diff --git a/sop-admin/pom.xml b/sop-admin/pom.xml index b98d40ee..7e307540 100755 --- a/sop-admin/pom.xml +++ b/sop-admin/pom.xml @@ -14,5 +14,6 @@ sop-admin-backend + sop-code-gen diff --git a/sop-admin/readme.md b/sop-admin/readme.md index 6410dedb..87999e53 100755 --- a/sop-admin/readme.md +++ b/sop-admin/readme.md @@ -2,4 +2,5 @@ - sop-admin-backend: admin服务端 - sop-admin-frontend: admin前端实现 +- sop-code-gen: 代码生成器 diff --git a/sop-admin/sop-code-gen/pom.xml b/sop-admin/sop-code-gen/pom.xml new file mode 100644 index 00000000..4dd383d6 --- /dev/null +++ b/sop-admin/sop-code-gen/pom.xml @@ -0,0 +1,245 @@ + + + 4.0.0 + + + org.noear + solon-parent + 3.0.5 + + + + com.gitee.fmadmin + sop-code-gen + 2.0.4 + 一款代码生成器 + https://gitee.com/durcframework/code-gen + + + 8 + 8 + UTF-8 + + + + + + org.noear + solon-web + + + org.noear + solon-boot-smarthttp + + + + + + org.noear + solon.boot.jdkhttp + + + + org.noear + solon.web.cors + + + + org.noear + solon.web.staticfiles + + + + org.noear + solon.logging.logback + + + + org.noear + mybatis-solon-plugin + + + + org.noear + solon-view-thymeleaf + + + + + org.apache.commons + commons-dbcp2 + 2.9.0 + + + + + org.apache.commons + commons-pool2 + 2.11.1 + + + + dom4j + dom4j + 1.6.1 + + + + org.apache.velocity + velocity + 1.7 + + + + com.alibaba + fastjson + 1.2.83 + + + + org.xerial + sqlite-jdbc + 3.34.0 + + + + mysql + mysql-connector-java + 8.0.28 + + + + + + commons-io + commons-io + 2.17.0 + + + + org.noear + solon-test-junit4 + test + + + junit + junit + 4.13.2 + test + + + + + + + ${project.artifactId} + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + utf-8 + -parameters + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.4 + + true + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.4.0 + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${project.build.directory}/lib + false + false + true + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + true + + lib/ + + com.gitee.gen.App + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + src/main/assembly/assembly-zip.xml + + + + + make-assembly + package + + single + + + + + + + + + diff --git a/sop-admin/sop-code-gen/readme.md b/sop-admin/sop-code-gen/readme.md new file mode 100644 index 00000000..a253e5f1 --- /dev/null +++ b/sop-admin/sop-code-gen/readme.md @@ -0,0 +1,7 @@ +# 代码生成工具 + +自动生成前后端代码,实现完整的增删改查功能。 + +参见:com.gitee.gen.GenLocalTest + +执行后代码自动生成到项目中 diff --git a/sop-admin/sop-code-gen/src/main/assembly/assembly-zip.xml b/sop-admin/sop-code-gen/src/main/assembly/assembly-zip.xml new file mode 100644 index 00000000..b9b3471c --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/assembly/assembly-zip.xml @@ -0,0 +1,58 @@ + + bin + + + dir + + true + + + + + target + / + + gen.jar + + 0644 + + + + + src/main/assembly/bin + / + 0755 + + + + + target/lib + lib + 0644 + + + + + src/main/assembly + + ext.md + + ext + 0644 + + + + + + + src/main/resources + conf + + app.yml + + 0644 + + + + + diff --git a/sop-admin/sop-code-gen/src/main/assembly/bin/run.bat b/sop-admin/sop-code-gen/src/main/assembly/bin/run.bat new file mode 100644 index 00000000..5e4ccd19 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/assembly/bin/run.bat @@ -0,0 +1,3 @@ +@echo off + +java -Dsolon.config.add=conf/app.yml -Duser.timezone=Asia/Shanghai -jar -Xms64m -Xmx64m gen.jar diff --git a/sop-admin/sop-code-gen/src/main/assembly/bin/run.sh b/sop-admin/sop-code-gen/src/main/assembly/bin/run.sh new file mode 100644 index 00000000..e79139b0 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/assembly/bin/run.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +# 先关闭服务 +sh shutdown.sh + +nohup java -Dsolon.config.add=./conf/app.yml -Duser.timezone=Asia/Shanghai -jar -Xms64m -Xmx64m gen.jar >/dev/null 2>&1 & diff --git a/sop-admin/sop-code-gen/src/main/assembly/bin/shutdown.sh b/sop-admin/sop-code-gen/src/main/assembly/bin/shutdown.sh new file mode 100644 index 00000000..7fa08d77 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/assembly/bin/shutdown.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +# 关闭服务 +app="gen" + +pid=$(ps -ef | grep ${app}.jar | grep -v grep | awk '{print $2}') +if [ -n "$pid" ]; then + echo "stop ${app}.jar, pid:" "$pid" + kill -9 "$pid" +fi diff --git a/sop-admin/sop-code-gen/src/main/assembly/ext.md b/sop-admin/sop-code-gen/src/main/assembly/ext.md new file mode 100644 index 00000000..8c5fa27f --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/assembly/ext.md @@ -0,0 +1 @@ +将数据库驱动放入该文件夹下 diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/App.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/App.java new file mode 100644 index 00000000..8edd93ee --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/App.java @@ -0,0 +1,17 @@ +package com.gitee.gen; + +import org.noear.solon.Solon; +import org.noear.solon.web.cors.CrossFilter; + + +public class App { + + public static void main(String[] args) { + Solon.start(App.class, args, app -> { + //例:增加全局处理(用过滤器模式)//对静态资源亦有效 + app.filter(-1, new CrossFilter().allowedOrigins("*")); //加-1 优先级更高 + }); + } + + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/Action.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/Action.java new file mode 100644 index 00000000..7944e047 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/Action.java @@ -0,0 +1,33 @@ +package com.gitee.gen.common; + +/** + * @author tanghc + */ +public class Action { + + private static final String CODE_SUCCESS = "0"; + private static final String CODE_ERROR = "100"; + + private static Result ok = new Result(); + static { + ok.setCode(CODE_SUCCESS); + } + + public static Result ok() { + return ok; + } + + public static Result ok(Object data) { + Result result = new Result(); + result.setCode(CODE_SUCCESS); + result.setData(data); + return result; + } + + public static Result err(String msg) { + Result result = new Result(); + result.setCode(CODE_ERROR); + result.setMsg(msg); + return result; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/GeneratorParam.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/GeneratorParam.java new file mode 100644 index 00000000..f2b92418 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/GeneratorParam.java @@ -0,0 +1,91 @@ +package com.gitee.gen.common; + +import java.util.List; + +public class GeneratorParam { + /** datasource_config主键 */ + private int datasourceConfigId; + + /** 表名 */ + private List tableNames; + + /** template_config主键 */ + private List templateConfigIdList; + + private String packageName; + + private String delPrefix; + + private String author; + + private String charset = "UTF-8"; + + public int getDatasourceConfigId() { + return datasourceConfigId; + } + + public void setDatasourceConfigId(int datasourceConfigId) { + this.datasourceConfigId = datasourceConfigId; + } + + public List getTableNames() { + return tableNames; + } + + public void setTableNames(List tableNames) { + this.tableNames = tableNames; + } + + public List getTemplateConfigIdList() { + return templateConfigIdList; + } + + public void setTemplateConfigIdList(List templateConfigIdList) { + this.templateConfigIdList = templateConfigIdList; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getDelPrefix() { + return delPrefix; + } + + public void setDelPrefix(String delPrefix) { + this.delPrefix = delPrefix; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getCharset() { + return charset; + } + + public void setCharset(String charset) { + this.charset = charset; + } + + @Override + public String toString() { + return "GeneratorParam{" + + "datasourceConfigId=" + datasourceConfigId + + ", tableNames=" + tableNames + + ", templateConfigIdList=" + templateConfigIdList + + ", packageName='" + packageName + '\'' + + ", delPrefix='" + delPrefix + '\'' + + ", author='" + author + '\'' + + ", charset='" + charset + '\'' + + '}'; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/IdWorker.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/IdWorker.java new file mode 100644 index 00000000..c3bbfa85 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/IdWorker.java @@ -0,0 +1,133 @@ +package com.gitee.gen.common; + +public class IdWorker { + + private static final IdWorker intance = new IdWorker(1, 1, 1); + + //因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。 + + //机器ID 2进制5位 32位减掉1位 31个 + private long workerId; + //机房ID 2进制5位 32位减掉1位 31个 + private long datacenterId; + //代表一毫秒内生成的多个id的最新序号 12位 4096 -1 = 4095 个 + private long sequence; + //设置一个时间初始值 2^41 - 1 差不多可以用69年 + private long twepoch = 1585644268888L; + //5位的机器id + private long workerIdBits = 5L; + //5位的机房id + private long datacenterIdBits = 5L; + //每毫秒内产生的id数 2 的 12次方 + private long sequenceBits = 12L; + // 这个是二进制运算,就是5 bit最多只能有31个数字,也就是说机器id最多只能是32以内 + private long maxWorkerId = -1L ^ (-1L << workerIdBits); + // 这个是一个意思,就是5 bit最多只能有31个数字,机房id最多只能是32以内 + private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + + private long workerIdShift = sequenceBits; + private long datacenterIdShift = sequenceBits + workerIdBits; + private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + private long sequenceMask = -1L ^ (-1L << sequenceBits); + //记录产生时间毫秒数,判断是否是同1毫秒 + private long lastTimestamp = -1L; + public long getWorkerId(){ + return workerId; + } + public long getDatacenterId() { + return datacenterId; + } + public long getTimestamp() { + return System.currentTimeMillis(); + } + + + public static IdWorker getInstance() { + return intance; + } + + public IdWorker(long workerId, long datacenterId, long sequence) { + + // 检查机房id和机器id是否超过31 不能小于0 + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException( + String.format("worker Id can't be greater than %d or less than 0",maxWorkerId)); + } + + if (datacenterId > maxDatacenterId || datacenterId < 0) { + + throw new IllegalArgumentException( + String.format("datacenter Id can't be greater than %d or less than 0",maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + this.sequence = sequence; + } + + // 这个是核心方法,通过调用nextId()方法,让当前这台机器上的snowflake算法程序生成一个全局唯一的id + public synchronized long nextId() { + // 这儿就是获取当前时间戳,单位是毫秒 + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + + System.err.printf( + "clock is moving backwards. Rejecting requests until %d.", lastTimestamp); + throw new RuntimeException( + String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", + lastTimestamp - timestamp)); + } + + // 下面是说假设在同一个毫秒内,又发送了一个请求生成一个id + // 这个时候就得把seqence序号给递增1,最多就是4096 + if (lastTimestamp == timestamp) { + + // 这个意思是说一个毫秒内最多只能有4096个数字,无论你传递多少进来, + //这个位运算保证始终就是在4096这个范围内,避免你自己传递个sequence超过了4096这个范围 + sequence = (sequence + 1) & sequenceMask; + //当某一毫秒的时间,产生的id数 超过4095,系统会进入等待,直到下一毫秒,系统继续产生ID + if (sequence == 0) { + timestamp = tilNextMillis(lastTimestamp); + } + + } else { + sequence = 0; + } + // 这儿记录一下最近一次生成id的时间戳,单位是毫秒 + lastTimestamp = timestamp; + // 这儿就是最核心的二进制位运算操作,生成一个64bit的id + // 先将当前时间戳左移,放到41 bit那儿;将机房id左移放到5 bit那儿;将机器id左移放到5 bit那儿;将序号放最后12 bit + // 最后拼接起来成一个64 bit的二进制数字,转换成10进制就是个long型 + return ((timestamp - twepoch) << timestampLeftShift) | + (datacenterId << datacenterIdShift) | + (workerId << workerIdShift) | sequence; + } + + /** + * 当某一毫秒的时间,产生的id数 超过4095,系统会进入等待,直到下一毫秒,系统继续产生ID + * @param lastTimestamp + * @return + */ + private long tilNextMillis(long lastTimestamp) { + + long timestamp = timeGen(); + + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + //获取当前时间戳 + private long timeGen(){ + return System.currentTimeMillis(); + } + + /** + * main 测试类 + * @param args + */ + public static void main(String[] args) { + for (int i = 0; i < 22; i++) { + System.out.println(getInstance().nextId()); + } + } +} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/Result.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/Result.java new file mode 100644 index 00000000..3ea05c41 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/common/Result.java @@ -0,0 +1,31 @@ +package com.gitee.gen.common; + +public class Result { + private String code; + private Object data; + private String msg; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/AppRouterInterceptor.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/AppRouterInterceptor.java new file mode 100644 index 00000000..0d929776 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/AppRouterInterceptor.java @@ -0,0 +1,27 @@ +package com.gitee.gen.config; + +import com.gitee.gen.common.Action; +import org.noear.solon.annotation.Component; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Handler; +import org.noear.solon.core.route.RouterInterceptor; +import org.noear.solon.core.route.RouterInterceptorChain; +import org.noear.solon.validation.ValidatorException; + +@Component(index = 0) //index 为顺序位(不加,则默认为0) +public class AppRouterInterceptor implements RouterInterceptor { + @Override + public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable { + try { + chain.doIntercept(ctx, mainHandler); + + if (mainHandler == null) { + ctx.render(Action.err("资源不存在")); + } + } catch (ValidatorException e) { + ctx.render(Action.err(e.getMessage())); //e.getResult().getDescription() + } catch (Throwable e) { + ctx.render(Action.err(e.getMessage())); + } + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/Config.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/Config.java new file mode 100644 index 00000000..776fec45 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/Config.java @@ -0,0 +1,82 @@ +package com.gitee.gen.config; + +import com.gitee.gen.service.UpgradeService; +import com.gitee.gen.util.StringUtil; +import com.gitee.gen.util.SystemUtil; +import org.apache.commons.dbcp2.BasicDataSource; +import org.apache.commons.lang.StringUtils; +import org.noear.solon.Solon; +import org.noear.solon.annotation.Bean; +import org.noear.solon.annotation.Condition; +import org.noear.solon.annotation.Configuration; +import org.noear.solon.annotation.Init; +import org.noear.solon.annotation.Inject; +import org.noear.solon.web.staticfiles.StaticMappings; +import org.noear.solon.web.staticfiles.repository.ClassPathStaticRepository; +import org.noear.solon.web.staticfiles.repository.FileStaticRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sql.DataSource; + +@Configuration +public class Config { + + static Logger log = LoggerFactory.getLogger(Config.class); + + @Inject + UpgradeService upgradeService; + + //此下的 db1 与 mybatis.db1 将对应在起来 //可以用 @Db("db1") 注入mapper + //typed=true,表示默认数据源。@Db 可不带名字注入 + @Bean(name = "db1", typed = true) + @Condition(onProperty = "${dbms.enable} = false") + public DataSource db1(@Inject("${gen.db1}") BasicDataSource ds) { + if (ds.getDriverClassName().contains("sqlite")) { + String url = ds.getUrl(); + ds.setUrl(url + UpgradeService.getLocalDbPath()); + } + log.info("使用本地数据库,url:{}", ds.getUrl()); + return ds; + } + + @Bean(name = "db1", typed = true) + @Condition(onProperty = "${dbms.enable} = true") + public DataSource db2(@Inject("${gen.db2}") BasicDataSource ds) { + log.info("使用DBMS存储数据,url={}", ds.getUrl()); + return ds; + } + + //调整 db1 的配置,或添加插件 (配置可以解决的,不需要这块代码) + //@Bean + //public void db1_cfg(@Db("db1") org.apache.ibatis.session.Configuration cfg) { + // cfg.setCacheEnabled(false); + //} + + @Init + public void start() { + upgradeService.initDatabase(); + upgradeService.init(); + initStaticFile(); + } + + /** + * 初始化静态资源文件 + */ + private static void initStaticFile() { + String frontLocation = Solon.context().cfg().get("gen.front-location", ""); + String frontRoot; + if (StringUtils.isNotBlank(frontLocation)) { + frontRoot = StringUtil.trimTrailingCharacter(frontLocation, '/'); + } else { + String homeDir = SystemUtil.getUserDir(); + if ("/".equals(homeDir)) { + homeDir = ""; + } + frontRoot = homeDir + "/dist"; + } + log.info("前端资源目录:{}", frontRoot); + + StaticMappings.add("/", new FileStaticRepository(frontRoot)); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/ConnectConfig.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/ConnectConfig.java new file mode 100644 index 00000000..69a817e9 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/ConnectConfig.java @@ -0,0 +1,53 @@ +package com.gitee.gen.config; + +/** + * @author 六如 + */ +public class ConnectConfig { + + private String name; + private String driver; + private String url; + private String serviceName; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDriver() { + return driver; + } + + public void setDriver(String driver) { + this.driver = driver; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getServiceName() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + @Override + public String toString() { + return "ConnectConfig{" + + "name='" + name + '\'' + + ", driver='" + driver + '\'' + + ", url='" + url + '\'' + + '}'; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/DbTypeConfig.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/DbTypeConfig.java new file mode 100644 index 00000000..6fa0ceb5 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/config/DbTypeConfig.java @@ -0,0 +1,33 @@ +package com.gitee.gen.config; + +import org.noear.solon.Solon; +import org.noear.solon.annotation.Configuration; +import org.noear.solon.annotation.Inject; + +import java.util.Map; + +/** + * @author 六如 + */ +@Configuration +public class DbTypeConfig { + + @Inject("${connect}") + private Map connectConfigMap; + + public static DbTypeConfig getInstance() { + return Solon.context().getBean(DbTypeConfig.class); + } + + public ConnectConfig getConnectConfig(Integer type) { + return connectConfigMap.get(type); + } + + public Map getConnectConfigMap() { + return connectConfigMap; + } + + public void setConnectConfigMap(Map connectConfigMap) { + this.connectConfigMap = connectConfigMap; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/DatasourceConfigController.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/DatasourceConfigController.java new file mode 100644 index 00000000..0dbf03b3 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/DatasourceConfigController.java @@ -0,0 +1,112 @@ +package com.gitee.gen.controller; + +import com.gitee.gen.common.Action; +import com.gitee.gen.common.Result; +import com.gitee.gen.config.DbTypeConfig; +import com.gitee.gen.entity.DatasourceConfig; +import com.gitee.gen.gen.DBConnect; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.SQLService; +import com.gitee.gen.gen.SQLServiceFactory; +import com.gitee.gen.gen.TableDefinition; +import com.gitee.gen.service.DatasourceConfigService; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.annotation.Path; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author tanghc + */ +@Controller +@Mapping("datasource") +public class DatasourceConfigController { + + @Inject + private DatasourceConfigService datasourceConfigService; + + @Mapping("/add") + public Result add(DatasourceConfig datasourceConfig) { + datasourceConfigService.insert(datasourceConfig); + return Action.ok(); + } + + @Mapping("/list") + public Result list() { + List datasourceConfigList = datasourceConfigService.listAll(); + return Action.ok(datasourceConfigList); + } + + @Mapping("/update") + public Result update(DatasourceConfig datasourceConfig) { + datasourceConfigService.update(datasourceConfig); + return Action.ok(); + } + + @Mapping("/del") + public Result del(DatasourceConfig datasourceConfig) { + datasourceConfigService.delete(datasourceConfig); + return Action.ok(); + } + + @Mapping("/table/{id}") + public Result listTable(@Path("id") int id) { + DatasourceConfig dataSourceConfig = datasourceConfigService.getById(id); + GeneratorConfig generatorConfig = GeneratorConfig.build(dataSourceConfig); + SQLService service = SQLServiceFactory.build(generatorConfig); + List list = service.getTableSelector(generatorConfig).getSimpleTableDefinitions(); + return Action.ok(list); + } + + + @Mapping("/test") + public Result test(DatasourceConfig datasourceConfig) { + String error = DBConnect.testConnection(GeneratorConfig.build(datasourceConfig)); + if (error != null) { + return Action.err(error); + } + return Action.ok(); + } + + @Mapping("/dbtype") + public Result dbType(DatasourceConfig datasourceConfig) { + List dbTypeShowList = DbTypeConfig.getInstance() + .getConnectConfigMap() + .entrySet() + .stream() + .map(entry -> new DbTypeShow(entry.getValue().getName(), entry.getKey())) + .collect(Collectors.toList()); + return Action.ok(dbTypeShowList); + } + + private static class DbTypeShow { + private String label; + private Integer dbType; + + public DbTypeShow(String label, Integer dbType) { + this.label = label; + this.dbType = dbType; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public Integer getDbType() { + return dbType; + } + + public void setDbType(Integer dbType) { + this.dbType = dbType; + } + } + + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/GenerateHistoryController.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/GenerateHistoryController.java new file mode 100644 index 00000000..02833577 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/GenerateHistoryController.java @@ -0,0 +1,80 @@ +package com.gitee.gen.controller; + +import com.alibaba.fastjson.JSON; +import com.gitee.gen.common.Action; +import com.gitee.gen.common.GeneratorParam; +import com.gitee.gen.common.Result; +import com.gitee.gen.controller.vo.GenerateHistoryVO; +import com.gitee.gen.entity.DatasourceConfig; +import com.gitee.gen.entity.GenerateHistory; +import com.gitee.gen.entity.TemplateConfig; +import com.gitee.gen.service.DatasourceConfigService; +import com.gitee.gen.service.GenerateHistoryService; +import com.gitee.gen.service.TemplateConfigService; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; + +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Controller +@Mapping("history") +public class GenerateHistoryController { + + @Inject + private GenerateHistoryService generateHistoryService; + + @Inject + private DatasourceConfigService datasourceConfigService; + + @Inject + private TemplateConfigService templateConfigService; + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + @Mapping("list") + public Result listAll() { + List generateHistories = generateHistoryService.listAll(); + List generateHistoryVOS = generateHistories.stream() + .map(generateHistory -> { + GenerateHistoryVO generateHistoryVO = new GenerateHistoryVO(); + GeneratorParam generatorParam = JSON.parseObject(generateHistory.getConfigContent(), GeneratorParam.class); + String datasourceInfo = getDatasourceInfo(generatorParam.getDatasourceConfigId()); + if (datasourceInfo == null) { + return null; + } + List templateNames = this.listTemplateNames(generatorParam.getTemplateConfigIdList()); + generateHistoryVO.setGenerateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(generateHistory.getGenerateTime())); + generateHistoryVO.setConfigContent(generatorParam); + generateHistoryVO.setDatasource(datasourceInfo); + generateHistoryVO.setTemplateNames(templateNames); + return generateHistoryVO; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + return Action.ok(generateHistoryVOS); + } + + private String getDatasourceInfo(int datasourceConfigId) { + DatasourceConfig datasourceConfig = datasourceConfigService.getById(datasourceConfigId); + if (datasourceConfig == null) { + return null; + } + String tpl = "%s(%s:%s)"; + return String.format(tpl, datasourceConfig.getDbName(), datasourceConfig.getHost(), datasourceConfig.getPort()); + } + + private List listTemplateNames(List idList) { + return templateConfigService.listTemplate(idList) + .stream() + .map(TemplateConfig::getName) + .collect(Collectors.toList()); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/GeneratorController.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/GeneratorController.java new file mode 100644 index 00000000..acd163c7 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/GeneratorController.java @@ -0,0 +1,41 @@ +package com.gitee.gen.controller; + +import com.gitee.gen.common.Action; +import com.gitee.gen.common.GeneratorParam; +import com.gitee.gen.common.Result; +import com.gitee.gen.entity.DatasourceConfig; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.service.DatasourceConfigService; +import com.gitee.gen.service.GeneratorService; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; + +/** + * @author tanghc + */ +@Controller +@Mapping("generate") +public class GeneratorController { + + @Inject + private DatasourceConfigService datasourceConfigService; + + @Inject + private GeneratorService generatorService; + + /** + * 生成代码 + * + * @param generatorParam 生成参数 + * @return 返回代码内容 + */ + @Mapping("/code") + public Result code(GeneratorParam generatorParam) { + int datasourceConfigId = generatorParam.getDatasourceConfigId(); + DatasourceConfig datasourceConfig = datasourceConfigService.getById(datasourceConfigId); + GeneratorConfig generatorConfig = GeneratorConfig.build(datasourceConfig); + return Action.ok(generatorService.generate(generatorParam, generatorConfig, null)); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/HomeController.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/HomeController.java new file mode 100644 index 00000000..15893c63 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/HomeController.java @@ -0,0 +1,25 @@ +package com.gitee.gen.controller; + + +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Get; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.ModelAndView; + +@Controller +public class HomeController { + + private static final ModelAndView INDEX_VIEW = new ModelAndView("index.html"); + + @Get + @Mapping("/") + public void index(Context context) { + context.redirect("index.html"); + } + + @Mapping("/index") + public ModelAndView index2() { + return INDEX_VIEW; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/TemplateConfigController.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/TemplateConfigController.java new file mode 100644 index 00000000..bb236351 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/TemplateConfigController.java @@ -0,0 +1,90 @@ +package com.gitee.gen.controller; + +import com.gitee.gen.common.Action; +import com.gitee.gen.common.Result; +import com.gitee.gen.entity.TemplateConfig; +import com.gitee.gen.entity.TemplateGroup; +import com.gitee.gen.service.TemplateConfigService; +import com.gitee.gen.service.TemplateGroupService; +import com.gitee.gen.util.TemplateMetaUtils; +import org.apache.commons.lang.StringUtils; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.annotation.Path; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author tanghc + */ +@Controller +@Mapping("template") +public class TemplateConfigController { + + @Inject + private TemplateConfigService templateConfigService; + + @Inject + private TemplateGroupService templateGroupService; + + @Mapping("/add") + public Result add(TemplateConfig templateConfig) { + templateConfigService.insert(templateConfig); + return Action.ok(templateConfig); + } + + @Mapping("/get/{id}") + public Result get(@Path("id") int id) { + return Action.ok(templateConfigService.getById(id)); + } + + @Mapping("/list") + public Result list(String groupId) { + List templateConfigs = null; + if(StringUtils.isEmpty(groupId)){ + templateConfigs = templateConfigService.listAll(); + }else { + templateConfigs = templateConfigService.listByGroupId(groupId); + } + Map idMap = templateGroupService.listAll() + .stream() + .collect(Collectors.toMap(TemplateGroup::getId, TemplateGroup::getGroupName)); + for (TemplateConfig templateConfig : templateConfigs) { + Integer gid = templateConfig.getGroupId(); + if (gid != null) { + String groupName = idMap.getOrDefault(gid, ""); + templateConfig.setGroupName(groupName); + } + templateConfig.setContent(TemplateMetaUtils.generateMetaContent(templateConfig)); + } + return Action.ok(templateConfigs); + } + + @Mapping("/update") + public Result update(TemplateConfig templateConfig) { + templateConfigService.update(templateConfig); + return Action.ok(); + } + + @Mapping("/del") + public Result del(TemplateConfig templateConfig) { + templateConfigService.delete(templateConfig); + return Action.ok(); + } + + @Mapping("/save") + public Result save(TemplateConfig templateConfig) { + templateConfigService.save(templateConfig); + return Action.ok(); + } + + @Mapping("/copy") + public Result copy(TemplateConfig templateConfig) { + templateConfigService.copy(templateConfig); + return Action.ok(); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/TemplateGroupController.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/TemplateGroupController.java new file mode 100644 index 00000000..dc46ebe3 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/TemplateGroupController.java @@ -0,0 +1,95 @@ +package com.gitee.gen.controller; + +import com.gitee.gen.common.Action; +import com.gitee.gen.common.Result; +import com.gitee.gen.entity.TemplateGroup; +import com.gitee.gen.service.TemplateGroupService; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.annotation.Path; + +import java.util.List; +import java.util.Objects; + +/** + * @author : zsljava + * @date Date : 2020-12-15 9:51 + * @Description: TODO + */ +@Controller +@Mapping("group") +public class TemplateGroupController { + + @Inject + private TemplateGroupService templateGroupService; + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + @Mapping("list") + public Result listAll() { + List templateGroups = templateGroupService.listAll(); + return Action.ok(templateGroups); + } + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + @Mapping("get/{id}") + public Result get(@Path("id") int id) { + TemplateGroup group = templateGroupService.getById(id); + return Action.ok(group); + } + + /** + * 新增,忽略null字段 + * + * @param templateGroup 新增的记录 + * @return 返回影响行数 + */ + @Mapping("add") + public Result insert(TemplateGroup templateGroup) { + TemplateGroup group = templateGroupService.getByName(templateGroup.getGroupName()); + if (group != null) { + throw new RuntimeException(templateGroup.getGroupName() + " 已存在"); + } + templateGroupService.insertIgnoreNull(templateGroup); + return Action.ok(templateGroup); + } + + /** + * 修改,忽略null字段 + * + * @param templateGroup 修改的记录 + * @return 返回影响行数 + */ + @Mapping("update") + public Result update(TemplateGroup templateGroup) { + TemplateGroup group = templateGroupService.getByName(templateGroup.getGroupName()); + if (group != null && !Objects.equals(group.getId(), templateGroup.getId())) { + throw new RuntimeException(templateGroup.getGroupName() + " 已存在"); + } + templateGroupService.updateIgnoreNull(templateGroup); + return Action.ok(); + } + + /** + * 删除记录 + * + * @param templateGroup 待删除的记录 + * @return 返回影响行数 + */ + @Mapping("del") + public Result delete(TemplateGroup templateGroup) { + templateGroupService.deleteGroup(templateGroup); + return Action.ok(); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/TypeConfigController.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/TypeConfigController.java new file mode 100644 index 00000000..48fb5cb0 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/TypeConfigController.java @@ -0,0 +1,56 @@ +package com.gitee.gen.controller; + +import com.gitee.gen.common.Action; +import com.gitee.gen.common.Result; +import com.gitee.gen.entity.TypeConfig; +import com.gitee.gen.service.TypeConfigService; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; + +import java.util.List; + +@Controller +@Mapping("type") +public class TypeConfigController { + + @Inject + private TypeConfigService typeConfigService; + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + @Mapping("list") + public Result listAll() { + return Action.ok(typeConfigService.listAll()); + } + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + @Mapping("getById") + public TypeConfig getById(Integer id) { + return typeConfigService.getById(id); + } + + /** + * 修改,忽略null字段 + * + * @param typeConfigList 修改的记录 + * @return 返回影响行数 + */ + @Mapping("update") + public Result update(List typeConfigList) { + for (TypeConfig typeConfig : typeConfigList) { + typeConfigService.updateIgnoreNull(typeConfig); + } + return Action.ok(); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/vo/GenerateHistoryVO.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/vo/GenerateHistoryVO.java new file mode 100644 index 00000000..be1996a6 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/controller/vo/GenerateHistoryVO.java @@ -0,0 +1,66 @@ +package com.gitee.gen.controller.vo; + +import com.gitee.gen.common.GeneratorParam; + +import java.util.List; + +/** + * @author tanghc + */ +public class GenerateHistoryVO { + + /* + { + "datasourceConfigId": 1, + "tableNames": [ + "datasource_config", + "generate_history" + ], + "templateConfigIdList": [ + 1 + ], + "packageName": "com.gitee.gen", + "delPrefix": "template_", + "groupId": "", + "groupName": "JPA" +} + */ + private GeneratorParam configContent; + + private String generateTime; + + private String datasource; + private List templateNames; + + public GeneratorParam getConfigContent() { + return configContent; + } + + public void setConfigContent(GeneratorParam configContent) { + this.configContent = configContent; + } + + public String getGenerateTime() { + return generateTime; + } + + public void setGenerateTime(String generateTime) { + this.generateTime = generateTime; + } + + public String getDatasource() { + return datasource; + } + + public void setDatasource(String datasource) { + this.datasource = datasource; + } + + public List getTemplateNames() { + return templateNames; + } + + public void setTemplateNames(List templateNames) { + this.templateNames = templateNames; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/ColumnInfo.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/ColumnInfo.java new file mode 100644 index 00000000..f1157a24 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/ColumnInfo.java @@ -0,0 +1,27 @@ +package com.gitee.gen.entity; + +/** + * @author tanghc + */ +public class ColumnInfo { + /** 字段名 */ + private String name; + /** 字段类型 */ + private String type; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/DatasourceConfig.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/DatasourceConfig.java new file mode 100644 index 00000000..42e87c58 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/DatasourceConfig.java @@ -0,0 +1,219 @@ +package com.gitee.gen.entity; + + +import java.util.Objects; + +/** + * 数据源配置表 + */ +public class DatasourceConfig { + private Integer id; + /** + * 数据库类型 + */ + private Integer dbType; + /** 数据库驱动 */ + private String driverClass; + /** 数据库别名 */ + private String dbDesc; + /** 数据库名称 */ + private String dbName; + /** schema(PGSQL专用) */ + private String schemaName; + /** 数据库host */ + private String host; + /** 数据库端口 */ + private Integer port; + /** 数据库用户名 */ + private String username; + /** 数据库密码 */ + private String password; + /** 是否已删除,1:已删除,0:未删除 */ + private Integer isDeleted; + /** 包名*/ + private String packageName; + /** 删除的前缀*/ + private String delPrefix; + /** 代码生成器模板组id*/ + private Integer groupId; + /** 作者名*/ + private String author; + /** 数据库分组名称 */ + private String dbGroupName; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getDbType() { + return dbType; + } + + public void setDbType(Integer dbType) { + this.dbType = dbType; + } + + public String getDriverClass() { + return driverClass; + } + + public void setDriverClass(String driverClass) { + this.driverClass = driverClass; + } + + public String getDbName() { + return dbName; + } + + public void setDbName(String dbName) { + this.dbName = dbName; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public Integer getIsDeleted() { + return isDeleted; + } + + public void setIsDeleted(Integer isDeleted) { + this.isDeleted = isDeleted; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getDelPrefix() { + return delPrefix; + } + + public void setDelPrefix(String delPrefix) { + this.delPrefix = delPrefix; + } + + public Integer getGroupId() { + return groupId; + } + + public void setGroupId(Integer groupId) { + this.groupId = groupId; + } + + public String getSchemaName() { + return schemaName; + } + + public void setSchemaName(String schemaName) { + this.schemaName = schemaName; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getDbDesc() { + return dbDesc; + } + + public void setDbDesc(String dbDesc) { + this.dbDesc = dbDesc; + } + + public String getDbGroupName() { + return dbGroupName; + } + + public void setDbGroupName(String dbGroupName) { + this.dbGroupName = dbGroupName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DatasourceConfig that = (DatasourceConfig) o; + return Objects.equals(id, that.id) && + Objects.equals(dbDesc, that.dbDesc) && + Objects.equals(dbType, that.dbType) && + Objects.equals(driverClass, that.driverClass) && + Objects.equals(dbName, that.dbName) && + Objects.equals(host, that.host) && + Objects.equals(port, that.port) && + Objects.equals(username, that.username) && + Objects.equals(password, that.password) && + Objects.equals(isDeleted, that.isDeleted) && + Objects.equals(packageName, that.packageName) && + Objects.equals(delPrefix, that.delPrefix) && + Objects.equals(groupId, that.groupId) && + Objects.equals(author, that.author) && + Objects.equals(dbGroupName, that.dbGroupName); + } + + @Override + public int hashCode() { + return Objects.hash(id, dbType, dbDesc, driverClass, dbName, host, port, username, password, isDeleted, packageName, delPrefix, groupId, author, dbGroupName); + } + + @Override + public String toString() { + return "DatasourceConfig{" + + "id=" + id + + ", dbType=" + dbType + + ", dbDesc=" + dbDesc + + ", driverClass='" + driverClass + '\'' + + ", dbName='" + dbName + '\'' + + ", host='" + host + '\'' + + ", port=" + port + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", isDeleted=" + isDeleted + + ", packageName='" + packageName + '\'' + + ", delPrefix='" + delPrefix + '\'' + + ", groupId='" + groupId + '\'' + + ", author='" + author + '\'' + + ", dbGroupName='" + dbGroupName + '\'' + + '}'; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/GenerateHistory.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/GenerateHistory.java new file mode 100644 index 00000000..f85970d0 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/GenerateHistory.java @@ -0,0 +1,67 @@ +package com.gitee.gen.entity; + + +import java.util.Date; + +public class GenerateHistory { + private Integer id; + private String configContent; + private String md5Value; + private Date generateTime; + + public void setId(Integer id) { + this.id = id; + } + + public Integer getId() { + return this.id; + } + + public void setConfigContent(String configContent) { + this.configContent = configContent; + } + + public String getConfigContent() { + return this.configContent; + } + + public void setMd5Value(String md5Value) { + this.md5Value = md5Value; + } + + public String getMd5Value() { + return this.md5Value; + } + + public Date getGenerateTime() { + return generateTime; + } + + public void setGenerateTime(Date generateTime) { + this.generateTime = generateTime; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) {return false;} + GenerateHistory that = (GenerateHistory) o; + return id.equals(that.id); + } + + @Override + public int hashCode() { + return java.util.Objects.hash(id); + } + + @Override + public String toString() { + return "GenerateHistory{" + + "id=" + id + + ",configContent='" + configContent + "'" + + ",md5Value='" + md5Value + "'" + + ",generateTime='" + generateTime + "'" + + '}'; + } + +} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/SystemConfig.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/SystemConfig.java new file mode 100644 index 00000000..3db209ba --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/SystemConfig.java @@ -0,0 +1,72 @@ +package com.gitee.gen.entity; + + +/** + * 系统配置表 + */ +public class SystemConfig { + private Integer id; + /** 配置项 */ + private String configKey; + /** 配置值 */ + private String configValue; + /** 备注 */ + private String remark; + + public void setId(Integer id) { + this.id = id; + } + + public Integer getId() { + return this.id; + } + + public void setConfigKey(String configKey) { + this.configKey = configKey; + } + + public String getConfigKey() { + return this.configKey; + } + + public void setConfigValue(String configValue) { + this.configValue = configValue; + } + + public String getConfigValue() { + return this.configValue; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getRemark() { + return this.remark; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) {return false;} + SystemConfig that = (SystemConfig) o; + return id.equals(that.id); + } + + @Override + public int hashCode() { + return java.util.Objects.hash(id); + } + + @Override + public String toString() { + return "SystemConfig{" + + ",id='" + id + "'" + + ",configKey='" + configKey + "'" + + ",configValue='" + configValue + "'" + + ",remark='" + remark + "'" + + '}'; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/TemplateConfig.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/TemplateConfig.java new file mode 100644 index 00000000..a68a5753 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/TemplateConfig.java @@ -0,0 +1,149 @@ +package com.gitee.gen.entity; + + +/** + * 模板表 + */ +public class TemplateConfig { + private Integer id; + private Integer groupId; + private String groupName; + /** 模板名称 */ + private String name; + /** + * 目录 + */ + private String folder; + /** 文件名称 */ + private String fileName; + /** 内容 */ + private String content; + /** 是否删除,1:已删除,0:未删除 */ + private Integer isDeleted; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getGroupId() { + return groupId; + } + + public void setGroupId(Integer groupId) { + this.groupId = groupId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Integer getIsDeleted() { + return isDeleted; + } + + public void setIsDeleted(Integer isDeleted) { + this.isDeleted = isDeleted; + } + + public String getFolder() { + return folder; + } + + public void setFolder(String folder) { + this.folder = folder; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TemplateConfig)) { + return false; + } + + TemplateConfig that = (TemplateConfig) o; + + if (id != null ? !id.equals(that.id) : that.id != null) { + return false; + } + if (groupId != null ? !groupId.equals(that.groupId) : that.groupId != null) { + return false; + } + if (groupName != null ? !groupName.equals(that.groupName) : that.groupName != null) { + return false; + } + if (name != null ? !name.equals(that.name) : that.name != null) { + return false; + } + if (folder != null ? !folder.equals(that.folder) : that.folder != null) { + return false; + } + if (fileName != null ? !fileName.equals(that.fileName) : that.fileName != null) { + return false; + } + if (content != null ? !content.equals(that.content) : that.content != null) { + return false; + } + return isDeleted != null ? isDeleted.equals(that.isDeleted) : that.isDeleted == null; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (groupId != null ? groupId.hashCode() : 0); + result = 31 * result + (groupName != null ? groupName.hashCode() : 0); + result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + (folder != null ? folder.hashCode() : 0); + result = 31 * result + (fileName != null ? fileName.hashCode() : 0); + result = 31 * result + (content != null ? content.hashCode() : 0); + result = 31 * result + (isDeleted != null ? isDeleted.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "TemplateConfig{" + + "id=" + id + + ", groupId=" + groupId + + ", groupName='" + groupName + '\'' + + ", name='" + name + '\'' + + ", folder='" + folder + '\'' + + ", fileName='" + fileName + '\'' + + ", content='" + content + '\'' + + ", isDeleted=" + isDeleted + + '}'; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/TemplateGroup.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/TemplateGroup.java new file mode 100644 index 00000000..e9630014 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/TemplateGroup.java @@ -0,0 +1,60 @@ +package com.gitee.gen.entity; + +/** + * @author : zsljava + * @date Date : 2020-12-15 9:49 + * @Description: TODO + */ +public class TemplateGroup { + private Integer id; + private String groupName; + private Integer isDeleted; + + public void setId(Integer id) { + this.id = id; + } + + public Integer getId() { + return this.id; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getGroupName() { + return this.groupName; + } + + public void setIsDeleted(Integer isDeleted) { + this.isDeleted = isDeleted; + } + + public Integer getIsDelete() { + return this.isDeleted; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) {return false;} + TemplateGroup that = (TemplateGroup) o; + return id.equals(that.id); + } + + @Override + public int hashCode() { + return java.util.Objects.hash(id); + } + + @Override + public String toString() { + return "TemplateGroup{" + + "id=" + id + + ",groupName='" + groupName + "'" + + ",isDelete='" + isDeleted + "'" + + '}'; + } + +} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/TypeConfig.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/TypeConfig.java new file mode 100644 index 00000000..e17badab --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/entity/TypeConfig.java @@ -0,0 +1,72 @@ +package com.gitee.gen.entity; + + +/** + * 字段类型配置表 + */ +public class TypeConfig { + private Integer id; + /** 数据库类型 */ + private String dbType; + /** 基本类型 */ + private String baseType; + /** 装箱类型 */ + private String boxType; + + public void setId(Integer id) { + this.id = id; + } + + public Integer getId() { + return this.id; + } + + public void setDbType(String dbType) { + this.dbType = dbType; + } + + public String getDbType() { + return this.dbType; + } + + public void setBaseType(String baseType) { + this.baseType = baseType; + } + + public String getBaseType() { + return this.baseType; + } + + public void setBoxType(String boxType) { + this.boxType = boxType; + } + + public String getBoxType() { + return this.boxType; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) {return false;} + TypeConfig that = (TypeConfig) o; + return id.equals(that.id); + } + + @Override + public int hashCode() { + return java.util.Objects.hash(id); + } + + @Override + public String toString() { + return "TypeConfig{" + + "id=" + id + + ",dbType='" + dbType + "'" + + ",baseType='" + baseType + "'" + + ",boxType='" + boxType + "'" + + '}'; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/CodeFile.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/CodeFile.java new file mode 100644 index 00000000..9b8ad7b7 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/CodeFile.java @@ -0,0 +1,33 @@ +package com.gitee.gen.gen; + +public class CodeFile { + + private String folder; + private String fileName; + private String content; + + public String getFolder() { + return folder; + } + + public void setFolder(String folder) { + this.folder = folder; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/ColumnDefinition.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/ColumnDefinition.java new file mode 100644 index 00000000..45e7c356 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/ColumnDefinition.java @@ -0,0 +1,328 @@ +package com.gitee.gen.gen; + +import com.gitee.gen.gen.converter.ColumnTypeConverter; +import com.gitee.gen.util.FieldUtil; +import com.gitee.gen.util.SqlTypeUtil; +import com.gitee.gen.util.StringUtil; +import org.apache.commons.lang.StringUtils; + +/** + * 表字段信息 + */ +public class ColumnDefinition { + + /** + * 数据库字段名 + */ + private String columnName; + /** + * 数据库类型 + */ + private String type; + /** + * 是否自增 + */ + private Boolean isIdentity; + /** + * 是否主键 + */ + private Boolean isPk; + /** + * 字段注释 + */ + private String comment; + /** + * 字段长度 + */ + private Integer maxLength; + /** + * 小数位长度 + */ + private Integer scale; + + /** + * 字段是否允许为null + */ + private boolean isNullable; + + + private ColumnTypeConverter columnTypeConverter; + + public void setColumnTypeConverter(ColumnTypeConverter columnTypeConverter) { + this.columnTypeConverter = columnTypeConverter; + } + + /** + * 数据库字段名首字母小写 + * @return + */ + public String getColumnNameLF() { + return FieldUtil.lowerFirstLetter(this.columnName); + } + + public String getLabel() { + return StringUtils.isNotBlank(comment) ? comment : getNameCamel(); + } + + public void setMaxLength(Integer maxLength) { + this.maxLength = maxLength; + } + + public void setScale(Integer scale) { + this.scale = scale; + } + + public Integer getMaxLength() { + return maxLength; + } + + public Integer getScale() { + return scale; + } + + /** + * 获得基本类型,int,float + * + * @return 返回基本类型 + */ + public String getFieldType() { + return getColumnTypeConverter().convertType(type); + } + + /** + * 获得基本类型,int,float + * + * @return 返回基本类型 + */ + public String getTypeBase() { + return getFieldType(); + } + + /** + * 获得装箱类型,Integer,Float + * + * @return 返回装箱类型 + */ + public String getFieldTypeBox() { + return getColumnTypeConverter().convertTypeBox(getType()); + } + + /** + * 获得装箱类型,Integer,Float + * + * @return 返回装箱类型 + */ + public String getTypeBox() { + return getFieldTypeBox(); + } + + + + public String getMybatisJdbcType() { + return SqlTypeUtil.TYPE_MYBATIS_MAP.getOrDefault(getType(), "VARCHAR"); + } + + /** + * 返回java字段名,并且第一个字母大写 + * + * @return 返回字段名 + * @see #getNamePascal() + */ + @Deprecated + public String getJavaFieldNameUF() { + return FieldUtil.upperFirstLetter(getJavaFieldName()); + } + + + // ---- name start ---- + + /** + * 返回表字段名 + * @return + */ + public String getName() { + return getColumnName(); + } + + /** + * 返回java字段 + * + * @return 返回java字段 + * @see #getNameCamel() + */ + @Deprecated + public String getJavaFieldName() { + String fieldName = FieldUtil.underlineFilter(getColumnName()); + if(StringUtils.isEmpty(fieldName)){ + return fieldName; + } + fieldName = fieldName.replaceAll("_", ""); + return FieldUtil.lowerFirstLetter(fieldName); + } + + /** + * 小驼峰命名,如:userAge + * @return + */ + public String getNameCamel() { + return getJavaFieldName(); + } + + /** + * 大驼峰命名,如:UserAge + * @return + */ + public String getNamePascal() { + return FieldUtil.upperFirstLetter(getJavaFieldName()); + } + + /** + * 蛇形命名,如:user_age + * @return + */ + public String getNameSnake() { + String name = getColumnName(); + name = StringUtil.trimTrailingCharacter(name, '_'); + name = StringUtil.trimLeadingCharacter(name, '_'); + return name.toLowerCase(); + } + + /** + * 蛇形命名大写,如:USER_AGE + * @return + */ + public String getNameSnakeBig() { + return getNameSnake().toUpperCase(); + } + + /** + * 烤串命名,如:user-name + * @return + */ + public String getNameKebab() { + String name = this.getNameSnake(); + return name.replace('_', '-'); + } + + /** + * 烤串命名大写,如:USER-AGE + * @return + */ + public String getNameKebabBig() { + return this.getNameKebab().toUpperCase(); + } + + /** + * 帕斯卡蛇形命名,如:User_Age + * @return + */ + public String getNamePascalSnake() { + String fieldNameSnake = this.getNameSnake(); + String[] split = fieldNameSnake.split("_"); + for (int i = 0; i < split.length; i++) { + split[i] = FieldUtil.upperFirstLetter(split[i]); + } + return String.join("_", split); + } + + /** + * 帕斯卡烤串命名,如:User-Age + * @return + */ + public String getNamePascalKebab() { + String fieldNameSnake = this.getNameSnake(); + String[] split = fieldNameSnake.split("_"); + for (int i = 0; i < split.length; i++) { + split[i] = FieldUtil.upperFirstLetter(split[i]); + } + return String.join("-", split); + } + + // ---- name end ---- + + + /** + * 获得基本类型,int,float + * + * @return 返回基本类型 + */ + public String getJavaType() { + return getFieldType(); + } + + /** + * 获得装箱类型,Integer,Float + * + * @return 返回装箱类型 + */ + + public String getJavaTypeBox() { + return getFieldTypeBox(); + } + + + /** + * 是否是自增主键 + * + * @return true, 是自增主键 + */ + public boolean getIsIdentityPk() { + return getIsPk() && getIsIdentity(); + } + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Boolean getIsIdentity() { + return isIdentity; + } + + public void setIsIdentity(Boolean isIdentity) { + this.isIdentity = isIdentity; + } + + public Boolean getIsPk() { + return isPk; + } + + public void setIsPk(Boolean isPk) { + this.isPk = isPk; + } + + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + if (comment == null) { + comment = ""; + } + this.comment = comment; + } + + public ColumnTypeConverter getColumnTypeConverter() { + return columnTypeConverter; + } + + public Boolean getIsNullable() { + return isNullable; + } + + public void setIsNullable(Boolean isNullable) { + this.isNullable = isNullable; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/ColumnSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/ColumnSelector.java new file mode 100644 index 00000000..6deb39b9 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/ColumnSelector.java @@ -0,0 +1,52 @@ +package com.gitee.gen.gen; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 表信息查询 + */ +public abstract class ColumnSelector { + + private GeneratorConfig generatorConfig; + + public ColumnSelector(GeneratorConfig generatorConfig){ + this.generatorConfig = generatorConfig; + } + + /** + * 返回查询表字段信息的SQL语句,不同的数据查询表信息不一样 + * 如mysql是DESC tableName + * @return + */ + protected abstract String getColumnInfoSQL(String tableName); + + /** + * 构建列信息 + * @param rowMap + * @return + */ + protected abstract ColumnDefinition buildColumnDefinition(Map rowMap); + + public List getColumnDefinitions(String tableName) { + List> resultList = SqlHelper.runSql(this.getGeneratorConfig(), getColumnInfoSQL(tableName)); + + List columnDefinitionList = new ArrayList(resultList.size()); + // 构建columnDefinition + for (Map rowMap : resultList) { + columnDefinitionList.add(buildColumnDefinition(rowMap)); + } + + return columnDefinitionList; + } + + public GeneratorConfig getGeneratorConfig() { + return generatorConfig; + } + + public void setGeneratorConfig(GeneratorConfig generatorConfig) { + this.generatorConfig = generatorConfig; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/CsharpColumnDefinition.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/CsharpColumnDefinition.java new file mode 100644 index 00000000..be0dc57a --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/CsharpColumnDefinition.java @@ -0,0 +1,27 @@ +package com.gitee.gen.gen; + +import com.gitee.gen.gen.converter.ColumnTypeConverter; +import com.gitee.gen.gen.converter.CsharpColumnTypeConverter; +import com.gitee.gen.util.FieldUtil; + +/** + * 提供C# Velocity变量 + * @author tanghc + */ +public class CsharpColumnDefinition extends ColumnDefinition { + + private static final ColumnTypeConverter COLUMN_TYPE_CONVERTER = new CsharpColumnTypeConverter(); + + public String getField() { + return FieldUtil.underlineFilter(getColumnName()); + } + + public String getProperty() { + return FieldUtil.upperFirstLetter(getField()); + } + + @Override + public ColumnTypeConverter getColumnTypeConverter() { + return COLUMN_TYPE_CONVERTER; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/DBConnect.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/DBConnect.java new file mode 100644 index 00000000..01bd169e --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/DBConnect.java @@ -0,0 +1,50 @@ +package com.gitee.gen.gen; + + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class DBConnect { + + public static Connection getConnection(GeneratorConfig config) throws ClassNotFoundException, SQLException { + Class.forName(config.getDriverClass()); + return DriverManager.getConnection(config.getJdbcUrl(), + config.getUsername(), config.getPassword()); + } + + /** + * 测试连接,返回错误信息,无返回内容说明连接成功 + * + * @param generatorConfig 数据源配置 + * @return 返回错误信息, 无返回内容说明连接成功 + */ + public static String testConnection(GeneratorConfig generatorConfig) { + Connection con = null; + String ret = null; + try { + con = DBConnect.getConnection(generatorConfig); + // 不为空说明连接成功 + if (con == null) { + ret = generatorConfig.getDbName() + "连接失败"; + } + } catch (ClassNotFoundException e) { + ret = generatorConfig.getDbName() + "连接失败" + "," + + "找不到驱动" + generatorConfig.getDriverClass(); + } catch (SQLException e) { + ret = generatorConfig.getDbName() + "连接失败" + "," + + e.getMessage(); + } finally { + if (con != null) { + try { + con.close(); // 关闭连接,该连接无实际用处 + } catch (SQLException e) { + e.printStackTrace(); + ret = e.getMessage(); + } + } + } + + return ret; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/DataSourceManager.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/DataSourceManager.java new file mode 100644 index 00000000..77e26240 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/DataSourceManager.java @@ -0,0 +1,77 @@ +package com.gitee.gen.gen; + +import org.apache.commons.dbcp2.BasicDataSourceFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author tanghc + */ +public class DataSourceManager { + + private static final Logger logger = LoggerFactory.getLogger(DataSourceManager.class); + + + private static final Map DATA_SOURCE_MAP = new ConcurrentHashMap<>(16); + + public static Connection getConnection(GeneratorConfig generatorConfig) { + try { + return getDataSource(generatorConfig).getConnection(); + } catch (SQLException e) { + logger.error("获取Connection失败, jdbcUrl:{}", generatorConfig.getJdbcUrl(), e); + throw new RuntimeException("获取Connection失败", e); + } + } + + public static void closeConnection(Connection connection) { + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) { + logger.error("close connection error", e); + } + } + } + + public static DataSource getDataSource(GeneratorConfig generatorConfig) { + String jdbcUrl = generatorConfig.getJdbcUrl() + ":" + generatorConfig.getUsername(); + DataSource dataSource = DATA_SOURCE_MAP.computeIfAbsent(jdbcUrl, key -> { + Properties properties = new Properties(); + properties.put("driverClassName", generatorConfig.getDriverClass()); + properties.put("url", generatorConfig.getJdbcUrl()); + properties.put("username", generatorConfig.getUsername()); + properties.put("password", generatorConfig.getPassword()); + // 初始连接数 + properties.put("initialSize", 1); + // 最大活跃数 + properties.put("maxTotal", 30); + properties.put("minIdle", 5); + properties.put("maxIdle", 10); + // 最长等待时间(毫秒) + properties.put("maxWaitMillis", 1000); + // 程序中的连接不使用后是否被连接池回收 + properties.put("removeAbandonedOnMaintenance", true); + properties.put("removeAbandonedOnBorrow", true); + // 连接在所指定的秒数内未使用才会被删除(秒) + properties.put("removeAbandonedTimeout", 5); + try { + return BasicDataSourceFactory.createDataSource(properties); + } catch (Exception e) { + logger.error("create datasource error, jdbcUr={}", jdbcUrl, e); + return null; + } + }); + if (dataSource == null) { + throw new RuntimeException("连接数据库失败"); + } + return dataSource; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/DbType.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/DbType.java new file mode 100644 index 00000000..4cf118b8 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/DbType.java @@ -0,0 +1,73 @@ +package com.gitee.gen.gen; + +/** + * 改成配在app.yml中 + * + * @author tanghc + */ +@Deprecated +public enum DbType { + + MYSQL(1, + "MySQL", + "com.mysql.cj.jdbc.Driver", + "jdbc:mysql://%s:%s/%s?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai" + ), + ORACLE(2, + "Oracle", + "oracle.jdbc.driver.OracleDriver", + "jdbc:oracle:thin:@%s:%s%s"), + + SQL_SERVER(3, + "SQL Server", + "com.microsoft.sqlserver.jdbc.SQLServerDriver", + "jdbc:sqlserver://%s:%s;DatabaseName=%s;trustServerCertificate=true"), + + POSTGRE_SQL(4, + "PostgreSQL", + "org.postgresql.Driver", + "jdbc:postgresql://%s:%s/%s"), + + DM(5, + "DM", + "dm.jdbc.driver.DmDriver", + "jdbc:dm://%s:%s/%s"), + + ; + private final int type; + private final String displayName; + private final String driverClass; + private final String jdbcUrl; + + DbType(int type, String displayName, String driverClass, String jdbcUrl) { + this.type = type; + this.displayName = displayName; + this.driverClass = driverClass; + this.jdbcUrl = jdbcUrl; + } + + public static DbType of(int type) { + for (DbType value : DbType.values()) { + if (value.type == type) { + return value; + } + } + return null; + } + + public String getDisplayName() { + return displayName; + } + + public String getJdbcUrl() { + return jdbcUrl; + } + + public int getType() { + return type; + } + + public String getDriverClass() { + return driverClass; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/GeneratorConfig.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/GeneratorConfig.java new file mode 100644 index 00000000..0b1c1037 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/GeneratorConfig.java @@ -0,0 +1,128 @@ +package com.gitee.gen.gen; + +import com.gitee.gen.config.ConnectConfig; +import com.gitee.gen.config.DbTypeConfig; +import com.gitee.gen.entity.DatasourceConfig; +import org.noear.snack.core.utils.StringUtil; + + +public class GeneratorConfig { + + private Integer dbType; + /** 数据库名称 */ + private String dbName; + /** schema(PGSQL专用) */ + private String schemaName; + /** + * 驱动class + */ + private String driverClass; + /** 数据库host */ + private String host; + /** 数据库端口 */ + private Integer port; + /** 数据库用户名 */ + private String username; + /** 数据库密码 */ + private String password; + + + public static GeneratorConfig build(DatasourceConfig datasourceConfig) { + GeneratorConfig generatorConfig = new GeneratorConfig(); + generatorConfig.setDbName(datasourceConfig.getDbName()); + generatorConfig.setDbType(datasourceConfig.getDbType()); + generatorConfig.setHost(datasourceConfig.getHost()); + generatorConfig.setPort(datasourceConfig.getPort()); + generatorConfig.setUsername(datasourceConfig.getUsername()); + generatorConfig.setPassword(datasourceConfig.getPassword()); + generatorConfig.setSchemaName(datasourceConfig.getSchemaName()); + String driver = datasourceConfig.getDriverClass(); + if (StringUtil.isEmpty(driver)) { + ConnectConfig connectConfig = DbTypeConfig.getInstance().getConnectConfig(datasourceConfig.getDbType()); + driver = connectConfig.getDriver(); + } + generatorConfig.setDriverClass(driver); + return generatorConfig; + } + + public String getJdbcUrl() { + ConnectConfig connectConfig = DbTypeConfig.getInstance().getConnectConfig(dbType); + if (dbType == null) { + throw new RuntimeException("不支持数据库类型" + this.dbType + ",请在 app.yml 中配置"); + } + String jdbcUrl = connectConfig.getUrl(); + // jdbc:mysql://{HOST}:{PORT}/{DB_NAME}?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + jdbcUrl = jdbcUrl.replace("{HOST}", host); + jdbcUrl = jdbcUrl.replace("{PORT}", String.valueOf(port)); + jdbcUrl = jdbcUrl.replace("{DB_NAME}", dbName); + return jdbcUrl; + } + + public String getDbName() { + return dbName; + } + + public void setDbName(String dbName) { + this.dbName = dbName; + } + + public Integer getDbType() { + return dbType; + } + + public void setDbType(Integer dbType) { + this.dbType = dbType; + } + + public void setPort(Integer port) { + this.port = port; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getSchemaName() { + return schemaName; + } + + public void setSchemaName(String schemaName) { + this.schemaName = schemaName; + } + + public void setDriverClass(String driverClass) { + this.driverClass = driverClass; + } + + public String getDriverClass() { + return driverClass; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/JavaColumnDefinition.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/JavaColumnDefinition.java new file mode 100644 index 00000000..6b115ada --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/JavaColumnDefinition.java @@ -0,0 +1,86 @@ +package com.gitee.gen.gen; + +import com.gitee.gen.gen.converter.ColumnTypeConverter; +import com.gitee.gen.gen.converter.JavaColumnTypeConverter; +import com.gitee.gen.util.FieldUtil; +import org.apache.commons.lang.StringUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author tanghc + */ +public class JavaColumnDefinition extends ColumnDefinition { + + private static final JavaColumnTypeConverter COLUMN_TYPE_CONVERTER = new JavaColumnTypeConverter(); + + private static final Map TYPE_MYBATIS_MAP = new HashMap<>(64); + + static { + TYPE_MYBATIS_MAP.put(TypeEnum.BIT.getType(), "BOOLEAN"); + TYPE_MYBATIS_MAP.put(TypeEnum.BOOLEAN.getType(), "BOOLEAN"); + TYPE_MYBATIS_MAP.put(TypeEnum.TINYINT.getType(), "TINYINT"); + TYPE_MYBATIS_MAP.put(TypeEnum.SMALLINT.getType(), "INTEGER"); + TYPE_MYBATIS_MAP.put(TypeEnum.INT.getType(), "INTEGER"); + TYPE_MYBATIS_MAP.put(TypeEnum.BIGINT.getType(), "BIGINT"); + TYPE_MYBATIS_MAP.put(TypeEnum.FLOAT.getType(), "FLOAT"); + TYPE_MYBATIS_MAP.put(TypeEnum.DOUBLE.getType(), "DOUBLE"); + TYPE_MYBATIS_MAP.put(TypeEnum.DECIMAL.getType(), "DECIMAL"); + TYPE_MYBATIS_MAP.put(TypeEnum.VARCHAR.getType(), "VARCHAR"); + TYPE_MYBATIS_MAP.put(TypeEnum.DATETIME.getType(), "TIMESTAMP"); + TYPE_MYBATIS_MAP.put(TypeEnum.BLOB.getType(), "BLOB"); + } + + public String getMybatisJdbcType() { + return TYPE_MYBATIS_MAP.getOrDefault(getType(), "VARCHAR"); + } + + /** + * 返回java字段名,并且第一个字母大写 + * + * @return 返回字段名 + */ + public String getJavaFieldNameUF() { + return FieldUtil.upperFirstLetter(getJavaFieldName()); + } + + /** + * 返回java字段 + * + * @return 返回java字段 + */ + public String getJavaFieldName() { + String fieldName = FieldUtil.underlineFilter(getColumnName()); + if(StringUtils.isEmpty(fieldName)){ + return fieldName; + } + fieldName = fieldName.replaceAll("_", ""); + return fieldName.substring(0, 1).toLowerCase() + fieldName.substring(1); + } + + /** + * 获得基本类型,int,float + * + * @return 返回基本类型 + */ + + public String getJavaType() { + return getFieldType(); + } + + /** + * 获得装箱类型,Integer,Float + * + * @return 返回装箱类型 + */ + + public String getJavaTypeBox() { + return getFieldTypeBox(); + } + + @Override + public ColumnTypeConverter getColumnTypeConverter() { + return COLUMN_TYPE_CONVERTER; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SQLContext.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SQLContext.java new file mode 100644 index 00000000..ba5cf0be --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SQLContext.java @@ -0,0 +1,299 @@ +package com.gitee.gen.gen; + +import com.gitee.gen.common.IdWorker; +import com.gitee.gen.util.FieldUtil; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.RandomUtils; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Properties; +import java.util.UUID; + +/** + * SQL上下文,这里可以取到表,字段信息
+ * 最终会把SQL上下文信息放到velocity中 + */ +public class SQLContext { + + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss"); + + private final LocalDateTime localDateTime = LocalDateTime.now(); + + /** + * 表结构定义 + */ + private final TableDefinition tableDefinition; + private final ColumnDefinition javaPkColumn; + /** + * 包名 + */ + private String packageName; + + /** + * 包的子路径 + */ + private String packageSubPath; + + /** + * 删除的前缀 + */ + private String delPrefix; + + /** + * 数据库名 + */ + private String dbName; + + /** + * 作者名 + */ + private String author; + + private Properties extConfig; + + public SQLContext(TableDefinition tableDefinition) { + this.tableDefinition = tableDefinition; + // 默认为全字母小写的类名 + this.packageName = getJavaBeanName().toLowerCase(); + this.javaPkColumn = this.tableDefinition.getPkColumn(); + } + + public String getDbNameCamel() { + return FieldUtil.underlineFilter(getDbName()); + } + + /** + * 干净的库名(移除下划线,横杠,点)并小写 + * @return + */ + public String getDbNameClean() { + return getDbName().replace("_", "") + .replace("-", "") + .replace(".", "").toLowerCase(); + } + + public String getDatetime() { + return localDateTime.format(DATE_TIME_FORMATTER); + } + + public String getDate() { + return localDateTime.format(DATE_FORMATTER); + } + + public String getTime() { + return localDateTime.format(TIME_FORMATTER); + } + + public int getRandomInt() { + return RandomUtils.nextInt(Integer.MAX_VALUE); + } + + public long getRandomLong() { + return RandomUtils.nextLong(); + } + + public boolean getRandomBoolean() { + return RandomUtils.nextBoolean(); + } + + public String getUuid() { + return UUID.randomUUID().toString(); + } + + public long getNextId() { + return IdWorker.getInstance().nextId(); + } + + /** + * 返回Java类名 + * + * @return + */ + public String getJavaBeanName() { + return getClassName(); + } + + /** + * 返回类名 UserInfo + * @return + */ + public String getClassName() { + String tableName = getJavaBeanNameLF(); + return FieldUtil.upperFirstLetter(tableName); + } + + /** + * 返回Java类名且首字母小写 + * + * @return + */ + public String getJavaBeanNameLF() { + String tableName = tableDefinition.getTableName(); + if(delPrefix != null){ + String[] split = delPrefix.split("\\s*,\\s*"); + for (String prefix : split){ + tableName = StringUtils.removeStart(tableName, prefix); + } + } + + tableName = FieldUtil.underlineFilter(tableName); + tableName = FieldUtil.dotFilter(tableName); + return FieldUtil.lowerFirstLetter(tableName); + } + + /** + * 返回类名,如:UserInfo + * @return 类名 + */ + public String getClassNamePascal() { + return getClassName(); + } + + /** + * 返回类名且首字母小写,如:userInfo + * @return 类名 + */ + public String getClassNameCamel() { + return getJavaBeanNameLF(); + } + + /** + * 返回类名且小写,如:userinfo + * @return 类名 + */ + public String getClassNameLower() { + return getClassName().toLowerCase(); + } + + /** + * 小写类名且横杠相连,如:user-info + * @return 类名 + */ + public String getClassNameKebab() { + return getJavaBeanNameHB(); + } + + /** + * 返回类名且横杠相连,如:User-Info + * @return 类名 + */ + public String getClassNamePascalKebab() { + String tableName = tableDefinition.getTableName(); + String[] split = tableName.split("_"); + for (int i = 0; i < split.length; i++) { + split[i] = FieldUtil.upperFirstLetter(split[i]); + } + return String.join("-", split); + } + + /** + * 返回Java类名全小写 + * + * @return + */ + public String getJavaBeanNameL() { + return getJavaBeanNameLF().toLowerCase(); + } + + /** + * 返回Java类名驼峰转横杠 + * + * @return User-Info + */ + public String getJavaBeanNameHB() { + String tableName = tableDefinition.getTableName(); + if(delPrefix != null){ + String[] split = delPrefix.split("\\s*,\\s*"); + for (String prefix : split){ + tableName = StringUtils.removeStart(tableName, prefix); + } + } + + tableName = tableName.replace("_","-"); + tableName = FieldUtil.dotFilter(tableName); + return tableName; + } + + public String getPkName() { + if (javaPkColumn != null) { + return javaPkColumn.getColumnName(); + } + return ""; + } + + public String getJavaPkName() { + if (javaPkColumn != null) { + return javaPkColumn.getJavaFieldName(); + } + return ""; + } + + public String getJavaPkType() { + if (javaPkColumn != null) { + return javaPkColumn.getJavaType(); + } + return ""; + } + + public String getMybatisPkType() { + if (javaPkColumn != null) { + return javaPkColumn.getMybatisJdbcType(); + } + return ""; + } + + public TableDefinition getTableDefinition() { + return tableDefinition; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getDelPrefix() { + return delPrefix; + } + + public void setDelPrefix(String delPrefix) { + this.delPrefix = delPrefix; + } + + public String getDbName() { + return dbName; + } + + public void setDbName(String dbName) { + this.dbName = dbName; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getPackageSubPath() { + return packageSubPath; + } + + public void setPackageSubPath(String packageSubPath) { + this.packageSubPath = packageSubPath; + } + + public Properties getExtConfig() { + return extConfig; + } + + public void setExtConfig(Properties extConfig) { + this.extConfig = extConfig; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SQLService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SQLService.java new file mode 100644 index 00000000..53fcbbf1 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SQLService.java @@ -0,0 +1,8 @@ +package com.gitee.gen.gen; + + +public interface SQLService { + + TableSelector getTableSelector(GeneratorConfig generatorConfig); + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SQLServiceFactory.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SQLServiceFactory.java new file mode 100644 index 00000000..95fe2f3f --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SQLServiceFactory.java @@ -0,0 +1,28 @@ +package com.gitee.gen.gen; + +import com.gitee.gen.config.ConnectConfig; +import com.gitee.gen.config.DbTypeConfig; +import org.noear.solon.core.util.ClassUtil; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class SQLServiceFactory { + + + private static final Map SERVICE_CONFIG = new ConcurrentHashMap<>(16); + + public static SQLService build(GeneratorConfig generatorConfig) { + Integer dbType = generatorConfig.getDbType(); + return SERVICE_CONFIG.computeIfAbsent(dbType, k -> { + ConnectConfig connectConfig = DbTypeConfig.getInstance().getConnectConfig(dbType); + String className = connectConfig.getServiceName(); + Class aClass = ClassUtil.loadClass(className); + if (aClass == null) { + throw new RuntimeException("找不到数据库服务类:" + className); + } + return ClassUtil.newInstance(aClass); + }); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SqlHelper.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SqlHelper.java new file mode 100644 index 00000000..3424a6df --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/SqlHelper.java @@ -0,0 +1,106 @@ +package com.gitee.gen.gen; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; +import java.util.Map; +import javax.sql.DataSource; +import org.apache.ibatis.jdbc.SqlRunner; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.scripting.xmltags.DynamicSqlSource; +import org.apache.ibatis.scripting.xmltags.TextSqlNode; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.transaction.TransactionFactory; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 执行SQL语句的帮助类 + * + * @author hc.tang + */ +public class SqlHelper { + private static final Logger logger = LoggerFactory.getLogger(SqlHelper.class); + + /** + *
+     * String sql = "SELECT * FROM datasource_config WHERE dc_id=${id}";
+     *
+     * DataSourceConfig dataSourceConfig = new DataSourceConfig();
+     * dataSourceConfig.setDriverClass("com.mysql.cj.jdbc.Driver");
+     * dataSourceConfig.setJdbcUrl("jdbc:mysql://localhost:3306/auto_code");
+     * dataSourceConfig.setUsername("root");
+     * dataSourceConfig.setPassword("root");
+     *
+     * Map params = new HashMap();
+     * params.put("id", 2);
+     *
+     * List> map = SqlHelper.runSql(dataSourceConfig, sql,params);
+     * 
+ * + * @param generatorConfig 配置 + * @param sql sql + * @param params 参数 + * @return 返回查询结果 + */ + public static List> runSql(GeneratorConfig generatorConfig, String sql, + Map params) { + + DataSource dataSource = DataSourceManager.getDataSource(generatorConfig); + String runSql = buildSqlWithParams(dataSource, sql, params); + String[] sqls = runSql.split(";"); + Connection conn = null; + try { + conn = DataSourceManager.getConnection(generatorConfig); + SqlRunner runner = buildSqlRunner(conn); + int sqlCount = sqls.length; + if (sqlCount == 1) { + return runner.selectAll(sqls[0]); + } else { + for (int i = 0; i < sqlCount - 1; i++) { + runner.run(sqls[i]); + } + return runner.selectAll(sqls[sqlCount - 1]); + } + } catch (SQLException e1) { + logger.error("生成代码错误", e1); + throw new RuntimeException("生成代码错误"); + } finally { + DataSourceManager.closeConnection(conn); + } + } + + /** + * 参数绑定 + * + * @param dataSource 数据源 + * @param sql sql模板 + * @param params 参数 + * @return 构建好的耍起莱 + */ + private static String buildSqlWithParams(DataSource dataSource, String sql, Map params) { + Configuration configuration = buildConfiguration(dataSource); + TextSqlNode node = new TextSqlNode(sql); + DynamicSqlSource dynamicSqlSource = new DynamicSqlSource(configuration, node); + BoundSql boundSql = dynamicSqlSource.getBoundSql(params); + return boundSql.getSql(); + } + + public static List> runSql(GeneratorConfig dataBaseConfig, String sql) { + return runSql(dataBaseConfig, sql, null); + } + + private static SqlRunner buildSqlRunner(Connection connection) { + return new SqlRunner(connection); + } + + private static Configuration buildConfiguration(DataSource dataSource) { + TransactionFactory transactionFactory = new JdbcTransactionFactory(); + Environment environment = new Environment("development", + transactionFactory, dataSource); + return new Configuration(environment); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TableBean.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TableBean.java new file mode 100644 index 00000000..1ead6063 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TableBean.java @@ -0,0 +1,19 @@ +package com.gitee.gen.gen; + +public class TableBean { + + public TableBean(String tableName) { + this.tableName = tableName; + } + + private String tableName; + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TableDefinition.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TableDefinition.java new file mode 100644 index 00000000..6cf9c61e --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TableDefinition.java @@ -0,0 +1,190 @@ +package com.gitee.gen.gen; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +/** + * 数据库表定义,从这里可以获取表名,字段信息 + */ +public class TableDefinition { + + /** + * PSSQL对应的schema + */ + private String schema; + + /** + * 表名 + */ + private String tableName; + + /** + * 表注释 + */ + private String comment; + + /** Java相关字段 */ + private transient List columnDefinitions = Collections.emptyList(); + + /** C#相关字段 */ + private transient List csharpColumnDefinitions = Collections.emptyList(); + + public TableDefinition() { + } + + public TableDefinition(String tableName) { + this.tableName = tableName; + } + + /** + * 返回字段数量 + * + * @return 字段数量,>=0 + */ + public int getColumnCount() { + return columnDefinitions.size(); + } + + /** + * 是否有时间字段 + * @return true:有 + */ + public boolean getHasDateColumn() { + for (ColumnDefinition definition : columnDefinitions) { + if (TypeEnum.DATETIME.getType().equalsIgnoreCase(definition.getType())) { + return true; + } + } + return false; + } + + /** + * 是否含有时间字段 + * + * @return + */ + public boolean getHasDateField() { + for (ColumnDefinition definition : columnDefinitions) { + if (Date.class.getSimpleName().equals((definition).getJavaType())) { + return true; + } + } + return false; + } + + public boolean getHasLocalDateField() { + for (ColumnDefinition definition : columnDefinitions) { + if (LocalDate.class.getSimpleName().equals((definition).getJavaType())) { + return true; + } + } + return false; + } + + public boolean getHasLocalDateTimeField() { + for (ColumnDefinition definition : columnDefinitions) { + if (LocalDateTime.class.getSimpleName().equals((definition).getJavaType())) { + return true; + } + } + return false; + } + + /** + * 是否含有BigDecimal字段 + * + * @return + */ + public boolean getHasBigDecimalField() { + for (ColumnDefinition definition : columnDefinitions) { + if ("BigDecimal".equals((definition).getJavaType())) { + return true; + } + } + return false; + } + + public boolean getHasJsonbField() { + for (ColumnDefinition definition : columnDefinitions) { + if ("jsonb".equals(definition.getType())) { + return true; + } + } + return false; + } + + /** + * 是否含有Long字段 + * + * @return + */ + public boolean getHasLongField() { + for (ColumnDefinition definition : columnDefinitions) { + if ("Long".equals((definition).getJavaType())) { + return true; + } + } + return false; + } + + /** + * 获取主键信息 + * + * @return 返回主键信息,如果没有则抛出异常 + */ + public ColumnDefinition getPkColumn() { + ColumnDefinition pk = null; + for (ColumnDefinition column : columnDefinitions) { + if (column.getColumnName().equalsIgnoreCase("id")) { + pk = column; + } + if (column.getIsPk()) { + return column; + } + } + return pk; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public List getColumnDefinitions() { + return columnDefinitions; + } + + public void setColumnDefinitions(List columnDefinitions) { + this.columnDefinitions = columnDefinitions; + } + + public List getCsharpColumnDefinitions() { + return csharpColumnDefinitions; + } + + public void setCsharpColumnDefinitions(List csharpColumnDefinitions) { + this.csharpColumnDefinitions = csharpColumnDefinitions; + } + + public String getSchema() { + return schema; + } + + public void setSchema(String schema) { + this.schema = schema; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TableSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TableSelector.java new file mode 100644 index 00000000..e29d118c --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TableSelector.java @@ -0,0 +1,125 @@ +package com.gitee.gen.gen; + + +import com.gitee.gen.gen.converter.ColumnTypeConverter; +import org.noear.solon.Utils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; +import java.util.stream.Collectors; + + +public abstract class TableSelector { + + private ColumnSelector columnSelector; + private GeneratorConfig generatorConfig; + private List schTableNames; + + private ColumnTypeConverter columnTypeConverter; + + public TableSelector(ColumnSelector columnSelector, GeneratorConfig generatorConfig) { + this.generatorConfig = generatorConfig; + this.columnSelector = columnSelector; + } + + /** + * 查询数据库表的SQL + * 1.如果是oracle的話則應該傳入用戶名,oracle是根據用戶去管理數據的 + * 2.mysql的话是传入数据库名,mysql和sqlserver是根据数据库去管理的 + * @param generatorConfig 配置 + * @return 返回获取表信息的sql + */ + protected abstract String getShowTablesSQL(GeneratorConfig generatorConfig); + + protected abstract TableDefinition buildTableDefinition(Map tableMap); + + public List getTableDefinitions() { + List> resultList = SqlHelper.runSql(getGeneratorConfig(), getShowTablesSQL(generatorConfig)); + List tablesList = new ArrayList(resultList.size()); + + for (Map rowMap : resultList) { + TableDefinition tableDefinition = this.buildTableDefinition(rowMap); + String tableName = tableDefinition.getTableName(); + List columnDefinitions = columnSelector.getColumnDefinitions(tableName); + tableDefinition.setColumnDefinitions(buildRealColumnDefinitions(columnDefinitions, ColumnDefinition::new)); + tableDefinition.setCsharpColumnDefinitions(buildRealColumnDefinitions(columnDefinitions, CsharpColumnDefinition::new)); + tablesList.add(tableDefinition); + } + + return tablesList; + } + + private List buildRealColumnDefinitions(List columnDefinitions, Supplier supplier) { + return columnDefinitions.stream() + .map(columnDefinition -> { + T t = supplier.get(); + t.setMaxLength(columnDefinition.getMaxLength()); + t.setScale(columnDefinition.getScale()); + t.setColumnName(columnDefinition.getColumnName()); + t.setType(columnDefinition.getType()); + t.setIsIdentity(columnDefinition.getIsIdentity()); + t.setIsPk(columnDefinition.getIsPk()); + t.setComment(columnDefinition.getComment()); + t.setIsNullable(columnDefinition.getIsNullable()); + t.setColumnTypeConverter(columnTypeConverter); + return t; + }) + .collect(Collectors.toList()); + } + + public List getSimpleTableDefinitions() { + List> resultList = SqlHelper.runSql(getGeneratorConfig(), getShowTablesSQL(generatorConfig)); + List tablesList = new ArrayList(resultList.size()); + + for (Map rowMap : resultList) { + tablesList.add(this.buildTableDefinition(rowMap)); + } + + return tablesList; + } + + public List wrapTableNames() { + List schTableNames = this.getSchTableNames(); + if (Utils.isEmpty(schTableNames)) { + return Collections.emptyList(); + } + return schTableNames.stream() + .map(this::wrapValue) + .collect(Collectors.toList()); + } + + protected String wrapValue(String tableName) { + return String.format("'%s'", tableName); + } + + public GeneratorConfig getGeneratorConfig() { + return generatorConfig; + } + + public void setGeneratorConfig(GeneratorConfig generatorConfig) { + this.generatorConfig = generatorConfig; + } + + public ColumnSelector getColumnSelector() { + return columnSelector; + } + + public void setColumnSelector(ColumnSelector columnSelector) { + this.columnSelector = columnSelector; + } + + public List getSchTableNames() { + return schTableNames; + } + + public void setSchTableNames(List schTableNames) { + this.schTableNames = schTableNames; + } + + public void setColumnTypeConverter(ColumnTypeConverter columnTypeConverter) { + this.columnTypeConverter = columnTypeConverter; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TypeEnum.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TypeEnum.java new file mode 100644 index 00000000..1d72730e --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TypeEnum.java @@ -0,0 +1,47 @@ +package com.gitee.gen.gen; + +/** + * 统一类型枚举 + * + * @author tanghc + */ +public enum TypeEnum { + + BIT("bit"), + + BOOLEAN("boolean"), + + TINYINT("tinyint"), + + SMALLINT("smallint"), + + INT("int"), + + BIGINT("bigint"), + + FLOAT("float"), + + DOUBLE("double"), + + DECIMAL("decimal"), + + VARCHAR("varchar"), + + DATETIME("datetime"), + DATE("date"), + + BLOB("blob"), + + JSONB("jsonb") + + ; + private final String type; + + TypeEnum(String type) { + this.type = type; + } + + public String getType() { + return type; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TypeFormatter.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TypeFormatter.java new file mode 100644 index 00000000..96b02c4e --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/TypeFormatter.java @@ -0,0 +1,89 @@ +package com.gitee.gen.gen; + +import org.apache.commons.lang.StringUtils; + +import java.util.List; + +/** + * 将各数据库类型格式化成统一的类型 + * @see TypeEnum + * @author tanghc + */ +public interface TypeFormatter { + + default String format(String columnType) { + if (isBit(columnType)) { + return TypeEnum.BIT.getType(); + } + if (isBoolean(columnType)) { + return TypeEnum.BOOLEAN.getType(); + } + if (isTinyint(columnType)) { + return TypeEnum.TINYINT.getType(); + } + if (isSmallint(columnType)) { + return TypeEnum.SMALLINT.getType(); + } + if (isInt(columnType)) { + return TypeEnum.INT.getType(); + } + if (isLong(columnType)) { + return TypeEnum.BIGINT.getType(); + } + if (isFloat(columnType)) { + return TypeEnum.FLOAT.getType(); + } + if (isDouble(columnType)) { + return TypeEnum.DOUBLE.getType(); + } + if (isDecimal(columnType)) { + return TypeEnum.DECIMAL.getType(); + } + if(isJsonb(columnType)){ + return TypeEnum.JSONB.getType(); + } + if (isVarchar(columnType)) { + return TypeEnum.VARCHAR.getType(); + } + if (isDatetime(columnType)) { + return TypeEnum.DATETIME.getType(); + } + if (isDate(columnType)) { + return TypeEnum.DATE.getType(); + } + if (isBlob(columnType)) { + return TypeEnum.BLOB.getType(); + } + + return TypeEnum.VARCHAR.getType(); + } + + default boolean contains(List columnTypes, String type) { + for (String columnType : columnTypes) { + if (type.equalsIgnoreCase(columnType)) { + return true; + } + } + for (String columnType : columnTypes) { + if (StringUtils.containsIgnoreCase(type, columnType)) { + return true; + } + } + return false; + } + + boolean isBit(String columnType); + boolean isBoolean(String columnType); + boolean isTinyint(String columnType); + boolean isSmallint(String columnType); + boolean isInt(String columnType); + boolean isLong(String columnType); + boolean isFloat(String columnType); + boolean isDouble(String columnType); + boolean isDecimal(String columnType); + boolean isVarchar(String columnType); + boolean isDatetime(String columnType); + boolean isDate(String columnType); + boolean isBlob(String columnType); + boolean isJsonb(String columnType); +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/ColumnTypeConverter.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/ColumnTypeConverter.java new file mode 100644 index 00000000..81f7c184 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/ColumnTypeConverter.java @@ -0,0 +1,24 @@ +package com.gitee.gen.gen.converter; + +/** + * 将数据库类型转换成各语言对应的类型 + * @see com.gitee.gen.gen.TypeEnum + * @author tanghc + */ +public interface ColumnTypeConverter { + + /** + * 将数据库类型转成基本类型 + * @param type 数据库类型 + * @return 基本类型 + */ + String convertType(String type); + + /** + * 将数据库类型转成装箱类型 + * @param type 数据库类型 + * @return 装箱类型 + */ + String convertTypeBox(String type); + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/CsharpColumnTypeConverter.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/CsharpColumnTypeConverter.java new file mode 100644 index 00000000..7c425132 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/CsharpColumnTypeConverter.java @@ -0,0 +1,39 @@ +package com.gitee.gen.gen.converter; + +import com.gitee.gen.gen.TypeEnum; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author tanghc + */ +public class CsharpColumnTypeConverter implements ColumnTypeConverter { + + private static final Map TYPE_MAP = new HashMap<>(64); + static { + TYPE_MAP.put(TypeEnum.BIT.getType(), "bool"); + TYPE_MAP.put(TypeEnum.BOOLEAN.getType(), "bool"); + TYPE_MAP.put(TypeEnum.TINYINT.getType(), "int"); + TYPE_MAP.put(TypeEnum.SMALLINT.getType(), "int"); + TYPE_MAP.put(TypeEnum.INT.getType(), "int"); + TYPE_MAP.put(TypeEnum.BIGINT.getType(), "long"); + TYPE_MAP.put(TypeEnum.FLOAT.getType(), "float"); + TYPE_MAP.put(TypeEnum.DOUBLE.getType(), "double"); + TYPE_MAP.put(TypeEnum.DECIMAL.getType(), "decimal"); + TYPE_MAP.put(TypeEnum.VARCHAR.getType(), "string"); + TYPE_MAP.put(TypeEnum.DATETIME.getType(), "DateTime"); + TYPE_MAP.put(TypeEnum.BLOB.getType(), "byte[]"); + } + + @Override + public String convertType(String type) { + return TYPE_MAP.getOrDefault(type, "string"); + } + + @Override + public String convertTypeBox(String type) { + return this.convertType(type); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/DbColumnTypeConverter.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/DbColumnTypeConverter.java new file mode 100644 index 00000000..5fdc6680 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/DbColumnTypeConverter.java @@ -0,0 +1,36 @@ +package com.gitee.gen.gen.converter; + +import com.gitee.gen.entity.TypeConfig; + +import java.util.Map; + +/** + * @author thc + */ +public class DbColumnTypeConverter implements ColumnTypeConverter { + + + private static TypeConfig DEF = new TypeConfig(); + static { + DEF.setBaseType("String"); + DEF.setBoxType("String"); + } + + // db_type + private final Map typeMap; + + public DbColumnTypeConverter(Map typeMap) { + this.typeMap = typeMap; + } + + @Override + public String convertType(String type) { + return typeMap.getOrDefault(type, DEF).getBaseType(); + } + + @Override + public String convertTypeBox(String type) { + return typeMap.getOrDefault(type, DEF).getBoxType(); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/JavaColumnTypeConverter.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/JavaColumnTypeConverter.java new file mode 100644 index 00000000..2400dda8 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/converter/JavaColumnTypeConverter.java @@ -0,0 +1,57 @@ +package com.gitee.gen.gen.converter; + +import com.gitee.gen.gen.TypeEnum; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author tanghc + */ +public class JavaColumnTypeConverter implements ColumnTypeConverter { + + private static final Map TYPE_MAP = new HashMap<>(64); + private static final Map TYPE_BOX_MAP = new HashMap<>(64); + static { + TYPE_MAP.put(TypeEnum.BIT.getType(), "boolean"); + TYPE_MAP.put(TypeEnum.BOOLEAN.getType(), "boolean"); + TYPE_MAP.put(TypeEnum.TINYINT.getType(), "int"); + TYPE_MAP.put(TypeEnum.SMALLINT.getType(), "int"); + TYPE_MAP.put(TypeEnum.INT.getType(), "int"); + TYPE_MAP.put(TypeEnum.BIGINT.getType(), "long"); + TYPE_MAP.put(TypeEnum.FLOAT.getType(), "float"); + TYPE_MAP.put(TypeEnum.DOUBLE.getType(), "double"); + TYPE_MAP.put(TypeEnum.DECIMAL.getType(), "BigDecimal"); + TYPE_MAP.put(TypeEnum.VARCHAR.getType(), "string"); + TYPE_MAP.put(TypeEnum.DATETIME.getType(), "LocalDateTime"); + TYPE_MAP.put(TypeEnum.DATE.getType(), "LocalDate"); + TYPE_MAP.put(TypeEnum.BLOB.getType(), "byte[]"); + TYPE_MAP.put(TypeEnum.JSONB.getType(), "Map"); + + TYPE_BOX_MAP.put(TypeEnum.BIT.getType(), "Boolean"); + TYPE_BOX_MAP.put(TypeEnum.BOOLEAN.getType(), "Boolean"); + TYPE_BOX_MAP.put(TypeEnum.TINYINT.getType(), "Integer"); + TYPE_BOX_MAP.put(TypeEnum.SMALLINT.getType(), "Integer"); + TYPE_BOX_MAP.put(TypeEnum.INT.getType(), "Integer"); + TYPE_BOX_MAP.put(TypeEnum.BIGINT.getType(), "Long"); + TYPE_BOX_MAP.put(TypeEnum.FLOAT.getType(), "Float"); + TYPE_BOX_MAP.put(TypeEnum.DOUBLE.getType(), "Double"); + TYPE_BOX_MAP.put(TypeEnum.DECIMAL.getType(), "BigDecimal"); + TYPE_BOX_MAP.put(TypeEnum.VARCHAR.getType(), "String"); + TYPE_BOX_MAP.put(TypeEnum.DATETIME.getType(), "LocalDateTime"); + TYPE_BOX_MAP.put(TypeEnum.DATE.getType(), "LocalDate"); + TYPE_BOX_MAP.put(TypeEnum.BLOB.getType(), "Byte[]"); + TYPE_BOX_MAP.put(TypeEnum.JSONB.getType(), "Map"); + } + + @Override + public String convertType(String type) { + String string = TYPE_MAP.getOrDefault(type, "String"); + return string; + } + + @Override + public String convertTypeBox(String type) { + return TYPE_BOX_MAP.getOrDefault(type, "String"); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmColumnSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmColumnSelector.java new file mode 100644 index 00000000..9d8a3325 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmColumnSelector.java @@ -0,0 +1,89 @@ +package com.gitee.gen.gen.dm; + +import com.gitee.gen.gen.ColumnDefinition; +import com.gitee.gen.gen.ColumnSelector; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.TypeFormatter; +import com.gitee.gen.util.FieldUtil; +import org.apache.commons.lang.StringUtils; + +import java.util.Map; +import java.util.Set; + +/** + * dm表信息查询 + * + */ +public class DmColumnSelector extends ColumnSelector { + + private static final TypeFormatter TYPE_FORMATTER = new DmTypeFormatter(); + + private static final String COLUMN_SQL = " SELECT " + + " atc.COLUMN_NAME FIELD, atc.DATA_TYPE TYPE, atc.DATA_SCALE SCALE, atc.DATA_LENGTH MAXLENGTH, " + + " CASE atc.NULLABLE WHEN 'N' THEN '否' ELSE '是' END 可空, " + + " atc.DATA_DEFAULT 默认值, acc.COMMENTS COMMENTS, atc.TABLE_NAME 表名, " + + " CASE atc.COLUMN_NAME " + + " WHEN " + + " ( SELECT col.column_name FROM user_constraints con " + + " LEFT JOIN user_cons_columns col ON con.table_name = col.table_name " + + " AND con.OWNER = col.OWNER AND con.CONSTRAINT_NAME = col.CONSTRAINT_NAME " + + " WHERE con.constraint_type = 'P' " + + " AND col.table_name = '%s' ) " + + " THEN 'true' ELSE 'false' END AS KEY " + + " FROM USER_TAB_COLUMNS atc " + + " LEFT JOIN USER_COL_COMMENTS acc " + + " ON acc.TABLE_NAME = atc.TABLE_NAME AND acc.COLUMN_NAME = atc.COLUMN_NAME " + + " WHERE atc.TABLE_NAME = '%s' " + + " ORDER BY atc.COLUMN_ID "; + + public DmColumnSelector(GeneratorConfig generatorConfig) { + super(generatorConfig); + } + + @Override + protected String getColumnInfoSQL(String tableName) { + return String.format(COLUMN_SQL, tableName, tableName); + } + + @Override + protected ColumnDefinition buildColumnDefinition(Map rowMap){ + Set columnSet = rowMap.keySet(); + + for (String columnInfo : columnSet) { + rowMap.put(columnInfo.toUpperCase(), rowMap.get(columnInfo)); + } + + ColumnDefinition columnDefinition = new ColumnDefinition(); + + columnDefinition.setColumnName(FieldUtil.convertString(rowMap.get("FIELD"))); + + columnDefinition.setIsIdentity(false); + + boolean isPk = "true".equalsIgnoreCase(FieldUtil.convertString(rowMap.get("KEY"))); + columnDefinition.setIsPk(isPk); + + String type = FieldUtil.convertString(rowMap.get("TYPE")); + // 如果是number + if (StringUtils.containsIgnoreCase(type, "number")) { + // 有精度则为decimal,否则是int + Object scaleCol = rowMap.get("SCALE"); + if (scaleCol == null) { + scaleCol = 0; + } + String scale = String.valueOf(scaleCol); + type = "0".equals(scale) ? "int" : "decimal"; + } + columnDefinition.setType(TYPE_FORMATTER.format(type)); + + columnDefinition.setComment(FieldUtil.convertString(rowMap.get("COMMENTS"))); + + String maxLength = FieldUtil.convertString(rowMap.get("MAXLENGTH")); + columnDefinition.setMaxLength(new Integer(StringUtils.isEmpty(maxLength) ? "0" : maxLength)); + + String scale = FieldUtil.convertString(rowMap.get("SCALE")); + columnDefinition.setScale(new Integer(StringUtils.isEmpty(scale) ? "0" : scale)); + + return columnDefinition; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmService.java new file mode 100644 index 00000000..9cf04718 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmService.java @@ -0,0 +1,14 @@ +package com.gitee.gen.gen.dm; + +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.SQLService; +import com.gitee.gen.gen.TableSelector; + +public class DmService implements SQLService { + + @Override + public TableSelector getTableSelector(GeneratorConfig generatorConfig) { + return new DmTableSelector(new DmColumnSelector(generatorConfig), generatorConfig); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmTableSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmTableSelector.java new file mode 100644 index 00000000..b4940ca9 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmTableSelector.java @@ -0,0 +1,54 @@ +package com.gitee.gen.gen.dm; + +import com.gitee.gen.gen.ColumnSelector; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.TableDefinition; +import com.gitee.gen.gen.TableSelector; + +import java.util.Map; + +import static com.gitee.gen.util.FieldUtil.convertString; + +/** + * 查询mysql数据库表 + */ +public class DmTableSelector extends TableSelector { + + public DmTableSelector(ColumnSelector columnSelector, + GeneratorConfig dataBaseConfig) { + super(columnSelector, dataBaseConfig); + } + + /** + * SELECT a.TABLE_NAME,b.COMMENTS + * FROM ALL_TABLES a,USER_TAB_COMMENTS b + * WHERE a.TABLE_NAME=b.TABLE_NAME + * AND a.OWNER='SYSTEM' + * @param generatorConfig generatorConfig + * @return + */ + @Override + protected String getShowTablesSQL(GeneratorConfig generatorConfig) { + String owner = generatorConfig.getSchemaName().toUpperCase(); + StringBuilder sb = new StringBuilder(""); + sb.append("SELECT a.TABLE_NAME AS NAME,b.COMMENTS FROM USER_TABLES a left join USER_TAB_COMMENTS b on a.TABLE_NAME = b.TABLE_NAME "); + sb.append(" WHERE 1=1 "); + if(this.getSchTableNames() != null && this.getSchTableNames().size() > 0) { + StringBuilder tables = new StringBuilder(); + for (String table : this.getSchTableNames()) { + tables.append(",'").append(table).append("'"); + } + sb.append(" AND a.TABLE_NAME IN (" + tables.substring(1) + ")"); + } + return sb.toString(); + } + + @Override + protected TableDefinition buildTableDefinition(Map tableMap) { + TableDefinition tableDefinition = new TableDefinition(); + tableDefinition.setTableName(convertString(tableMap.get("NAME"))); + tableDefinition.setComment(convertString(tableMap.get("COMMENTS"))); + return tableDefinition; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmTypeFormatter.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmTypeFormatter.java new file mode 100644 index 00000000..d7fcfa22 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/dm/DmTypeFormatter.java @@ -0,0 +1,82 @@ +package com.gitee.gen.gen.dm; + +import com.gitee.gen.gen.TypeFormatter; + +import java.util.Arrays; +import java.util.Collections; + +/** + * @author tanghc + */ +public class DmTypeFormatter implements TypeFormatter { + + @Override + public boolean isBit(String columnType) { + return contains(Collections.singletonList("bit"), columnType); + } + + @Override + public boolean isBoolean(String columnType) { + return contains(Collections.singletonList("boolean"), columnType); + } + + @Override + public boolean isTinyint(String columnType) { + return contains(Collections.singletonList("tinyint"), columnType); + } + + @Override + public boolean isSmallint(String columnType) { + return false; + } + + @Override + public boolean isInt(String columnType) { + return !isLong(columnType) && contains(Arrays.asList("int", "integer"), columnType); + } + + @Override + public boolean isLong(String columnType) { + return !isVarchar(columnType) && contains(Collections.singletonList("bigint"), columnType); + } + + @Override + public boolean isFloat(String columnType) { + return contains(Collections.singletonList("float"), columnType); + } + + @Override + public boolean isDouble(String columnType) { + return contains(Collections.singletonList("double"), columnType); + } + + @Override + public boolean isDecimal(String columnType) { + return contains(Collections.singletonList("decimal"), columnType); + } + + @Override + public boolean isVarchar(String columnType) { + return contains(Arrays.asList("CHAR", "VARCHAR", "VARCHAR2", "NVARCHAR2", "TEXT", "NCHAR"), columnType); + } + + @Override + public boolean isDatetime(String columnType) { + return contains(Arrays.asList("TIME", "DATETIME", "TIMESTAMP"), columnType); + } + + @Override + public boolean isDate(String columnType) { + return contains(Collections.singletonList("DATE"), columnType); + } + + @Override + public boolean isBlob(String columnType) { + return contains(Collections.singletonList("blob"), columnType); + } + + @Override + public boolean isJsonb(String columnType) { + return false; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlColumnSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlColumnSelector.java new file mode 100644 index 00000000..e8fb7cfe --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlColumnSelector.java @@ -0,0 +1,89 @@ +package com.gitee.gen.gen.mysql; + +import com.gitee.gen.gen.ColumnDefinition; +import com.gitee.gen.gen.ColumnSelector; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.TypeFormatter; +import com.gitee.gen.util.FieldUtil; +import org.apache.commons.lang.StringUtils; + +import java.util.Map; +import java.util.Set; + +/** + * mysql表信息查询 + * + */ +public class MySqlColumnSelector extends ColumnSelector { + + private static final TypeFormatter TYPE_FORMATTER = new MySqlTypeFormatter(); + + private static final String SHOW_SQL = " SELECT " + + " COLUMN_NAME AS 'Field', " + + " COLUMN_DEFAULT AS 'Default', " + + " IS_NULLABLE AS 'Null', " + + " DATA_TYPE AS 'DataType', " + + " CASE DATA_TYPE " + + " WHEN 'int' THEN NUMERIC_PRECISION " + + " WHEN 'varchar' THEN CHARACTER_MAXIMUM_LENGTH " + + " END AS 'MaxLength', " + + " IFNULL(NUMERIC_SCALE,0) AS 'Scale', " + + " COLUMN_TYPE AS 'Type', " + + " COLUMN_KEY 'KEY', " + + " EXTRA AS 'Extra', " + + " COLUMN_COMMENT AS 'Comment' " + + " FROM information_schema.`COLUMNS` " + + " WHERE 1=1 AND TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s' " + + " ORDER BY ORDINAL_POSITION"; + + public MySqlColumnSelector(GeneratorConfig generatorConfig) { + super(generatorConfig); + } + + /** + * SHOW FULL COLUMNS FROM 表名 + */ + @Override + protected String getColumnInfoSQL(String tableName) { + return String.format(SHOW_SQL, getGeneratorConfig().getDbName(), tableName); + } + + /* + * {FIELD=username, EXTRA=, COMMENT=用户名, COLLATION=utf8_general_ci, PRIVILEGES=select,insert,update,references, KEY=PRI, NULL=NO, DEFAULT=null, TYPE=varchar(20)} + */ + @Override + protected ColumnDefinition buildColumnDefinition(Map rowMap){ + Set columnSet = rowMap.keySet(); + + for (String columnInfo : columnSet) { + rowMap.put(columnInfo.toUpperCase(), rowMap.get(columnInfo)); + } + + ColumnDefinition columnDefinition = new ColumnDefinition(); + + columnDefinition.setColumnName(FieldUtil.convertString(rowMap.get("FIELD"))); + + boolean isIdentity = "auto_increment".equalsIgnoreCase(FieldUtil.convertString(rowMap.get("EXTRA"))); + columnDefinition.setIsIdentity(isIdentity); + + boolean isPk = "PRI".equalsIgnoreCase(FieldUtil.convertString(rowMap.get("KEY"))); + columnDefinition.setIsPk(isPk); + + String type = FieldUtil.convertString(rowMap.get("TYPE")); + columnDefinition.setType(TYPE_FORMATTER.format(type)); + + columnDefinition.setComment(FieldUtil.convertString(rowMap.get("COMMENT"))); + + String maxLength = FieldUtil.convertString(rowMap.get("MAXLENGTH")); + columnDefinition.setMaxLength(new Integer(StringUtils.isEmpty(maxLength) ? "0" : maxLength)); + + String scale = FieldUtil.convertString(rowMap.get("SCALE")); + columnDefinition.setScale(new Integer(StringUtils.isEmpty(scale) ? "0" : scale)); + + String isNullable = FieldUtil.convertString(rowMap.get("NULL")); + columnDefinition.setIsNullable("YES".equalsIgnoreCase(isNullable)); + + return columnDefinition; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlService.java new file mode 100644 index 00000000..fc1aa591 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlService.java @@ -0,0 +1,14 @@ +package com.gitee.gen.gen.mysql; + +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.SQLService; +import com.gitee.gen.gen.TableSelector; + +public class MySqlService implements SQLService { + + @Override + public TableSelector getTableSelector(GeneratorConfig generatorConfig) { + return new MySqlTableSelector(new MySqlColumnSelector(generatorConfig), generatorConfig); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlTableSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlTableSelector.java new file mode 100644 index 00000000..2ad163df --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlTableSelector.java @@ -0,0 +1,48 @@ +package com.gitee.gen.gen.mysql; + +import com.gitee.gen.gen.ColumnSelector; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.TableDefinition; +import com.gitee.gen.gen.TableSelector; + +import java.util.Map; + +import static com.gitee.gen.util.FieldUtil.convertString; + +/** + * 查询mysql数据库表 + */ +public class MySqlTableSelector extends TableSelector { + + public MySqlTableSelector(ColumnSelector columnSelector, + GeneratorConfig dataBaseConfig) { + super(columnSelector, dataBaseConfig); + } + + @Override + protected String getShowTablesSQL(GeneratorConfig generatorConfig) { + String dbName = generatorConfig.getDbName(); + // 兼容dbName包含特殊字符会报错的情况 + if (!(dbName.startsWith("`") && dbName.endsWith("`"))) { + dbName = String.format("`%s`",dbName); + } + String sql = "SHOW TABLE STATUS FROM " + dbName; + if(this.getSchTableNames() != null && this.getSchTableNames().size() > 0) { + StringBuilder tables = new StringBuilder(); + for (String table : this.getSchTableNames()) { + tables.append(",'").append(table).append("'"); + } + sql += " WHERE NAME IN (" + tables.substring(1) + ")"; + } + return sql; + } + + @Override + protected TableDefinition buildTableDefinition(Map tableMap) { + TableDefinition tableDefinition = new TableDefinition(); + tableDefinition.setTableName(convertString(tableMap.get("NAME"))); + tableDefinition.setComment(convertString(tableMap.get("COMMENT"))); + return tableDefinition; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlTypeFormatter.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlTypeFormatter.java new file mode 100644 index 00000000..ce7f3462 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/mysql/MySqlTypeFormatter.java @@ -0,0 +1,82 @@ +package com.gitee.gen.gen.mysql; + +import com.gitee.gen.gen.TypeFormatter; + +import java.util.Arrays; +import java.util.Collections; + +/** + * @author tanghc + */ +public class MySqlTypeFormatter implements TypeFormatter { + + @Override + public boolean isBit(String columnType) { + return contains(Collections.singletonList("bit"), columnType); + } + + @Override + public boolean isBoolean(String columnType) { + return contains(Collections.singletonList("boolean"), columnType); + } + + @Override + public boolean isTinyint(String columnType) { + return contains(Collections.singletonList("tinyint"), columnType); + } + + @Override + public boolean isSmallint(String columnType) { + return contains(Collections.singletonList("smallint"), columnType); + } + + @Override + public boolean isInt(String columnType) { + return !isLong(columnType) && contains(Arrays.asList("int", "integer"), columnType); + } + + @Override + public boolean isLong(String columnType) { + return !isVarchar(columnType) && contains(Collections.singletonList("bigint"), columnType); + } + + @Override + public boolean isFloat(String columnType) { + return contains(Collections.singletonList("float"), columnType); + } + + @Override + public boolean isDouble(String columnType) { + return contains(Collections.singletonList("double"), columnType); + } + + @Override + public boolean isDecimal(String columnType) { + return contains(Collections.singletonList("decimal"), columnType); + } + + @Override + public boolean isVarchar(String columnType) { + return contains(Arrays.asList("CHAR", "VARCHAR", "TEXT"), columnType); + } + + @Override + public boolean isDatetime(String columnType) { + return contains(Arrays.asList("TIME", "DATETIME", "TIMESTAMP"), columnType); + } + + @Override + public boolean isDate(String columnType) { + return contains(Collections.singletonList("DATE"), columnType); + } + + @Override + public boolean isBlob(String columnType) { + return contains(Collections.singletonList("blob"), columnType); + } + + @Override + public boolean isJsonb(String columnType) { + return false; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleColumnSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleColumnSelector.java new file mode 100644 index 00000000..1ae1a4e4 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleColumnSelector.java @@ -0,0 +1,115 @@ +package com.gitee.gen.gen.oracle; + +import com.gitee.gen.gen.ColumnDefinition; +import com.gitee.gen.gen.ColumnSelector; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.TypeFormatter; +import com.gitee.gen.util.FieldUtil; +import org.apache.commons.lang.StringUtils; + +import java.util.Map; +import java.util.Set; + +/** + * oracle表信息查询 + */ +public class OracleColumnSelector extends ColumnSelector { + + private static final TypeFormatter TYPE_FORMATTER = new OracleTypeFormatter(); + +// private static final String COLUMN_SQL = "select " +// + " utc.column_name as FIELD,utc.data_type TYPE, utc.data_scale SCALE, utc.data_length MAXLENGTH, " +// + " CASE utc.nullable WHEN 'N' THEN '否' ELSE '是' END 可空, " +// + " utc.data_default 默认值,ucc.comments COMMENTS,UTC.table_name 表名, " +// + " CASE UTC.COLUMN_NAME " +// + " WHEN (select " +// + " col.column_name " +// + " from " +// + " user_constraints con,user_cons_columns col " +// + " where " +// + " con.constraint_name=col.constraint_name and con.constraint_type='P' " +// + " and col.table_name='%s') THEN 'true' ELSE 'false' END AS KEY " +// + " from " +// + " user_tab_columns utc,user_col_comments ucc " +// + " where " +// + " utc.table_name = ucc.table_name " +// + " and utc.column_name = ucc.column_name " +// + " and utc.table_name = '%s' " +// + " order by " +// + " column_id "; + + private static final String COLUMN_SQL = " SELECT " + + " atc.COLUMN_NAME FIELD, atc.DATA_TYPE TYPE, atc.DATA_SCALE SCALE, atc.DATA_LENGTH MAXLENGTH, " + + " atc.NULLABLE NULLABLE , " + + " atc.DATA_DEFAULT 默认值, acc.COMMENTS COMMENTS, atc.TABLE_NAME 表名, " + + " CASE atc.COLUMN_NAME " + + " WHEN " + + " ( SELECT col.column_name FROM all_constraints con " + + " LEFT JOIN all_cons_columns col ON con.table_name = col.table_name " + + " AND con.OWNER = col.OWNER AND con.CONSTRAINT_NAME = col.CONSTRAINT_NAME " + + " WHERE con.constraint_type = 'P' " + + " AND col.table_name = '%s' AND con.OWNER = '%s' AND col.column_name = atc.COLUMN_NAME ) " + + " THEN 'true' ELSE 'false' END AS KEY " + + " FROM ALL_TAB_COLUMNS atc " + + " LEFT JOIN ALL_COL_COMMENTS acc " + + " ON acc.TABLE_NAME = atc.TABLE_NAME AND acc.COLUMN_NAME = atc.COLUMN_NAME " + + " AND acc.OWNER = atc.OWNER " + + " WHERE atc.TABLE_NAME = '%s' AND atc.OWNER = '%s' " + + " ORDER BY atc.COLUMN_ID "; + + public OracleColumnSelector(GeneratorConfig generatorConfig) { + super(generatorConfig); + } + + @Override + protected String getColumnInfoSQL(String tableName) { + String owner = this.getGeneratorConfig().getSchemaName(); + return String.format(COLUMN_SQL, tableName, owner, tableName, owner); + } + + @Override + protected ColumnDefinition buildColumnDefinition(Map rowMap){ + Set columnSet = rowMap.keySet(); + + for (String columnInfo : columnSet) { + rowMap.put(columnInfo.toUpperCase(), rowMap.get(columnInfo)); + } + + ColumnDefinition columnDefinition = new ColumnDefinition(); + + columnDefinition.setColumnName(FieldUtil.convertString(rowMap.get("FIELD"))); + + columnDefinition.setIsIdentity(false); + + boolean isPk = "true".equalsIgnoreCase(FieldUtil.convertString(rowMap.get("KEY"))); + columnDefinition.setIsPk(isPk); + + String type = FieldUtil.convertString(rowMap.get("TYPE")); + // 如果是number + if (StringUtils.containsIgnoreCase(type, "number")) { + // 有精度则为decimal,否则是int + Object scaleCol = rowMap.get("SCALE"); + if (scaleCol == null) { + scaleCol = 0; + } + String scale = String.valueOf(scaleCol); + type = "0".equals(scale) ? "int" : "decimal"; + } + columnDefinition.setType(TYPE_FORMATTER.format(type)); + + columnDefinition.setComment(FieldUtil.convertString(rowMap.get("COMMENTS"))); + + String maxLength = FieldUtil.convertString(rowMap.get("MAXLENGTH")); + columnDefinition.setMaxLength(new Integer(StringUtils.isEmpty(maxLength) ? "0" : maxLength)); + + String scale = FieldUtil.convertString(rowMap.get("SCALE")); + columnDefinition.setScale(new Integer(StringUtils.isEmpty(scale) ? "0" : scale)); + + String isNullable = FieldUtil.convertString(rowMap.get("NULLABLE")); + columnDefinition.setIsNullable(!"N".equalsIgnoreCase(isNullable)); + + return columnDefinition; + } + + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleService.java new file mode 100644 index 00000000..7a599d1b --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleService.java @@ -0,0 +1,14 @@ +package com.gitee.gen.gen.oracle; + +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.SQLService; +import com.gitee.gen.gen.TableSelector; + +public class OracleService implements SQLService { + + @Override + public TableSelector getTableSelector(GeneratorConfig generatorConfig) { + return new OracleTableSelector(new OracleColumnSelector(generatorConfig), generatorConfig); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleTableSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleTableSelector.java new file mode 100644 index 00000000..223d36fd --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleTableSelector.java @@ -0,0 +1,55 @@ +package com.gitee.gen.gen.oracle; + +import com.gitee.gen.gen.ColumnSelector; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.TableDefinition; +import com.gitee.gen.gen.TableSelector; + +import java.util.Map; + +import static com.gitee.gen.util.FieldUtil.convertString; + +/** + * 查询oracle数据库表 + */ +public class OracleTableSelector extends TableSelector { + + public OracleTableSelector(ColumnSelector columnSelector, + GeneratorConfig dataBaseConfig) { + super(columnSelector, dataBaseConfig); + } + + /** + * SELECT a.TABLE_NAME,b.COMMENTS + * FROM ALL_TABLES a,USER_TAB_COMMENTS b + * WHERE a.TABLE_NAME=b.TABLE_NAME + * AND a.OWNER='SYSTEM' + * @param generatorConfig generatorConfig + * @return + */ + @Override + protected String getShowTablesSQL(GeneratorConfig generatorConfig) { + StringBuilder sb = new StringBuilder(""); + sb.append(" SELECT a.TABLE_NAME as NAME,b.COMMENTS" + + " FROM ALL_TABLES a,USER_TAB_COMMENTS b" + + " WHERE a.TABLE_NAME=b.TABLE_NAME"); + sb.append(" AND 1=1 "); + if(this.getSchTableNames() != null && this.getSchTableNames().size() > 0) { + StringBuilder tables = new StringBuilder(); + for (String table : this.getSchTableNames()) { + tables.append(",'").append(table).append("'"); + } + sb.append(" AND a.TABLE_NAME IN (" + tables.substring(1) + ")"); + } + return sb.toString(); + } + + @Override + protected TableDefinition buildTableDefinition(Map tableMap) { + TableDefinition tableDefinition = new TableDefinition(); + tableDefinition.setTableName(convertString(tableMap.get("NAME"))); + tableDefinition.setComment(convertString(tableMap.get("COMMENTS"))); + return tableDefinition; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleTypeFormatter.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleTypeFormatter.java new file mode 100644 index 00000000..74890075 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/oracle/OracleTypeFormatter.java @@ -0,0 +1,82 @@ +package com.gitee.gen.gen.oracle; + +import com.gitee.gen.gen.TypeFormatter; + +import java.util.Arrays; +import java.util.Collections; + +/** + * @author tanghc + */ +public class OracleTypeFormatter implements TypeFormatter { + + @Override + public boolean isBit(String columnType) { + return contains(Collections.singletonList("bit"), columnType); + } + + @Override + public boolean isBoolean(String columnType) { + return contains(Collections.singletonList("boolean"), columnType); + } + + @Override + public boolean isTinyint(String columnType) { + return contains(Collections.singletonList("tinyint"), columnType); + } + + @Override + public boolean isSmallint(String columnType) { + return false; + } + + @Override + public boolean isInt(String columnType) { + return contains(Arrays.asList("int", "integer"), columnType); + } + + @Override + public boolean isLong(String columnType) { + return !isVarchar(columnType) && contains(Collections.singletonList("long"), columnType); + } + + @Override + public boolean isFloat(String columnType) { + return contains(Collections.singletonList("float"), columnType); + } + + @Override + public boolean isDouble(String columnType) { + return contains(Collections.singletonList("double"), columnType); + } + + @Override + public boolean isDecimal(String columnType) { + return contains(Collections.singletonList("decimal"), columnType); + } + + @Override + public boolean isVarchar(String columnType) { + return contains(Arrays.asList("CHAR", "VARCHAR", "VARCHAR2", "NVARCHAR2", "TEXT", "NCHAR"), columnType); + } + + @Override + public boolean isDatetime(String columnType) { + return contains(Arrays.asList("TIME", "DATETIME", "TIMESTAMP"), columnType); + } + + @Override + public boolean isDate(String columnType) { + return contains(Collections.singletonList("DATE"), columnType); + } + + @Override + public boolean isBlob(String columnType) { + return contains(Collections.singletonList("blob"), columnType); + } + + @Override + public boolean isJsonb(String columnType) { + return false; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlColumnSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlColumnSelector.java new file mode 100644 index 00000000..f150ddb6 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlColumnSelector.java @@ -0,0 +1,106 @@ +package com.gitee.gen.gen.postgresql; + +import com.gitee.gen.gen.ColumnDefinition; +import com.gitee.gen.gen.ColumnSelector; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.util.FieldUtil; +import org.apache.commons.lang.StringUtils; + +import java.util.Map; +import java.util.Set; + +import static com.gitee.gen.util.FieldUtil.convertString; + +/** + * @author tanghc + */ +public class PostgreSqlColumnSelector extends ColumnSelector { + + private static final PostgreSqlTypeFormatter SQL_TYPE_FORMATTER = new PostgreSqlTypeFormatter(); + + public PostgreSqlColumnSelector(GeneratorConfig dataBaseConfig) { + super(dataBaseConfig); + } + + private static final String SHOW_COLUMN_SQL = "SELECT " + + " pg_attribute.attname AS colname, " + + " atttypid::regtype AS type, " + + " pg_attribute.atttypmod - 4 AS type_length, " + + " numeric_scale as SCALE, " + + " C.is_nullable as NULLABLE, " + + " col_description ( pg_attribute.attrelid, pg_attribute.attnum ) AS cmt, " + + " pg_attribute.attnum = pg_constraint.conkey [ 1 ] AS is_pk, " + + "CASE WHEN POSITION ( 'nextval' IN column_default ) > 0 THEN 1 ELSE 0 END AS is_identity " + + "FROM " + + " pg_constraint " + + " RIGHT JOIN pg_class ON pg_constraint.conrelid = pg_class.oid and pg_constraint.contype = 'p' " + + " RIGHT JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid " + + " RIGHT JOIN pg_type ON pg_type.oid = pg_attribute.atttypid " + + " RIGHT JOIN information_schema.COLUMNS C ON C.TABLE_NAME = pg_class.relname " + + " AND C.COLUMN_NAME = pg_attribute.attname " + + "WHERE " + + " pg_class.relname = '%s' " + +// " and pg_constraint.contype = 'p' " + + " AND pg_attribute.attnum > 0"; + + @Override + protected String getColumnInfoSQL(String tableName) { + return String.format(SHOW_COLUMN_SQL, tableName); + } + + /* + "colname" "type" "cmt" "is_pk" "is_identity" + "id" "integer" "自增主键" "t" "1" + "user_id" "integer" "用户id" "f" "0" + "city" "character varying" "城市" "f" "0" + "address" "character varying" "街道" "f" "0" + "status" "character varying" "类型" "f" "0" + "create_time" "timestamp without time zone" "添加时间" "f" "0" + "update_time" "timestamp without time zone" "修改时间" "f" "0" + + */ + @Override + protected ColumnDefinition buildColumnDefinition(Map rowMap) { + Set columnSet = rowMap.keySet(); + for (String columnInfo : columnSet) { + rowMap.put(columnInfo.toUpperCase(), rowMap.get(columnInfo)); + } + + ColumnDefinition columnDefinition = new ColumnDefinition(); + + columnDefinition.setColumnName(convertString(rowMap.get("COLNAME"))); + + boolean isIdentity = "1".equals(convertString(rowMap.get("IS_IDENTITY"))); + columnDefinition.setIsIdentity(isIdentity); + + boolean isPk = (Boolean) (rowMap.get("IS_PK") != null ? rowMap.get("IS_PK") : false); + columnDefinition.setIsPk(isPk); + + String type = convertString(rowMap.get("TYPE")); + + // 如果是number + if (StringUtils.containsIgnoreCase(type, "numeric")) { + // 有精度则为decimal,否则是int + Object scaleCol = rowMap.get("SCALE"); + if (scaleCol == null) { + scaleCol = 0; + } + String scale = String.valueOf(scaleCol); + type = "0".equals(scale) ? "integer" : "decimal"; + } + + columnDefinition.setType(SQL_TYPE_FORMATTER.format(type)); + + String maxLength = FieldUtil.convertString(rowMap.get("TYPE_LENGTH")); + int length = Integer.parseInt((StringUtils.isEmpty(maxLength) ? "0" : maxLength)); + columnDefinition.setMaxLength(Math.max(length, 0)); + + columnDefinition.setComment(convertString(rowMap.get("CMT"))); + + String isNullable = FieldUtil.convertString(rowMap.get("NULLABLE")); + columnDefinition.setIsNullable(!"NO".equalsIgnoreCase(isNullable)); + + return columnDefinition; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlService.java new file mode 100644 index 00000000..b545f9a0 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlService.java @@ -0,0 +1,16 @@ +package com.gitee.gen.gen.postgresql; + +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.SQLService; +import com.gitee.gen.gen.TableSelector; + +/** + * @author tanghc + */ +public class PostgreSqlService implements SQLService { + @Override + public TableSelector getTableSelector(GeneratorConfig generatorConfig) { + return new PostgreSqlTableSelector(new PostgreSqlColumnSelector(generatorConfig), generatorConfig); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlTableSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlTableSelector.java new file mode 100644 index 00000000..ef06bdad --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlTableSelector.java @@ -0,0 +1,63 @@ +package com.gitee.gen.gen.postgresql; + +import com.gitee.gen.gen.ColumnSelector; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.TableDefinition; +import com.gitee.gen.gen.TableSelector; +import org.apache.commons.lang.StringUtils; + +import java.util.List; +import java.util.Map; + +import static com.gitee.gen.util.FieldUtil.convertString; + +/** + * @author tanghc + */ +public class PostgreSqlTableSelector extends TableSelector { + + private static final String DEFAULT_SCHEMA = "public"; + + public PostgreSqlTableSelector(ColumnSelector columnSelector, GeneratorConfig generatorConfig) { + super(columnSelector, generatorConfig); + } + + private static final String SHOW_TABLE_SQL = + "SELECT " + + " t.schemaname, t.tablename, t2.cmt " + + "FROM " + + " pg_tables t LEFT JOIN " + + " ( " + + " SELECT C.relname as tablename, obj_description(C.oid) as cmt, n.nspname as schemaname " + + " FROM pg_class C join pg_namespace n on n.oid = C.relnamespace " + + " WHERE C.relkind='r' AND C.relname NOT LIKE 'pg_%%' AND C.relname NOT LIKE 'sql_%%' AND C.relchecks=0 " + + " ORDER BY relname " + + ") t2 ON t.tablename = t2.tablename and t.schemaname = t2.schemaname " + + "WHERE t.schemaname != 'pg_catalog' AND t.schemaname != 'information_schema' %s %s"; + + @Override + protected String getShowTablesSQL(GeneratorConfig generatorConfig) { + String schema = generatorConfig.getSchemaName(); + if (schema == null) { + schema = ""; + } + if (StringUtils.isNotBlank(schema)) { + schema = String.format("AND t.schemaname = '%s'", schema); + } + List tableNames = wrapTableNames(); + String and = ""; + if (!tableNames.isEmpty()) { + and = String.format("AND t.tablename in (%s)", String.join(",", tableNames)); + } + return String.format(SHOW_TABLE_SQL, schema, and); + } + + @Override + protected TableDefinition buildTableDefinition(Map tableMap) { + TableDefinition tableDefinition = new TableDefinition(); + tableDefinition.setSchema(convertString(tableMap.get("SCHEMANAME"))); + tableDefinition.setTableName(convertString(tableMap.get("TABLENAME"))); + tableDefinition.setComment(convertString(tableMap.get("CMT"))); + return tableDefinition; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlTypeFormatter.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlTypeFormatter.java new file mode 100644 index 00000000..9d0e1ee6 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlTypeFormatter.java @@ -0,0 +1,82 @@ +package com.gitee.gen.gen.postgresql; + +import com.gitee.gen.gen.TypeFormatter; + +import java.util.Arrays; +import java.util.Collections; + +/** + * @author tanghc + */ +public class PostgreSqlTypeFormatter implements TypeFormatter { + + @Override + public boolean isBit(String columnType) { + return contains(Collections.singletonList("bit"), columnType); + } + + @Override + public boolean isBoolean(String columnType) { + return contains(Collections.singletonList("boolean"), columnType); + } + + @Override + public boolean isTinyint(String columnType) { + return false; + } + + @Override + public boolean isSmallint(String columnType) { + return contains(Arrays.asList("int2", "serial2", "smallint"), columnType); + } + + @Override + public boolean isInt(String columnType) { + return contains(Arrays.asList("int4", "serial4", "integer"), columnType); + } + + @Override + public boolean isLong(String columnType) { + return !isVarchar(columnType) && contains(Arrays.asList("int8", "serial8", "bigint"), columnType); + } + + @Override + public boolean isFloat(String columnType) { + return contains(Arrays.asList("float", "real"), columnType); + } + + @Override + public boolean isDouble(String columnType) { + return contains(Collections.singletonList("double"), columnType); + } + + @Override + public boolean isDecimal(String columnType) { + return contains(Arrays.asList("decimal","numeric"), columnType); + } + + @Override + public boolean isVarchar(String columnType) { + return contains(Arrays.asList("CHAR", "VARCHAR", "TEXT", "character", "json"), columnType); + } + + @Override + public boolean isDatetime(String columnType) { + return contains(Arrays.asList("TIME", "DATETIME", "TIMESTAMP"), columnType); + } + + @Override + public boolean isDate(String columnType) { + return contains(Collections.singletonList("DATE"), columnType); + } + + @Override + public boolean isBlob(String columnType) { + return contains(Collections.singletonList("blob"), columnType); + } + + @Override + public boolean isJsonb(String columnType) { + return contains(Collections.singletonList("jsonb"), columnType); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerColumnSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerColumnSelector.java new file mode 100644 index 00000000..2b1ed004 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerColumnSelector.java @@ -0,0 +1,122 @@ +package com.gitee.gen.gen.sqlserver; + +import com.gitee.gen.gen.ColumnDefinition; +import com.gitee.gen.gen.ColumnSelector; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.util.FieldUtil; +import org.apache.commons.lang.StringUtils; + +import java.util.Map; +import java.util.Set; + +public class SqlServerColumnSelector extends ColumnSelector { + + private static final SqlServerTypeFormatter TYPE_FORMATTER = new SqlServerTypeFormatter(); + + // https://blog.csdn.net/qq_14880455/article/details/92842329 + private static String TABKE_DETAIL_SQL = new StringBuilder() + .append("SELECT") + .append(" col.name AS column_name") + .append(" , col.max_length AS MaxLength") //sqlserver 字段长度 + .append(" , col.scale AS Scale") //sqlserver 字段精度 + .append(" , col.is_nullable AS NULLABLE") //1 =列可以为空。 + .append(" , bt.name AS type") + .append(" , col.is_identity") + .append(" , ext.value AS comment") + .append(" ,(") + .append(" SELECT COUNT(1) FROM sys.indexes IDX ") + .append(" INNER JOIN sys.index_columns IDXC ") + .append(" ON IDX.[object_id]=IDXC.[object_id] ") + .append(" AND IDX.index_id=IDXC.index_id ") + .append(" LEFT JOIN sys.key_constraints KC ") + .append(" ON IDX.[object_id]=KC.[parent_object_id] ") + .append(" AND IDX.index_id=KC.unique_index_id ") + .append(" INNER JOIN sys.objects O ") + .append(" ON O.[object_id]=IDX.[object_id] ") + .append(" WHERE O.[object_id]=col.[object_id] ") + .append(" AND O.type='U' ") + .append(" AND O.is_ms_shipped=0 ") + .append(" AND IDX.is_primary_key=1 ") + .append(" AND IDXC.Column_id=col.column_id ") + .append(" ) AS is_pk ") + .append("FROM sys.columns col ") + .append("LEFT OUTER JOIN sys.types bt on bt.user_type_id = col.system_type_id ") + .append("LEFT JOIN sys.extended_properties ext ON ext.major_id = col.object_id AND ext.minor_id = col.column_id ") + .append("WHERE col.object_id = object_id('%s') ") + .append("ORDER BY col.column_id").toString(); + + + + public SqlServerColumnSelector(GeneratorConfig generatorConfig) { + super(generatorConfig); + } + + /* SELECT + col.name AS column_name + , bt.name AS type + , col.is_identity + , ext.value as comment + ,( + SELECT COUNT(1) FROM sys.indexes IDX + INNER JOIN sys.index_columns IDXC + ON IDX.[object_id]=IDXC.[object_id] + AND IDX.index_id=IDXC.index_id + LEFT JOIN sys.key_constraints KC + ON IDX.[object_id]=KC.[parent_object_id] + AND IDX.index_id=KC.unique_index_id + INNER JOIN sys.objects O + ON O.[object_id]=IDX.[object_id] + WHERE O.[object_id]=col.[object_id] + AND O.type='U' + AND O.is_ms_shipped=0 + AND IDX.is_primary_key=1 + AND IDXC.Column_id=col.column_id + ) AS is_pk + FROM sys.columns col + LEFT OUTER JOIN sys.types bt on bt.user_type_id = col.system_type_id + LEFT JOIN sys.extended_properties ext ON ext.major_id = col.object_id AND ext.minor_id = col.column_id + WHERE col.object_id = object_id('front.bar') + ORDER BY col.column_id; + */ + @Override + protected String getColumnInfoSQL(String tableName) { + return String.format(TABKE_DETAIL_SQL, tableName); + } + + + /* + * rowMap: + * {COLUMN_NAME=barId, IS_IDENTITY=true, COMMENT=网吧ID, IS_PK=1, TYPE=int} + */ + @Override + protected ColumnDefinition buildColumnDefinition(Map rowMap) { + Set columnSet = rowMap.keySet(); + + for (String columnInfo : columnSet) { + rowMap.put(columnInfo.toUpperCase(), rowMap.get(columnInfo)); + } + + ColumnDefinition columnDefinition = new ColumnDefinition(); + + columnDefinition.setColumnName(FieldUtil.convertString(rowMap.get("COLUMN_NAME"))); + columnDefinition.setIsIdentity((Boolean)rowMap.get("IS_IDENTITY")); + boolean isPk = (Integer)rowMap.get("IS_PK") == 1; + columnDefinition.setIsPk(isPk); + String type = FieldUtil.convertString( rowMap.get("TYPE")); + columnDefinition.setType(TYPE_FORMATTER.format(type)); + + columnDefinition.setComment(FieldUtil.convertString(rowMap.get("COMMENT"))); + + //sqlserver 字段长度 + String maxLength = FieldUtil.convertString(rowMap.get("MAXLENGTH")); + columnDefinition.setMaxLength(Integer.parseInt(StringUtils.isEmpty(maxLength) ? "0" : maxLength)); + //sqlserver 字段精度 + String scale = FieldUtil.convertString(rowMap.get("SCALE")); + columnDefinition.setScale(Integer.parseInt(StringUtils.isEmpty(scale) ? "0" : scale)); + + String isNullable = FieldUtil.convertString(rowMap.get("NULLABLE")); + columnDefinition.setIsNullable("1".equalsIgnoreCase(isNullable)); + return columnDefinition; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerService.java new file mode 100644 index 00000000..72908e5a --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerService.java @@ -0,0 +1,14 @@ +package com.gitee.gen.gen.sqlserver; + +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.SQLService; +import com.gitee.gen.gen.TableSelector; + +public class SqlServerService implements SQLService { + + @Override + public TableSelector getTableSelector(GeneratorConfig generatorConfig) { + return new SqlServerTableSelector(new SqlServerColumnSelector(generatorConfig), generatorConfig); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerTableSelector.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerTableSelector.java new file mode 100644 index 00000000..e0300b2d --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerTableSelector.java @@ -0,0 +1,60 @@ +package com.gitee.gen.gen.sqlserver; + +import com.gitee.gen.gen.ColumnSelector; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.TableDefinition; +import com.gitee.gen.gen.TableSelector; + +import java.util.Map; + +import static com.gitee.gen.util.FieldUtil.convertString; + +public class SqlServerTableSelector extends TableSelector { + + public SqlServerTableSelector(ColumnSelector columnSelector, + GeneratorConfig dataBaseConfig) { + super(columnSelector, dataBaseConfig); + } + + @Override + protected String getShowTablesSQL(GeneratorConfig generatorConfig) { + return "SELECT SS.name + '.' + t.name AS table_name " + + ",CONVERT(varchar(50),ISNULL(ext.value, '')) as comment " + + "FROM sysobjects t " + + "INNER JOIN sys.objects SO ON t.name = SO.name " + + "INNER JOIN sys.schemas SS ON SO.schema_id = SS.schema_id " + + "LEFT JOIN sys.extended_properties ext ON ext.major_id = SO.object_id and ext.minor_id=0 " + + "WHERE t.xtype='u' " + + this.buildTableSchWhere() + + " ORDER BY SS.name ASC,t.name ASC"; + } + + // and ( (t.name = 'bar' and SS.name = 'front') or (t.name = 'adjustBatch' and SS.name = 'account') ) + private String buildTableSchWhere() { + if(this.getSchTableNames() != null && this.getSchTableNames().size() > 0) { + int i = 0; + StringBuilder tables = new StringBuilder(" and ( "); + for (String table : this.getSchTableNames()) { + String[] tableArr = table.split("\\."); + if(i > 0) { + tables.append(" or "); + } + tables.append("(SS.name='").append(tableArr[0]).append("' and t.name='").append(tableArr[1]).append("') "); + i++; + } + tables.append(" )"); + return tables.toString(); + } + return ""; + } + + // {TABLE_NAME=account.adjustBatch, COMMENT=} + @Override + protected TableDefinition buildTableDefinition(Map tableMap) { + TableDefinition tableDefinition = new TableDefinition(); + tableDefinition.setTableName(convertString(tableMap.get("TABLE_NAME"))); + tableDefinition.setComment(convertString(tableMap.get("COMMENT"))); + return tableDefinition; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerTypeFormatter.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerTypeFormatter.java new file mode 100644 index 00000000..a4e30ef3 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerTypeFormatter.java @@ -0,0 +1,82 @@ +package com.gitee.gen.gen.sqlserver; + +import com.gitee.gen.gen.TypeFormatter; + +import java.util.Arrays; +import java.util.Collections; + +/** + * @author tanghc + */ +public class SqlServerTypeFormatter implements TypeFormatter { + + @Override + public boolean isBit(String columnType) { + return contains(Collections.singletonList("bit"), columnType); + } + + @Override + public boolean isBoolean(String columnType) { + return contains(Collections.singletonList("boolean"), columnType); + } + + @Override + public boolean isTinyint(String columnType) { + return contains(Collections.singletonList("tinyint"), columnType); + } + + @Override + public boolean isSmallint(String columnType) { + return contains(Collections.singletonList("smallint"), columnType); + } + + @Override + public boolean isInt(String columnType) { + return !isLong(columnType) && contains(Arrays.asList("int", "integer"), columnType); + } + + @Override + public boolean isLong(String columnType) { + return !isVarchar(columnType) && contains(Collections.singletonList("bigint"), columnType); + } + + @Override + public boolean isFloat(String columnType) { + return contains(Arrays.asList("float", "real"), columnType); + } + + @Override + public boolean isDouble(String columnType) { + return contains(Collections.singletonList("double"), columnType); + } + + @Override + public boolean isDecimal(String columnType) { + return contains(Arrays.asList("decimal", "numeric", "money", "smallmoney"), columnType); + } + + @Override + public boolean isVarchar(String columnType) { + return contains(Arrays.asList("CHAR", "VARCHAR", "TEXT", "nchar", "nvarchar", "ntext"), columnType); + } + + @Override + public boolean isDatetime(String columnType) { + return contains(Arrays.asList("TIME", "DATETIME", "TIMESTAMP", "datetime2", "smalldatetime", "datetimeoffset"), columnType); + } + + @Override + public boolean isDate(String columnType) { + return contains(Collections.singletonList("DATE"), columnType); + } + + @Override + public boolean isBlob(String columnType) { + return contains(Arrays.asList("blob", "binary", "varbinary"), columnType); + } + + @Override + public boolean isJsonb(String columnType) { + return false; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/DatasourceConfigMapper.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/DatasourceConfigMapper.java new file mode 100644 index 00000000..7b6ed423 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/DatasourceConfigMapper.java @@ -0,0 +1,67 @@ +package com.gitee.gen.mapper; + +import com.gitee.gen.entity.DatasourceConfig; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface DatasourceConfigMapper { + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + DatasourceConfig getById(Integer id); + + /** + * 新增,插入所有字段 + * + * @param datasourceConfig 新增的记录 + * @return 返回影响行数 + */ + int insert(DatasourceConfig datasourceConfig); + + /** + * 新增,忽略null字段 + * + * @param datasourceConfig 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(DatasourceConfig datasourceConfig); + + /** + * 修改,修改所有字段 + * + * @param datasourceConfig 修改的记录 + * @return 返回影响行数 + */ + int update(DatasourceConfig datasourceConfig); + + /** + * 修改,忽略null字段 + * + * @param datasourceConfig 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(DatasourceConfig datasourceConfig); + + /** + * 删除记录 + * + * @param datasourceConfig 待删除的记录 + * @return 返回影响行数 + */ + int delete(DatasourceConfig datasourceConfig); + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/GenerateHistoryMapper.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/GenerateHistoryMapper.java new file mode 100644 index 00000000..f4846fad --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/GenerateHistoryMapper.java @@ -0,0 +1,76 @@ +package com.gitee.gen.mapper; + +import com.gitee.gen.entity.GenerateHistory; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface GenerateHistoryMapper { + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + GenerateHistory getById(Integer id); + + /** + * 新增,插入所有字段 + * + * @param generateHistory 新增的记录 + * @return 返回影响行数 + */ + int insert(GenerateHistory generateHistory); + + /** + * 新增,忽略null字段 + * + * @param generateHistory 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(GenerateHistory generateHistory); + + /** + * 修改,修改所有字段 + * + * @param generateHistory 修改的记录 + * @return 返回影响行数 + */ + int update(GenerateHistory generateHistory); + + /** + * 修改,忽略null字段 + * + * @param generateHistory 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(GenerateHistory generateHistory); + + /** + * 删除记录 + * + * @param generateHistory 待删除的记录 + * @return 返回影响行数 + */ + int delete(GenerateHistory generateHistory); + + + /** + * 根据md5查询 + * + * @param md5 md5 + * @return 返回记录,没有返回null + */ + GenerateHistory getByMd5(@Param("md5") String md5); +} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/SystemConfigMapper.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/SystemConfigMapper.java new file mode 100644 index 00000000..9f74ce7c --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/SystemConfigMapper.java @@ -0,0 +1,70 @@ +package com.gitee.gen.mapper; + +import java.util.List; + +import com.gitee.gen.entity.SystemConfig; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface SystemConfigMapper { + + SystemConfig getByKey(@Param("key") String key); + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + SystemConfig getById(Integer id); + + /** + * 新增,插入所有字段 + * + * @param systemConfig 新增的记录 + * @return 返回影响行数 + */ + int insert(SystemConfig systemConfig); + + /** + * 新增,忽略null字段 + * + * @param systemConfig 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(SystemConfig systemConfig); + + /** + * 修改,修改所有字段 + * + * @param systemConfig 修改的记录 + * @return 返回影响行数 + */ + int update(SystemConfig systemConfig); + + /** + * 修改,忽略null字段 + * + * @param systemConfig 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(SystemConfig systemConfig); + + /** + * 删除记录 + * + * @param systemConfig 待删除的记录 + * @return 返回影响行数 + */ + int delete(SystemConfig systemConfig); + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/TemplateConfigMapper.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/TemplateConfigMapper.java new file mode 100644 index 00000000..23de650a --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/TemplateConfigMapper.java @@ -0,0 +1,79 @@ +package com.gitee.gen.mapper; + +import com.gitee.gen.entity.TemplateConfig; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface TemplateConfigMapper { + + TemplateConfig getByName(@Param("name") String name, @Param("groupId") Integer groupId); + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + TemplateConfig getById(Integer id); + + /** + * 新增,插入所有字段 + * + * @param templateConfig 新增的记录 + * @return 返回影响行数 + */ + int insert(TemplateConfig templateConfig); + + /** + * 新增,忽略null字段 + * + * @param templateConfig 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(TemplateConfig templateConfig); + + /** + * 修改,修改所有字段 + * + * @param templateConfig 修改的记录 + * @return 返回影响行数 + */ + int update(TemplateConfig templateConfig); + + /** + * 修改,忽略null字段 + * + * @param templateConfig 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(TemplateConfig templateConfig); + + /** + * 删除记录 + * + * @param templateConfig 待删除的记录 + * @return 返回影响行数 + */ + int delete(TemplateConfig templateConfig); + + List listByGroupId(String groupId); + + List listByGroupName(String groupName); + + int updateGroupNameByGroupId(Integer groupId, String groupName); + + int deleteByGroupId(Integer id); + + List listTemplate(@Param("idList") List idList); +} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/TemplateGroupMapper.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/TemplateGroupMapper.java new file mode 100644 index 00000000..b901f5a1 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/TemplateGroupMapper.java @@ -0,0 +1,80 @@ +package com.gitee.gen.mapper; + +import com.gitee.gen.entity.TemplateGroup; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * @author : zsljava + * @date Date : 2020-12-15 9:50 + * @Description: TODO + */ +@Mapper +public interface TemplateGroupMapper { + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + TemplateGroup getById(Integer id); + + /** + * 根据name查询 + * + * @param name name + * @return 返回记录,没有返回null + */ + TemplateGroup getByName(String name); + + /** + * 新增,插入所有字段 + * + * @param templateGroup 新增的记录 + * @return 返回影响行数 + */ + int insert(TemplateGroup templateGroup); + + /** + * 新增,忽略null字段 + * + * @param templateGroup 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(TemplateGroup templateGroup); + + /** + * 修改,修改所有字段 + * + * @param templateGroup 修改的记录 + * @return 返回影响行数 + */ + int update(TemplateGroup templateGroup); + + /** + * 修改,忽略null字段 + * + * @param templateGroup 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(TemplateGroup templateGroup); + + /** + * 删除记录 + * + * @param templateGroup 待删除的记录 + * @return 返回影响行数 + */ + int delete(TemplateGroup templateGroup); + +} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/TypeConfigMapper.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/TypeConfigMapper.java new file mode 100644 index 00000000..69fd4906 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/TypeConfigMapper.java @@ -0,0 +1,67 @@ +package com.gitee.gen.mapper; + +import com.gitee.gen.entity.TypeConfig; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface TypeConfigMapper { + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + TypeConfig getById(Integer id); + + /** + * 新增,插入所有字段 + * + * @param typeConfig 新增的记录 + * @return 返回影响行数 + */ + int insert(TypeConfig typeConfig); + + /** + * 新增,忽略null字段 + * + * @param typeConfig 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(TypeConfig typeConfig); + + /** + * 修改,修改所有字段 + * + * @param typeConfig 修改的记录 + * @return 返回影响行数 + */ + int update(TypeConfig typeConfig); + + /** + * 修改,忽略null字段 + * + * @param typeConfig 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(TypeConfig typeConfig); + + /** + * 删除记录 + * + * @param typeConfig 待删除的记录 + * @return 返回影响行数 + */ + int delete(TypeConfig typeConfig); + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/UpgradeMapper.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/UpgradeMapper.java new file mode 100644 index 00000000..728ed136 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/mapper/UpgradeMapper.java @@ -0,0 +1,63 @@ +package com.gitee.gen.mapper; + +import com.gitee.gen.entity.ColumnInfo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author tanghc + */ +@Mapper +public interface UpgradeMapper { + + void runSql(@Param("sql") String sql); + + /** + * 新增表字段 + * @param tableName 表名 + * @param columnName 字段名 + * @param type 类型 + */ + void addColumn(@Param("tableName") String tableName, @Param("columnName")String columnName,@Param("type") String type); + /** + * 新增dm表字段 + * @param tableName 表名 + * @param columnName 字段名 + * @param type 类型 + */ + void addColumnDm(@Param("tableName") String tableName, @Param("columnName")String columnName,@Param("type") String type); + /** + * 新增mysql表字段 + * @param tableName 表名 + * @param columnName 字段名 + * @param type 类型 + */ + void addColumnMysql(@Param("tableName") String tableName, @Param("columnName")String columnName,@Param("type") String type); + + /** + * 查看表字段信息 + * @param tableName 表名 + * @return 返回字段信息 + */ + List listColumnInfo(@Param("tableName") String tableName); + /** + * 查看DM表字段信息 + * @param tableName 表名 + * @return 返回字段信息 + */ + List listColumnInfoDm(@Param("tableName") String tableName); + /** + * 查看MYSQL表字段信息 + * @param tableName 表名 + * @return 返回字段信息 + */ + List listColumnInfoMysql(@Param("tableName") String tableName, @Param("dbName") String dbName); + + List listTableName(); + + List listTableNameDm(); + + List listTableNameMysql(); +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/DatasourceConfigService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/DatasourceConfigService.java new file mode 100644 index 00000000..f11a00a9 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/DatasourceConfigService.java @@ -0,0 +1,45 @@ +package com.gitee.gen.service; + +import com.gitee.gen.config.ConnectConfig; +import com.gitee.gen.config.DbTypeConfig; +import com.gitee.gen.entity.DatasourceConfig; +import com.gitee.gen.mapper.DatasourceConfigMapper; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; + +import java.util.List; + +/** + * @author tanghc + */ +@Component +public class DatasourceConfigService { + + @Db + private DatasourceConfigMapper datasourceConfigMapper; + + public DatasourceConfig getById(int id) { + return datasourceConfigMapper.getById(id); + } + + public List listAll() { + return datasourceConfigMapper.listAll(); + } + + public void insert(DatasourceConfig templateConfig) { + templateConfig.setIsDeleted(0); + ConnectConfig connectConfig = DbTypeConfig.getInstance().getConnectConfig(templateConfig.getDbType()); + if (connectConfig != null) { + templateConfig.setDriverClass(connectConfig.getDriver()); + } + datasourceConfigMapper.insert(templateConfig); + } + + public void update(DatasourceConfig templateConfig) { + datasourceConfigMapper.update(templateConfig); + } + + public void delete(DatasourceConfig templateConfig) { + datasourceConfigMapper.delete(templateConfig); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/GenerateHistoryService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/GenerateHistoryService.java new file mode 100644 index 00000000..36a58fab --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/GenerateHistoryService.java @@ -0,0 +1,106 @@ +package com.gitee.gen.service; + +import com.alibaba.fastjson.JSON; +import com.gitee.gen.common.GeneratorParam; +import com.gitee.gen.entity.GenerateHistory; +import com.gitee.gen.mapper.GenerateHistoryMapper; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.Utils; +import org.noear.solon.annotation.Component; + +import java.util.Date; +import java.util.List; + +@Component +public class GenerateHistoryService { + + @Db + private GenerateHistoryMapper generateHistoryMapper; + + public void saveHistory(GeneratorParam param) { + String content = JSON.toJSONString(param); + String md5 = Utils.md5(content); + GenerateHistory history = generateHistoryMapper.getByMd5(md5); + if (history != null) { + history.setGenerateTime(new Date()); + generateHistoryMapper.updateIgnoreNull(history); + return; + } + GenerateHistory generateHistory = new GenerateHistory(); + generateHistory.setConfigContent(content); + generateHistory.setMd5Value(md5); + generateHistory.setGenerateTime(new Date()); + this.insertIgnoreNull(generateHistory); + } + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + public List listAll() { + return generateHistoryMapper.listAll(); + } + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + public GenerateHistory getById(Integer id) { + return generateHistoryMapper.getById(id); + } + + /** + * 新增,插入所有字段 + * + * @param generateHistory 新增的记录 + * @return 返回影响行数 + */ + public int insert(GenerateHistory generateHistory) { + return generateHistoryMapper.insert(generateHistory); + } + + /** + * 新增,忽略null字段 + * + * @param generateHistory 新增的记录 + * @return 返回影响行数 + */ + public int insertIgnoreNull(GenerateHistory generateHistory) { + return generateHistoryMapper.insertIgnoreNull(generateHistory); + } + + /** + * 修改,修改所有字段 + * + * @param generateHistory 修改的记录 + * @return 返回影响行数 + */ + public int update(GenerateHistory generateHistory) { + return generateHistoryMapper.update(generateHistory); + } + + /** + * 修改,忽略null字段 + * + * @param generateHistory 修改的记录 + * @return 返回影响行数 + */ + public int updateIgnoreNull(GenerateHistory generateHistory) { + return generateHistoryMapper.updateIgnoreNull(generateHistory); + } + + /** + * 删除记录 + * + * @param generateHistory 待删除的记录 + * @return 返回影响行数 + */ + public int delete(GenerateHistory generateHistory) { + return generateHistoryMapper.delete(generateHistory); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/GeneratorService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/GeneratorService.java new file mode 100644 index 00000000..f2188236 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/GeneratorService.java @@ -0,0 +1,182 @@ +package com.gitee.gen.service; + +import com.gitee.gen.common.GeneratorParam; +import com.gitee.gen.entity.TemplateConfig; +import com.gitee.gen.gen.CodeFile; +import com.gitee.gen.gen.GeneratorConfig; +import com.gitee.gen.gen.SQLContext; +import com.gitee.gen.gen.SQLService; +import com.gitee.gen.gen.SQLServiceFactory; +import com.gitee.gen.gen.TableDefinition; +import com.gitee.gen.gen.TableSelector; +import com.gitee.gen.util.FormatUtil; +import com.gitee.gen.util.VelocityUtil; +import org.apache.commons.lang.StringUtils; +import org.apache.velocity.VelocityContext; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Properties; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * 生成代码逻辑 + */ +@Component +public class GeneratorService { + + static ExecutorService executorService = Executors.newFixedThreadPool(2); + + @Inject + private TemplateConfigService templateConfigService; + + @Inject + private GenerateHistoryService generateHistoryService; + + @Inject + private TypeConfigService typeConfigService; + + @Inject("${gen.format-xml:false}") + private String formatXml; + + + /** + * 生成代码内容,map的 + * + * @param generatorParam 生成参数 + * @param generatorConfig 数据源配置 + * @return 一张表对应多个模板 + */ + public List generate(GeneratorParam generatorParam, GeneratorConfig generatorConfig, Properties extConfig) { + List contextList = this.buildSQLContextList(generatorParam, generatorConfig); + List codeFileList = new ArrayList<>(); + + for (SQLContext sqlContext : contextList) { + sqlContext.setExtConfig(extConfig); + setPackageName(sqlContext, generatorParam.getPackageName()); + setDelPrefix(sqlContext, generatorParam.getDelPrefix()); + setAuthor(sqlContext, generatorParam.getAuthor()); + for (int tcId : generatorParam.getTemplateConfigIdList()) { + TemplateConfig template = templateConfigService.getById(tcId); + String folder = template.getFolder(); + if (StringUtils.isEmpty(folder)) { + folder = template.getName(); + }else{ + //文件目录可以使用变量 + folder = doGenerator(sqlContext, folder); + } + + setFolder(sqlContext, folder); + + //获取文件名 + String fileName = doGenerator(sqlContext, template.getFileName()); + String content = doGenerator(sqlContext, template.getContent()); + content = this.formatCode(fileName, content); + CodeFile codeFile = new CodeFile(); + codeFile.setFolder(folder); + codeFile.setFileName(fileName); + codeFile.setContent(content); + codeFileList.add(codeFile); + } + } + + executorService.execute(() -> { + generateHistoryService.saveHistory(generatorParam); + }); + + return codeFileList; + } + + // 格式化代码 + private String formatCode(String fileName, String content) { + if (Objects.equals("true", formatXml) && fileName.endsWith(".xml")) { + return FormatUtil.formatXml(content); + } + return content; + } + + + /** + * 返回SQL上下文列表 + * + * @param generatorParam 参数 + * @param generatorConfig 配置 + * @return 返回SQL上下文 + */ + private List buildSQLContextList(GeneratorParam generatorParam, GeneratorConfig generatorConfig) { + + List tableNames = generatorParam.getTableNames(); + List contextList = new ArrayList<>(); + SQLService service = SQLServiceFactory.build(generatorConfig); + + TableSelector tableSelector = service.getTableSelector(generatorConfig); + tableSelector.setSchTableNames(tableNames); + tableSelector.setColumnTypeConverter(typeConfigService.buildColumnTypeConverter()); + + List tableDefinitions = tableSelector.getTableDefinitions(); + + for (TableDefinition tableDefinition : tableDefinitions) { + SQLContext sqlContext = new SQLContext(tableDefinition); + sqlContext.setDbName(generatorConfig.getDbName()); + contextList.add(sqlContext); + } + + return contextList; + } + + private void setPackageName(SQLContext sqlContext, String packageName) { + if (StringUtils.isNotBlank(packageName)) { + sqlContext.setPackageName(packageName); + } + } + + private void setFolder(SQLContext sqlContext, String folder) { + if (StringUtils.isNotBlank(folder)) { + sqlContext.setPackageSubPath(folder); + } + } + + private void setDelPrefix(SQLContext sqlContext, String delPrefix) { + if (StringUtils.isNotBlank(delPrefix)) { + sqlContext.setDelPrefix(delPrefix); + } + } + + private void setAuthor(SQLContext sqlContext, String author) { + if (StringUtils.isNotBlank(author)) { + sqlContext.setAuthor(author); + } + } + + private String doGenerator(SQLContext sqlContext, String template) { + if (template == null) { + return ""; + } + VelocityContext context = new VelocityContext(); + Object pkColumn = sqlContext.getTableDefinition().getPkColumn(); + if (pkColumn == null) { + pkColumn = Collections.emptyMap(); + } + context.put("context", sqlContext); + context.put("table", sqlContext.getTableDefinition()); + context.put("pk", pkColumn); + context.put("columns", sqlContext.getTableDefinition().getColumnDefinitions()); + context.put("csharpColumns", sqlContext.getTableDefinition().getCsharpColumnDefinitions()); + + Properties extConfig = sqlContext.getExtConfig(); + if (extConfig != null) { + for (Map.Entry entry : extConfig.entrySet()) { + context.put(String.valueOf(entry.getKey()), entry.getValue()); + } + } + + return VelocityUtil.generate(context, template); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/LocalGenService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/LocalGenService.java new file mode 100644 index 00000000..cb825ef2 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/LocalGenService.java @@ -0,0 +1,115 @@ +package com.gitee.gen.service; + +import com.gitee.gen.common.GeneratorParam; +import com.gitee.gen.entity.TemplateConfig; +import com.gitee.gen.gen.CodeFile; +import com.gitee.gen.gen.GeneratorConfig; +import org.apache.commons.io.FileUtils; +import org.noear.snack.core.utils.StringUtil; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Properties; +import java.util.stream.Collectors; +import java.util.stream.Stream; + + +/** + * @author 六如 + */ +@Component +public class LocalGenService { + + @Inject + private GeneratorService generatorService; + + @Inject + private TemplateConfigService templateConfigService; + + /** + * 生成本地文件 + * + * @param extConfig 配置 + */ + public void genLocal(Properties extConfig) throws IOException { + check(extConfig); + GeneratorParam generatorParam = buildGeneratorParam(extConfig); + GeneratorConfig generatorConfig = buildGeneratorConfig(extConfig); + List files = generatorService.generate(generatorParam, generatorConfig, extConfig); + for (CodeFile file : files) { + FileUtils.writeStringToFile(new File(file.getFileName()), file.getContent(), StandardCharsets.UTF_8); + System.out.println("生成文件:" + file.getFileName()); + } + } + + private void check(Properties extConfig) { + String moduleName = extConfig.getProperty("moduleName"); + if (StringUtil.isEmpty(moduleName)) { + throw new IllegalArgumentException("moduleName 配置必填"); + } + } + + private GeneratorParam buildGeneratorParam(Properties extConfig) { + GeneratorParam generatorParam = new GeneratorParam(); + generatorParam.setDatasourceConfigId(0); + + String table = extConfig.getProperty("tables"); + if (table == null) { + throw new RuntimeException("未指定表名"); + } + String[] split = table.split(","); + generatorParam.setTableNames(Stream.of(split).collect(Collectors.toList())); + + List templateIds = templateConfigService.listByGroupName(extConfig.getProperty("groupName")) + .stream() + .map(TemplateConfig::getId) + .collect(Collectors.toList()); + generatorParam.setTemplateConfigIdList(templateIds); + generatorParam.setPackageName(""); + generatorParam.setDelPrefix(""); + generatorParam.setAuthor(extConfig.getProperty("author")); + + return generatorParam; + } + + private GeneratorConfig buildGeneratorConfig(Properties extConfig) { + GeneratorConfig generatorConfig = new GeneratorConfig(); + generatorConfig.setDbName(extConfig.getProperty("db.name")); + String driverClass = extConfig.getProperty("db.driverClass"); + if (StringUtil.isEmpty(driverClass)) { + throw new RuntimeException("未指定driverClass"); + } + + generatorConfig.setDbType(buildDbType(driverClass)); + generatorConfig.setPort(Integer.parseInt(extConfig.getProperty("db.port"))); + generatorConfig.setHost(extConfig.getProperty("db.host")); + generatorConfig.setUsername(extConfig.getProperty("db.username")); + generatorConfig.setPassword(extConfig.getProperty("db.password")); + generatorConfig.setDriverClass(driverClass); + return generatorConfig; + } + + private Integer buildDbType(String driverClass) { + if (driverClass.contains("mysql")) { + return 1; + } + if (driverClass.contains("OracleDriver")) { + return 2; + } + if (driverClass.contains("SQLServerDriver")) { + return 3; + } + if (driverClass.contains("postgresql")) { + return 4; + } + if (driverClass.contains("DmDriver")) { + return 5; + } + + return 1; + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/SystemConfigService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/SystemConfigService.java new file mode 100644 index 00000000..c575d966 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/SystemConfigService.java @@ -0,0 +1,105 @@ +package com.gitee.gen.service; + +import com.gitee.gen.entity.SystemConfig; +import com.gitee.gen.mapper.SystemConfigMapper; +import java.util.List; +import java.util.Optional; + +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; + + +@Component +public class SystemConfigService { + + @Db + private SystemConfigMapper systemConfigMapper; + + public Optional getValue(String key) { + SystemConfig config = systemConfigMapper.getByKey(key); + return Optional.ofNullable(config) + .map(SystemConfig::getConfigValue); + } + + public void saveOrUpdate(SystemConfig systemConfig) { + SystemConfig config = systemConfigMapper.getByKey(systemConfig.getConfigKey()); + if (config == null) { + systemConfigMapper.insert(systemConfig); + } else { + config.setConfigValue(systemConfig.getConfigValue()); + config.setRemark(systemConfig.getRemark()); + systemConfigMapper.update(config); + } + } + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + public List listAll() { + return systemConfigMapper.listAll(); + } + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + public SystemConfig getById(Integer id) { + return systemConfigMapper.getById(id); + } + + /** + * 新增,插入所有字段 + * + * @param systemConfig 新增的记录 + * @return 返回影响行数 + */ + public int insert(SystemConfig systemConfig) { + return systemConfigMapper.insert(systemConfig); + } + + /** + * 新增,忽略null字段 + * + * @param systemConfig 新增的记录 + * @return 返回影响行数 + */ + public int insertIgnoreNull(SystemConfig systemConfig) { + return systemConfigMapper.insertIgnoreNull(systemConfig); + } + + /** + * 修改,修改所有字段 + * + * @param systemConfig 修改的记录 + * @return 返回影响行数 + */ + public int update(SystemConfig systemConfig) { + return systemConfigMapper.update(systemConfig); + } + + /** + * 修改,忽略null字段 + * + * @param systemConfig 修改的记录 + * @return 返回影响行数 + */ + public int updateIgnoreNull(SystemConfig systemConfig) { + return systemConfigMapper.updateIgnoreNull(systemConfig); + } + + /** + * 删除记录 + * + * @param systemConfig 待删除的记录 + * @return 返回影响行数 + */ + public int delete(SystemConfig systemConfig) { + return systemConfigMapper.delete(systemConfig); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/TemplateConfigService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/TemplateConfigService.java new file mode 100644 index 00000000..33be4e4f --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/TemplateConfigService.java @@ -0,0 +1,123 @@ +package com.gitee.gen.service; + +import com.gitee.gen.entity.TemplateConfig; +import com.gitee.gen.mapper.TemplateConfigMapper; +import com.gitee.gen.util.StringUtil; +import com.gitee.gen.util.TemplateMetaUtils; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @author tanghc + */ +@Component +public class TemplateConfigService { + + @Db + private TemplateConfigMapper templateConfigMapper; + + public List listTemplate(List idList) { + if (CollectionUtils.isEmpty(idList)) { + return Collections.emptyList(); + } + return templateConfigMapper.listTemplate(idList); + } + + public TemplateConfig getById(int id) { + return templateConfigMapper.getById(id); + } + + public List listAll() { + return templateConfigMapper.listAll(); + } + + public void insert(TemplateConfig templateConfig) { + String name = templateConfig.getName(); + TemplateConfig existObj = templateConfigMapper.getByName(name, templateConfig.getGroupId()); + if (existObj != null) { + throw new RuntimeException("模板名称 "+ name +" 已存在"); + } + templateConfig.setIsDeleted(0); + templateConfigMapper.insert(templateConfig); + } + + public void update(TemplateConfig templateConfig) { + String name = templateConfig.getName(); + TemplateConfig existObj = templateConfigMapper.getByName(name, templateConfig.getGroupId()); + if (existObj != null && !Objects.equals(templateConfig.getId(), existObj.getId())) { + throw new RuntimeException("模板名称 "+ name +" 已存在"); + } + templateConfigMapper.updateIgnoreNull(templateConfig); + } + + public void delete(TemplateConfig templateConfig) { + templateConfigMapper.delete(templateConfig); + } + + public List listByGroupId(String groupId) { + return templateConfigMapper.listByGroupId(groupId); + } + + public List listByGroupName(String groupName) { + return templateConfigMapper.listByGroupName(groupName); + } + + + public synchronized void save(TemplateConfig templateConfig) { + handleContent(templateConfig); + String name = templateConfig.getName(); + TemplateConfig existObj = templateConfigMapper.getByName(name, templateConfig.getGroupId()); + if(existObj == null) { + this.insert(templateConfig); + } else { + templateConfig.setId(existObj.getId()); + this.update(templateConfig); + } + } + + /** + * 复制模板 + * @param templateConfig + */ + public void copy(TemplateConfig templateConfig) { + Integer id = templateConfig.getId(); + TemplateConfig templateConfigById = this.getById(id); + if(templateConfigById == null){ + throw new RuntimeException("要复制的模板不存在"); + } + templateConfigById.setId(null); + templateConfigById.setName(templateConfig.getName()); + this.save(templateConfigById); + } + + /** + * 解析模板元信息, 即开始第一行是注释时 + *

+ * 格式: ## filename=#{xxx}.java, folder=entity + */ + private void handleContent(TemplateConfig template) { + String content = StringUtil.trimLeadingWhitespace(template.getContent()); + // 解析元信息 + Map data = TemplateMetaUtils.parseMetaContent(content); + if (StringUtils.isEmpty(template.getFileName())) { + template.setFileName(data.get("filename")); + } + if (StringUtils.isEmpty(template.getFolder())) { + template.setFolder(data.get("folder")); + } + // 设置默认值 + if (StringUtils.isEmpty(template.getFileName())) { + template.setFileName(template.getName()); + } + if (StringUtils.isEmpty(template.getFolder())) { + template.setFolder(template.getName()); + } + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/TemplateGroupService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/TemplateGroupService.java new file mode 100644 index 00000000..dfa46f75 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/TemplateGroupService.java @@ -0,0 +1,109 @@ +package com.gitee.gen.service; + +import com.gitee.gen.entity.TemplateGroup; +import com.gitee.gen.mapper.TemplateConfigMapper; +import com.gitee.gen.mapper.TemplateGroupMapper; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; + +import java.util.List; + +/** + * @author : zsljava + * @date Date : 2020-12-15 9:50 + * @Description: TODO + */ +@Component +public class TemplateGroupService { + + @Db + private TemplateGroupMapper templateGroupMapper; + + @Db + private TemplateConfigMapper templateConfigMapper; + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + public List listAll() { + return templateGroupMapper.listAll(); + } + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + public TemplateGroup getById(Integer id) { + return templateGroupMapper.getById(id); + } + + /** + * 新增,插入所有字段 + * + * @param templateGroup 新增的记录 + * @return 返回影响行数 + */ + public int insert(TemplateGroup templateGroup) { + return templateGroupMapper.insert(templateGroup); + } + + /** + * 新增,忽略null字段 + * + * @param templateGroup 新增的记录 + * @return 返回影响行数 + */ + public int insertIgnoreNull(TemplateGroup templateGroup) { + templateGroup.setIsDeleted(0); + return templateGroupMapper.insertIgnoreNull(templateGroup); + } + + /** + * 修改,修改所有字段 + * + * @param templateGroup 修改的记录 + * @return 返回影响行数 + */ + public int update(TemplateGroup templateGroup) { + return templateGroupMapper.update(templateGroup); + } + + /** + * 修改,忽略null字段 + * + * @param templateGroup 修改的记录 + * @return 返回影响行数 + */ + public int updateIgnoreNull(TemplateGroup templateGroup) { + return templateGroupMapper.updateIgnoreNull(templateGroup); + } + + /** + * 删除记录 + * + * @param templateGroup 待删除的记录 + * @return 返回影响行数 + */ + public int delete(TemplateGroup templateGroup) { + return templateGroupMapper.delete(templateGroup); + } + + public int deleteGroup(TemplateGroup templateGroup) { + List templateGroups = this.listAll(); + if (templateGroups.size() == 1) { + throw new RuntimeException("无法删除,必须要有一个模板组"); + } + int delete = templateGroupMapper.delete(templateGroup); + templateConfigMapper.deleteByGroupId(templateGroup.getId()); + return delete; + } + + public TemplateGroup getByName(String name) { + return templateGroupMapper.getByName(name); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/TypeConfigService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/TypeConfigService.java new file mode 100644 index 00000000..42064c71 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/TypeConfigService.java @@ -0,0 +1,97 @@ +package com.gitee.gen.service; + +import com.gitee.gen.entity.TypeConfig; +import com.gitee.gen.gen.converter.ColumnTypeConverter; +import com.gitee.gen.gen.converter.DbColumnTypeConverter; +import com.gitee.gen.mapper.TypeConfigMapper; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Component +public class TypeConfigService { + + @Db + private TypeConfigMapper typeConfigMapper; + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + public List listAll() { + return typeConfigMapper.listAll(); + } + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + public TypeConfig getById(Integer id) { + return typeConfigMapper.getById(id); + } + + /** + * 新增,插入所有字段 + * + * @param typeConfig 新增的记录 + * @return 返回影响行数 + */ + public int insert(TypeConfig typeConfig) { + return typeConfigMapper.insert(typeConfig); + } + + /** + * 新增,忽略null字段 + * + * @param typeConfig 新增的记录 + * @return 返回影响行数 + */ + public int insertIgnoreNull(TypeConfig typeConfig) { + return typeConfigMapper.insertIgnoreNull(typeConfig); + } + + /** + * 修改,修改所有字段 + * + * @param typeConfig 修改的记录 + * @return 返回影响行数 + */ + public int update(TypeConfig typeConfig) { + return typeConfigMapper.update(typeConfig); + } + + /** + * 修改,忽略null字段 + * + * @param typeConfig 修改的记录 + * @return 返回影响行数 + */ + public int updateIgnoreNull(TypeConfig typeConfig) { + return typeConfigMapper.updateIgnoreNull(typeConfig); + } + + /** + * 删除记录 + * + * @param typeConfig 待删除的记录 + * @return 返回影响行数 + */ + public int delete(TypeConfig typeConfig) { + return typeConfigMapper.delete(typeConfig); + } + + public ColumnTypeConverter buildColumnTypeConverter() { + List typeConfigs = typeConfigMapper.listAll(); + Map map = typeConfigs.stream() + .collect(Collectors.toMap(TypeConfig::getDbType, Function.identity(), (v1, v2) -> v2)); + return new DbColumnTypeConverter(map); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/UpgradeService.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/UpgradeService.java new file mode 100644 index 00000000..be0e0488 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/service/UpgradeService.java @@ -0,0 +1,323 @@ +package com.gitee.gen.service; + +import com.gitee.gen.entity.ColumnInfo; +import com.gitee.gen.entity.SystemConfig; +import com.gitee.gen.mapper.UpgradeMapper; +import com.gitee.gen.util.SystemUtil; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.Solon; +import org.noear.solon.Utils; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; +import org.noear.solon.core.AppClassLoader; +import org.noear.solon.core.util.IoUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Objects; + + +/** + * 升级 + * + * @author tanghc + */ +@Component +public class UpgradeService { + + private static final Logger log = LoggerFactory.getLogger(UpgradeService.class); + + public static final String TABLE_DATASOURCE_CONFIG = "datasource_config"; + public static final String TABLE_TEMPLATE_CONFIG = "template_config"; + public static final String TABLE_TEMPLATE_GROUP = "template_group"; + public static final String TABLE_GENERATE_HISTORY = "generate_history"; + + // 版本号,格式:xx.yy.zz,如:1.16.0,1.16.11 + private static final int CURRENT_VERSION = 200000; + public static final String GEN_VERSION = "GEN_VERSION"; + private static final String DB_FILE_NAME = "gen.db"; + + @Db + private UpgradeMapper upgradeMapper; + + @Inject + private SystemConfigService systemConfigService; + + @Inject("${dbms.enable:false}") + private boolean useDbms; + + @Inject("${gen.db2.driverClassName}") + private String driverClassName; + + @Inject("${dbms.database:gen}") + private String dbName; + + @Inject("${gen.init-file:gen_init.db}") + private String initFileName; + + public void init() { + this.createTable("system_config"); + int oldVersion = getOldVersion(); + upgrade(oldVersion); + } + + public void initDatabase() { + if (useDbms) { + log.info("使用DBMS,跳过sqlit3文件初始化"); + return; + } + File dbFile = getDbFile(); + if (!dbFile.exists()) { + try { + dbFile.createNewFile(); + } catch (IOException e) { + throw new RuntimeException(e); + } + try (InputStream inputStream = AppClassLoader.getSystemResourceAsStream(initFileName)) { + Path path = dbFile.toPath(); + log.info("初始化数据库文件, path={}", path); + OutputStream outputStream = Files.newOutputStream(path); + IoUtil.transferTo(inputStream, outputStream); + outputStream.close(); + } catch (IOException e) { + throw new RuntimeException("初始化数据库失败", e); + } + } + } + + private File getDbFile() { + String localDbPath = getLocalDbPath(); + log.info("SQLite3 Database file:{}", localDbPath); + return new File(localDbPath); + } + + public static String getLocalDbPath() { + String dbPath = Solon.cfg().get("LOCAL_DB", ""); + if (Utils.isNotBlank(dbPath)) { + return dbPath.replace("${user.home}", SystemUtil.getUserHome()); + } else { + return SystemUtil.getUserDir() + "/" + DB_FILE_NAME; + } + } + + private int getOldVersion() { + return systemConfigService.getValue(GEN_VERSION) + .map(Integer::parseInt) + .orElse(0); + } + + private void writeNewVersion() { + SystemConfig systemConfig = new SystemConfig(); + systemConfig.setConfigKey(GEN_VERSION); + systemConfig.setConfigValue(String.valueOf(CURRENT_VERSION)); + systemConfig.setRemark("版本号"); + systemConfigService.saveOrUpdate(systemConfig); + } + + /** + * 升级 + */ + public void upgrade(int oldVersion) { + if (oldVersion == 0) { + upgradeV1_4_0(); + upgradeV1_4_12(); + upgradeV1_4_17(); + upgradeV1_5_2(); + } + doUpgrade(oldVersion); + writeNewVersion(); + } + + private void doUpgrade(int oldVersion) { + upgradeV1_6_0(oldVersion); + upgradeV2_0_0(oldVersion); + } + + private void upgradeV2_0_0(int oldVersion) { + if (oldVersion < 200000) { + createTable("type_config", () -> { + runSql("insert into type_config(db_type, base_type, box_type) values\n" + + "('bit', 'boolean', 'Boolean')\n" + + ",('boolean', 'boolean', 'Boolean')\n" + + ",('tinyint', 'int', 'Integer')\n" + + ",('smallint', 'int', 'Integer')\n" + + ",('int', 'int', 'Integer')\n" + + ",('bigint', 'long', 'Long')\n" + + ",('float', 'float', 'Float')\n" + + ",('double', 'double', 'Double')\n" + + ",('decimal', 'BigDecimal', 'BigDecimal')\n" + + ",('varchar', 'String', 'String')\n" + + ",('datetime', 'Date', 'Date')\n" + + ",('date', 'Date', 'Date')\n" + + ",('blob', 'String', 'String')\n" + + ",('jsonb', 'String', 'String')"); + }); + } + } + + private void upgradeV1_6_0(int oldVersion) { + if (oldVersion < 101600) { + this.addColumn(TABLE_DATASOURCE_CONFIG, "db_desc", "varchar(64)"); + this.addColumn(TABLE_DATASOURCE_CONFIG, "db_group_name", "varchar(64)"); + } + } + + private void upgradeV1_4_17() { + this.addColumn(TABLE_TEMPLATE_CONFIG, "folder", "varchar(64)"); + } + + private void upgradeV1_4_12() { + this.addColumn(TABLE_DATASOURCE_CONFIG, "schema_name", "varchar(100)"); + } + + /** + * 升级v1.4.0 + */ + private void upgradeV1_4_0() { + this.createTable(TABLE_GENERATE_HISTORY); + boolean isCreate = this.createTable(TABLE_TEMPLATE_GROUP); + if (isCreate) { + runSql("INSERT INTO `template_group` (`id`, `group_name`, `is_deleted`) VALUES (1,'default',0)"); + } + + this.addColumn(TABLE_DATASOURCE_CONFIG, "package_name", "varchar(100)"); + this.addColumn(TABLE_DATASOURCE_CONFIG, "del_prefix", "varchar(200)"); + this.addColumn(TABLE_DATASOURCE_CONFIG, "group_id", "int"); + + this.addColumn(TABLE_TEMPLATE_CONFIG, "group_id", "int"); + this.addColumn(TABLE_TEMPLATE_CONFIG, "group_name", "varchar(100)"); + runSql("update template_config set group_id=1,group_name='default' where group_id IS NULL"); + } + + /** + * 升级v1.5.2 + * 1、前端:修复修改数据源时候不管什么数据库都带出oracle数据库 + * 2、前端:新增oracle类型数据库 数据库角色可以为空 + * 3、前端:修复数据库类型为oracle数据库时候测试连接服务器字段展示undefined问题 + * 4、前后端:新增author作者名配置,方便模板中插入作者 + * 5、后端:修复postgresql数据库表如果没有设置主键无法获取列数组问题 + */ + private void upgradeV1_5_2() { + this.addColumn(TABLE_DATASOURCE_CONFIG, "author", "varchar(255)"); + } + + private void runSql(String sql) { + upgradeMapper.runSql(sql); + } + + /** + * 添加表字段 + * + * @param tableName 表名 + * @param columnName 字段名 + * @param type 字段类型,如:varchar(128),text,integer + * @return 返回true,插入成功 + */ + public boolean addColumn(String tableName, String columnName, String type) { + if (!isColumnExist(tableName, columnName)) { + try { + if (isMysql()) { + upgradeMapper.addColumnMysql(tableName, columnName, type); + } else if (isDm()) { + upgradeMapper.addColumnDm(tableName, columnName, type); + } else { + upgradeMapper.addColumn(tableName, columnName, type); + } + } catch (Exception e) { + log.error("add column error, tableName={}, columnName={}, type={}", + tableName, columnName, type, e); + } + return true; + } + return false; + } + + /** + * 创建表 + * + * @param tableName 表名 + * @return 创建成功返回true + */ + public boolean createTable(String tableName, Runnable afterCreated) { + if (!isTableExist(tableName)) { + String sql = this.loadDDL(tableName); + upgradeMapper.runSql(sql); + if (afterCreated != null) { + afterCreated.run(); + } + return true; + } + return false; + } + + public boolean createTable(String tableName) { + return createTable(tableName, null); + } + + private String loadDDL(String tableName) { + String tmp_dm = "ddl_%s_dm.txt"; + String tmp_mysql = "ddl_%s_mysql.txt"; + String tmp_sqlite = "ddl_%s_sqlite.txt"; + String tmp = isDm() ? tmp_dm : (isMysql() ? tmp_mysql : tmp_sqlite); + String filename = "upgrade/" + String.format(tmp, tableName); + InputStream inputStream = AppClassLoader.getSystemResourceAsStream(filename); + if (inputStream == null) { + throw new RuntimeException("找不到文件:" + filename); + } + try { + return IoUtil.transferToString(inputStream); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("打开文件出错", e); + } + } + + /** + * 判断列是否存在 + * + * @param tableName 表名 + * @param columnName 列名 + * @return true:存在 + */ + public boolean isColumnExist(String tableName, String columnName) { + List columnInfoList = isDm() ? upgradeMapper.listColumnInfoDm(tableName) : + (isMysql() ? upgradeMapper.listColumnInfoMysql(tableName, dbName) : upgradeMapper.listColumnInfo(tableName)); + return columnInfoList + .stream() + .anyMatch(columnInfo -> Objects.equals(columnInfo.getName(), columnName)); + } + + /** + * 表是否存在 + * + * @param tableName + * @return + */ + public boolean isTableExist(String tableName) { + List tableNameList; + if (isMysql()) { + tableNameList = upgradeMapper.listTableNameMysql(); + } else if (isDm()) { + tableNameList = upgradeMapper.listTableNameDm(); + } else { + tableNameList = upgradeMapper.listTableName(); + } + return tableNameList != null && tableNameList.contains(tableName); + } + + private boolean isMysql() { + return useDbms && this.driverClassName.contains("mysql"); + } + + private boolean isDm() { + return useDbms && this.driverClassName.contains("dm"); + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/BeanUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/BeanUtil.java new file mode 100644 index 00000000..38c2ae36 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/BeanUtil.java @@ -0,0 +1,372 @@ +package com.gitee.gen.util; + +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Collectors; + +/** + * @author thc + */ +public class BeanUtil { + private static final Log logger = LogFactory.getLog(BeanUtil.class); + + private static final String PREFIX_GET = "get"; + private static final String PREFIX_SET = "set"; + private static final String PREFIX_IS = "is"; + private static final String GET_CLASS_NAME = "getClass"; + + /** + * 属性拷贝,第一个参数中的属性值拷贝到第二个参数中
+ * 注意:当第一个参数中的属性有null值时,不会拷贝进去 + * + * @param source 源对象 + * @param target 目标对象 + */ + public static void copyPropertiesIgnoreNull(Object source, Object target) { + copyProperties(source, target, true); + } + + /** + * 属性拷贝,第一个参数中的属性值拷贝到第二个参数中
+ * 注意:当第一个参数中的属性有null值时,不会拷贝进去 + * + * @param source 源对象 + * @param target 目标对象 + * @param ignoreNullValue 是否忽略null值 + */ + private static void copyPropertiesForMap(Map source, Object target, boolean ignoreNullValue) { + Objects.requireNonNull(source, "Source must not be null"); + Objects.requireNonNull(target, "Target must not be null"); + Method[] targetMethods = target.getClass().getMethods(); + Map setMethodMap = buildSetMethodMap(targetMethods); + Set keys = source.keySet(); + try { + for (String column : keys) { + Object sourceFieldValue = source.get(column); + if (ignoreNullValue && sourceFieldValue == null) { + continue; + } + MethodBean methodBean = setMethodMap.get(column); + // 如果为null,转成驼峰再获取一次 + if (methodBean == null) { + String fieldName = FieldUtil.underlineFilter(column); + methodBean = setMethodMap.get(fieldName); + } + if (methodBean == null) { + continue; + } + Class paramType = methodBean.getParamType(); + Object targetVal = parseValue(sourceFieldValue, paramType); + Method targetMethod = methodBean.getMethod(); + setValue(targetMethod, target, targetVal); + } + } catch (Exception e) { + logger.error("copyPropertiesForMap error, source=" + source, e); + throw new RuntimeException(e); + } + } + + /** + * 属性拷贝,第一个参数中的属性值拷贝到第二个参数中
+ * 注意:当第一个参数中的属性有null值时,不会拷贝进去 + * + * @param source 源对象 + * @param target 目标对象 + * @param ignoreNullValue 是否忽略null值 + */ + private static void copyProperties(Object source, Object target, boolean ignoreNullValue) { + Objects.requireNonNull(source, "Source must not be null"); + Objects.requireNonNull(target, "Target must not be null"); + if (source instanceof Map) { + copyPropertiesForMap((Map) source, target, ignoreNullValue); + return; + } + Method[] sourceMethods = source.getClass().getMethods(); + Method[] targetMethods = target.getClass().getMethods(); + Map setMethodMap = buildSetMethodMap(targetMethods); + try { + for (Method method : sourceMethods) { + if (isGetMethod(method)) { + String methodName = method.getName(); + Class returnType = method.getReturnType(); + String sourceFieldName = buildFieldName(methodName); + Object sourceFieldValue = method.invoke(source); + if (ignoreNullValue && sourceFieldValue == null) { + continue; + } + MethodBean methodBean = setMethodMap.get(sourceFieldName); + if (methodBean == null) { + continue; + } + Class paramType = methodBean.getParamType(); + Method targetMethod = methodBean.getMethod(); + if (paramType == returnType) { + setValue(targetMethod, target, sourceFieldValue); + } + } + } + } catch (Exception e) { + throw new RuntimeException("copyProperties error", e); + } + } + + /** + * 返回所有的setXX方法,key为对应的字段名称 + * + * @param methods 方法列表 + * @return 返回setXx方法对应关系,key为对应的字段名称 + */ + private static Map buildSetMethodMap(Method[] methods) { + return Arrays.stream(methods) + .filter(BeanUtil::isSetMethod) + .collect(Collectors.toMap(method -> buildFieldName(method.getName()), method -> { + Class parameterType = method.getParameterTypes()[0]; + return new MethodBean(method, parameterType); + })); + } + + private static void setValue(Method method, Object obj, Object value) throws InvocationTargetException, IllegalAccessException { + method.invoke(obj, value); + } + + /** + * 属性拷贝,第一个参数中的属性值拷贝到第二个参数中
+ * 注意:当第一个参数中的属性有null值时,不会拷贝进去 + * + * @param source 源对象 + * @param target 目标对象 + */ + public static void copyProperties(Object source, Object target) { + Objects.requireNonNull(source, "Source must not be null"); + Objects.requireNonNull(target, "Target must not be null"); + copyProperties(source, target, false); + } + + + /** + * 深层次拷贝 + * + * @param from 待转换的集合类 + * @param toClass 目标类class + * @param 目标类 + * @return 返回目标类 + */ + public static List copyBean(List from, Class toClass) { + if (from == null || from.isEmpty()) { + return new ArrayList<>(); + } + return from.stream() + .filter(Objects::nonNull) + .map(source -> copyBean(source, toClass)) + .collect(Collectors.toList()); + } + + + /** + * 深层次拷贝,通过json转换的方式实现 + * + * @param from 待转换的类 + * @param toClass 目标类class + * @param 目标类 + * @return 返回目标类 + */ + public static T copyBean(Object from, Class toClass) { + if (from == null) { + return null; + } + T target = newInstance(toClass); + copyProperties(from, target); + return target; + } + + private static T newInstance(Class clazz) { + try { + return clazz.newInstance(); + } catch (Exception e) { + throw new RuntimeException("create instance error", e); + } + } + + /** + * 将实体对象转换成Map, key:实体类中的字段名称 + * + * @param pojo 实体类 + * @return 返回map, key:实体类中的字段名称, value:实体类中的字段值 + */ + public static Map pojoToMap(Object pojo) { + if (pojo == null) { + return Collections.emptyMap(); + } + Method[] methods = pojo.getClass().getMethods(); + Map map = new HashMap<>(methods.length * 2); + try { + for (Method method : methods) { + if (isGetMethod(method)) { + String methodName = method.getName(); + String fieldName = buildFieldName(methodName); + Object value = method.invoke(pojo); + map.put(fieldName, value); + } + } + } catch (Exception e) { + throw new RuntimeException("pojoToMap失败", e); + } + return map; + } + + // 构建列名 + private static String buildFieldName(String methodName) { + if (methodName.startsWith(PREFIX_IS)) { + return methodName.substring(2, 3).toLowerCase() + methodName.substring(3); + } + return methodName.substring(3, 4).toLowerCase() + methodName.substring(4); + } + + /** + * 是否是get方法 + */ + private static boolean isGetMethod(Method method) { + Class returnType = method.getReturnType(); + if (returnType == Void.TYPE) { + return false; + } + String methodName = method.getName(); + if (GET_CLASS_NAME.equals(methodName)) { + return false; + } + boolean isBooleanType = returnType == boolean.class || returnType == Boolean.class; + return methodName.startsWith(PREFIX_GET) || (isBooleanType && methodName.startsWith(PREFIX_IS)); + } + + /** + * 是否是set方法 + * + * @param method + * @return + */ + private static boolean isSetMethod(Method method) { + return method.getName().startsWith(PREFIX_SET) && method.getParameterTypes().length == 1; + } + + /** + * 单值转换 + * @param value 单值 + * @param valClass 转换的class类型 + * @param 类型 + * @return 转换后的值 + */ + public static T parseValue(Object value, Class valClass) { + if (value == null) { + return null; + } + if (valClass == Object.class) { + return (T) value; + } + if (valClass == String.class) { + return (T) String.valueOf(value); + } + // 处理时间类型 + if (value.getClass() == Timestamp.class) { + Timestamp timestamp = (Timestamp) value; + if (valClass == Date.class) { + return (T) timestamp; + } else if (valClass == java.sql.Date.class) { + return (T) new java.sql.Date(timestamp.getTime()); + } else if (valClass == LocalDateTime.class) { + return (T) timestamp.toLocalDateTime(); + } + } + if ( valClass == Date.class && value.getClass() == LocalDateTime.class) { + LocalDateTime localDateTime = (LocalDateTime) value; + return (T) Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + T t = null; + // 转换单值:byte(位)、short(短整数)、int(整数)、long(长整数)、float(单精度)、double(双精度)、char(字符)和boolean(布尔值)。 + String strValue = String.valueOf(value); + + if (valClass == Byte.class || valClass == byte.class) { + t = (T) Byte.valueOf(strValue); + } + if (valClass == Short.class || valClass == short.class) { + t = (T) Short.valueOf(strValue); + } + if (valClass == Integer.class || valClass == int.class) { + t = (T) Integer.valueOf(strValue); + } + if (valClass == Long.class || valClass == long.class) { + t = (T) Long.valueOf(strValue); + } + if (valClass == Float.class || valClass == float.class) { + t = (T) Float.valueOf(strValue); + } + if (valClass == Double.class || valClass == double.class) { + t = (T) Double.valueOf(strValue); + } + if (valClass == Character.class || valClass == char.class) { + t = (T) Character.valueOf(strValue.charAt(0)); + } + if (valClass == BigDecimal.class) { + t = (T) (value.getClass() == BigDecimal.class ? value : new BigDecimal(strValue)); + } + if (valClass == BigInteger.class) { + t = (T) (value.getClass() == BigInteger.class ? value : new BigInteger(strValue)); + } + if (valClass == AtomicInteger.class) { + t = (T) (value.getClass() == AtomicInteger.class ? value : new AtomicInteger(Integer.valueOf(strValue))); + } + if (valClass == AtomicLong.class) { + t = (T) (value.getClass() == AtomicLong.class ? value : new AtomicLong(Long.valueOf(strValue))); + } + if (valClass == Boolean.class || valClass == boolean.class) { + String temp = strValue; + if ("0".equals(strValue)) { + temp = "false"; + } else if ("1".equals(strValue)) { + temp = "true"; + } + t = (T) Boolean.valueOf(temp); + } + if (t != null) { + return t; + } + // 转换其它单值 + return (T) value; + } + + static class MethodBean { + private final Method method; + private final Class paramType; + + public MethodBean(Method method, Class paramType) { + this.method = method; + this.paramType = paramType; + } + + public Method getMethod() { + return method; + } + + public Class getParamType() { + return paramType; + } + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FieldUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FieldUtil.java new file mode 100644 index 00000000..f1865e90 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FieldUtil.java @@ -0,0 +1,164 @@ +package com.gitee.gen.util; + +import org.apache.commons.lang.StringUtils; + +import java.util.Objects; + +public class FieldUtil { + + public static final String UNDER_LINE = "_"; + + /** + * 下划线字段转驼峰
+ * + *

+     * user_age -> userAge
+     * user_address_detail -> userAddressDetail
+     * user__age -> userAge
+     * name -> name
+     * _name -> _name
+     * _name_ -> _name_
+     * _user_age -> _userAge
+     * _user__age -> _userAge
+     * user_age_ -> userAge_
+     * _user_age_ -> _userAge_
+     * name__ -> name__
+     * __name -> __name
+     * 
+ * + * + * @param field 字段 + * @return 返回转换后的字段 + */ + public static String underlineFilter(String field) { + if (StringUtils.isNotBlank(field)) { + char underLine = '_'; + int underLineCountLeading = findCharCount(field, underLine, false); + int underLineCountTailing = findCharCount(field, underLine, true); + // 去除首尾'_' + field = StringUtil.trimLeadingCharacter(field, underLine); + field = StringUtil.trimTrailingCharacter(field, underLine); + if (isSingleAllUpper(field)) { + return field.toLowerCase(); + } + if (field.contains(UNDER_LINE)) { + field = field.toLowerCase(); + } + String[] arr = field.split("_+"); + return join(arr, underLineCountLeading, underLineCountTailing); + } + return ""; + } + + /** + * 是不是全部大写的单词,如:NAME, ADDRESS + * @param name 单词 + * @return true:是 + */ + private static boolean isSingleAllUpper(String name) { + if (name.contains(UNDER_LINE)) { + return false; + } + return Objects.equals(name, name.toUpperCase()); + } + + private static String join(String[] arr, int underLineCountLeading, int underLineCountTailing) { + if (arr.length > 1) { + for (int i = 1; i < arr.length; i++) { + arr[i] = upperFirstLetter(arr[i]); + } + } + StringBuilder ret = new StringBuilder(); + char underLine = '_'; + for (int i = 0; i < underLineCountLeading; i++) { + ret.append(underLine); + } + ret.append(String.join("", arr)); + for (int i = 0; i < underLineCountTailing; i++) { + ret.append(underLine); + } + return ret.toString(); + } + + private static int findCharCount(String str, char searchChar, boolean reverse) { + if (StringUtils.isEmpty(str)) { + return 0; + } + int count = 0; + char[] chars = str.toCharArray(); + + if (reverse) { + for (int i = chars.length - 1; i >= 0; i--) { + if (chars[i] == searchChar) { + count++; + } else { + break; + } + } + } else { + for (char aChar : chars) { + if (aChar == searchChar) { + count++; + } else { + break; + } + } + } + return count; + } + + public static String convertString(Object object) { + if (object == null) { + return ""; + } + return String.valueOf(object); + } + + /** + * 过滤"." + * + * @param field 字段 + * @return 返回新字段 + */ + public static String dotFilter(String field) { + if (StringUtils.isNotBlank(field)) { + if (field.contains(".")) { + String[] words = field.split("\\."); + StringBuilder ret = new StringBuilder(); + for (String str : words) { + ret.append(upperFirstLetter(str)); + } + return ret.toString(); + } + } + return field; + } + + /** + * 将第一个字母转换成大写。 name -> Name + * + * @param str 字符串 + * @return 返回新字段 + */ + public static String upperFirstLetter(String str) { + if (StringUtils.isNotBlank(str)) { + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + return str; + } + + /** + * 将第一个字母转换成小写。Name -> name + * + * @param str 字符串 + * @return 返回新内容 + */ + public static String lowerFirstLetter(String str) { + if (StringUtils.isNotBlank(str)) { + return str.substring(0, 1).toLowerCase() + str.substring(1); + } + return str; + } + + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FileUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FileUtil.java new file mode 100644 index 00000000..bbb7a0de --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FileUtil.java @@ -0,0 +1,10 @@ +package com.gitee.gen.util; + +/** + * @author 六如 + */ +public class FileUtil { + + + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FormatUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FormatUtil.java new file mode 100644 index 00000000..13660e06 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FormatUtil.java @@ -0,0 +1,50 @@ +package com.gitee.gen.util; + +import org.dom4j.Document; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.SAXReader; +import org.dom4j.io.XMLWriter; + +import java.io.StringReader; +import java.io.StringWriter; + +/** + * 代码格式化 + * @author tanghc + */ +public class FormatUtil { + + public static String formatXml(String input) { + try{ + SAXReader reader = new SAXReader(); + // System.out.println(reader); + // 注释:创建一个串的字符输入流 + StringReader in = new StringReader(input); + Document doc = reader.read(in); + // System.out.println(doc.getRootElement()); + // 注释:创建输出格式 + OutputFormat formater = OutputFormat.createPrettyPrint(); + // formater=OutputFormat.createCompactFormat(); + // 注释:设置xml的输出编码 + formater.setEncoding("utf-8"); + // TAB缩进 + formater.setIndent(" "); + // 注释:创建输出(目标) + StringWriter out = new StringWriter(); + // 注释:创建输出流 + XMLWriter writer = new XMLWriter(out, formater); + // 注释:输出格式化的串到目标中,执行后。格式化后的串保存在out中。 + writer.write(doc); + + writer.close(); + // 注释:返回我们格式化后的结果 + return out.toString(); + }catch (Exception e) { + e.printStackTrace(); + return input; + } + } + + + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SqlTypeUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SqlTypeUtil.java new file mode 100644 index 00000000..69350661 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SqlTypeUtil.java @@ -0,0 +1,161 @@ +package com.gitee.gen.util; + +import com.gitee.gen.gen.TypeEnum; + +import java.util.HashMap; +import java.util.Map; + +/** + * 字段类型转换 + */ +public class SqlTypeUtil { + private static final Map javaTypeMap = new HashMap<>(); + private static final Map javaBoxTypeMap = new HashMap<>(); + private static final Map mybatisTypeMap = new HashMap<>(); + + static { + javaTypeMap.put("bigint", "long"); + javaTypeMap.put("binary", "byte[]"); + javaTypeMap.put("bit", "boolean"); + javaTypeMap.put("boolean", "boolean"); + javaTypeMap.put("blob", "byte[]"); + javaTypeMap.put("char", "String"); + javaTypeMap.put("date", "Date"); + javaTypeMap.put("datetime", "Date"); + javaTypeMap.put("decimal", "BigDecimal"); + javaTypeMap.put("double", "double"); + javaTypeMap.put("float", "float"); + javaTypeMap.put("int", "int"); + javaTypeMap.put("integer", "int"); + javaTypeMap.put("image", "byte[]"); + javaTypeMap.put("money", "BigDecimal"); + javaTypeMap.put("nchar", "String"); + javaTypeMap.put("ntext", "byte"); + javaTypeMap.put("numeric", "BigDecimal"); + javaTypeMap.put("nvarchar", "String"); + javaTypeMap.put("real", "float"); + javaTypeMap.put("smalldatetime", "Date"); + javaTypeMap.put("smallint", "int"); + javaTypeMap.put("smallmoney", "BigDecimal"); + javaTypeMap.put("sql_variant", "String"); + javaTypeMap.put("text", "String"); + javaTypeMap.put("tinyint", "int"); + javaTypeMap.put("timestamp", "Date"); + javaTypeMap.put("uniqueidentifier", "String"); + javaTypeMap.put("varbinary", "byte[]"); + javaTypeMap.put("varchar", "String"); + + + javaBoxTypeMap.put("bigint", "Long"); + javaBoxTypeMap.put("binary", "Byte[]"); + javaBoxTypeMap.put("bit", "Boolean"); + javaBoxTypeMap.put("bool", "Boolean"); + javaBoxTypeMap.put("boolean", "Boolean"); + javaBoxTypeMap.put("blob", "Byte[]"); + javaBoxTypeMap.put("char", "String"); + javaBoxTypeMap.put("date", "Date"); + javaBoxTypeMap.put("datetime", "Date"); + javaBoxTypeMap.put("decimal", "BigDecimal"); + javaBoxTypeMap.put("double", "Double"); + javaBoxTypeMap.put("float", "Float"); + javaBoxTypeMap.put("int", "Integer"); + javaBoxTypeMap.put("integer", "Integer"); + javaBoxTypeMap.put("image", "Byte[]"); + javaBoxTypeMap.put("money", "BigDecimal"); + javaBoxTypeMap.put("nchar", "String"); + javaBoxTypeMap.put("ntext", "String"); + javaBoxTypeMap.put("numeric", "BigDecimal"); + javaBoxTypeMap.put("nvarchar", "String"); + javaBoxTypeMap.put("real", "Float"); + javaBoxTypeMap.put("smalldatetime", "Date"); + javaBoxTypeMap.put("smallint", "Integer"); + javaBoxTypeMap.put("smallmoney", "BigDecimal"); + javaBoxTypeMap.put("sql_variant", "String"); + javaBoxTypeMap.put("text", "String"); + javaBoxTypeMap.put("tinyint", "Integer"); + javaBoxTypeMap.put("timestamp", "Date"); + javaBoxTypeMap.put("uniqueidentifier", "String"); + javaBoxTypeMap.put("varbinary", "Byte[]"); + javaBoxTypeMap.put("varchar", "String"); + + + mybatisTypeMap.put("bigint", "BIGINT"); + mybatisTypeMap.put("binary", "BLOB"); + mybatisTypeMap.put("bit", "BOOLEAN"); + mybatisTypeMap.put("boolean", "BOOLEAN"); + mybatisTypeMap.put("blob", "BLOB"); + mybatisTypeMap.put("char", "CHAR"); + mybatisTypeMap.put("date", "TIMESTAMP"); + mybatisTypeMap.put("datetime", "TIMESTAMP"); + mybatisTypeMap.put("decimal", "DECIMAL"); + mybatisTypeMap.put("double", "DOUBLE"); + mybatisTypeMap.put("float", "FLOAT"); + mybatisTypeMap.put("int", "INTEGER"); + mybatisTypeMap.put("integer", "INTEGER"); + mybatisTypeMap.put("image", "BLOB"); + mybatisTypeMap.put("money", "DECIMAL"); + mybatisTypeMap.put("nchar", "NCHAR"); + mybatisTypeMap.put("ntext", "VARCHAR"); + mybatisTypeMap.put("numeric", "DECIMAL"); + mybatisTypeMap.put("nvarchar", "NVARCHAR"); + mybatisTypeMap.put("real", "FLOAT"); + mybatisTypeMap.put("smalldatetime", "TIMESTAMP"); + mybatisTypeMap.put("smallint", "INTEGER"); + mybatisTypeMap.put("smallmoney", "DECIMAL"); + mybatisTypeMap.put("sql_variant", "VARCHAR"); + mybatisTypeMap.put("text", "VARCHAR"); + mybatisTypeMap.put("tinyint", "TINYINT"); + mybatisTypeMap.put("timestamp", "TIMESTAMP"); + mybatisTypeMap.put("uniqueidentifier", "VARCHAR"); + mybatisTypeMap.put("varbinary", "BLOB"); + mybatisTypeMap.put("varchar", "VARCHAR"); + } + + public static final Map TYPE_MYBATIS_MAP = new HashMap<>(64); + + static { + TYPE_MYBATIS_MAP.put(TypeEnum.BIT.getType(), "BOOLEAN"); + TYPE_MYBATIS_MAP.put(TypeEnum.BOOLEAN.getType(), "BOOLEAN"); + TYPE_MYBATIS_MAP.put(TypeEnum.TINYINT.getType(), "TINYINT"); + TYPE_MYBATIS_MAP.put(TypeEnum.SMALLINT.getType(), "INTEGER"); + TYPE_MYBATIS_MAP.put(TypeEnum.INT.getType(), "INTEGER"); + TYPE_MYBATIS_MAP.put(TypeEnum.BIGINT.getType(), "BIGINT"); + TYPE_MYBATIS_MAP.put(TypeEnum.FLOAT.getType(), "FLOAT"); + TYPE_MYBATIS_MAP.put(TypeEnum.DOUBLE.getType(), "DOUBLE"); + TYPE_MYBATIS_MAP.put(TypeEnum.DECIMAL.getType(), "DECIMAL"); + TYPE_MYBATIS_MAP.put(TypeEnum.VARCHAR.getType(), "VARCHAR"); + TYPE_MYBATIS_MAP.put(TypeEnum.DATETIME.getType(), "TIMESTAMP"); + TYPE_MYBATIS_MAP.put(TypeEnum.BLOB.getType(), "BLOB"); + } + + /** + * 将sql字段类型转换为java字段类型 + * @param sqlType 数据库字段类型 + * @return 找不到类型默认返回String + */ + public static String convertToJavaType(String sqlType){ + String javaType = javaTypeMap.get(sqlType); + return javaType == null ? "String" : javaType; + } + + /** + * 将sql字段类型转换为java装箱字段类型 + * @param sqlType 数据库字段类型 + * @return 找不到类型默认返回String + */ + public static String convertToJavaBoxType(String sqlType){ + String javaType = javaBoxTypeMap.get(sqlType); + return javaType == null ? "String" : javaType; + } + + /** + * 将sql字段类型转换为mybatis的jdbcType + * @param sqlType 数据库字段类型 + * @return 找不到类型默认返回VARCHAR + */ + public static String convertToMyBatisJdbcType(String sqlType){ + String javaType = mybatisTypeMap.get(sqlType); + return javaType == null ? "VARCHAR" : javaType; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/StringUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/StringUtil.java new file mode 100644 index 00000000..64d1d6a9 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/StringUtil.java @@ -0,0 +1,51 @@ +package com.gitee.gen.util; + +import org.apache.commons.lang.StringUtils; + +/** + * @author thc + */ +public class StringUtil { + + /** + * Trim leading whitespace from the given {@code String}. + * @param str the {@code String} to check + * @return the trimmed {@code String} + * @see Character#isWhitespace + */ + public static String trimLeadingWhitespace(String str) { + if (StringUtils.isBlank(str)) { + return str; + } + + int beginIdx = 0; + while (beginIdx < str.length() && Character.isWhitespace(str.charAt(beginIdx))) { + beginIdx++; + } + return str.substring(beginIdx); + } + + public static String trimLeadingCharacter(String str, char leadingCharacter) { + if (StringUtils.isBlank(str)) { + return str; + } + + int beginIdx = 0; + while (beginIdx < str.length() && leadingCharacter == str.charAt(beginIdx)) { + beginIdx++; + } + return str.substring(beginIdx); + } + + public static String trimTrailingCharacter(String str, char trailingCharacter) { + if (StringUtils.isBlank(str)) { + return str; + } + + int endIdx = str.length() - 1; + while (endIdx >= 0 && trailingCharacter == str.charAt(endIdx)) { + endIdx--; + } + return str.substring(0, endIdx + 1); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SystemUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SystemUtil.java new file mode 100644 index 00000000..2f84fd3f --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SystemUtil.java @@ -0,0 +1,45 @@ +package com.gitee.gen.util; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +/** + * @author tanghc + */ +public class SystemUtil { + + private static volatile String binPath; + + /** + * 获取程序执行目录,即jar包所在的目录。此方法只在部署后有用,开发模式下,这里返回target路径 + * + * @return 返回路径 + */ + public static String getBinPath() { + if (binPath == null) { + synchronized (SystemUtil.class) { + if (binPath == null) { + String path = SystemUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + try { + path = URLDecoder.decode(path, "UTF-8"); + path = StringUtil.trimTrailingCharacter(path, '/'); + int index = path.lastIndexOf('/'); + path = path.substring(0, index); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + binPath = path; + } + } + } + return binPath; + } + + public static String getUserDir() { + return System.getProperty("user.dir"); + } + + public static String getUserHome() { + return System.getProperty("user.home"); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/TemplateMetaUtils.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/TemplateMetaUtils.java new file mode 100644 index 00000000..feba0d4f --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/TemplateMetaUtils.java @@ -0,0 +1,106 @@ +package com.gitee.gen.util; + +import com.gitee.gen.entity.TemplateConfig; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * 模板元信息工具类 + */ +public final class TemplateMetaUtils { + + private TemplateMetaUtils() { + } + + /** + * 解析模板内容中的元信息 + */ + public static Map parseMetaContent(String content) { + content = StringUtil.trimLeadingWhitespace(content); + if (content != null && content.startsWith("##")) { + int rowIdx = content.indexOf('\n'); + String metaInfo = content.substring(2, rowIdx); + return parseMetaRow(metaInfo); + } + return Collections.emptyMap(); + } + + /** + * 解析元数据信息 + */ + public static Map parseMetaRow(String row) { + char[] charArray = row.toCharArray(); + + Map data = new HashMap<>(); + + StringBuilder kvBuilder = new StringBuilder(); + // 剩余未闭合表达式数量 + int leftExpr = 0; + for (int i = 0, len = charArray.length, end = len - 1; i < len; i++) { + char c = charArray[i]; + boolean kvEnd = false; + if (i == end) { + kvBuilder.append(c); + kvEnd = true; + } else if (',' == c && leftExpr == 0) { + kvEnd = true; + } + + if (kvEnd) { + String[] kv = kvBuilder.toString().trim().split("="); + data.put(kv[0].trim(), kv.length == 1 ? null : kv[1].trim()); + kvBuilder = new StringBuilder(); + continue; + } + + kvBuilder.append(c); + switch (c) { + case '{': + case '(': + leftExpr++; + break; + case '}': + case ')': + leftExpr--; + break; + default: + break; + } + } + if (leftExpr > 0) { + throw new RuntimeException("读取元数据失败,有" + leftExpr + "个表达式未闭合"); + } + return data; + } + + /** + * 生成元数据的模板内容 + */ + public static String generateMetaContent(TemplateConfig template) { + String content = StringUtil.trimLeadingWhitespace(template.getContent()); + String metaRow = generateMetaRow(template); + if (content.startsWith("##")) { + int rowIdx = content.indexOf('\n'); + if(rowIdx == -1) { + content = metaRow; + } else { + content = metaRow + content.substring(rowIdx); + } + } else { + content = metaRow + "\n" + content; + } + return content; + } + + /** + * 解析元数据信息 + */ + public static String generateMetaRow(TemplateConfig template) { + String format = "## filename=%s, folder=%s"; + String filename = template.getFileName() != null ? template.getFileName() : ""; + String folder = template.getFolder() != null ? template.getFolder() : ""; + return String.format(format, filename, folder); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/VelocityUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/VelocityUtil.java new file mode 100644 index 00000000..db1a958d --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/VelocityUtil.java @@ -0,0 +1,42 @@ +package com.gitee.gen.util; + +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.apache.velocity.runtime.log.NullLogChute; + +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; + +/** + * Velocity工具类,根据模板内容生成文件 + */ +public class VelocityUtil { + private VelocityUtil() { + super(); + } + + static { + // 禁止输出日志 + Velocity.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM, new NullLogChute()); + Velocity.init(); + } + + private final static String LOG_TAG = "velocity_log"; + + public static String generate(VelocityContext context, String template) { + StringReader reader = new StringReader(template); + StringWriter writer = new StringWriter(); + // 不用vm文件 + Velocity.evaluate(context, writer, LOG_TAG, reader); + + try { + writer.close(); + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return writer.toString(); + } +} diff --git a/sop-admin/sop-code-gen/src/main/resources/app.yml b/sop-admin/sop-code-gen/src/main/resources/app.yml new file mode 100644 index 00000000..48d0f584 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/app.yml @@ -0,0 +1,88 @@ +solon.app: + name: gen +server: + port: 6969 + + +# sqlite3 +#LOCAL_DB: ${user.home}/gen.db +gen.db1: + url: "jdbc:sqlite:" + driverClassName: org.sqlite.JDBC + userName: + password: + +# mysql +dbms: + enable: false +# host: localhost:3306 +# database: gen +# username: root +# password: root + +gen.db2: + url: jdbc:mysql://${dbms.host:localhost:3306}/${dbms.database:gen}?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai + driverClassName: com.mysql.cj.jdbc.Driver + userName: ${dbms.username:gen} + password: ${dbms.password:} + +# 配置数据源对应的 mybatis 信息(要与 DataSource bean 的名字对上) +mybatis.db1: + mappers: #支持包名 或 类名(大写开头 或 *)或 xml(.xml结尾)//支持 ** 或 * 占位符 + - "com.gitee.gen.mapper.*" #这个表达式同上效果 + - "classpath:mybatis/**/*.xml" + configuration: #扩展配置(要与 Configuration 类的属性一一对应) + cacheEnabled: false + mapperVerifyEnabled: true #如果为 true,则要求所有 mapper 有 @Mapper 主解 + mapUnderscoreToCamelCase: true + +gen: + format-xml: ${GEN_FORMAT_XML:true} + db-name: ${GEN_DBNAME:gen} + +# log +solon.logging.appender: + console: + level: INFO + enable: true #是否启用 + file: + name: "logs/${solon.app.name}" + level: INFO + enable: false #是否启用 + extension: ".log" #v2.2.18 后支持(例:.log, .log.gz, .log.zip) + maxFileSize: "10 MB" + maxHistory: "7" + cloud: + level: INFO + enable: false #是否启用 + + +# 2.0.3新增 +# 连接方式管理, {HOST},{PORT},{DB_NAME} 表示占位符 +connect: + 1: + name: MySQL + driver: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://{HOST}:{PORT}/{DB_NAME}?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + serviceName: com.gitee.gen.gen.mysql.MySqlService + 2: + name: Oracle + driver: oracle.jdbc.driver.OracleDriver + url: jdbc:oracle:thin:@{HOST}:{PORT}{DB_NAME} + serviceName: com.gitee.gen.gen.oracle.OracleService + 3: + name: "SQL Server" + driver: com.microsoft.sqlserver.jdbc.SQLServerDriver + url: jdbc:sqlserver://{HOST}:{PORT};DatabaseName={DB_NAME};trustServerCertificate=true + serviceName: com.gitee.gen.gen.sqlserver.SqlServerService + 4: + name: PostgreSQL + driver: org.postgresql.Driver + url: jdbc:postgresql://{HOST}:{PORT}/{DB_NAME} + serviceName: com.gitee.gen.gen.postgresql.PostgreSqlService + 5: + name: "达梦" + driver: dm.jdbc.driver.DmDriver + url: jdbc:dm://{HOST}:{PORT}/{DB_NAME} + serviceName: com.gitee.gen.gen.dm.DmService + diff --git a/sop-admin/sop-code-gen/src/main/resources/gen_init.db b/sop-admin/sop-code-gen/src/main/resources/gen_init.db new file mode 100644 index 00000000..bf04d3e4 Binary files /dev/null and b/sop-admin/sop-code-gen/src/main/resources/gen_init.db differ diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/DatasourceConfigMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/DatasourceConfigMapper.xml new file mode 100644 index 00000000..0e96a7f3 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/DatasourceConfigMapper.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + t.id + , t.db_type + , t.db_desc + , t.driver_class + , t.db_name + , t.schema_name + , t.host + , t.port + , t.username + , t.password + , t.is_deleted + , t.package_name + , t.del_prefix + , t.group_id + , t.author + , t.db_group_name + + + + + + + + + + + INSERT INTO datasource_config + + db_type, + db_desc, + driver_class, + db_name, + schema_name, + host, + port, + username, + password, + is_deleted, + package_name, + del_prefix, + group_id, + author, + db_group_name, + + + #{dbType}, + #{dbDesc}, + #{driverClass}, + #{dbName}, + #{schemaName}, + #{host}, + #{port}, + #{username}, + #{password}, + #{isDeleted}, + #{packageName}, + #{delPrefix}, + #{groupId}, + #{author}, + #{dbGroupName}, + + + + + + INSERT INTO datasource_config + + + + db_type, + + + db_desc, + + + driver_class, + + + db_name, + + + schema_name, + + + host, + + + port, + + + username, + + + password, + + + is_deleted, + + + package_name, + + + del_prefix, + + + group_id, + + + author, + + + db_group_name, + + + + + #{dbType}, + + + #{dbDesc}, + + + #{driverClass}, + + + #{dbName}, + + + #{schemaName}, + + + #{host}, + + + #{port}, + + + #{username}, + + + #{password}, + + + #{isDeleted}, + + + #{packageName}, + + + #{delPrefix}, + + + #{groupId}, + + + #{author}, + + + #{dbGroupName}, + + + + + + + UPDATE datasource_config + + db_type=#{dbType}, + db_desc=#{dbDesc}, + driver_class=#{driverClass}, + db_name=#{dbName}, + schema_name=#{schemaName}, + host=#{host}, + port=#{port}, + username=#{username}, + password=#{password}, + is_deleted=#{isDeleted}, + package_name=#{packageName}, + del_prefix=#{delPrefix}, + group_id=#{groupId}, + author=#{author}, + db_group_name=#{dbGroupName}, + + WHERE id = #{id} + + + + + + UPDATE datasource_config + + + db_type=#{dbType}, + + + db_desc=#{dbDesc}, + + + driver_class=#{driverClass}, + + + db_name=#{dbName}, + + + schema_name=#{schemaName}, + + + host=#{host}, + + + port=#{port}, + + + username=#{username}, + + + password=#{password}, + + + is_deleted=#{isDeleted}, + + + package_name=#{packageName}, + + + del_prefix=#{delPrefix}, + + + group_id=#{groupId}, + + + author=#{author}, + + + db_group_name=#{dbGroupName}, + + + WHERE id = #{id} + + + + + + UPDATE datasource_config + SET is_deleted=1 + WHERE id = #{id} + + + + \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/GenerateHistoryMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/GenerateHistoryMapper.xml new file mode 100644 index 00000000..1cc11f09 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/GenerateHistoryMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + t.id + , t.config_content + , t.md5_value + , t.generate_time + + + + + + + + + + + INSERT INTO generate_history + + config_content, + md5_value, + generate_time, + + + #{configContent}, + #{md5Value}, + #{generateTime}, + + + + + + INSERT INTO generate_history + + + + config_content, + + + md5_value, + + + generate_time, + + + + + #{configContent}, + + + #{md5Value}, + + + #{generateTime}, + + + + + + + UPDATE generate_history + + config_content=#{configContent}, + md5_value=#{md5Value}, + generate_time=#{generateTime}, + + WHERE id = #{id} + + + + + + UPDATE generate_history + + + config_content=#{configContent}, + + + md5_value=#{md5Value}, + + + generate_time=#{generateTime}, + + + WHERE id = #{id} + + + + + + UPDATE generate_history + SET is_deleted=1 + WHERE id = #{id} + + + + + \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/SystemConfigMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/SystemConfigMapper.xml new file mode 100644 index 00000000..773c8322 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/SystemConfigMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + t.id, t.config_key, t.config_value, t.remark + + + + + + + + INSERT INTO system_config + config_key, config_value, remark, + #{configKey}, #{configValue}, #{remark}, + + + INSERT INTO system_config + + config_key, + config_value, + remark, + + + #{configKey}, + #{configValue}, + #{remark}, + + + + UPDATE system_config + config_key=#{configKey}, config_value=#{configValue}, remark=#{remark}, WHERE id = #{id} + + + UPDATE system_config + + config_key=#{configKey}, + config_value=#{configValue}, + remark=#{remark}, + WHERE id = #{id} + + + UPDATE system_config SET is_deleted=1 WHERE id = #{id} + diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateConfigMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateConfigMapper.xml new file mode 100644 index 00000000..84561e7b --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateConfigMapper.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + t.id + , t.group_id + , t.group_name + , t.name + , t.folder + , t.file_name + , t.content + , t.is_deleted + + + + + + + + + + + + + INSERT INTO template_config + + group_id, + group_name, + name, + folder, + file_name, + content, + is_deleted, + + + #{groupId}, + #{groupName}, + #{name}, + #{folder}, + #{fileName}, + #{content}, + #{isDeleted}, + + + + + + INSERT INTO template_config + + + + group_id, + + + group_name, + + + name, + + + file_name, + + + content, + + + is_deleted, + + + + + #{groupId}, + + + #{groupName}, + + + #{name}, + + + #{fileName}, + + + #{content}, + + + #{isDeleted}, + + + + + + + UPDATE template_config + + group_id=#{groupId}, + group_name=#{groupName}, + name=#{name}, + file_name=#{fileName}, + content=#{content}, + is_deleted=#{isDeleted}, + + WHERE id = #{id} + + + + + + UPDATE template_config + + + group_id=#{groupId}, + + + group_name=#{groupName}, + + + name=#{name}, + + + folder=#{folder}, + + + file_name=#{fileName}, + + + content=#{content}, + + + is_deleted=#{isDeleted}, + + + WHERE id = #{id} + + + + + + UPDATE template_config + SET is_deleted=1 + WHERE id = #{id} + + + + + + + + UPDATE template_config + SET group_name = #{groupName} + WHERE group_id = #{groupId} + + + + UPDATE template_config + SET is_deleted=1 + WHERE group_id = #{groupId} + + + + + diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateGroupMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateGroupMapper.xml new file mode 100644 index 00000000..69be989b --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateGroupMapper.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + t.id + , t.group_name + , t.is_deleted + + + + + + + + + + + + + INSERT INTO template_group + + group_name, + is_deleted, + + + #{groupName}, + #{isDeleted}, + + + + + + INSERT INTO template_group + + + + group_name, + + + is_deleted, + + + + + #{groupName}, + + + #{isDeleted}, + + + + + + + UPDATE template_group + + group_name=#{groupName}, + is_deleted=#{isDeleted}, + + WHERE id = #{id} + + + + + + UPDATE template_group + + + group_name=#{groupName}, + + + is_deleted=#{isDeleted}, + + + WHERE id = #{id} + + + + + + UPDATE template_group + SET is_deleted = 1 + WHERE id = #{id} + + + + \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/TypeConfigMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/TypeConfigMapper.xml new file mode 100644 index 00000000..d39bee2c --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/TypeConfigMapper.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + t.id , t.db_type , t.base_type , t.box_type + + + + + + INSERT INTO type_config + db_type, base_type, box_type, + #{dbType}, #{baseType}, #{boxType}, + + + INSERT INTO type_config + + db_type, + base_type, + box_type, + + + #{dbType}, + #{baseType}, + #{boxType}, + + + + UPDATE type_config + db_type=#{dbType}, base_type=#{baseType}, box_type=#{boxType}, WHERE id = #{id} + + + UPDATE type_config + + db_type=#{dbType}, + base_type=#{baseType}, + box_type=#{boxType}, + WHERE id = #{id} + + + UPDATE type_config SET is_deleted=1 WHERE id = #{id} + diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/UpgradeMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/UpgradeMapper.xml new file mode 100644 index 00000000..2a7d9f56 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/UpgradeMapper.xml @@ -0,0 +1,48 @@ + + + + + + ${sql} + + + + ALTER TABLE ${tableName} ADD ${columnName} ${type} + + + + alter table ${tableName} add column(${columnName} ${type}); + + + + ALTER TABLE ${tableName} ADD COLUMN ${columnName} ${type} + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/favicon.ico b/sop-admin/sop-code-gen/src/main/resources/static/favicon.ico new file mode 100644 index 00000000..34b63ac6 Binary files /dev/null and b/sop-admin/sop-code-gen/src/main/resources/static/favicon.ico differ diff --git a/sop-admin/sop-code-gen/src/main/resources/static/help/velocity.md b/sop-admin/sop-code-gen/src/main/resources/static/help/velocity.md new file mode 100644 index 00000000..e7ecfb42 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/help/velocity.md @@ -0,0 +1,86 @@ +# Velocity语法 + +在 Velocity 中所有的关键字都是以`#`开头的,而所有的变量则是以`$`开头。 + +## 注释 + +单行注释 + +`## 这是单行注释` + +多行注释 + +```html +#* + +xxx + + *# +``` + +## 变量 + +声明变量 + +```html +#set($name = "velocity") +#set($foo = 1) +``` + +使用: + +```html +My name is ${name} +``` + +## 循环 + +```html +#foreach($item in $list) + $item + ${foreach.index} +#end +``` + +其中,`$item`代表遍历的每一项,`${foreach.index}`表示当前循环次数的计数器,从0开始 + + +for循环跳出`#break` + +```html +#foreach($item in $list) + #if($item.name == "张三") + #break + #end +#end +``` + +## 条件控制 + +```html +#if(condition) +...dosonmething... +#elseif(condition) +...dosomething... +#else +...dosomething... +#end +``` + +如: + +```html +#if( "${table.comment}" != "" ) +/** + * ${table.comment} + */ +#end +``` + +## 关系和逻操作符 + +```html +#if($foo && $bar) + xxx +#end +``` diff --git a/sop-admin/sop-code-gen/src/main/resources/static/index.html b/sop-admin/sop-code-gen/src/main/resources/static/index.html new file mode 100644 index 00000000..f74497af --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/index.html @@ -0,0 +1 @@ +代码生成工具
\ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/app.d83b2768.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/app.d83b2768.css new file mode 100644 index 00000000..413534b0 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/app.d83b2768.css @@ -0,0 +1 @@ +.app-breadcrumb.el-breadcrumb[data-v-33d79dae]{display:inline-block;font-size:14px;line-height:50px;margin-left:8px}.app-breadcrumb.el-breadcrumb .no-redirect[data-v-33d79dae]{color:#97a8be;cursor:text}.hamburger[data-v-49e15297]{display:inline-block;vertical-align:middle;width:20px;height:20px}.hamburger.is-active[data-v-49e15297]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.navbar[data-v-58ce17d6]{height:50px;overflow:hidden;position:relative;background:#fff;-webkit-box-shadow:0 1px 4px rgba(0,21,41,.08);box-shadow:0 1px 4px rgba(0,21,41,.08)}.navbar .hamburger-container[data-v-58ce17d6]{line-height:46px;height:100%;float:left;cursor:pointer;-webkit-transition:background .3s;transition:background .3s;-webkit-tap-highlight-color:transparent}.navbar .hamburger-container[data-v-58ce17d6]:hover{background:rgba(0,0,0,.025)}.navbar .breadcrumb-container[data-v-58ce17d6]{float:left}.navbar .right-menu[data-v-58ce17d6]{float:right;height:100%;line-height:50px;padding-right:10px}.navbar .right-menu[data-v-58ce17d6]:focus{outline:none}.navbar .right-menu .right-menu-item[data-v-58ce17d6]{display:inline-block;padding:0 8px;height:100%;font-size:18px;color:#5a5e66;vertical-align:text-bottom}.navbar .right-menu .right-menu-item.hover-effect[data-v-58ce17d6]{cursor:pointer;-webkit-transition:background .3s;transition:background .3s}.navbar .right-menu .right-menu-item.hover-effect[data-v-58ce17d6]:hover{background:rgba(0,0,0,.025)}.navbar .right-menu .avatar-container[data-v-58ce17d6]{margin-right:30px}.navbar .right-menu .avatar-container .avatar-wrapper[data-v-58ce17d6]{margin-top:5px;position:relative}.navbar .right-menu .avatar-container .avatar-wrapper .user-avatar[data-v-58ce17d6]{cursor:pointer;width:40px;height:40px;border-radius:10px}.navbar .right-menu .avatar-container .avatar-wrapper .el-icon-caret-bottom[data-v-58ce17d6]{cursor:pointer;position:absolute;right:-20px;top:25px;font-size:12px}.sidebarLogoFade-enter-active[data-v-4a3d5d44]{-webkit-transition:opacity 1.5s;transition:opacity 1.5s}.sidebarLogoFade-enter[data-v-4a3d5d44],.sidebarLogoFade-leave-to[data-v-4a3d5d44]{opacity:0}.sidebar-logo-container[data-v-4a3d5d44]{position:relative;width:100%;height:50px;line-height:50px;background:#2b2f3a;padding-left:10px;overflow:hidden}.sidebar-logo-container .sidebar-logo-link[data-v-4a3d5d44]{height:100%;width:100%}.sidebar-logo-container .sidebar-logo-link .sidebar-logo[data-v-4a3d5d44]{width:32px;height:32px;vertical-align:middle;margin-right:12px}.sidebar-logo-container .sidebar-logo-link .sidebar-title[data-v-4a3d5d44]{display:inline-block;margin:0;color:#fff;font-weight:600;line-height:50px;font-size:14px;font-family:Avenir,Helvetica Neue,Arial,Helvetica,sans-serif;vertical-align:middle}.sidebar-logo-container.collapse .sidebar-logo[data-v-4a3d5d44]{margin-right:0}.app-main[data-v-43c24f68]{min-height:calc(100vh - 50px);width:100%;position:relative;overflow:hidden}.fixed-header+.app-main[data-v-43c24f68]{padding-top:50px}[data-v-4f739cf0]:export{menuText:#bfcbd9;menuActiveText:#409eff;subMenuActiveText:#f4f4f5;menuBg:#304156;menuHover:#263445;subMenuBg:#1f2d3d;subMenuHover:#001528;sideBarWidth:210px}.app-wrapper[data-v-4f739cf0]{position:relative;height:100%;width:100%}.app-wrapper[data-v-4f739cf0]:after{content:"";display:table;clear:both}.app-wrapper.mobile.openSidebar[data-v-4f739cf0]{position:fixed;top:0}.drawer-bg[data-v-4f739cf0]{background:#000;opacity:.3;width:100%;top:0;height:100%;position:absolute;z-index:999}.fixed-header[data-v-4f739cf0]{position:fixed;top:0;right:0;z-index:9;width:calc(100% - 210px);-webkit-transition:width .28s;transition:width .28s}.hideSidebar .fixed-header[data-v-4f739cf0]{width:calc(100% - 54px)}.mobile .fixed-header[data-v-4f739cf0]{width:100%}.svg-icon[data-v-53ff2da0]{width:1em;height:1em;vertical-align:-.15em;fill:currentColor;overflow:hidden}.fade-enter-active,.fade-leave-active{-webkit-transition:opacity .28s;transition:opacity .28s}.fade-enter,.fade-leave-active{opacity:0}.breadcrumb-enter-active,.breadcrumb-leave-active{-webkit-transition:all .5s;transition:all .5s}.breadcrumb-enter,.breadcrumb-leave-active{opacity:0;-webkit-transform:translateX(20px);transform:translateX(20px)}.breadcrumb-move{-webkit-transition:all .5s;transition:all .5s}.breadcrumb-leave-active{position:absolute}.el-breadcrumb__inner,.el-breadcrumb__inner a{font-weight:400!important}.el-upload input[type=file]{display:none!important}.el-upload__input{display:none}.el-dialog{-webkit-transform:none;transform:none;left:0;position:relative;margin:0 auto}.upload-container .el-upload{width:100%}.upload-container .el-upload .el-upload-dragger{width:100%;height:200px}.el-dropdown-menu a{display:block}#app .main-container{min-height:100%;-webkit-transition:margin-left .28s;transition:margin-left .28s;margin-left:210px;position:relative}#app .sidebar-container{-webkit-transition:width .28s;transition:width .28s;width:210px!important;background-color:#304156;height:100%;position:fixed;font-size:0;top:0;bottom:0;left:0;z-index:1001;overflow:hidden}#app .sidebar-container .horizontal-collapse-transition{-webkit-transition:width 0s ease-in-out,padding-left 0s ease-in-out,padding-right 0s ease-in-out;transition:width 0s ease-in-out,padding-left 0s ease-in-out,padding-right 0s ease-in-out}#app .sidebar-container .scrollbar-wrapper{overflow-x:hidden!important}#app .sidebar-container .el-scrollbar__bar.is-vertical{right:0}#app .sidebar-container .el-scrollbar{height:100%}#app .sidebar-container.has-logo .el-scrollbar{height:calc(100% - 50px)}#app .sidebar-container .is-horizontal{display:none}#app .sidebar-container a{display:inline-block;width:100%;overflow:hidden}#app .sidebar-container .svg-icon{margin-right:16px}#app .sidebar-container .el-menu{border:none;height:100%;width:100%!important}#app .sidebar-container .el-submenu__title:hover,#app .sidebar-container .submenu-title-noDropdown:hover{background-color:#263445!important}#app .sidebar-container .is-active>.el-submenu__title{color:#f4f4f5!important}#app .sidebar-container .el-submenu .el-menu-item,#app .sidebar-container .nest-menu .el-submenu>.el-submenu__title{min-width:210px!important;background-color:#1f2d3d!important}#app .sidebar-container .el-submenu .el-menu-item:hover,#app .sidebar-container .nest-menu .el-submenu>.el-submenu__title:hover{background-color:#001528!important}#app .hideSidebar .sidebar-container{width:54px!important}#app .hideSidebar .main-container{margin-left:54px}#app .hideSidebar .svg-icon{margin-right:0}#app .hideSidebar .submenu-title-noDropdown{padding:0!important;position:relative}#app .hideSidebar .submenu-title-noDropdown .el-tooltip{padding:0!important}#app .hideSidebar .submenu-title-noDropdown .el-tooltip .svg-icon{margin-left:20px}#app .hideSidebar .el-submenu{overflow:hidden}#app .hideSidebar .el-submenu>.el-submenu__title{padding:0!important}#app .hideSidebar .el-submenu>.el-submenu__title .svg-icon{margin-left:20px}#app .hideSidebar .el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}#app .hideSidebar .el-menu--collapse .el-submenu>.el-submenu__title>span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}#app .el-menu--collapse .el-menu .el-submenu{min-width:210px!important}#app .mobile .main-container{margin-left:0}#app .mobile .sidebar-container{-webkit-transition:-webkit-transform .28s;transition:-webkit-transform .28s;transition:transform .28s;transition:transform .28s,-webkit-transform .28s;width:210px!important}#app .mobile.hideSidebar .sidebar-container{pointer-events:none;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transform:translate3d(-210px,0,0);transform:translate3d(-210px,0,0)}#app .withoutAnimation .main-container,#app .withoutAnimation .sidebar-container{-webkit-transition:none;transition:none}.el-menu--vertical>.el-menu .svg-icon{margin-right:16px}.el-menu--vertical .el-menu-item:hover,.el-menu--vertical .nest-menu .el-submenu>.el-submenu__title:hover{background-color:#263445!important}.el-menu--vertical>.el-menu--popup{max-height:100vh;overflow-y:auto}.el-menu--vertical>.el-menu--popup::-webkit-scrollbar-track-piece{background:#d3dce6}.el-menu--vertical>.el-menu--popup::-webkit-scrollbar{width:6px}.el-menu--vertical>.el-menu--popup::-webkit-scrollbar-thumb{background:#99a9bf;border-radius:20px}body{height:100%;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Arial,sans-serif}label{font-weight:700}html{-webkit-box-sizing:border-box;box-sizing:border-box}#app,html{height:100%}*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}a:active,a:focus{outline:none}a,a:focus,a:hover{cursor:pointer;color:inherit;text-decoration:none}div:focus{outline:none}.clearfix:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.app-container{padding:20px}.CodeMirror{padding:0;border:1px solid #eee;height:auto}.CodeMirror-scroll{height:auto;overflow-y:hidden;overflow-x:auto}.el-aside{border-right:1px solid #eee;padding-right:10px}.el-main{padding-top:0}.el-backtop{z-index:99999}.cell .el-link{margin-bottom:1px}.cell .el-button{padding:0}.param-table .el-form{width:100%;display:inline-block}.param-table .el-form .el-form-item{margin-bottom:0}.param-table .el-form .el-form-item .el-form-item__content .el-form-item__error{position:inherit}.param-table .el-switch{margin-bottom:2px} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-10204558.7315ca47.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-10204558.7315ca47.css new file mode 100644 index 00000000..3918c01a --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-10204558.7315ca47.css @@ -0,0 +1 @@ +.cm-s-neat span.cm-comment{color:#a86}.cm-s-neat span.cm-keyword{line-height:1em;font-weight:700;color:#00f}.cm-s-neat span.cm-string{color:#a22}.cm-s-neat span.cm-builtin{line-height:1em;font-weight:700;color:#077}.cm-s-neat span.cm-special{line-height:1em;font-weight:700;color:#0aa}.cm-s-neat span.cm-variable{color:#000}.cm-s-neat span.cm-atom,.cm-s-neat span.cm-number{color:#3a3}.cm-s-neat span.cm-meta{color:#555}.cm-s-neat span.cm-link{color:#3a3}.cm-s-neat .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-neat .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important}.cm-s-darcula{font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif}.cm-s-darcula.CodeMirror{background:#2b2b2b;color:#a9b7c6}.cm-s-darcula span.cm-meta{color:#bbb529}.cm-s-darcula span.cm-number{color:#6897bb}.cm-s-darcula span.cm-keyword{color:#cc7832;line-height:1em;font-weight:700}.cm-s-darcula span.cm-def{color:#a9b7c6;font-style:italic}.cm-s-darcula span.cm-variable,.cm-s-darcula span.cm-variable-2{color:#a9b7c6}.cm-s-darcula span.cm-variable-3{color:#9876aa}.cm-s-darcula span.cm-type{color:#abc;font-weight:700}.cm-s-darcula span.cm-property{color:#ffc66d}.cm-s-darcula span.cm-operator{color:#a9b7c6}.cm-s-darcula span.cm-string,.cm-s-darcula span.cm-string-2{color:#6a8759}.cm-s-darcula span.cm-comment{color:#61a151;font-style:italic}.cm-s-darcula span.cm-atom,.cm-s-darcula span.cm-link{color:#cc7832}.cm-s-darcula span.cm-error{color:#bc3f3c}.cm-s-darcula span.cm-tag{color:#629755;font-weight:700;font-style:italic;text-decoration:underline}.cm-s-darcula span.cm-attribute{color:#6897bb}.cm-s-darcula span.cm-qualifier{color:#6a8759}.cm-s-darcula span.cm-bracket{color:#a9b7c6}.cm-s-darcula span.cm-builtin,.cm-s-darcula span.cm-special{color:#ff9e59}.cm-s-darcula span.cm-matchhighlight{color:#fff;background-color:rgba(50,89,48,.7);font-weight:400}.cm-s-darcula span.cm-searching{color:#fff;background-color:rgba(61,115,59,.7);font-weight:400}.cm-s-darcula .CodeMirror-cursor{border-left:1px solid #a9b7c6}.cm-s-darcula .CodeMirror-activeline-background{background:#323232}.cm-s-darcula .CodeMirror-gutters{background:#313335;border-right:1px solid #313335}.cm-s-darcula .CodeMirror-guttermarker{color:#ffee80}.cm-s-darcula .CodeMirror-guttermarker-subtle{color:#d0d0d0}.cm-s-darcula .CodeMirrir-linenumber{color:#606366}.cm-s-darcula .CodeMirror-matchingbracket{background-color:#3b514d;color:#ffef28!important;font-weight:700}.cm-s-darcula div.CodeMirror-selected{background:#214283}.CodeMirror-hints.darcula{font-family:Menlo,Monaco,Consolas,Courier New,monospace;color:#9c9e9e;background-color:#3b3e3f!important}.CodeMirror-hints.darcula .CodeMirror-hint-active{background-color:#494d4e!important;color:#9c9e9e!important}.cm-s-material.CodeMirror{background-color:#263238;color:#eff}.cm-s-material .CodeMirror-gutters{background:#263238;color:#546e7a;border:none}.cm-s-material .CodeMirror-guttermarker,.cm-s-material .CodeMirror-guttermarker-subtle,.cm-s-material .CodeMirror-linenumber{color:#546e7a}.cm-s-material .CodeMirror-cursor{border-left:1px solid #fc0}.cm-s-material .cm-animate-fat-cursor,.cm-s-material.cm-fat-cursor .CodeMirror-cursor{background-color:rgba(93,109,92,.5019607843137255)!important}.cm-s-material.CodeMirror-focused div.CodeMirror-selected,.cm-s-material div.CodeMirror-selected{background:rgba(128,203,196,.2)}.cm-s-material .CodeMirror-line::selection,.cm-s-material .CodeMirror-line>span::selection,.cm-s-material .CodeMirror-line>span>span::selection{background:rgba(128,203,196,.2)}.cm-s-material .CodeMirror-line::-moz-selection,.cm-s-material .CodeMirror-line>span::-moz-selection,.cm-s-material .CodeMirror-line>span>span::-moz-selection{background:rgba(128,203,196,.2)}.cm-s-material .CodeMirror-activeline-background{background:rgba(0,0,0,.5)}.cm-s-material .cm-keyword{color:#c792ea}.cm-s-material .cm-operator{color:#89ddff}.cm-s-material .cm-variable-2{color:#eff}.cm-s-material .cm-type,.cm-s-material .cm-variable-3{color:#f07178}.cm-s-material .cm-builtin{color:#ffcb6b}.cm-s-material .cm-atom{color:#f78c6c}.cm-s-material .cm-number{color:#ff5370}.cm-s-material .cm-def{color:#82aaff}.cm-s-material .cm-string{color:#c3e88d}.cm-s-material .cm-string-2{color:#f07178}.cm-s-material .cm-comment{color:#546e7a}.cm-s-material .cm-variable{color:#f07178}.cm-s-material .cm-tag{color:#ff5370}.cm-s-material .cm-meta{color:#ffcb6b}.cm-s-material .cm-attribute,.cm-s-material .cm-property{color:#c792ea}.cm-s-material .cm-qualifier,.cm-s-material .cm-type,.cm-s-material .cm-variable-3{color:#decb6b}.cm-s-material .cm-error{color:#fff;background-color:#ff5370}.cm-s-material .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.CodeMirror-dialog{position:absolute;left:0;right:0;background:inherit;z-index:15;padding:.1em .8em;overflow:hidden;color:inherit}.CodeMirror-dialog-top{border-bottom:1px solid #eee;top:0}.CodeMirror-dialog-bottom{border-top:1px solid #eee;bottom:0}.CodeMirror-dialog input{border:none;outline:none;background:transparent;width:20em;color:inherit;font-family:monospace}.CodeMirror-dialog button{font-size:70%} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-1eecf382.89945ab3.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-1eecf382.89945ab3.css new file mode 100644 index 00000000..e267514b --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-1eecf382.89945ab3.css @@ -0,0 +1 @@ +.tpl-table{color:#606266;font-size:14px;margin-bottom:10px;width:100%}.tpl-table tr th{padding-right:10px}.tpl-table tr td .el-form-item--mini{margin-bottom:0!important}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label,.el-form-item__content{line-height:20px}.velocity-tip{color:#606266;font-size:13px;font-weight:400}.velocity-var li{font-size:14px;color:#606266;line-height:26px}.velocity-var a{color:#409eff;font-weight:500}.velocity-var a:hover{color:rgba(64,158,255,.75)}.hasFix{position:fixed;top:0}.el-dropdown-link{cursor:pointer;color:#409eff}.el-icon-arrow-down{font-size:12px}span.split{color:#ccc;margin:0 3px} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-3f781f70.a37cd815.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-3f781f70.a37cd815.css new file mode 100644 index 00000000..5adab285 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-3f781f70.a37cd815.css @@ -0,0 +1 @@ +.wscn-http404-container[data-v-c095f994]{-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);position:absolute;top:40%;left:50%}.wscn-http404[data-v-c095f994]{position:relative;width:1200px;padding:0 50px;overflow:hidden}.wscn-http404 .pic-404[data-v-c095f994]{position:relative;float:left;width:600px;overflow:hidden}.wscn-http404 .pic-404__parent[data-v-c095f994]{width:100%}.wscn-http404 .pic-404__child[data-v-c095f994]{position:absolute}.wscn-http404 .pic-404__child.left[data-v-c095f994]{width:80px;top:17px;left:220px;opacity:0;-webkit-animation-name:cloudLeft-data-v-c095f994;animation-name:cloudLeft-data-v-c095f994;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}.wscn-http404 .pic-404__child.mid[data-v-c095f994]{width:46px;top:10px;left:420px;opacity:0;-webkit-animation-name:cloudMid-data-v-c095f994;animation-name:cloudMid-data-v-c095f994;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1.2s;animation-delay:1.2s}.wscn-http404 .pic-404__child.right[data-v-c095f994]{width:62px;top:100px;left:500px;opacity:0;-webkit-animation-name:cloudRight-data-v-c095f994;animation-name:cloudRight-data-v-c095f994;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}@-webkit-keyframes cloudLeft-data-v-c095f994{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@keyframes cloudLeft-data-v-c095f994{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@-webkit-keyframes cloudMid-data-v-c095f994{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@keyframes cloudMid-data-v-c095f994{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@-webkit-keyframes cloudRight-data-v-c095f994{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}@keyframes cloudRight-data-v-c095f994{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}.wscn-http404 .bullshit[data-v-c095f994]{position:relative;float:left;width:300px;padding:30px 0;overflow:hidden}.wscn-http404 .bullshit__oops[data-v-c095f994]{font-size:32px;line-height:40px;color:#1482f0;margin-bottom:20px;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__headline[data-v-c095f994],.wscn-http404 .bullshit__oops[data-v-c095f994]{font-weight:700;opacity:0;-webkit-animation-name:slideUp-data-v-c095f994;animation-name:slideUp-data-v-c095f994;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__headline[data-v-c095f994]{font-size:20px;line-height:24px;color:#222;margin-bottom:10px;-webkit-animation-delay:.1s;animation-delay:.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-c095f994]{font-size:13px;line-height:21px;color:grey;margin-bottom:30px;-webkit-animation-delay:.2s;animation-delay:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-c095f994],.wscn-http404 .bullshit__return-home[data-v-c095f994]{opacity:0;-webkit-animation-name:slideUp-data-v-c095f994;animation-name:slideUp-data-v-c095f994;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__return-home[data-v-c095f994]{display:block;float:left;width:110px;height:36px;background:#1482f0;border-radius:100px;text-align:center;color:#fff;font-size:14px;line-height:36px;cursor:pointer;-webkit-animation-delay:.3s;animation-delay:.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes slideUp-data-v-c095f994{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes slideUp-data-v-c095f994{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-49e8d1e8.e2948cc9.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-49e8d1e8.e2948cc9.css new file mode 100644 index 00000000..02ed69e4 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-49e8d1e8.e2948cc9.css @@ -0,0 +1 @@ +.code-gen{margin:0 auto;width:70%}.code-gen .el-input{width:450px}.code-gen .el-row h4{text-align:center}.code-gen .el-row .el-button{margin-top:20px}.el-table .hidden-row{display:none}#templateSelect .el-input{width:100%} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-734ead8e.dfbde295.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-734ead8e.dfbde295.css new file mode 100644 index 00000000..9b9987b4 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-734ead8e.dfbde295.css @@ -0,0 +1 @@ +.cm-s-neat span.cm-comment{color:#a86}.cm-s-neat span.cm-keyword{line-height:1em;font-weight:700;color:#00f}.cm-s-neat span.cm-string{color:#a22}.cm-s-neat span.cm-builtin{line-height:1em;font-weight:700;color:#077}.cm-s-neat span.cm-special{line-height:1em;font-weight:700;color:#0aa}.cm-s-neat span.cm-variable{color:#000}.cm-s-neat span.cm-atom,.cm-s-neat span.cm-number{color:#3a3}.cm-s-neat span.cm-meta{color:#555}.cm-s-neat span.cm-link{color:#3a3}.cm-s-neat .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-neat .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-aacd9526.2864c242.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-aacd9526.2864c242.css new file mode 100644 index 00000000..e167b074 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-aacd9526.2864c242.css @@ -0,0 +1 @@ +.dashboard-container[data-v-22edc0ee]{margin:30px}.dashboard-text[data-v-22edc0ee]{font-size:18px;line-height:46px} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-elementUI.f2af0811.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-elementUI.f2af0811.css new file mode 100644 index 00000000..70a49155 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-elementUI.f2af0811.css @@ -0,0 +1 @@ +.el-pagination--small .arrow.disabled,.el-table--hidden,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.is-hidden>*{visibility:hidden}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing),.el-message__closeBtn:focus,.el-message__content:focus,.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing),.el-rate:active,.el-rate:focus,.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing),.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}.el-input__suffix,.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}@font-face{font-family:element-icons;src:url(../../static/fonts/element-icons.535877f5.woff) format("woff"),url(../../static/fonts/element-icons.732389de.ttf) format("truetype");font-weight:400;font-display:"auto";font-style:normal}[class*=" el-icon-"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-icon-ice-cream-round:before{content:"\E6A0"}.el-icon-ice-cream-square:before{content:"\E6A3"}.el-icon-lollipop:before{content:"\E6A4"}.el-icon-potato-strips:before{content:"\E6A5"}.el-icon-milk-tea:before{content:"\E6A6"}.el-icon-ice-drink:before{content:"\E6A7"}.el-icon-ice-tea:before{content:"\E6A9"}.el-icon-coffee:before{content:"\E6AA"}.el-icon-orange:before{content:"\E6AB"}.el-icon-pear:before{content:"\E6AC"}.el-icon-apple:before{content:"\E6AD"}.el-icon-cherry:before{content:"\E6AE"}.el-icon-watermelon:before{content:"\E6AF"}.el-icon-grape:before{content:"\E6B0"}.el-icon-refrigerator:before{content:"\E6B1"}.el-icon-goblet-square-full:before{content:"\E6B2"}.el-icon-goblet-square:before{content:"\E6B3"}.el-icon-goblet-full:before{content:"\E6B4"}.el-icon-goblet:before{content:"\E6B5"}.el-icon-cold-drink:before{content:"\E6B6"}.el-icon-coffee-cup:before{content:"\E6B8"}.el-icon-water-cup:before{content:"\E6B9"}.el-icon-hot-water:before{content:"\E6BA"}.el-icon-ice-cream:before{content:"\E6BB"}.el-icon-dessert:before{content:"\E6BC"}.el-icon-sugar:before{content:"\E6BD"}.el-icon-tableware:before{content:"\E6BE"}.el-icon-burger:before{content:"\E6BF"}.el-icon-knife-fork:before{content:"\E6C1"}.el-icon-fork-spoon:before{content:"\E6C2"}.el-icon-chicken:before{content:"\E6C3"}.el-icon-food:before{content:"\E6C4"}.el-icon-dish-1:before{content:"\E6C5"}.el-icon-dish:before{content:"\E6C6"}.el-icon-moon-night:before{content:"\E6EE"}.el-icon-moon:before{content:"\E6F0"}.el-icon-cloudy-and-sunny:before{content:"\E6F1"}.el-icon-partly-cloudy:before{content:"\E6F2"}.el-icon-cloudy:before{content:"\E6F3"}.el-icon-sunny:before{content:"\E6F6"}.el-icon-sunset:before{content:"\E6F7"}.el-icon-sunrise-1:before{content:"\E6F8"}.el-icon-sunrise:before{content:"\E6F9"}.el-icon-heavy-rain:before{content:"\E6FA"}.el-icon-lightning:before{content:"\E6FB"}.el-icon-light-rain:before{content:"\E6FC"}.el-icon-wind-power:before{content:"\E6FD"}.el-icon-baseball:before{content:"\E712"}.el-icon-soccer:before{content:"\E713"}.el-icon-football:before{content:"\E715"}.el-icon-basketball:before{content:"\E716"}.el-icon-ship:before{content:"\E73F"}.el-icon-truck:before{content:"\E740"}.el-icon-bicycle:before{content:"\E741"}.el-icon-mobile-phone:before{content:"\E6D3"}.el-icon-service:before{content:"\E6D4"}.el-icon-key:before{content:"\E6E2"}.el-icon-unlock:before{content:"\E6E4"}.el-icon-lock:before{content:"\E6E5"}.el-icon-watch:before{content:"\E6FE"}.el-icon-watch-1:before{content:"\E6FF"}.el-icon-timer:before{content:"\E702"}.el-icon-alarm-clock:before{content:"\E703"}.el-icon-map-location:before{content:"\E704"}.el-icon-delete-location:before{content:"\E705"}.el-icon-add-location:before{content:"\E706"}.el-icon-location-information:before{content:"\E707"}.el-icon-location-outline:before{content:"\E708"}.el-icon-location:before{content:"\E79E"}.el-icon-place:before{content:"\E709"}.el-icon-discover:before{content:"\E70A"}.el-icon-first-aid-kit:before{content:"\E70B"}.el-icon-trophy-1:before{content:"\E70C"}.el-icon-trophy:before{content:"\E70D"}.el-icon-medal:before{content:"\E70E"}.el-icon-medal-1:before{content:"\E70F"}.el-icon-stopwatch:before{content:"\E710"}.el-icon-mic:before{content:"\E711"}.el-icon-copy-document:before{content:"\E718"}.el-icon-full-screen:before{content:"\E719"}.el-icon-switch-button:before{content:"\E71B"}.el-icon-aim:before{content:"\E71C"}.el-icon-crop:before{content:"\E71D"}.el-icon-odometer:before{content:"\E71E"}.el-icon-time:before{content:"\E71F"}.el-icon-bangzhu:before{content:"\E724"}.el-icon-close-notification:before{content:"\E726"}.el-icon-microphone:before{content:"\E727"}.el-icon-turn-off-microphone:before{content:"\E728"}.el-icon-position:before{content:"\E729"}.el-icon-postcard:before{content:"\E72A"}.el-icon-message:before{content:"\E72B"}.el-icon-chat-line-square:before{content:"\E72D"}.el-icon-chat-dot-square:before{content:"\E72E"}.el-icon-chat-dot-round:before{content:"\E72F"}.el-icon-chat-square:before{content:"\E730"}.el-icon-chat-line-round:before{content:"\E731"}.el-icon-chat-round:before{content:"\E732"}.el-icon-set-up:before{content:"\E733"}.el-icon-turn-off:before{content:"\E734"}.el-icon-open:before{content:"\E735"}.el-icon-connection:before{content:"\E736"}.el-icon-link:before{content:"\E737"}.el-icon-cpu:before{content:"\E738"}.el-icon-thumb:before{content:"\E739"}.el-icon-female:before{content:"\E73A"}.el-icon-male:before{content:"\E73B"}.el-icon-guide:before{content:"\E73C"}.el-icon-news:before{content:"\E73E"}.el-icon-price-tag:before{content:"\E744"}.el-icon-discount:before{content:"\E745"}.el-icon-wallet:before{content:"\E747"}.el-icon-coin:before{content:"\E748"}.el-icon-money:before{content:"\E749"}.el-icon-bank-card:before{content:"\E74A"}.el-icon-box:before{content:"\E74B"}.el-icon-present:before{content:"\E74C"}.el-icon-sell:before{content:"\E6D5"}.el-icon-sold-out:before{content:"\E6D6"}.el-icon-shopping-bag-2:before{content:"\E74D"}.el-icon-shopping-bag-1:before{content:"\E74E"}.el-icon-shopping-cart-2:before{content:"\E74F"}.el-icon-shopping-cart-1:before{content:"\E750"}.el-icon-shopping-cart-full:before{content:"\E751"}.el-icon-smoking:before{content:"\E752"}.el-icon-no-smoking:before{content:"\E753"}.el-icon-house:before{content:"\E754"}.el-icon-table-lamp:before{content:"\E755"}.el-icon-school:before{content:"\E756"}.el-icon-office-building:before{content:"\E757"}.el-icon-toilet-paper:before{content:"\E758"}.el-icon-notebook-2:before{content:"\E759"}.el-icon-notebook-1:before{content:"\E75A"}.el-icon-files:before{content:"\E75B"}.el-icon-collection:before{content:"\E75C"}.el-icon-receiving:before{content:"\E75D"}.el-icon-suitcase-1:before{content:"\E760"}.el-icon-suitcase:before{content:"\E761"}.el-icon-film:before{content:"\E763"}.el-icon-collection-tag:before{content:"\E765"}.el-icon-data-analysis:before{content:"\E766"}.el-icon-pie-chart:before{content:"\E767"}.el-icon-data-board:before{content:"\E768"}.el-icon-data-line:before{content:"\E76D"}.el-icon-reading:before{content:"\E769"}.el-icon-magic-stick:before{content:"\E76A"}.el-icon-coordinate:before{content:"\E76B"}.el-icon-mouse:before{content:"\E76C"}.el-icon-brush:before{content:"\E76E"}.el-icon-headset:before{content:"\E76F"}.el-icon-umbrella:before{content:"\E770"}.el-icon-scissors:before{content:"\E771"}.el-icon-mobile:before{content:"\E773"}.el-icon-attract:before{content:"\E774"}.el-icon-monitor:before{content:"\E775"}.el-icon-search:before{content:"\E778"}.el-icon-takeaway-box:before{content:"\E77A"}.el-icon-paperclip:before{content:"\E77D"}.el-icon-printer:before{content:"\E77E"}.el-icon-document-add:before{content:"\E782"}.el-icon-document:before{content:"\E785"}.el-icon-document-checked:before{content:"\E786"}.el-icon-document-copy:before{content:"\E787"}.el-icon-document-delete:before{content:"\E788"}.el-icon-document-remove:before{content:"\E789"}.el-icon-tickets:before{content:"\E78B"}.el-icon-folder-checked:before{content:"\E77F"}.el-icon-folder-delete:before{content:"\E780"}.el-icon-folder-remove:before{content:"\E781"}.el-icon-folder-add:before{content:"\E783"}.el-icon-folder-opened:before{content:"\E784"}.el-icon-folder:before{content:"\E78A"}.el-icon-edit-outline:before{content:"\E764"}.el-icon-edit:before{content:"\E78C"}.el-icon-date:before{content:"\E78E"}.el-icon-c-scale-to-original:before{content:"\E7C6"}.el-icon-view:before{content:"\E6CE"}.el-icon-loading:before{content:"\E6CF"}.el-icon-rank:before{content:"\E6D1"}.el-icon-sort-down:before{content:"\E7C4"}.el-icon-sort-up:before{content:"\E7C5"}.el-icon-sort:before{content:"\E6D2"}.el-icon-finished:before{content:"\E6CD"}.el-icon-refresh-left:before{content:"\E6C7"}.el-icon-refresh-right:before{content:"\E6C8"}.el-icon-refresh:before{content:"\E6D0"}.el-icon-video-play:before{content:"\E7C0"}.el-icon-video-pause:before{content:"\E7C1"}.el-icon-d-arrow-right:before{content:"\E6DC"}.el-icon-d-arrow-left:before{content:"\E6DD"}.el-icon-arrow-up:before{content:"\E6E1"}.el-icon-arrow-down:before{content:"\E6DF"}.el-icon-arrow-right:before{content:"\E6E0"}.el-icon-arrow-left:before{content:"\E6DE"}.el-icon-top-right:before{content:"\E6E7"}.el-icon-top-left:before{content:"\E6E8"}.el-icon-top:before{content:"\E6E6"}.el-icon-bottom:before{content:"\E6EB"}.el-icon-right:before{content:"\E6E9"}.el-icon-back:before{content:"\E6EA"}.el-icon-bottom-right:before{content:"\E6EC"}.el-icon-bottom-left:before{content:"\E6ED"}.el-icon-caret-top:before{content:"\E78F"}.el-icon-caret-bottom:before{content:"\E790"}.el-icon-caret-right:before{content:"\E791"}.el-icon-caret-left:before{content:"\E792"}.el-icon-d-caret:before{content:"\E79A"}.el-icon-share:before{content:"\E793"}.el-icon-menu:before{content:"\E798"}.el-icon-s-grid:before{content:"\E7A6"}.el-icon-s-check:before{content:"\E7A7"}.el-icon-s-data:before{content:"\E7A8"}.el-icon-s-opportunity:before{content:"\E7AA"}.el-icon-s-custom:before{content:"\E7AB"}.el-icon-s-claim:before{content:"\E7AD"}.el-icon-s-finance:before{content:"\E7AE"}.el-icon-s-comment:before{content:"\E7AF"}.el-icon-s-flag:before{content:"\E7B0"}.el-icon-s-marketing:before{content:"\E7B1"}.el-icon-s-shop:before{content:"\E7B4"}.el-icon-s-open:before{content:"\E7B5"}.el-icon-s-management:before{content:"\E7B6"}.el-icon-s-ticket:before{content:"\E7B7"}.el-icon-s-release:before{content:"\E7B8"}.el-icon-s-home:before{content:"\E7B9"}.el-icon-s-promotion:before{content:"\E7BA"}.el-icon-s-operation:before{content:"\E7BB"}.el-icon-s-unfold:before{content:"\E7BC"}.el-icon-s-fold:before{content:"\E7A9"}.el-icon-s-platform:before{content:"\E7BD"}.el-icon-s-order:before{content:"\E7BE"}.el-icon-s-cooperation:before{content:"\E7BF"}.el-icon-bell:before{content:"\E725"}.el-icon-message-solid:before{content:"\E799"}.el-icon-video-camera:before{content:"\E772"}.el-icon-video-camera-solid:before{content:"\E796"}.el-icon-camera:before{content:"\E779"}.el-icon-camera-solid:before{content:"\E79B"}.el-icon-download:before{content:"\E77C"}.el-icon-upload2:before{content:"\E77B"}.el-icon-upload:before{content:"\E7C3"}.el-icon-picture-outline-round:before{content:"\E75F"}.el-icon-picture-outline:before{content:"\E75E"}.el-icon-picture:before{content:"\E79F"}.el-icon-close:before{content:"\E6DB"}.el-icon-check:before{content:"\E6DA"}.el-icon-plus:before{content:"\E6D9"}.el-icon-minus:before{content:"\E6D8"}.el-icon-help:before{content:"\E73D"}.el-icon-s-help:before{content:"\E7B3"}.el-icon-circle-close:before{content:"\E78D"}.el-icon-circle-check:before{content:"\E720"}.el-icon-circle-plus-outline:before{content:"\E723"}.el-icon-remove-outline:before{content:"\E722"}.el-icon-zoom-out:before{content:"\E776"}.el-icon-zoom-in:before{content:"\E777"}.el-icon-error:before{content:"\E79D"}.el-icon-success:before{content:"\E79C"}.el-icon-circle-plus:before{content:"\E7A0"}.el-icon-remove:before{content:"\E7A2"}.el-icon-info:before{content:"\E7A1"}.el-icon-question:before{content:"\E7A4"}.el-icon-warning-outline:before{content:"\E6C9"}.el-icon-warning:before{content:"\E7A3"}.el-icon-goods:before{content:"\E7C2"}.el-icon-s-goods:before{content:"\E7B2"}.el-icon-star-off:before{content:"\E717"}.el-icon-star-on:before{content:"\E797"}.el-icon-more-outline:before{content:"\E6CC"}.el-icon-more:before{content:"\E794"}.el-icon-phone-outline:before{content:"\E6CB"}.el-icon-phone:before{content:"\E795"}.el-icon-user:before{content:"\E6E3"}.el-icon-user-solid:before{content:"\E7A5"}.el-icon-setting:before{content:"\E6CA"}.el-icon-s-tools:before{content:"\E7AC"}.el-icon-delete:before{content:"\E6D7"}.el-icon-delete-solid:before{content:"\E7C9"}.el-icon-eleme:before{content:"\E7C7"}.el-icon-platform-eleme:before{content:"\E7CA"}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotating{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.el-pagination{white-space:nowrap;padding:2px 5px;color:#303133;font-weight:700}.el-pagination:after,.el-pagination:before{display:table;content:""}.el-pagination:after{clear:both}.el-pagination button,.el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.el-pagination .el-select .el-input{width:100px;margin:0 5px}.el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:#409eff}.el-pagination button:disabled{color:#c0c4cc;background-color:#fff;cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:50% no-repeat #fff;background-size:16px;cursor:pointer;margin:0;color:#303133}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700}.el-pagination .btn-prev{padding-right:12px}.el-pagination .btn-next{padding-left:12px}.el-pagination .el-pager li.disabled{color:#c0c4cc;cursor:not-allowed}.el-pager li,.el-pager li.btn-quicknext:hover,.el-pager li.btn-quickprev:hover{cursor:pointer}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.el-pagination--small .more:before,.el-pagination--small li.more:before{line-height:24px}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:22px;line-height:22px}.el-pagination--small .el-pagination__editor,.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:22px}.el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#606266}.el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.el-pagination__sizes .el-input .el-input__inner:hover{border-color:#409eff}.el-pagination__total{margin-right:10px;font-weight:400;color:#606266}.el-pagination__jump{margin-left:24px;font-weight:400;color:#606266}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__rightwrapper{float:right}.el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px}.el-pager,.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:28px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 5px;background-color:#f4f4f5;color:#606266;min-width:30px;border-radius:2px}.el-pagination.is-background .btn-next.disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.disabled{color:#c0c4cc}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:#409eff}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:#409eff;color:#fff}.el-dialog,.el-pager li{background:#fff;-webkit-box-sizing:border-box}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{margin:0 3px;min-width:22px}.el-pager,.el-pager li{vertical-align:top;margin:0;display:inline-block}.el-pager{-ms-user-select:none;user-select:none;list-style:none;font-size:0}.el-date-table,.el-pager,.el-table th{-webkit-user-select:none;-moz-user-select:none}.el-pager .more:before{line-height:30px}.el-pager li{padding:0 4px;font-size:13px;min-width:35.5px;height:28px;line-height:28px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center}.el-menu--collapse .el-menu .el-submenu,.el-menu--popup{min-width:200px}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:28px;color:#303133}.el-pager li.btn-quicknext.disabled,.el-pager li.btn-quickprev.disabled{color:#c0c4cc}.el-pager li.active+li{border-left:0}.el-pager li:hover{color:#409eff}.el-pager li.active{color:#409eff;cursor:default}@-webkit-keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{to{opacity:0}}.el-dialog{position:relative;margin:0 auto 50px;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#409eff}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px;word-break:break-all}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;border:1px solid #e4e7ed;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.el-dropdown-menu,.el-menu--collapse .el-submenu .el-menu{z-index:10;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#606266;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li.highlighted,.el-autocomplete-suggestion li:hover{background-color:#f5f7fa}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.el-autocomplete-suggestion.is-loading li:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:#fff}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.el-dropdown .el-dropdown__caret-button:before{content:"";position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:hsla(0,0%,100%,.5)}.el-dropdown .el-dropdown__caret-button.el-button--default:before{background:rgba(220,223,230,.5)}.el-dropdown .el-dropdown__caret-button:hover:before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown-menu{position:absolute;top:0;left:0;padding:10px 0;margin:5px 0;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-dropdown-menu__item{list-style:none;line-height:36px;padding:0 20px;margin:0;font-size:14px;color:#606266;cursor:pointer;outline:0}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#ecf5ff;color:#66b1ff}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #ebeef5}.el-dropdown-menu__item--divided:before{content:"";height:6px;display:block;margin:0 -20px;background-color:#fff}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-menu{border-right:1px solid #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0}.el-menu,.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-menu:after,.el-menu:before{display:table;content:""}.el-menu:after{clear:both}.el-menu.el-menu--horizontal{border-bottom:1px solid #e6e6e6}.el-menu--horizontal{border-right:none}.el-menu--horizontal>.el-menu-item{float:left;height:60px;line-height:60px;margin:0;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #409eff;color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#fff;float:none;height:36px;line-height:36px;padding:0 10px;color:#909399}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:#303133}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid #409eff;color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-submenu{position:relative}.el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;border:1px solid #e4e7ed;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu-item,.el-submenu__title{height:56px;line-height:56px;position:relative;-webkit-box-sizing:border-box;white-space:nowrap;list-style:none}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.el-menu--popup{z-index:100;border:none;padding:5px 0;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{outline:0;background-color:#ecf5ff}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:#409eff}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{outline:0;background-color:#ecf5ff}.el-submenu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.el-submenu.is-active .el-submenu__title{border-bottom-color:#409eff}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#909399}.el-radio-button__inner,.el-radio-group{display:inline-block;line-height:1;vertical-align:middle}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.el-radio-group{font-size:0}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{white-space:nowrap;background:#fff;border:1px solid #dcdfe6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#409eff}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#fff;background-color:#409eff;border-color:#409eff;-webkit-box-shadow:-1px 0 0 0 #409eff;box-shadow:-1px 0 0 0 #409eff}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#f2f6fc}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-popover,.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #409eff;box-shadow:0 0 2px 2px #409eff}.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;vertical-align:middle;color:#303133}.el-switch__label.is-active{color:#409eff}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #dcdfe6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#dcdfe6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#fff}.el-switch.is-checked .el-switch__core{border-color:#409eff;background-color:#409eff}.el-switch.is-checked .el-switch__core:after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #e4e7ed;border-radius:4px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#409eff;background-color:#fff}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#f5f7fa}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected:after{position:absolute;right:20px;font-family:element-icons;content:"\E6DA";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#fff}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#f5f7fa}.el-select-dropdown__item.selected{color:#409eff;font-weight:700}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type):after{content:"";position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#e4e7ed}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{display:inline-block;position:relative}.el-select .el-select__tags>span{display:contents}.el-select:hover .el-input__inner{border-color:#c0c4cc}.el-select .el-input__inner{cursor:pointer;padding-right:35px}.el-select .el-input__inner:focus{border-color:#409eff}.el-select .el-input .el-select__caret{color:#c0c4cc;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotate(180deg);transform:rotate(180deg);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotate(0);transform:rotate(0)}.el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotate(180deg);transform:rotate(180deg);border-radius:100%;color:#c0c4cc;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-select .el-input .el-select__caret.is-show-close:hover{color:#909399}.el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__inner:hover{border-color:#e4e7ed}.el-select .el-input.is-focus .el-input__inner{border-color:#409eff}.el-select>.el-input{display:block}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-mini{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#c0c4cc;line-height:18px;font-size:14px}.el-select__close:hover{color:#909399}.el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-select .el-tag__close{margin-top:-2px}.el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:#f0f2f5}.el-select .el-tag__close.el-icon-close{background-color:#c0c4cc;right:-7px;top:0;color:#fff}.el-select .el-tag__close.el-icon-close:hover{background-color:#909399}.el-table,.el-table__expanded-cell{background-color:#fff}.el-select .el-tag__close.el-icon-close:before{display:block;-webkit-transform:translateY(.5px);transform:translateY(.5px)}.el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;max-width:100%;font-size:14px;color:#606266}.el-table--mini,.el-table--small,.el-table__expand-icon{font-size:12px}.el-table__empty-block{min-height:60px;text-align:center;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:#909399}.el-table__expand-column .cell{padding:0;text-align:center}.el-table__expand-icon{position:relative;cursor:pointer;color:#666;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit td.gutter,.el-table--fit th.gutter{border-right-width:1px}.el-table--scrollable-x .el-table__body-wrapper{overflow-x:auto}.el-table--scrollable-y .el-table__body-wrapper{overflow-y:auto}.el-table thead{color:#909399;font-weight:500}.el-table thead.is-group th{background:#f5f7fa}.el-table th,.el-table tr{background-color:#fff}.el-table td,.el-table th{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left}.el-table td.is-center,.el-table th.is-center{text-align:center}.el-table td.is-right,.el-table th.is-right{text-align:right}.el-table td.gutter,.el-table th.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table--medium td,.el-table--medium th{padding:10px 0}.el-table--small td,.el-table--small th{padding:8px 0}.el-table--mini td,.el-table--mini th{padding:6px 0}.el-table--border td:first-child .cell,.el-table--border th:first-child .cell,.el-table .cell{padding-left:10px}.el-table tr input[type=checkbox]{margin:0}.el-table td,.el-table th.is-leaf{border-bottom:1px solid #ebeef5}.el-table th.is-sortable{cursor:pointer}.el-table th{overflow:hidden;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.el-table th>.cell{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;vertical-align:middle;padding-left:10px;padding-right:10px;width:100%}.el-table th>.cell.highlight{color:#409eff}.el-table th.required>div:before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-table td.gutter{width:0}.el-table .cell{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding-right:10px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--border,.el-table--group{border:1px solid #ebeef5}.el-table--border:after,.el-table--group:after,.el-table:before{content:"";position:absolute;background-color:#ebeef5;z-index:1}.el-table--border:after,.el-table--group:after{top:0;right:0;width:1px;height:100%}.el-table:before{left:0;bottom:0;width:100%;height:1px}.el-table--border{border-right:none;border-bottom:none}.el-table--border.el-loading-parent--relative{border-color:transparent}.el-table--border td,.el-table--border th,.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:1px solid #ebeef5}.el-table--border th.gutter:last-of-type{border-bottom:1px solid #ebeef5;border-bottom-width:1px}.el-table--border th,.el-table__fixed-right-patch{border-bottom:1px solid #ebeef5}.el-table__fixed,.el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.el-table__fixed-right:before,.el-table__fixed:before{content:"";position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#ebeef5;z-index:4}.el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#fff}.el-table__fixed-right{top:0;left:auto;right:0}.el-table__fixed-right .el-table__fixed-body-wrapper,.el-table__fixed-right .el-table__fixed-footer-wrapper,.el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.el-table__fixed-footer-wrapper tbody td{border-top:1px solid #ebeef5;background-color:#f5f7fa;color:#606266}.el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__footer-wrapper{margin-top:-1px}.el-table__footer-wrapper td{border-top:1px solid #ebeef5}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td,.el-table__header-wrapper tbody td{background-color:#f5f7fa;color:#606266}.el-table__body-wrapper{overflow:hidden;position:relative}.el-table__body-wrapper.is-scrolling-left~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right,.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.el-picker-panel,.el-table-filter{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right{border-left:1px solid #ebeef5}.el-table .caret-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:5px solid transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:#c0c4cc;top:5px}.el-table .sort-caret.descending{border-top-color:#c0c4cc;bottom:7px}.el-table .ascending .sort-caret.ascending{border-bottom-color:#409eff}.el-table .descending .sort-caret.descending{border-top-color:#409eff}.el-table .hidden-columns{position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td{background:#fafafa}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td{background-color:#ecf5ff}.el-table__body tr.hover-row.current-row>td,.el-table__body tr.hover-row.el-table__row--striped.current-row>td,.el-table__body tr.hover-row.el-table__row--striped>td,.el-table__body tr.hover-row>td{background-color:#f5f7fa}.el-table__body tr.current-row>td{background-color:#ecf5ff}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #ebeef5;z-index:10}.el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.el-table__column-filter-trigger i{color:#909399;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.el-table--enable-row-transition .el-table__body td{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td{background-color:#f5f7fa}.el-table--fluid-height .el-table__fixed,.el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:20px;line-height:20px;height:20px;text-align:center;margin-right:3px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:1px solid #ebeef5;border-radius:2px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:2px 0}.el-date-table td,.el-date-table td div{height:30px;-webkit-box-sizing:border-box}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.el-table-filter__list-item:hover{background-color:#ecf5ff;color:#66b1ff}.el-table-filter__list-item.is-active{background-color:#409eff;color:#fff}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid #ebeef5;padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:#606266;cursor:pointer;font-size:13px;padding:0 3px}.el-date-table.is-week-mode .el-date-table__row.current div,.el-date-table.is-week-mode .el-date-table__row:hover div,.el-date-table td.in-range div,.el-date-table td.in-range div:hover{background-color:#f2f6fc}.el-table-filter__bottom button:hover{color:#409eff}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:block;margin-right:5px;margin-bottom:8px;margin-left:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-date-table{font-size:12px;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#606266}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td{width:32px;padding:4px 0;text-align:center;cursor:pointer;position:relative}.el-date-table td,.el-date-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td div{padding:3px 0}.el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.el-date-table td.next-month,.el-date-table td.prev-month{color:#c0c4cc}.el-date-table td.today{position:relative}.el-date-table td.today span{color:#409eff;font-weight:700}.el-date-table td.today.end-date span,.el-date-table td.today.start-date span{color:#fff}.el-date-table td.available:hover{color:#409eff}.el-date-table td.current:not(.disabled) span{color:#fff;background-color:#409eff}.el-date-table td.end-date div,.el-date-table td.start-date div{color:#fff}.el-date-table td.end-date span,.el-date-table td.start-date span{background-color:#409eff}.el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled div{background-color:#f5f7fa;opacity:1;cursor:not-allowed;color:#c0c4cc}.el-date-table td.selected div{margin-left:5px;margin-right:5px;background-color:#f2f6fc;border-radius:15px}.el-date-table td.selected div:hover{background-color:#f2f6fc}.el-date-table td.selected span{background-color:#409eff;color:#fff;border-radius:15px}.el-date-table td.week{font-size:80%;color:#606266}.el-month-table,.el-year-table{font-size:12px;border-collapse:collapse}.el-date-table th{padding:5px;color:#606266;font-weight:400;border-bottom:1px solid #ebeef5}.el-month-table{margin:-1px}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-month-table td.today .cell{color:#409eff;font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#fff}.el-month-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#c0c4cc}.el-month-table td.disabled .cell:hover{color:#c0c4cc}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:#606266;margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:#409eff}.el-month-table td.in-range div,.el-month-table td.in-range div:hover{background-color:#f2f6fc}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#fff}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#fff;background-color:#409eff}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:#409eff}.el-year-table{margin:-1px}.el-year-table .el-icon{color:#303133}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:#409eff;font-weight:700}.el-year-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#c0c4cc}.el-year-table td.disabled .cell:hover{color:#c0c4cc}.el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#606266;margin:0 auto}.el-year-table td .cell:hover,.el-year-table td.current:not(.disabled) .cell{color:#409eff}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#303133}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#fff}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:1px solid #ebeef5}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#606266}.el-date-picker__header-label.active,.el-date-picker__header-label:hover{color:#409eff}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.selected:not(.disabled){color:#409eff;font-weight:700}.time-select-item.disabled{color:#e4e7ed;cursor:not-allowed}.time-select-item:hover{background-color:#f5f7fa;font-weight:700;cursor:pointer}.el-date-editor{position:relative;display:inline-block;text-align:left}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:220px}.el-date-editor--monthrange.el-input,.el-date-editor--monthrange.el-input__inner{width:300px}.el-date-editor--daterange.el-input,.el-date-editor--daterange.el-input__inner,.el-date-editor--timerange.el-input,.el-date-editor--timerange.el-input__inner{width:350px}.el-date-editor--datetimerange.el-input,.el-date-editor--datetimerange.el-input__inner{width:400px}.el-date-editor--dates .el-input__inner{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .el-icon-circle-close{cursor:pointer}.el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#c0c4cc;float:left;line-height:32px}.el-date-editor .el-range-input,.el-date-editor .el-range-separator{height:100%;margin:0;text-align:center;display:inline-block;font-size:14px}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;padding:0;width:39%;color:#606266}.el-date-editor .el-range-input::-webkit-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input:-ms-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::-ms-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::-moz-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::placeholder{color:#c0c4cc}.el-date-editor .el-range-separator{padding:0 5px;line-height:32px;width:5%;color:#303133}.el-date-editor .el-range__close-icon{font-size:14px;color:#c0c4cc;width:25px;display:inline-block;float:right;line-height:32px}.el-range-editor.el-input__inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:3px 10px}.el-range-editor .el-range-input{line-height:1}.el-range-editor.is-active,.el-range-editor.is-active:hover{border-color:#409eff}.el-range-editor--medium.el-input__inner{height:36px}.el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.el-range-editor--medium .el-range-input{font-size:14px}.el-range-editor--medium .el-range__close-icon,.el-range-editor--medium .el-range__icon{line-height:28px}.el-range-editor--small.el-input__inner{height:32px}.el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.el-range-editor--small .el-range-input{font-size:13px}.el-range-editor--small .el-range__close-icon,.el-range-editor--small .el-range__icon{line-height:24px}.el-range-editor--mini.el-input__inner{height:28px}.el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.el-range-editor--mini .el-range-input{font-size:12px}.el-range-editor--mini .el-range__close-icon,.el-range-editor--mini .el-range__icon{line-height:20px}.el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:#e4e7ed}.el-range-editor.is-disabled input{background-color:#f5f7fa;color:#c0c4cc;cursor:not-allowed}.el-range-editor.is-disabled input::-webkit-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input:-ms-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::-ms-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::-moz-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::placeholder{color:#c0c4cc}.el-range-editor.is-disabled .el-range-separator{color:#c0c4cc}.el-picker-panel{color:#606266;border:1px solid #e4e7ed;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#fff;border-radius:4px;line-height:30px;margin:5px 0}.el-picker-panel,.el-popover,.el-time-panel{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-picker-panel__body-wrapper:after,.el-picker-panel__body:after{content:"";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#fff;position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:#409eff}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#409eff}.el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:#303133;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:#409eff}.el-picker-panel__icon-btn.is-disabled{color:#bbb}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#fff;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__input.el-input .el-input__inner,.el-time-spinner__list{padding:0;text-align:center}.el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#fff;cursor:default}.el-time-spinner__arrow{font-size:12px;color:#909399;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:#409eff}.el-time-spinner__arrow.el-icon-arrow-up{top:10px}.el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__list{margin:0;list-style:none}.el-time-spinner__list:after,.el-time-spinner__list:before{content:"";display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#606266}.el-time-spinner__item:hover:not(.disabled):not(.active){background:#f5f7fa;cursor:pointer}.el-time-spinner__item.active:not(.disabled){color:#303133;font-weight:700}.el-time-spinner__item.disabled{color:#c0c4cc;cursor:not-allowed}.el-time-panel{margin:5px 0;border:1px solid #e4e7ed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;user-select:none;-webkit-box-sizing:content-box;box-sizing:content-box}.el-slider__button,.el-slider__button-wrapper,.el-time-panel{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content:after,.el-time-panel__content:before{content:"";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #e4e7ed;border-bottom:1px solid #e4e7ed}.el-time-panel__content:after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content:before{padding-left:50%;margin-right:12%;margin-left:12%}.el-time-panel__content.has-seconds:after{left:66.66667%}.el-time-panel__content.has-seconds:before{padding-left:33.33333%}.el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#303133}.el-time-panel__btn.confirm{font-weight:800;color:#409eff}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px}.el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid #e4e7ed}.el-popover{position:absolute;background:#fff;min-width:150px;border:1px solid #ebeef5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);word-break:break-all}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#fff;border-radius:4px;border:1px solid #ebeef5;font-size:18px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.el-message-box__wrapper:after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box__header{position:relative;padding:15px 15px 10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#303133}.el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus,.el-message-box__input input.invalid,.el-message-box__input input.invalid:focus{border-color:#f56c6c}.el-message-box__headerbtn .el-message-box__close{color:#909399}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}.el-message-box__content{padding:10px 15px;color:#606266;font-size:14px}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.el-message-box__status:before{padding-left:1px}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.el-message-box__status.el-icon-success{color:#67c23a}.el-message-box__status.el-icon-info{color:#909399}.el-message-box__status.el-icon-warning{color:#e6a23c}.el-message-box__status.el-icon-error{color:#f56c6c}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:#f56c6c;font-size:12px;min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;text-align:right}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.el-message-box--center{padding-bottom:30px}.el-message-box--center .el-message-box__header{padding-top:30px}.el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__content{text-align:center}.el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb:after,.el-breadcrumb:before{display:table;content:""}.el-breadcrumb:after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#c0c4cc}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner.is-link,.el-breadcrumb__inner a{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner.is-link:hover,.el-breadcrumb__inner a:hover{color:#409eff;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover{font-weight:400;color:#606266;cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item:after,.el-form-item:before{display:table;content:""}.el-form-item:after{clear:both}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label-wrap{float:left}.el-form-item__label-wrap .el-form-item__label{display:inline-block;float:none}.el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content:after,.el-form-item__content:before{display:table;content:""}.el-form-item__content:after{clear:both}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:#f56c6c;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:"*";color:#f56c6c;margin-right:4px}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#f56c6c}.el-form-item--feedback .el-input__validateIcon{display:inline-block}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#409eff;z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.el-collapse-item__arrow,.el-tabs__nav{-webkit-transition:-webkit-transform .3s}.el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8);transform:scale(.8)}.el-tabs__new-tab:hover{color:#409eff}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap:after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#e4e7ed;z-index:1}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after,.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;transition:-webkit-transform .3s;-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.el-tabs__nav.is-stretch{min-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.el-tabs__nav.is-stretch>*{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus.is-active.is-focus:not(:active){-webkit-box-shadow:0 0 2px 2px #409eff inset;box-shadow:inset 0 0 2px 2px #409eff;border-radius:3px}.el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.el-tabs__item .el-icon-close:hover{background-color:#c0c4cc;color:#fff}.el-tabs__item.is-active{color:#409eff}.el-tabs__item:hover{color:#409eff;cursor:pointer}.el-tabs__item.is-disabled{color:#c0c4cc;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #e4e7ed}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #e4e7ed;border-bottom:none;border-radius:4px 4px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close,.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #e4e7ed;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#fff}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--border-card{background:#fff;border:1px solid #dcdfe6;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#f5f7fa;border-bottom:1px solid #e4e7ed;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin-top:-1px;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#409eff;background-color:#fff;border-right-color:#dcdfe6;border-left-color:#dcdfe6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:#409eff}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#c0c4cc}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #dcdfe6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left:after{right:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left,.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid #e4e7ed;border-bottom:none;border-top:1px solid #e4e7ed;text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #e4e7ed;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid #e4e7ed;border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #e4e7ed;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #e4e7ed}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #e4e7ed;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid #e4e7ed;border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #e4e7ed;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.el-tree{position:relative;cursor:default;background:#fff;color:#606266}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#909399;font-size:14px}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:#409eff}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:#f5f7fa}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:#409eff;color:#fff}.el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:26px;cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:#f5f7fa}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:#c0c4cc;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__label{font-size:14px}.el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#c0c4cc}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#f0f7ff}.el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#fff;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-light .el-alert__closebtn{color:#c0c4cc}.el-alert.is-dark .el-alert__closebtn,.el-alert.is-dark .el-alert__description{color:#fff}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success.is-light{background-color:#f0f9eb;color:#67c23a}.el-alert--success.is-light .el-alert__description{color:#67c23a}.el-alert--success.is-dark{background-color:#67c23a;color:#fff}.el-alert--info.is-light{background-color:#f4f4f5;color:#909399}.el-alert--info.is-dark{background-color:#909399;color:#fff}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning.is-light{background-color:#fdf6ec;color:#e6a23c}.el-alert--warning.is-light .el-alert__description{color:#e6a23c}.el-alert--warning.is-dark{background-color:#e6a23c;color:#fff}.el-alert--error.is-light{background-color:#fef0f0;color:#f56c6c}.el-alert--error.is-light .el-alert__description{color:#f56c6c}.el-alert--error.is-dark{background-color:#f56c6c;color:#fff}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert-fade-enter,.el-alert-fade-leave-active,.el-loading-fade-enter,.el-loading-fade-leave-active,.el-notification-fade-leave-active{opacity:0}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ebeef5;position:fixed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:13px;margin-right:8px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67c23a}.el-notification .el-icon-error{color:#f56c6c}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#e6a23c}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.el-input-number .el-input{display:block}.el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.el-input-number__decrease,.el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#f5f7fa;color:#606266;cursor:pointer;font-size:13px}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:#409eff}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#409eff}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #dcdfe6}.el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #dcdfe6}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:#e4e7ed;color:#e4e7ed}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:#e4e7ed;cursor:not-allowed}.el-input-number--medium{width:200px;line-height:34px}.el-input-number--medium .el-input-number__decrease,.el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.el-input-number--small{width:130px;line-height:30px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.el-input-number--mini{width:130px;line-height:26px}.el-input-number--mini .el-input-number__decrease,.el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.el-input-number--mini .el-input-number__decrease [class*=el-icon],.el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #dcdfe6}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #dcdfe6;border-radius:0 0 4px}.el-input-number.is-controls-right[class*=medium] [class*=decrease],.el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.el-input-number.is-controls-right[class*=mini] [class*=decrease],.el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow:after{content:" ";border-width:5px}.el-progress-bar__inner:after,.el-row:after,.el-row:before,.el-slider:after,.el-slider:before,.el-slider__button-wrapper:after,.el-upload-cover:after{content:""}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow:after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow:after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow:after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow:after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#fff}.el-tooltip__popper.is-light{background:#fff;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow:after{border-top-color:#fff}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow:after{border-bottom-color:#fff}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow:after{border-left-color:#fff}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow:after{border-right-color:#fff}.el-slider:after,.el-slider:before{display:table}.el-slider__button-wrapper .el-tooltip,.el-slider__button-wrapper:after{vertical-align:middle;display:inline-block}.el-slider:after{clear:both}.el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#e4e7ed;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.el-slider__runway.show-input{margin-right:160px;width:auto}.el-slider__runway.disabled{cursor:default}.el-slider__runway.disabled .el-slider__bar{background-color:#c0c4cc}.el-slider__runway.disabled .el-slider__button{border-color:#c0c4cc}.el-slider__runway.disabled .el-slider__button-wrapper.dragging,.el-slider__runway.disabled .el-slider__button-wrapper.hover,.el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.disabled .el-slider__button.dragging,.el-slider__runway.disabled .el-slider__button.hover,.el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1);cursor:not-allowed}.el-slider__button-wrapper,.el-slider__stop{-webkit-transform:translateX(-50%);position:absolute}.el-slider__input{float:right;margin-top:3px;width:130px}.el-slider__input.el-input-number--mini{margin-top:5px}.el-slider__input.el-input-number--medium{margin-top:0}.el-slider__input.el-input-number--large{margin-top:-2px}.el-slider__bar{height:6px;background-color:#409eff;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.el-slider__button-wrapper{height:36px;width:36px;z-index:1001;top:-15px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:normal}.el-slider__button-wrapper:after{height:100%}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{width:16px;height:16px;border:2px solid #409eff;background-color:#fff;border-radius:50%;-webkit-transition:.2s;transition:.2s;user-select:none}.el-image-viewer__btn,.el-slider__button,.el-step__icon-inner{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{height:6px;width:6px;border-radius:100%;background-color:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);font-size:14px;color:#909399;margin-top:15px}.el-slider.is-vertical{position:relative}.el-slider.is-vertical .el-slider__runway{width:6px;height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:6px;height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px}.el-slider.is-vertical .el-slider__button-wrapper,.el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #dcdfe6;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#c0c4cc}.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#409eff}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:hsla(0,0%,100%,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-col-pull-0,.el-col-pull-1,.el-col-pull-2,.el-col-pull-3,.el-col-pull-4,.el-col-pull-5,.el-col-pull-6,.el-col-pull-7,.el-col-pull-8,.el-col-pull-9,.el-col-pull-10,.el-col-pull-11,.el-col-pull-13,.el-col-pull-14,.el-col-pull-15,.el-col-pull-16,.el-col-pull-17,.el-col-pull-18,.el-col-pull-19,.el-col-pull-20,.el-col-pull-21,.el-col-pull-22,.el-col-pull-23,.el-col-pull-24,.el-col-push-0,.el-col-push-1,.el-col-push-2,.el-col-push-3,.el-col-push-4,.el-col-push-5,.el-col-push-6,.el-col-push-7,.el-col-push-8,.el-col-push-9,.el-col-push-10,.el-col-push-11,.el-col-push-12,.el-col-push-13,.el-col-push-14,.el-col-push-15,.el-col-push-16,.el-col-push-17,.el-col-push-18,.el-col-push-19,.el-col-push-20,.el-col-push-21,.el-col-push-22,.el-col-push-23,.el-col-push-24,.el-row{position:relative}.el-loading-spinner .el-loading-text{color:#409eff;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#409eff;stroke-linecap:round}.el-loading-spinner i{color:#409eff}@-webkit-keyframes loading-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loading-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-row{-webkit-box-sizing:border-box;box-sizing:border-box}.el-row:after,.el-row:before{display:table}.el-row:after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-col-0,.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}[class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-upload--picture-card,.el-upload-dragger{-webkit-box-sizing:border-box;cursor:pointer}.el-col-0{width:0}.el-col-offset-0{margin-left:0}.el-col-pull-0{right:0}.el-col-push-0{left:0}.el-col-1{width:4.16667%}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{right:4.16667%}.el-col-push-1{left:4.16667%}.el-col-2{width:8.33333%}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{right:8.33333%}.el-col-push-2{left:8.33333%}.el-col-3{width:12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{right:12.5%}.el-col-push-3{left:12.5%}.el-col-4{width:16.66667%}.el-col-offset-4{margin-left:16.66667%}.el-col-pull-4{right:16.66667%}.el-col-push-4{left:16.66667%}.el-col-5{width:20.83333%}.el-col-offset-5{margin-left:20.83333%}.el-col-pull-5{right:20.83333%}.el-col-push-5{left:20.83333%}.el-col-6{width:25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{right:25%}.el-col-push-6{left:25%}.el-col-7{width:29.16667%}.el-col-offset-7{margin-left:29.16667%}.el-col-pull-7{right:29.16667%}.el-col-push-7{left:29.16667%}.el-col-8{width:33.33333%}.el-col-offset-8{margin-left:33.33333%}.el-col-pull-8{right:33.33333%}.el-col-push-8{left:33.33333%}.el-col-9{width:37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{right:37.5%}.el-col-push-9{left:37.5%}.el-col-10{width:41.66667%}.el-col-offset-10{margin-left:41.66667%}.el-col-pull-10{right:41.66667%}.el-col-push-10{left:41.66667%}.el-col-11{width:45.83333%}.el-col-offset-11{margin-left:45.83333%}.el-col-pull-11{right:45.83333%}.el-col-push-11{left:45.83333%}.el-col-12{width:50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{position:relative;right:50%}.el-col-push-12{left:50%}.el-col-13{width:54.16667%}.el-col-offset-13{margin-left:54.16667%}.el-col-pull-13{right:54.16667%}.el-col-push-13{left:54.16667%}.el-col-14{width:58.33333%}.el-col-offset-14{margin-left:58.33333%}.el-col-pull-14{right:58.33333%}.el-col-push-14{left:58.33333%}.el-col-15{width:62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{right:62.5%}.el-col-push-15{left:62.5%}.el-col-16{width:66.66667%}.el-col-offset-16{margin-left:66.66667%}.el-col-pull-16{right:66.66667%}.el-col-push-16{left:66.66667%}.el-col-17{width:70.83333%}.el-col-offset-17{margin-left:70.83333%}.el-col-pull-17{right:70.83333%}.el-col-push-17{left:70.83333%}.el-col-18{width:75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{right:75%}.el-col-push-18{left:75%}.el-col-19{width:79.16667%}.el-col-offset-19{margin-left:79.16667%}.el-col-pull-19{right:79.16667%}.el-col-push-19{left:79.16667%}.el-col-20{width:83.33333%}.el-col-offset-20{margin-left:83.33333%}.el-col-pull-20{right:83.33333%}.el-col-push-20{left:83.33333%}.el-col-21{width:87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{right:87.5%}.el-col-push-21{left:87.5%}.el-col-22{width:91.66667%}.el-col-offset-22{margin-left:91.66667%}.el-col-pull-22{right:91.66667%}.el-col-push-22{left:91.66667%}.el-col-23{width:95.83333%}.el-col-offset-23{margin-left:95.83333%}.el-col-pull-23{right:95.83333%}.el-col-push-23{left:95.83333%}.el-col-24{width:100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{right:100%}.el-col-push-24{left:100%}@media only screen and (max-width:767px){.el-col-xs-0{display:none;width:0}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{width:4.16667%}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{width:8.33333%}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{width:12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{width:16.66667%}.el-col-xs-offset-4{margin-left:16.66667%}.el-col-xs-pull-4{position:relative;right:16.66667%}.el-col-xs-push-4{position:relative;left:16.66667%}.el-col-xs-5{width:20.83333%}.el-col-xs-offset-5{margin-left:20.83333%}.el-col-xs-pull-5{position:relative;right:20.83333%}.el-col-xs-push-5{position:relative;left:20.83333%}.el-col-xs-6{width:25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{width:29.16667%}.el-col-xs-offset-7{margin-left:29.16667%}.el-col-xs-pull-7{position:relative;right:29.16667%}.el-col-xs-push-7{position:relative;left:29.16667%}.el-col-xs-8{width:33.33333%}.el-col-xs-offset-8{margin-left:33.33333%}.el-col-xs-pull-8{position:relative;right:33.33333%}.el-col-xs-push-8{position:relative;left:33.33333%}.el-col-xs-9{width:37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{width:41.66667%}.el-col-xs-offset-10{margin-left:41.66667%}.el-col-xs-pull-10{position:relative;right:41.66667%}.el-col-xs-push-10{position:relative;left:41.66667%}.el-col-xs-11{width:45.83333%}.el-col-xs-offset-11{margin-left:45.83333%}.el-col-xs-pull-11{position:relative;right:45.83333%}.el-col-xs-push-11{position:relative;left:45.83333%}.el-col-xs-12{width:50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{width:54.16667%}.el-col-xs-offset-13{margin-left:54.16667%}.el-col-xs-pull-13{position:relative;right:54.16667%}.el-col-xs-push-13{position:relative;left:54.16667%}.el-col-xs-14{width:58.33333%}.el-col-xs-offset-14{margin-left:58.33333%}.el-col-xs-pull-14{position:relative;right:58.33333%}.el-col-xs-push-14{position:relative;left:58.33333%}.el-col-xs-15{width:62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{width:66.66667%}.el-col-xs-offset-16{margin-left:66.66667%}.el-col-xs-pull-16{position:relative;right:66.66667%}.el-col-xs-push-16{position:relative;left:66.66667%}.el-col-xs-17{width:70.83333%}.el-col-xs-offset-17{margin-left:70.83333%}.el-col-xs-pull-17{position:relative;right:70.83333%}.el-col-xs-push-17{position:relative;left:70.83333%}.el-col-xs-18{width:75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{width:79.16667%}.el-col-xs-offset-19{margin-left:79.16667%}.el-col-xs-pull-19{position:relative;right:79.16667%}.el-col-xs-push-19{position:relative;left:79.16667%}.el-col-xs-20{width:83.33333%}.el-col-xs-offset-20{margin-left:83.33333%}.el-col-xs-pull-20{position:relative;right:83.33333%}.el-col-xs-push-20{position:relative;left:83.33333%}.el-col-xs-21{width:87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{width:91.66667%}.el-col-xs-offset-22{margin-left:91.66667%}.el-col-xs-pull-22{position:relative;right:91.66667%}.el-col-xs-push-22{position:relative;left:91.66667%}.el-col-xs-23{width:95.83333%}.el-col-xs-offset-23{margin-left:95.83333%}.el-col-xs-pull-23{position:relative;right:95.83333%}.el-col-xs-push-23{position:relative;left:95.83333%}.el-col-xs-24{width:100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{display:none;width:0}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{width:4.16667%}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{width:8.33333%}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{width:12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{width:16.66667%}.el-col-sm-offset-4{margin-left:16.66667%}.el-col-sm-pull-4{position:relative;right:16.66667%}.el-col-sm-push-4{position:relative;left:16.66667%}.el-col-sm-5{width:20.83333%}.el-col-sm-offset-5{margin-left:20.83333%}.el-col-sm-pull-5{position:relative;right:20.83333%}.el-col-sm-push-5{position:relative;left:20.83333%}.el-col-sm-6{width:25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{width:29.16667%}.el-col-sm-offset-7{margin-left:29.16667%}.el-col-sm-pull-7{position:relative;right:29.16667%}.el-col-sm-push-7{position:relative;left:29.16667%}.el-col-sm-8{width:33.33333%}.el-col-sm-offset-8{margin-left:33.33333%}.el-col-sm-pull-8{position:relative;right:33.33333%}.el-col-sm-push-8{position:relative;left:33.33333%}.el-col-sm-9{width:37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{width:41.66667%}.el-col-sm-offset-10{margin-left:41.66667%}.el-col-sm-pull-10{position:relative;right:41.66667%}.el-col-sm-push-10{position:relative;left:41.66667%}.el-col-sm-11{width:45.83333%}.el-col-sm-offset-11{margin-left:45.83333%}.el-col-sm-pull-11{position:relative;right:45.83333%}.el-col-sm-push-11{position:relative;left:45.83333%}.el-col-sm-12{width:50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{width:54.16667%}.el-col-sm-offset-13{margin-left:54.16667%}.el-col-sm-pull-13{position:relative;right:54.16667%}.el-col-sm-push-13{position:relative;left:54.16667%}.el-col-sm-14{width:58.33333%}.el-col-sm-offset-14{margin-left:58.33333%}.el-col-sm-pull-14{position:relative;right:58.33333%}.el-col-sm-push-14{position:relative;left:58.33333%}.el-col-sm-15{width:62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{width:66.66667%}.el-col-sm-offset-16{margin-left:66.66667%}.el-col-sm-pull-16{position:relative;right:66.66667%}.el-col-sm-push-16{position:relative;left:66.66667%}.el-col-sm-17{width:70.83333%}.el-col-sm-offset-17{margin-left:70.83333%}.el-col-sm-pull-17{position:relative;right:70.83333%}.el-col-sm-push-17{position:relative;left:70.83333%}.el-col-sm-18{width:75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{width:79.16667%}.el-col-sm-offset-19{margin-left:79.16667%}.el-col-sm-pull-19{position:relative;right:79.16667%}.el-col-sm-push-19{position:relative;left:79.16667%}.el-col-sm-20{width:83.33333%}.el-col-sm-offset-20{margin-left:83.33333%}.el-col-sm-pull-20{position:relative;right:83.33333%}.el-col-sm-push-20{position:relative;left:83.33333%}.el-col-sm-21{width:87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{width:91.66667%}.el-col-sm-offset-22{margin-left:91.66667%}.el-col-sm-pull-22{position:relative;right:91.66667%}.el-col-sm-push-22{position:relative;left:91.66667%}.el-col-sm-23{width:95.83333%}.el-col-sm-offset-23{margin-left:95.83333%}.el-col-sm-pull-23{position:relative;right:95.83333%}.el-col-sm-push-23{position:relative;left:95.83333%}.el-col-sm-24{width:100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{display:none;width:0}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{width:4.16667%}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{width:8.33333%}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{width:12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{width:16.66667%}.el-col-md-offset-4{margin-left:16.66667%}.el-col-md-pull-4{position:relative;right:16.66667%}.el-col-md-push-4{position:relative;left:16.66667%}.el-col-md-5{width:20.83333%}.el-col-md-offset-5{margin-left:20.83333%}.el-col-md-pull-5{position:relative;right:20.83333%}.el-col-md-push-5{position:relative;left:20.83333%}.el-col-md-6{width:25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{width:29.16667%}.el-col-md-offset-7{margin-left:29.16667%}.el-col-md-pull-7{position:relative;right:29.16667%}.el-col-md-push-7{position:relative;left:29.16667%}.el-col-md-8{width:33.33333%}.el-col-md-offset-8{margin-left:33.33333%}.el-col-md-pull-8{position:relative;right:33.33333%}.el-col-md-push-8{position:relative;left:33.33333%}.el-col-md-9{width:37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{width:41.66667%}.el-col-md-offset-10{margin-left:41.66667%}.el-col-md-pull-10{position:relative;right:41.66667%}.el-col-md-push-10{position:relative;left:41.66667%}.el-col-md-11{width:45.83333%}.el-col-md-offset-11{margin-left:45.83333%}.el-col-md-pull-11{position:relative;right:45.83333%}.el-col-md-push-11{position:relative;left:45.83333%}.el-col-md-12{width:50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{width:54.16667%}.el-col-md-offset-13{margin-left:54.16667%}.el-col-md-pull-13{position:relative;right:54.16667%}.el-col-md-push-13{position:relative;left:54.16667%}.el-col-md-14{width:58.33333%}.el-col-md-offset-14{margin-left:58.33333%}.el-col-md-pull-14{position:relative;right:58.33333%}.el-col-md-push-14{position:relative;left:58.33333%}.el-col-md-15{width:62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{width:66.66667%}.el-col-md-offset-16{margin-left:66.66667%}.el-col-md-pull-16{position:relative;right:66.66667%}.el-col-md-push-16{position:relative;left:66.66667%}.el-col-md-17{width:70.83333%}.el-col-md-offset-17{margin-left:70.83333%}.el-col-md-pull-17{position:relative;right:70.83333%}.el-col-md-push-17{position:relative;left:70.83333%}.el-col-md-18{width:75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{width:79.16667%}.el-col-md-offset-19{margin-left:79.16667%}.el-col-md-pull-19{position:relative;right:79.16667%}.el-col-md-push-19{position:relative;left:79.16667%}.el-col-md-20{width:83.33333%}.el-col-md-offset-20{margin-left:83.33333%}.el-col-md-pull-20{position:relative;right:83.33333%}.el-col-md-push-20{position:relative;left:83.33333%}.el-col-md-21{width:87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{width:91.66667%}.el-col-md-offset-22{margin-left:91.66667%}.el-col-md-pull-22{position:relative;right:91.66667%}.el-col-md-push-22{position:relative;left:91.66667%}.el-col-md-23{width:95.83333%}.el-col-md-offset-23{margin-left:95.83333%}.el-col-md-pull-23{position:relative;right:95.83333%}.el-col-md-push-23{position:relative;left:95.83333%}.el-col-md-24{width:100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{display:none;width:0}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{width:4.16667%}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{width:8.33333%}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{width:12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{width:16.66667%}.el-col-lg-offset-4{margin-left:16.66667%}.el-col-lg-pull-4{position:relative;right:16.66667%}.el-col-lg-push-4{position:relative;left:16.66667%}.el-col-lg-5{width:20.83333%}.el-col-lg-offset-5{margin-left:20.83333%}.el-col-lg-pull-5{position:relative;right:20.83333%}.el-col-lg-push-5{position:relative;left:20.83333%}.el-col-lg-6{width:25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{width:29.16667%}.el-col-lg-offset-7{margin-left:29.16667%}.el-col-lg-pull-7{position:relative;right:29.16667%}.el-col-lg-push-7{position:relative;left:29.16667%}.el-col-lg-8{width:33.33333%}.el-col-lg-offset-8{margin-left:33.33333%}.el-col-lg-pull-8{position:relative;right:33.33333%}.el-col-lg-push-8{position:relative;left:33.33333%}.el-col-lg-9{width:37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{width:41.66667%}.el-col-lg-offset-10{margin-left:41.66667%}.el-col-lg-pull-10{position:relative;right:41.66667%}.el-col-lg-push-10{position:relative;left:41.66667%}.el-col-lg-11{width:45.83333%}.el-col-lg-offset-11{margin-left:45.83333%}.el-col-lg-pull-11{position:relative;right:45.83333%}.el-col-lg-push-11{position:relative;left:45.83333%}.el-col-lg-12{width:50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{width:54.16667%}.el-col-lg-offset-13{margin-left:54.16667%}.el-col-lg-pull-13{position:relative;right:54.16667%}.el-col-lg-push-13{position:relative;left:54.16667%}.el-col-lg-14{width:58.33333%}.el-col-lg-offset-14{margin-left:58.33333%}.el-col-lg-pull-14{position:relative;right:58.33333%}.el-col-lg-push-14{position:relative;left:58.33333%}.el-col-lg-15{width:62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{width:66.66667%}.el-col-lg-offset-16{margin-left:66.66667%}.el-col-lg-pull-16{position:relative;right:66.66667%}.el-col-lg-push-16{position:relative;left:66.66667%}.el-col-lg-17{width:70.83333%}.el-col-lg-offset-17{margin-left:70.83333%}.el-col-lg-pull-17{position:relative;right:70.83333%}.el-col-lg-push-17{position:relative;left:70.83333%}.el-col-lg-18{width:75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{width:79.16667%}.el-col-lg-offset-19{margin-left:79.16667%}.el-col-lg-pull-19{position:relative;right:79.16667%}.el-col-lg-push-19{position:relative;left:79.16667%}.el-col-lg-20{width:83.33333%}.el-col-lg-offset-20{margin-left:83.33333%}.el-col-lg-pull-20{position:relative;right:83.33333%}.el-col-lg-push-20{position:relative;left:83.33333%}.el-col-lg-21{width:87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{width:91.66667%}.el-col-lg-offset-22{margin-left:91.66667%}.el-col-lg-pull-22{position:relative;right:91.66667%}.el-col-lg-push-22{position:relative;left:91.66667%}.el-col-lg-23{width:95.83333%}.el-col-lg-offset-23{margin-left:95.83333%}.el-col-lg-pull-23{position:relative;right:95.83333%}.el-col-lg-push-23{position:relative;left:95.83333%}.el-col-lg-24{width:100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{display:none;width:0}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{width:4.16667%}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{width:8.33333%}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{width:12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{width:16.66667%}.el-col-xl-offset-4{margin-left:16.66667%}.el-col-xl-pull-4{position:relative;right:16.66667%}.el-col-xl-push-4{position:relative;left:16.66667%}.el-col-xl-5{width:20.83333%}.el-col-xl-offset-5{margin-left:20.83333%}.el-col-xl-pull-5{position:relative;right:20.83333%}.el-col-xl-push-5{position:relative;left:20.83333%}.el-col-xl-6{width:25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{width:29.16667%}.el-col-xl-offset-7{margin-left:29.16667%}.el-col-xl-pull-7{position:relative;right:29.16667%}.el-col-xl-push-7{position:relative;left:29.16667%}.el-col-xl-8{width:33.33333%}.el-col-xl-offset-8{margin-left:33.33333%}.el-col-xl-pull-8{position:relative;right:33.33333%}.el-col-xl-push-8{position:relative;left:33.33333%}.el-col-xl-9{width:37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{width:41.66667%}.el-col-xl-offset-10{margin-left:41.66667%}.el-col-xl-pull-10{position:relative;right:41.66667%}.el-col-xl-push-10{position:relative;left:41.66667%}.el-col-xl-11{width:45.83333%}.el-col-xl-offset-11{margin-left:45.83333%}.el-col-xl-pull-11{position:relative;right:45.83333%}.el-col-xl-push-11{position:relative;left:45.83333%}.el-col-xl-12{width:50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{width:54.16667%}.el-col-xl-offset-13{margin-left:54.16667%}.el-col-xl-pull-13{position:relative;right:54.16667%}.el-col-xl-push-13{position:relative;left:54.16667%}.el-col-xl-14{width:58.33333%}.el-col-xl-offset-14{margin-left:58.33333%}.el-col-xl-pull-14{position:relative;right:58.33333%}.el-col-xl-push-14{position:relative;left:58.33333%}.el-col-xl-15{width:62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{width:66.66667%}.el-col-xl-offset-16{margin-left:66.66667%}.el-col-xl-pull-16{position:relative;right:66.66667%}.el-col-xl-push-16{position:relative;left:66.66667%}.el-col-xl-17{width:70.83333%}.el-col-xl-offset-17{margin-left:70.83333%}.el-col-xl-pull-17{position:relative;right:70.83333%}.el-col-xl-push-17{position:relative;left:70.83333%}.el-col-xl-18{width:75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{width:79.16667%}.el-col-xl-offset-19{margin-left:79.16667%}.el-col-xl-pull-19{position:relative;right:79.16667%}.el-col-xl-push-19{position:relative;left:79.16667%}.el-col-xl-20{width:83.33333%}.el-col-xl-offset-20{margin-left:83.33333%}.el-col-xl-pull-20{position:relative;right:83.33333%}.el-col-xl-push-20{position:relative;left:83.33333%}.el-col-xl-21{width:87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{width:91.66667%}.el-col-xl-offset-22{margin-left:91.66667%}.el-col-xl-pull-22{position:relative;right:91.66667%}.el-col-xl-push-22{position:relative;left:91.66667%}.el-col-xl-23{width:95.83333%}.el-col-xl-offset-23{margin-left:95.83333%}.el-col-xl-pull-23{position:relative;right:95.83333%}.el-col-xl-push-23{position:relative;left:95.83333%}.el-col-xl-24{width:100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}@-webkit-keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}.el-upload{display:inline-block;text-align:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:#606266;margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;opacity:0;filter:alpha(opacity=0)}.el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;line-height:146px;vertical-align:top}.el-upload--picture-card i{font-size:28px;color:#8c939d}.el-upload--picture-card:hover,.el-upload:focus{border-color:#409eff;color:#409eff}.el-upload:focus .el-upload-dragger{border-color:#409eff}.el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:360px;height:180px;text-align:center;position:relative;overflow:hidden}.el-upload-dragger .el-icon-upload{font-size:67px;color:#c0c4cc;margin:40px 0 16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:1px solid #dcdfe6;margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:#606266;font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:#409eff;font-style:normal}.el-upload-dragger:hover{border-color:#409eff}.el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #409eff}.el-upload-list{margin:0;padding:0;list-style:none}.el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#606266;line-height:1.8;margin-top:5px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item:first-child{margin-top:10px}.el-upload-list__item .el-icon-upload-success{color:#67c23a}.el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#606266}.el-upload-list__item .el-icon-close:hover{opacity:1}.el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:#409eff}.el-upload-list__item:hover{background-color:#f5f7fa}.el-upload-list__item:hover .el-icon-close{display:inline-block}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#409eff;cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip{display:inline-block}.el-upload-list__item.is-success:active .el-icon-close-tip,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip{display:none}.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.el-upload-list__item-name{color:#606266;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#909399;line-height:inherit}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#606266;display:none}.el-upload-list__item-delete:hover{color:#409eff}.el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.el-upload-list--picture-card .el-upload-list__item .el-icon-check,.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon-close,.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.el-upload-list--picture-card .el-upload-list__item-actions:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.el-upload-list--picture .el-upload-list__item .el-icon-check,.el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px;background-color:#fff}.el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover:after{display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#fff;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);margin-top:60px}.el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#fff;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#303133}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress-bar,.el-progress-bar__inner:after,.el-progress-bar__innerText,.el-spinner{display:inline-block;vertical-align:middle}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67c23a}.el-progress.is-success .el-progress__text{color:#67c23a}.el-progress.is-warning .el-progress-bar__inner{background-color:#e6a23c}.el-progress.is-warning .el-progress__text{color:#e6a23c}.el-progress.is-exception .el-progress-bar__inner{background-color:#f56c6c}.el-progress.is-exception .el-progress__text{color:#f56c6c}.el-progress-bar{padding-right:50px;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#ebeef5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#409eff;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-card,.el-message{border-radius:4px;overflow:hidden}.el-progress-bar__inner:after{height:100%}.el-progress-bar__innerText{color:#fff;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-width:1px;border-style:solid;border-color:#ebeef5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,transform .4s,top .4s;transition:opacity .3s,transform .4s,top .4s,-webkit-transform .4s;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67c23a}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#e6a23c}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#f56c6c}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#c0c4cc;font-size:16px}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67c23a}.el-message .el-icon-error{color:#f56c6c}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#e6a23c}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{background-color:#f56c6c;border-radius:10px;color:#fff;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #fff}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#409eff}.el-badge__content--success{background-color:#67c23a}.el-badge__content--warning{background-color:#e6a23c}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#f56c6c}.el-card{border:1px solid #ebeef5;background-color:#fff;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__body{padding:20px}.el-rate{height:20px;line-height:1}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#c0c4cc;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-step.is-vertical,.el-steps{display:-webkit-box;display:-ms-flexbox}.el-rate__text{font-size:14px;vertical-align:middle}.el-steps{display:-webkit-box;display:-ms-flexbox;display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#f5f7fa}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto!important;flex-basis:auto!important;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:#303133;border-color:#303133}.el-step__head.is-wait{color:#c0c4cc;border-color:#c0c4cc}.el-step__head.is-success{color:#67c23a;border-color:#67c23a}.el-step__head.is-error{color:#f56c6c;border-color:#f56c6c}.el-step__head.is-finish{color:#409eff;border-color:#409eff}.el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:24px;height:24px;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;-webkit-transition:.15s ease-out;transition:.15s ease-out}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{display:inline-block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:#c0c4cc}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:#303133}.el-step__title.is-wait{color:#c0c4cc}.el-step__title.is-success{color:#67c23a}.el-step__title.is-error{color:#f56c6c}.el-step__title.is-finish{color:#409eff}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:#303133}.el-step__description.is-wait{color:#c0c4cc}.el-step__description.is-success{color:#67c23a}.el-step__description.is-error{color:#f56c6c}.el-step__description.is-finish{color:#409eff}.el-step.is-horizontal{display:inline-block}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:-webkit-box;display:-ms-flexbox;display:flex}.el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-step.is-simple .el-step__arrow:after,.el-step.is-simple .el-step__arrow:before{content:"";display:inline-block;position:absolute;height:15px;width:1px;background:#c0c4cc}.el-step.is-simple .el-step__arrow:before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.el-step.is-simple .el-step__arrow:after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-carousel{position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#fff;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:2}.el-carousel__indicators--horizontal{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#c0c4cc;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:12px 4px}.el-carousel__indicator--vertical{padding:4px 12px}.el-carousel__indicator--vertical .el-carousel__button{width:2px;height:15px}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#fff;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.el-carousel__item,.el-carousel__mask{height:100%;top:0;left:0;position:absolute}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item--card,.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#fff;opacity:.24;-webkit-transition:.2s;transition:.2s}.el-fade-in-enter,.el-fade-in-leave-active,.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active,.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active,.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-enter-active,.el-fade-in-leave-active,.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1);transform:scale(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45);transform:scale(.45)}.collapse-transition{-webkit-transition:height .3s ease-in-out,padding-top .3s ease-in-out,padding-bottom .3s ease-in-out;transition:height .3s ease-in-out,padding-top .3s ease-in-out,padding-bottom .3s ease-in-out}.horizontal-collapse-transition{-webkit-transition:width .3s ease-in-out,padding-left .3s ease-in-out,padding-right .3s ease-in-out;transition:width .3s ease-in-out,padding-left .3s ease-in-out,padding-right .3s ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.el-collapse{border-top:1px solid #ebeef5;border-bottom:1px solid #ebeef5}.el-collapse-item.is-disabled .el-collapse-item__header{color:#bbb;cursor:not-allowed}.el-collapse-item__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:48px;line-height:48px;background-color:#fff;color:#303133;cursor:pointer;border-bottom:1px solid #ebeef5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s;outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;transition:-webkit-transform .3s;-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-weight:300}.el-collapse-item__arrow.is-active{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:#409eff}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;background-color:#fff;overflow:hidden;box-sizing:border-box;border-bottom:1px solid #ebeef5}.el-cascader__tags,.el-collapse-item__wrap,.el-tag{-webkit-box-sizing:border-box}.el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#303133;line-height:1.769230769230769}.el-collapse-item:last-child{margin-bottom:-1px}.el-popper .popper__arrow,.el-popper .popper__arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0,0,0,.03));filter:drop-shadow(0 2px 12px rgba(0,0,0,.03))}.el-popper .popper__arrow:after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#ebeef5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow:after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#ebeef5}.el-popper[x-placement^=bottom] .popper__arrow:after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#ebeef5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow:after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#ebeef5}.el-popper[x-placement^=left] .popper__arrow:after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.el-tag{background-color:#ecf5ff;border-color:#d9ecff;display:inline-block;height:32px;padding:0 10px;line-height:30px;font-size:12px;color:#409eff;border-width:1px;border-style:solid;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap}.el-tag.is-hit{border-color:#409eff}.el-tag .el-tag__close{color:#409eff}.el-tag .el-tag__close:hover{color:#fff;background-color:#409eff}.el-tag.el-tag--info{background-color:#f4f4f5;border-color:#e9e9eb;color:#909399}.el-tag.el-tag--info.is-hit{border-color:#909399}.el-tag.el-tag--info .el-tag__close{color:#909399}.el-tag.el-tag--info .el-tag__close:hover{color:#fff;background-color:#909399}.el-tag.el-tag--success{background-color:#f0f9eb;border-color:#e1f3d8;color:#67c23a}.el-tag.el-tag--success.is-hit{border-color:#67c23a}.el-tag.el-tag--success .el-tag__close{color:#67c23a}.el-tag.el-tag--success .el-tag__close:hover{color:#fff;background-color:#67c23a}.el-tag.el-tag--warning{background-color:#fdf6ec;border-color:#faecd8;color:#e6a23c}.el-tag.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#e6a23c}.el-tag.el-tag--danger{background-color:#fef0f0;border-color:#fde2e2;color:#f56c6c}.el-tag.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f56c6c}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;vertical-align:middle;top:-1px;right:-5px}.el-tag .el-icon-close:before{display:block}.el-tag--dark{background-color:#409eff;color:#fff}.el-tag--dark,.el-tag--dark.is-hit{border-color:#409eff}.el-tag--dark .el-tag__close{color:#fff}.el-tag--dark .el-tag__close:hover{color:#fff;background-color:#66b1ff}.el-tag--dark.el-tag--info{background-color:#909399;border-color:#909399;color:#fff}.el-tag--dark.el-tag--info.is-hit{border-color:#909399}.el-tag--dark.el-tag--info .el-tag__close{color:#fff}.el-tag--dark.el-tag--info .el-tag__close:hover{color:#fff;background-color:#a6a9ad}.el-tag--dark.el-tag--success{background-color:#67c23a;border-color:#67c23a;color:#fff}.el-tag--dark.el-tag--success.is-hit{border-color:#67c23a}.el-tag--dark.el-tag--success .el-tag__close{color:#fff}.el-tag--dark.el-tag--success .el-tag__close:hover{color:#fff;background-color:#85ce61}.el-tag--dark.el-tag--warning{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.el-tag--dark.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag--dark.el-tag--warning .el-tag__close{color:#fff}.el-tag--dark.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#ebb563}.el-tag--dark.el-tag--danger{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.el-tag--dark.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag--dark.el-tag--danger .el-tag__close{color:#fff}.el-tag--dark.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f78989}.el-tag--plain{background-color:#fff;border-color:#b3d8ff;color:#409eff}.el-tag--plain.is-hit{border-color:#409eff}.el-tag--plain .el-tag__close{color:#409eff}.el-tag--plain .el-tag__close:hover{color:#fff;background-color:#409eff}.el-tag--plain.el-tag--info{background-color:#fff;border-color:#d3d4d6;color:#909399}.el-tag--plain.el-tag--info.is-hit{border-color:#909399}.el-tag--plain.el-tag--info .el-tag__close{color:#909399}.el-tag--plain.el-tag--info .el-tag__close:hover{color:#fff;background-color:#909399}.el-tag--plain.el-tag--success{background-color:#fff;border-color:#c2e7b0;color:#67c23a}.el-tag--plain.el-tag--success.is-hit{border-color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close{color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close:hover{color:#fff;background-color:#67c23a}.el-tag--plain.el-tag--warning{background-color:#fff;border-color:#f5dab1;color:#e6a23c}.el-tag--plain.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#e6a23c}.el-tag--plain.el-tag--danger{background-color:#fff;border-color:#fbc4c4;color:#f56c6c}.el-tag--plain.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f56c6c}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.el-cascader{display:inline-block;position:relative;font-size:14px;line-height:40px}.el-cascader:not(.is-disabled):hover .el-input__inner{cursor:pointer;border-color:#c0c4cc}.el-cascader .el-input .el-input__inner:focus,.el-cascader .el-input.is-focus .el-input__inner{border-color:#409eff}.el-cascader .el-input{cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis}.el-cascader .el-input .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.el-cascader .el-input .el-icon-arrow-down.is-reverse{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.el-cascader .el-input .el-icon-circle-close:hover{color:#909399}.el-cascader--medium{font-size:14px;line-height:36px}.el-cascader--small{font-size:13px;line-height:32px}.el-cascader--mini{font-size:12px;line-height:28px}.el-cascader.is-disabled .el-cascader__label{z-index:2;color:#c0c4cc}.el-cascader__dropdown{margin:5px 0;font-size:14px;background:#fff;border:1px solid #e4e7ed;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:normal;text-align:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-cascader__tags .el-tag{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:#f0f2f5}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{-webkit-box-flex:0;-ms-flex:none;flex:none;background-color:#c0c4cc;color:#fff}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:#909399}.el-cascader__suggestion-panel{border-radius:4px}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:14px;color:#606266;text-align:center}.el-cascader__suggestion-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:#f5f7fa}.el-cascader__suggestion-item.is-checked{color:#409eff;font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:#c0c4cc}.el-cascader__search-input{-webkit-box-flex:1;-ms-flex:1;flex:1;height:24px;min-width:60px;margin:2px 0 2px 15px;padding:0;color:#606266;border:none;outline:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-cascader__search-input::-webkit-input-placeholder{color:#c0c4cc}.el-cascader__search-input:-ms-input-placeholder{color:#c0c4cc}.el-cascader__search-input::-ms-input-placeholder{color:#c0c4cc}.el-cascader__search-input::-moz-placeholder{color:#c0c4cc}.el-cascader__search-input::placeholder{color:#c0c4cc}.el-color-predefine{font-size:12px;margin-top:8px;width:280px}.el-color-predefine,.el-color-predefine__colors{display:-webkit-box;display:-ms-flexbox;display:flex}.el-color-predefine__colors{-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{-webkit-box-shadow:0 0 3px 2px #409eff;box-shadow:0 0 3px 2px #409eff}.el-color-predefine__color-selector>div{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,color-stop(0,red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,color-stop(0,red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(180deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(hsla(0,0%,100%,0)));background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(transparent));background:linear-gradient(0deg,#000,transparent)}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,color-stop(0,hsla(0,0%,100%,0)),to(#fff));background:linear-gradient(90deg,hsla(0,0%,100%,0) 0,#fff);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,color-stop(0,hsla(0,0%,100%,0)),to(#fff));background:linear-gradient(180deg,hsla(0,0%,100%,0) 0,#fff)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper:after{content:"";display:table;clear:both}.el-color-dropdown__btns{margin-top:6px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.el-color-dropdown__btn:hover{color:#409eff;border-color:#409eff}.el-color-dropdown__link-btn{cursor:pointer;color:#409eff;text-decoration:none;padding:15px;font-size:12px}.el-color-dropdown__link-btn:hover{color:tint(#409eff,20%)}.el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--medium{height:36px}.el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.el-color-picker--small{height:32px}.el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker--mini{height:28px}.el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.el-color-picker--mini .el-color-picker__empty,.el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:hsla(0,0%,100%,.7)}.el-color-picker__trigger{display:inline-block;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;cursor:pointer}.el-color-picker__color,.el-color-picker__trigger{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.el-color-picker__color{display:block;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.el-color-picker__empty,.el-color-picker__icon{top:50%;left:50%;font-size:12px;position:absolute}.el-color-picker__empty{color:#999}.el-color-picker__empty,.el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.el-color-picker__icon{display:inline-block;width:100%;color:#fff;text-align:center}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;-webkit-box-sizing:content-box;box-sizing:content-box;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-textarea{position:relative;display:inline-block;width:100%;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#fff;background-image:none;border:1px solid #dcdfe6;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#c0c4cc}.el-textarea__inner:-ms-input-placeholder{color:#c0c4cc}.el-textarea__inner::-ms-input-placeholder{color:#c0c4cc}.el-textarea__inner::-moz-placeholder{color:#c0c4cc}.el-textarea__inner::placeholder{color:#c0c4cc}.el-textarea__inner:hover{border-color:#c0c4cc}.el-textarea__inner:focus{outline:0;border-color:#409eff}.el-textarea .el-input__count{color:#909399;background:#fff;position:absolute;font-size:12px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::-moz-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#c0c4cc}.el-textarea.is-exceed .el-textarea__inner{border-color:#f56c6c}.el-textarea.is-exceed .el-input__count{color:#f56c6c}.el-input{position:relative;font-size:14px;display:inline-block;width:100%}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner,.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#c0c4cc;font-size:14px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#909399;font-size:12px}.el-input .el-input__count .el-input__count-inner{background:#fff;line-height:normal;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;display:inline-block;font-size:inherit;height:40px;line-height:40px;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.el-input__prefix,.el-input__suffix{position:absolute;top:0;-webkit-transition:all .3s;height:100%;color:#c0c4cc;text-align:center}.el-input__inner::-ms-reveal{display:none}.el-input__inner::-webkit-input-placeholder{color:#c0c4cc}.el-input__inner:-ms-input-placeholder{color:#c0c4cc}.el-input__inner::-ms-input-placeholder{color:#c0c4cc}.el-input__inner::-moz-placeholder{color:#c0c4cc}.el-input__inner::placeholder{color:#c0c4cc}.el-input__inner:hover{border-color:#c0c4cc}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409eff;outline:0}.el-input__suffix{right:5px;-webkit-transition:all .3s;transition:all .3s}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{left:5px}.el-input__icon,.el-input__prefix{-webkit-transition:all .3s;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;line-height:40px}.el-input__icon:after{content:"";height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::-moz-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-link,.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-input.is-exceed .el-input__inner{border-color:#f56c6c}.el-input.is-exceed .el-input__suffix .el-input__count{color:#f56c6c}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#f5f7fa;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #dcdfe6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--prepend .el-input__inner,.el-input-group__append{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input__inner::-ms-clear{display:none;width:0;height:0}.el-transfer{font-size:14px}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#fff;background-color:#409eff;font-size:0}.el-transfer-panel__item+.el-transfer-panel__item,.el-transfer__button [class*=el-icon-]+span{margin-left:0}.el-transfer__button.is-with-texts{border-radius:4px}.el-transfer__button.is-disabled,.el-transfer__button.is-disabled:hover{border:1px solid #dcdfe6;background-color:#f5f7fa;color:#c0c4cc}.el-transfer__button:first-child{margin-bottom:10px}.el-transfer__button:nth-child(2){margin:0}.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer-panel{border:1px solid #ebeef5;border-radius:4px;overflow:hidden;background:#fff;display:inline-block;vertical-align:middle;width:200px;max-height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:246px}.el-transfer-panel__body.is-with-footer{padding-bottom:40px}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block!important}.el-transfer-panel__item.el-checkbox{color:#606266}.el-transfer-panel__item:hover{color:#409eff}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.el-transfer-panel__filter .el-input__icon{margin-left:5px}.el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#f5f7fa;margin:0;padding-left:15px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#303133;font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#909399;font-size:12px;font-weight:400}.el-divider__text,.el-link{font-weight:500;font-size:14px}.el-transfer-panel .el-transfer-panel__footer{height:40px;background:#fff;margin:0;padding:0;border-top:1px solid #ebeef5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.el-transfer-panel .el-transfer-panel__footer:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-container,.el-timeline-item__node{display:-webkit-box;display:-ms-flexbox}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#606266}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#909399;text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner:after{height:6px;width:3px;left:4px}.el-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;box-sizing:border-box;min-width:0}.el-aside,.el-container,.el-header{-webkit-box-sizing:border-box}.el-container.is-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.el-header{padding:0 20px}.el-aside,.el-header{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-aside{overflow:auto}.el-footer,.el-main{-webkit-box-sizing:border-box}.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;padding:20px}.el-footer,.el-main{-webkit-box-sizing:border-box;box-sizing:border-box}.el-footer{padding:0 20px;-ms-flex-negative:0;flex-shrink:0}.el-timeline{margin:0;font-size:14px;list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid #e4e7ed}.el-timeline-item__icon{color:#fff;font-size:13px}.el-timeline-item__node{position:absolute;background-color:#e4e7ed;border-radius:50%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image__error,.el-timeline-item__dot{display:-webkit-box;display:-ms-flexbox}.el-timeline-item__node--normal{left:-1px;width:12px;height:12px}.el-timeline-item__node--large{left:-2px;width:14px;height:14px}.el-timeline-item__node--primary{background-color:#409eff}.el-timeline-item__node--success{background-color:#67c23a}.el-timeline-item__node--warning{background-color:#e6a23c}.el-timeline-item__node--danger{background-color:#f56c6c}.el-timeline-item__node--info{background-color:#909399}.el-timeline-item__dot{position:absolute;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-timeline-item__content{color:#303133}.el-timeline-item__timestamp{color:#909399;line-height:1;font-size:13px}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;padding:0}.el-drawer,.el-empty,.el-result{-webkit-box-orient:vertical;-webkit-box-direction:normal}.el-link.is-underline:hover:after{content:"";position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid #409eff}.el-link.el-link--default:after,.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:#409eff}.el-link.is-disabled{cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default{color:#606266}.el-link.el-link--default:hover{color:#409eff}.el-link.el-link--default.is-disabled{color:#c0c4cc}.el-link.el-link--primary{color:#409eff}.el-link.el-link--primary:hover{color:#66b1ff}.el-link.el-link--primary.is-disabled{color:#a0cfff}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:#f56c6c}.el-link.el-link--danger{color:#f56c6c}.el-link.el-link--danger:hover{color:#f78989}.el-link.el-link--danger.is-disabled{color:#fab6b6}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:#67c23a}.el-link.el-link--success{color:#67c23a}.el-link.el-link--success:hover{color:#85ce61}.el-link.el-link--success.is-disabled{color:#b3e19d}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:#e6a23c}.el-link.el-link--warning{color:#e6a23c}.el-link.el-link--warning:hover{color:#ebb563}.el-link.el-link--warning.is-disabled{color:#f3d19e}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:#909399}.el-link.el-link--info{color:#909399}.el-link.el-link--info:hover{color:#a6a9ad}.el-link.el-link--info.is-disabled{color:#c8c9cc}.el-divider{background-color:#dcdfe6;position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative}.el-divider__text{position:absolute;background-color:#fff;padding:0 20px;color:#303133}.el-image__error,.el-image__placeholder{background:#f5f7fa}.el-divider__text.is-left{left:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-divider__text.is-center{left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image__error,.el-image__inner,.el-image__placeholder{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top}.el-image__inner--center{position:relative;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block}.el-image__error{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:14px;color:#c0c4cc;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:50%;opacity:.8;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;user-select:none}.el-button,.el-checkbox,.el-image-viewer__btn{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:24px;color:#fff;background-color:#606266}.el-image-viewer__canvas{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image-viewer__actions{left:50%;bottom:30px;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:282px;height:44px;padding:0 23px;background-color:#606266;border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around}.el-image-viewer__next,.el-image-viewer__prev{top:50%;width:44px;height:44px;font-size:24px;color:#fff;background-color:#606266;border-color:#fff}.el-image-viewer__prev{left:40px}.el-image-viewer__next,.el-image-viewer__prev{-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image-viewer__next{right:40px;text-indent:2px}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in .3s;animation:viewer-fade-in .3s}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out .3s;animation:viewer-fade-out .3s}@-webkit-keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button{margin-left:10px}.el-button:focus,.el-button:hover{color:#409eff;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#fff;border-color:#409eff;color:#409eff}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:#fff;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#ebeef5;color:#c0c4cc}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:"";position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:hsla(0,0%,100%,.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#fff;background-color:#409eff;border-color:#409eff}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#fff}.el-button--primary.is-active,.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#fff;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409eff;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409eff;border-color:#409eff;color:#fff}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#fff;background-color:#67c23a;border-color:#67c23a}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#fff}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#fff}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#fff;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67c23a;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67c23a;border-color:#67c23a;color:#fff}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#fff;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#fff;background-color:#e6a23c;border-color:#e6a23c}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#fff}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#fff}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#fff;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#e6a23c;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#e6a23c;border-color:#e6a23c;color:#fff}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#fff;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#fff}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#fff}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#fff;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#f56c6c;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#f56c6c;border-color:#f56c6c;color:#fff}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#fff;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#fff;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#fff}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#fff}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#fff;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#fff}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#fff;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--text,.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover,.el-button--text:active{border-color:transparent}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--mini,.el-button--small{font-size:12px;border-radius:3px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small,.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini.is-circle{padding:7px}.el-button--text{color:#409eff;background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;background-color:transparent}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group:after,.el-button-group:before{display:table;content:""}.el-button-group:after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button.is-active,.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--primary:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--primary:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--success:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--success:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--warning:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--warning:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--danger:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--danger:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--info:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--info:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-calendar{background-color:#fff}.el-calendar__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:12px 20px;border-bottom:1px solid #ebeef5}.el-backtop,.el-page-header{display:-webkit-box;display:-ms-flexbox}.el-calendar__title{color:#000;-ms-flex-item-align:center;align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:#606266;font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:#c0c4cc}.el-backtop,.el-calendar-table td.is-today{color:#409eff}.el-calendar-table td{border-bottom:1px solid #ebeef5;border-right:1px solid #ebeef5;vertical-align:top;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}.el-calendar-table td.is-selected{background-color:#f2f8fe}.el-calendar-table tr:first-child td{border-top:1px solid #ebeef5}.el-calendar-table tr td:first-child{border-left:1px solid #ebeef5}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px;height:85px}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:#f2f8fe}.el-backtop{position:fixed;background-color:#fff;width:40px;height:40px;border-radius:50%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:20px;-webkit-box-shadow:0 0 6px rgba(0,0,0,.12);box-shadow:0 0 6px rgba(0,0,0,.12);cursor:pointer;z-index:5}.el-backtop:hover{background-color:#f2f6fc}.el-page-header{line-height:24px}.el-page-header,.el-page-header__left{display:-webkit-box;display:-ms-flexbox;display:flex}.el-page-header__left{cursor:pointer;margin-right:40px;position:relative}.el-page-header__left:after{content:"";position:absolute;width:1px;height:16px;right:-20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#dcdfe6}.el-checkbox,.el-checkbox__input{display:inline-block;position:relative;white-space:nowrap}.el-page-header__left .el-icon-back{font-size:18px;margin-right:6px;-ms-flex-item-align:center;align-self:center}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:#303133}.el-checkbox{color:#606266;font-weight:500;font-size:14px;cursor:pointer;user-select:none;margin-right:30px}.el-checkbox,.el-checkbox-button__inner,.el-empty__image img,.el-radio{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:normal;height:40px}.el-checkbox.is-bordered.is-checked{border-color:#409eff}.el-checkbox.is-bordered.is-disabled{border-color:#ebeef5;cursor:not-allowed}.el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px;height:36px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:5px 15px 5px 10px;border-radius:3px;height:32px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox.is-bordered.el-checkbox--mini{padding:3px 15px 3px 10px;border-radius:3px;height:28px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox__input{cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#dcdfe6;cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{cursor:not-allowed;border-color:#c0c4cc}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#f2f6fc;border-color:#dcdfe6}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:#c0c4cc}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#f2f6fc;border-color:#dcdfe6}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:#c0c4cc;border-color:#c0c4cc}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#409eff;border-color:#409eff}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:#c0c4cc;cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner:after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:#409eff}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:#409eff}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{content:"";position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:1px solid #dcdfe6;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:#409eff}.el-checkbox__inner:after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s ease-in .05s;transition:-webkit-transform .15s ease-in .05s;transition:transform .15s ease-in .05s;transition:transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;-webkit-transform-origin:center;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox-button,.el-checkbox-button__inner{display:inline-block;position:relative}.el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.el-checkbox:last-of-type{margin-right:0}.el-checkbox-button__inner{line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #dcdfe6;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-checkbox-button__inner.is-round{padding:12px 20px}.el-checkbox-button__inner:hover{color:#409eff}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-radio,.el-radio__input{line-height:1;white-space:nowrap;outline:0}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#409eff;border-color:#409eff;-webkit-box-shadow:-1px 0 0 0 #8cc5ff;box-shadow:-1px 0 0 0 #8cc5ff}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:#409eff}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:#ebeef5}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#409eff}.el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.el-checkbox-group{font-size:0}.el-radio,.el-radio--medium.is-bordered .el-radio__label{font-size:14px}.el-radio{color:#606266;font-weight:500;cursor:pointer;margin-right:30px}.el-cascader-node>.el-radio,.el-radio:last-child{margin-right:0}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-radio.is-bordered.is-checked{border-color:#409eff}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#ebeef5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#f5f7fa;border-color:#e4e7ed}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio__input{cursor:pointer;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner:after{cursor:not-allowed;background-color:#f5f7fa}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:#c0c4cc}.el-radio__input.is-disabled+span.el-radio__label{color:#c0c4cc;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#409eff;background:#409eff}.el-radio__input.is-checked .el-radio__inner:after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#409eff}.el-radio__input.is-focus .el-radio__inner{border-color:#409eff}.el-radio__inner{border:1px solid #dcdfe6;border-radius:100%;width:14px;height:14px;background-color:#fff;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box}.el-radio__inner:hover{border-color:#409eff}.el-radio__inner:after{width:4px;height:4px;border-radius:100%;background-color:#fff;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #409eff;box-shadow:0 0 2px 2px #409eff}.el-radio__label{font-size:14px;padding-left:10px}.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity .34s ease-out;transition:opacity .34s ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:background-color .3s;transition:background-color .3s}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity .12s ease-out;transition:opacity .12s ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-cascader-panel{display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:4px;font-size:14px}.el-cascader-panel.is-bordered{border:1px solid #e4e7ed;border-radius:4px}.el-cascader-menu{min-width:180px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;border-right:1px solid #e4e7ed}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu:last-child .el-cascader-node{padding-right:20px}.el-cascader-menu__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;-webkit-box-sizing:border-box;box-sizing:border-box}.el-avatar,.el-drawer{-webkit-box-sizing:border-box;overflow:hidden}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;color:#c0c4cc}.el-cascader-node{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:#606266}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:#409eff;font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:#f5f7fa}.el-cascader-node.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-avatar{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;color:#fff;background:#c0c4cc;width:40px;height:40px;line-height:40px;font-size:14px}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-drawer,.el-drawer__header{display:-webkit-box;display:-ms-flexbox}.el-empty__image img,.el-empty__image svg{vertical-align:top;height:100%;width:100%}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px}.el-drawer.ltr,.el-drawer.rtl,.el-drawer__container{top:0;bottom:0;height:100%}@-webkit-keyframes el-drawer-fade-in{0%{opacity:0}to{opacity:1}}@keyframes el-drawer-fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%);transform:translate(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%);transform:translate(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes rtl-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(100%);transform:translate(100%)}}@keyframes rtl-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(100%);transform:translate(100%)}}@-webkit-keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%);transform:translate(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%);transform:translate(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes ltr-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(-100%);transform:translate(-100%)}}@keyframes ltr-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(-100%);transform:translate(-100%)}}@-webkit-keyframes ttb-drawer-in{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ttb-drawer-in{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes ttb-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes ttb-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes btt-drawer-in{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes btt-drawer-in{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes btt-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes btt-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}.el-drawer{position:absolute;box-sizing:border-box;background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);outline:0}.el-drawer,.el-drawer__body>*,.el-empty{-webkit-box-sizing:border-box}.el-drawer.rtl{-webkit-animation:rtl-drawer-out .3s;animation:rtl-drawer-out .3s;right:0}.el-drawer__open .el-drawer.rtl{-webkit-animation:rtl-drawer-in .3s 1ms;animation:rtl-drawer-in .3s 1ms}.el-drawer.ltr{-webkit-animation:ltr-drawer-out .3s;animation:ltr-drawer-out .3s;left:0}.el-drawer__open .el-drawer.ltr{-webkit-animation:ltr-drawer-in .3s 1ms;animation:ltr-drawer-in .3s 1ms}.el-drawer.ttb{-webkit-animation:ttb-drawer-out .3s;animation:ttb-drawer-out .3s;top:0}.el-drawer__open .el-drawer.ttb{-webkit-animation:ttb-drawer-in .3s 1ms;animation:ttb-drawer-in .3s 1ms}.el-drawer.btt{-webkit-animation:btt-drawer-out .3s;animation:btt-drawer-out .3s;bottom:0}.el-drawer__open .el-drawer.btt{-webkit-animation:btt-drawer-in .3s 1ms;animation:btt-drawer-in .3s 1ms}.el-drawer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0}.el-drawer__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#72767b;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:32px;padding:20px 20px 0}.el-drawer__header>:first-child,.el-drawer__title{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-drawer__title{margin:0;line-height:inherit;font-size:1rem}.el-drawer__close-btn{border:none;cursor:pointer;font-size:20px;color:inherit;background-color:transparent}.el-drawer__body{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.el-drawer__body>*{-webkit-box-sizing:border-box;box-sizing:border-box}.el-drawer.btt,.el-drawer.ttb,.el-drawer__container{width:100%;left:0;right:0}.el-drawer__container{position:relative}.el-drawer-fade-enter-active{-webkit-animation:el-drawer-fade-in .3s;animation:el-drawer-fade-in .3s}.el-drawer-fade-leave-active{animation:el-drawer-fade-in .3s reverse}.el-popconfirm__main{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin:0}@-webkit-keyframes el-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}@keyframes el-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}.el-skeleton{width:100%}.el-skeleton__first-line,.el-skeleton__paragraph{height:16px;margin-top:16px;background:#f2f2f2}.el-skeleton.is-animated .el-skeleton__item{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#f2f2f2),color-stop(37%,#e6e6e6),color-stop(63%,#f2f2f2));background:linear-gradient(90deg,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);background-size:400% 100%;-webkit-animation:el-skeleton-loading 1.4s ease infinite;animation:el-skeleton-loading 1.4s ease infinite}.el-skeleton__item{background:#f2f2f2;display:inline-block;height:16px;border-radius:4px;width:100%}.el-empty,.el-skeleton__image{display:-webkit-box;display:-ms-flexbox}.el-skeleton__circle{border-radius:50%;width:36px;height:36px;line-height:36px}.el-skeleton__circle--lg{width:40px;height:40px;line-height:40px}.el-skeleton__circle--md{width:28px;height:28px;line-height:28px}.el-skeleton__button{height:40px;width:64px;border-radius:4px}.el-skeleton__p{width:100%}.el-skeleton__p.is-last{width:61%}.el-skeleton__p.is-first{width:33%}.el-skeleton__text{width:100%;height:13px}.el-skeleton__caption{height:12px}.el-skeleton__h1{height:20px}.el-skeleton__h3{height:18px}.el-skeleton__h5{height:16px}.el-skeleton__image{width:unset;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:0}.el-skeleton__image svg{fill:#dcdde0;width:22%;height:22%}.el-empty{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 0}.el-empty__image{width:160px}.el-empty__image img{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:contain;object-fit:contain}.el-empty__image svg{fill:#dcdde0}.el-empty__description{margin-top:20px}.el-empty__description p{margin:0;font-size:14px;color:#909399}.el-empty__bottom,.el-result__title{margin-top:20px}.el-descriptions{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:14px;color:#303133}.el-descriptions__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}.el-descriptions__title{font-size:16px;font-weight:700}.el-descriptions--mini,.el-descriptions--small{font-size:12px}.el-descriptions__body{color:#606266;background-color:#fff}.el-descriptions__body table{border-collapse:collapse;width:100%;table-layout:fixed}.el-descriptions__body table td,.el-descriptions__body table th{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;font-weight:400;line-height:1.5}.el-descriptions__body table td.is-left,.el-descriptions__body table th.is-left{text-align:left}.el-descriptions__body table td.is-center,.el-descriptions__body table th.is-center{text-align:center}.el-descriptions__body table td.is-right,.el-descriptions__body table th.is-right{text-align:right}.el-descriptions .is-bordered{table-layout:auto}.el-descriptions .is-bordered td,.el-descriptions .is-bordered th{border:1px solid #ebeef5;padding:12px 10px}.el-descriptions :not(.is-bordered) td,.el-descriptions :not(.is-bordered) th{padding-bottom:12px}.el-descriptions--medium.is-bordered td,.el-descriptions--medium.is-bordered th{padding:10px}.el-descriptions--medium:not(.is-bordered) td,.el-descriptions--medium:not(.is-bordered) th{padding-bottom:10px}.el-descriptions--small.is-bordered td,.el-descriptions--small.is-bordered th{padding:8px 10px}.el-descriptions--small:not(.is-bordered) td,.el-descriptions--small:not(.is-bordered) th{padding-bottom:8px}.el-descriptions--mini.is-bordered td,.el-descriptions--mini.is-bordered th{padding:6px 10px}.el-descriptions--mini:not(.is-bordered) td,.el-descriptions--mini:not(.is-bordered) th{padding-bottom:6px}.el-descriptions-item__container{display:-webkit-box;display:-ms-flexbox;display:flex}.el-descriptions-item__label.has-colon:after{content:":";position:relative;top:-.5px}.el-descriptions-item__label.is-bordered-label{font-weight:700;color:#909399;background:#fafafa}.el-descriptions-item__label:not(.is-bordered-label){margin-right:10px}.el-result{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 30px}.el-result__icon svg{width:64px;height:64px}.el-result__title p{margin:0;font-size:20px;color:#303133;line-height:1.3}.el-result__subtitle{margin-top:10px}.el-result__subtitle p{margin:0;font-size:14px;color:#606266;line-height:1.3}.el-result__extra{margin-top:30px}.el-result .icon-success{fill:#67c23a}.el-result .icon-error{fill:#f56c6c}.el-result .icon-info{fill:#909399}.el-result .icon-warning{fill:#e6a23c} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-libs.c716f4ea.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-libs.c716f4ea.css new file mode 100644 index 00000000..39af0b08 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-libs.c716f4ea.css @@ -0,0 +1 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;-webkit-box-shadow:0 0 10px #29d,0 0 5px #29d;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translateY(-4px);transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;-webkit-box-sizing:border-box;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:transparent}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:transparent}.cm-fat-cursor{caret-color:transparent}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;height:100%;outline:none;position:relative;z-index:0}.CodeMirror-sizer{position:relative;border-right:50px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none;outline:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-50px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-webkit-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:none} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/fonts/element-icons.535877f5.woff b/sop-admin/sop-code-gen/src/main/resources/static/static/fonts/element-icons.535877f5.woff new file mode 100644 index 00000000..02b9a253 Binary files /dev/null and b/sop-admin/sop-code-gen/src/main/resources/static/static/fonts/element-icons.535877f5.woff differ diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/fonts/element-icons.732389de.ttf b/sop-admin/sop-code-gen/src/main/resources/static/static/fonts/element-icons.732389de.ttf new file mode 100644 index 00000000..91b74de3 Binary files /dev/null and b/sop-admin/sop-code-gen/src/main/resources/static/static/fonts/element-icons.732389de.ttf differ diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/img/404.a57b6f31.png b/sop-admin/sop-code-gen/src/main/resources/static/static/img/404.a57b6f31.png new file mode 100644 index 00000000..3d8e2305 Binary files /dev/null and b/sop-admin/sop-code-gen/src/main/resources/static/static/img/404.a57b6f31.png differ diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/img/404_cloud.0f4bc32b.png b/sop-admin/sop-code-gen/src/main/resources/static/static/img/404_cloud.0f4bc32b.png new file mode 100644 index 00000000..c6281d09 Binary files /dev/null and b/sop-admin/sop-code-gen/src/main/resources/static/static/img/404_cloud.0f4bc32b.png differ diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/js/app.c7a9a8f2.js b/sop-admin/sop-code-gen/src/main/resources/static/static/js/app.c7a9a8f2.js new file mode 100644 index 00000000..0ddf5e54 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/js/app.c7a9a8f2.js @@ -0,0 +1 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["app"],{0:function(e,t,n){e.exports=n("56d7")},"0372":function(e,t,n){},"18f0":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-link",use:"icon-link-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"2a3d":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-password",use:"icon-password-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"30c3":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-example",use:"icon-example-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},3673:function(e,t,n){},"3ef9":function(e,t,n){},4181:function(e,t,n){},"47f1":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-table",use:"icon-table-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"4df5":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-eye",use:"icon-eye-usage",viewBox:"0 0 128 64",content:''});r.a.add(c);t["default"]=c},"51ff":function(e,t,n){var a={"./dashboard.svg":"f782","./example.svg":"30c3","./eye-open.svg":"d7ec","./eye.svg":"4df5","./form.svg":"eb1b","./link.svg":"18f0","./nested.svg":"dcf8","./password.svg":"2a3d","./table.svg":"47f1","./tree.svg":"93cd","./user.svg":"b3b5"};function i(e){var t=o(e);return n(t)}function o(e){var t=a[e];if(!(t+1)){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}return t}i.keys=function(){return Object.keys(a)},i.resolve=o,e.exports=i,i.id="51ff"},"56d7":function(e,t,n){"use strict";n.r(t);n("cadf"),n("551c"),n("f751"),n("097d");var a=n("2b0e"),i=(n("f5df"),n("5c96")),o=n.n(i),r=(n("0fae"),n("f0d9")),c=n.n(r),s=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"app"}},[n("router-view")],1)},u=[],l={name:"App"},d=l,h=n("2877"),m=Object(h["a"])(d,s,u,!1,null,null,null),f=m.exports,p=n("2f62"),v=(n("7f7f"),{sidebar:function(e){return e.app.sidebar},device:function(e){return e.app.device},token:function(e){return e.user.token},avatar:function(e){return e.user.avatar},name:function(e){return e.user.name}}),b=v,g=n("a78e"),w=n.n(g),x={sidebar:{opened:!w.a.get("sidebarStatus")||!!+w.a.get("sidebarStatus"),withoutAnimation:!1},device:"desktop"},y={TOGGLE_SIDEBAR:function(e){e.sidebar.opened=!e.sidebar.opened,e.sidebar.withoutAnimation=!1,e.sidebar.opened?w.a.set("sidebarStatus",1):w.a.set("sidebarStatus",0)},CLOSE_SIDEBAR:function(e,t){w.a.set("sidebarStatus",0),e.sidebar.opened=!1,e.sidebar.withoutAnimation=t},TOGGLE_DEVICE:function(e,t){e.device=t}},C={toggleSideBar:function(e){var t=e.commit;t("TOGGLE_SIDEBAR")},closeSideBar:function(e,t){var n=e.commit,a=t.withoutAnimation;n("CLOSE_SIDEBAR",a)},toggleDevice:function(e,t){var n=e.commit;n("TOGGLE_DEVICE",t)}},_={namespaced:!0,state:x,mutations:y,actions:C},k=n("83d6"),S=n.n(k),z=S.a.showSettings,B=S.a.fixedHeader,O=S.a.sidebarLogo,H={showSettings:z,fixedHeader:B,sidebarLogo:O},M={CHANGE_SETTING:function(e,t){var n=t.key,a=t.value;e.hasOwnProperty(n)&&(e[n]=a)}},T={changeSetting:function(e,t){var n=e.commit;n("CHANGE_SETTING",t)}},E={namespaced:!0,state:H,mutations:M,actions:T},$=n("bc3a"),L=n.n($),A="sop-admin-token";function V(){return w.a.get(A)}function j(e){return w.a.set(A,e)}function P(){return w.a.remove(A)}var I=L.a.create({baseURL:"",withCredentials:!0,timeout:5e3});I.interceptors.request.use((function(e){return xt.getters.token&&(e.headers["X-Token"]=V()),e}),(function(e){return console.log(e),Promise.reject(e)})),I.interceptors.response.use((function(e){var t=e.data;return 2e4!==t.code?(Object(i["Message"])({message:t.message||"error",type:"error",duration:5e3}),50008!==t.code&&50012!==t.code&&50014!==t.code||i["MessageBox"].confirm("You have been logged out, you can cancel to stay on this page, or log in again","Confirm logout",{confirmButtonText:"Re-Login",cancelButtonText:"Cancel",type:"warning"}).then((function(){xt.dispatch("user/resetToken").then((function(){location.reload()}))})),Promise.reject(t.message||"error")):t}),(function(e){return console.log("err"+e),Object(i["Message"])({message:e.message,type:"error",duration:5e3}),Promise.reject(e)}));var N=I;function D(e){return N({url:"/user/login",method:"post",data:e})}function q(e){return N({url:"/user/info",method:"get",params:{token:e}})}function R(){return N({url:"/user/logout",method:"post"})}var G=n("8c4f"),F=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"app-wrapper",class:e.classObj},["mobile"===e.device&&e.sidebar.opened?n("div",{staticClass:"drawer-bg",on:{click:e.handleClickOutside}}):e._e(),e._v(" "),n("sidebar",{staticClass:"sidebar-container"}),e._v(" "),n("div",{staticClass:"main-container"},[n("div",{class:{"fixed-header":e.fixedHeader}},[n("navbar")],1),e._v(" "),n("app-main")],1)],1)},U=[],K=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"navbar"},[n("hamburger",{staticClass:"hamburger-container",attrs:{"is-active":e.sidebar.opened},on:{toggleClick:e.toggleSideBar}}),e._v(" "),n("breadcrumb",{staticClass:"breadcrumb-container"}),e._v(" "),n("div",{staticClass:"right-menu"},[n("el-link",{attrs:{type:"primary",underline:!1,href:"https://gitee.com/durcframework/code-gen",target:"_blank"}},[e._v("Git")])],1)],1)},W=[],J=n("db72"),X=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-breadcrumb",{staticClass:"app-breadcrumb",attrs:{separator:"/"}},[n("transition-group",{attrs:{name:"breadcrumb"}},e._l(e.levelList,(function(t,a){return n("el-breadcrumb-item",{key:t.path},["noRedirect"===t.redirect||a==e.levelList.length-1?n("span",{staticClass:"no-redirect"},[e._v(e._s(t.meta.title))]):n("a",{on:{click:function(n){return n.preventDefault(),e.handleLink(t)}}},[e._v(e._s(t.meta.title))])])})),1)],1)},Y=[],Q=n("bd11"),Z=n.n(Q),ee={data:function(){return{levelList:null}},watch:{$route:function(){this.getBreadcrumb()}},created:function(){this.getBreadcrumb()},methods:{getBreadcrumb:function(){var e=this.$route.matched.filter((function(e){return e.meta&&e.meta.title})),t=e[0];this.isDashboard(t)||(e=[{path:"/dashboard",meta:{title:"首页"}}].concat(e)),this.levelList=e.filter((function(e){return e.meta&&e.meta.title&&!1!==e.meta.breadcrumb}))},isDashboard:function(e){var t=e&&e.name;return!!t&&t.trim().toLocaleLowerCase()==="Dashboard".toLocaleLowerCase()},pathCompile:function(e){var t=this.$route.params,n=Z.a.compile(e);return n(t)},handleLink:function(e){var t=e.redirect,n=e.path;t?this.$router.push(t):this.$router.push(this.pathCompile(n))}}},te=ee,ne=(n("8a0e"),Object(h["a"])(te,X,Y,!1,null,"33d79dae",null)),ae=ne.exports,ie=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticStyle:{padding:"0 15px"},on:{click:e.toggleClick}},[n("svg",{staticClass:"hamburger",class:{"is-active":e.isActive},attrs:{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg",width:"64",height:"64"}},[n("path",{attrs:{d:"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"}})])])},oe=[],re={name:"Hamburger",props:{isActive:{type:Boolean,default:!1}},methods:{toggleClick:function(){this.$emit("toggleClick")}}},ce=re,se=(n("8dd0"),Object(h["a"])(ce,ie,oe,!1,null,"49e15297",null)),ue=se.exports,le={components:{Breadcrumb:ae,Hamburger:ue},computed:Object(J["a"])({},Object(p["b"])(["sidebar","avatar"])),methods:{toggleSideBar:function(){this.$store.dispatch("app/toggleSideBar")},doLogout:function(){this.logout()}}},de=le,he=(n("fbed"),Object(h["a"])(de,K,W,!1,null,"58ce17d6",null)),me=he.exports,fe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{class:{"has-logo":e.showLogo}},[e.showLogo?n("logo",{attrs:{collapse:e.isCollapse}}):e._e(),e._v(" "),n("el-scrollbar",{attrs:{"wrap-class":"scrollbar-wrapper"}},[n("el-menu",{attrs:{"default-active":e.activeMenu,collapse:e.isCollapse,"background-color":e.variables.menuBg,"text-color":e.variables.menuText,"unique-opened":!1,"active-text-color":e.variables.menuActiveText,"collapse-transition":!1,mode:"vertical"}},e._l(e.routes,(function(e){return n("sidebar-item",{key:e.path,attrs:{item:e,"base-path":e.path}})})),1)],1)],1)},pe=[],ve=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"sidebar-logo-container",class:{collapse:e.collapse}},[n("transition",{attrs:{name:"sidebarLogoFade"}},[e.collapse?n("router-link",{key:"collapse",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[e.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:e.logo}}):n("h1",{staticClass:"sidebar-title"},[e._v(e._s(e.title)+" ")])]):n("router-link",{key:"expand",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[e.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:e.logo}}):e._e(),e._v(" "),n("h1",{staticClass:"sidebar-title"},[e._v(e._s(e.title)+" ")])])],1)],1)},be=[],ge={name:"SidebarLogo",props:{collapse:{type:Boolean,required:!0}},data:function(){return{title:"代码生成工具",logo:"https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png"}}},we=ge,xe=(n("c9bc"),Object(h["a"])(we,ve,be,!1,null,"4a3d5d44",null)),ye=xe.exports,Ce=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.item.hidden?e._e():n("div",{staticClass:"menu-wrapper"},[!e.hasOneShowingChild(e.item.children,e.item)||e.onlyOneChild.children&&!e.onlyOneChild.noShowingChildren||e.item.alwaysShow?n("el-submenu",{ref:"subMenu",attrs:{index:e.resolvePath(e.item.path),"popper-append-to-body":""}},[n("template",{slot:"title"},[e.item.meta?n("item",{attrs:{icon:e.item.meta&&e.item.meta.icon,title:e.item.meta.title}}):e._e()],1),e._v(" "),e._l(e.item.children,(function(t){return n("sidebar-item",{key:t.path,staticClass:"nest-menu",attrs:{"is-nest":!0,item:t,"base-path":e.resolvePath(t.path)}})}))],2):[e.onlyOneChild.meta?n("app-link",{attrs:{to:e.resolvePath(e.onlyOneChild.path)}},[n("el-menu-item",{class:{"submenu-title-noDropdown":!e.isNest},attrs:{index:e.resolvePath(e.onlyOneChild.path)}},[n("item",{attrs:{icon:e.onlyOneChild.meta.icon||e.item.meta&&e.item.meta.icon,title:e.onlyOneChild.meta.title}})],1)],1):e._e()]],2)},_e=[],ke=n("df7c"),Se=n.n(ke);function ze(e){return/^(https?:|mailto:|tel:)/.test(e)}var Be,Oe,He={name:"MenuItem",functional:!0,props:{icon:{type:String,default:""},title:{type:String,default:""}},render:function(e,t){var n=t.props,a=n.icon,i=n.title,o=[];return a&&o.push(e("svg-icon",{attrs:{"icon-class":a}})),i&&o.push(e("span",{slot:"title"},[i])),o}},Me=He,Te=Object(h["a"])(Me,Be,Oe,!1,null,null,null),Ee=Te.exports,$e=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("component",e._b({},"component",e.linkProps(e.to),!1),[e._t("default")],2)},Le=[],Ae={props:{to:{type:String,required:!0}},methods:{linkProps:function(e){return ze(e)?{is:"a",href:e,target:"_blank",rel:"noopener"}:{is:"router-link",to:e}}}},Ve=Ae,je=Object(h["a"])(Ve,$e,Le,!1,null,null,null),Pe=je.exports,Ie={computed:{device:function(){return this.$store.state.app.device}},mounted:function(){this.fixBugIniOS()},methods:{fixBugIniOS:function(){var e=this,t=this.$refs.subMenu;if(t){var n=t.handleMouseleave;t.handleMouseleave=function(t){"mobile"!==e.device&&n(t)}}}}},Ne={name:"SidebarItem",components:{Item:Ee,AppLink:Pe},mixins:[Ie],props:{item:{type:Object,required:!0},isNest:{type:Boolean,default:!1},basePath:{type:String,default:""}},data:function(){return this.onlyOneChild=null,{}},methods:{hasOneShowingChild:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1?arguments[1]:void 0,a=t.filter((function(t){return!t.hidden&&(e.onlyOneChild=t,!0)}));return 1===a.length||0===a.length&&(this.onlyOneChild=Object(J["a"])(Object(J["a"])({},n),{},{path:"",noShowingChildren:!0}),!0)},resolvePath:function(e){return ze(e)?e:ze(this.basePath)?this.basePath:Se.a.resolve(this.basePath,e)}}},De=Ne,qe=Object(h["a"])(De,Ce,_e,!1,null,null,null),Re=qe.exports,Ge=n("cf1e"),Fe=n.n(Ge),Ue={components:{SidebarItem:Re,Logo:ye},computed:Object(J["a"])(Object(J["a"])({},Object(p["b"])(["sidebar"])),{},{routes:function(){return this.$router.options.routes},activeMenu:function(){var e=this.$route,t=e.meta,n=e.path;return t.activeMenu?t.activeMenu:n},showLogo:function(){return this.$store.state.settings.sidebarLogo},variables:function(){return Fe.a},isCollapse:function(){return!this.sidebar.opened}})},Ke=Ue,We=Object(h["a"])(Ke,fe,pe,!1,null,null,null),Je=We.exports,Xe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("section",{staticClass:"app-main"},[n("transition",{attrs:{name:"fade-transform",mode:"out-in"}},[n("router-view",{key:e.key})],1)],1)},Ye=[],Qe={name:"AppMain",computed:{key:function(){return this.$route.fullPath}}},Ze=Qe,et=(n("e405"),Object(h["a"])(Ze,Xe,Ye,!1,null,"43c24f68",null)),tt=et.exports,nt=document,at=nt.body,it=992,ot={watch:{$route:function(e){"mobile"===this.device&&this.sidebar.opened&&xt.dispatch("app/closeSideBar",{withoutAnimation:!1})}},beforeMount:function(){window.addEventListener("resize",this.$_resizeHandler)},beforeDestroy:function(){window.removeEventListener("resize",this.$_resizeHandler)},mounted:function(){var e=this.$_isMobile();e&&(xt.dispatch("app/toggleDevice","mobile"),xt.dispatch("app/closeSideBar",{withoutAnimation:!0}))},methods:{$_isMobile:function(){var e=at.getBoundingClientRect();return e.width-1'});r.a.add(c);t["default"]=c},a1c9:function(e,t,n){},b20f:function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},b3ae:function(e,t,n){"use strict";n("4181")},b3b5:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-user",use:"icon-user-usage",viewBox:"0 0 130 130",content:''});r.a.add(c);t["default"]=c},c9bc:function(e,t,n){"use strict";n("a1c9")},cf1e:function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},d7ec:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-eye-open",use:"icon-eye-open-usage",viewBox:"0 0 1024 1024",content:''});r.a.add(c);t["default"]=c},dcf8:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-nested",use:"icon-nested-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},e1ad:function(e,t,n){},e405:function(e,t,n){"use strict";n("0372")},eb1b:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-form",use:"icon-form-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},f782:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-dashboard",use:"icon-dashboard-usage",viewBox:"0 0 128 100",content:''});r.a.add(c);t["default"]=c},fbed:function(e,t,n){"use strict";n("6d93")}},[[0,"runtime","chunk-elementUI","chunk-libs"]]]); \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/js/chunk-10204558.4a42f0ee.js b/sop-admin/sop-code-gen/src/main/resources/static/static/js/chunk-10204558.4a42f0ee.js new file mode 100644 index 00000000..3a9a3325 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/js/chunk-10204558.4a42f0ee.js @@ -0,0 +1 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-10204558"],{"0b6c":function(e,t,n){(function(e){e(n("56b3"),n("b933"),n("2aed"))})((function(e){"use strict";function t(e,t){return"string"==typeof e?e=new RegExp(e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),t?"gi":"g"):e.global||(e=new RegExp(e.source,e.ignoreCase?"gi":"g")),{token:function(t){e.lastIndex=t.pos;var n=e.exec(t.string);if(n&&n.index==t.pos)return t.pos+=n[0].length||1,"searching";n?t.pos=n.index:t.skipToEnd()}}}function n(){this.posFrom=this.posTo=this.lastQuery=this.query=null,this.overlay=null}function r(e){return e.state.search||(e.state.search=new n)}function o(e){return"string"==typeof e&&e==e.toLowerCase()}function i(e,t,n){return e.getSearchCursor(t,n,{caseFold:o(t),multiline:!0})}function a(e,t,n,r,o){e.openDialog(t,r,{value:n,selectValueOnOpen:!0,closeOnEnter:!1,onClose:function(){_(e)},onKeyDown:o,bottom:e.options.search.bottom})}function s(e,t,n,r,o){e.openDialog?e.openDialog(t,o,{value:r,selectValueOnOpen:!0,bottom:e.options.search.bottom}):o(prompt(n,r))}function l(e,t,n,r){e.openConfirm?e.openConfirm(t,r):confirm(n)&&r[0]()}function c(e){return e.replace(/\\([nrt\\])/g,(function(e,t){return"n"==t?"\n":"r"==t?"\r":"t"==t?"\t":"\\"==t?"\\":e}))}function u(e){var t=e.match(/^\/(.*)\/([a-z]*)$/);if(t)try{e=new RegExp(t[1],-1==t[2].indexOf("i")?"":"i")}catch(n){}else e=c(e);return("string"==typeof e?""==e:e.test(""))&&(e=/x^/),e}function p(e,n,r){n.queryText=r,n.query=u(r),e.removeOverlay(n.overlay,o(n.query)),n.overlay=t(n.query,o(n.query)),e.addOverlay(n.overlay),e.showMatchesOnScrollbar&&(n.annotate&&(n.annotate.clear(),n.annotate=null),n.annotate=e.showMatchesOnScrollbar(n.query,o(n.query)))}function h(t,n,o,i){var l=r(t);if(l.query)return d(t,n);var c=t.getSelection()||l.lastQuery;if(c instanceof RegExp&&"x^"==c.source&&(c=null),o&&t.openDialog){var u=null,h=function(n,r){e.e_stop(r),n&&(n!=l.queryText&&(p(t,l,n),l.posFrom=l.posTo=t.getCursor()),u&&(u.style.opacity=1),d(t,r.shiftKey,(function(e,n){var r;n.line<3&&document.querySelector&&(r=t.display.wrapper.querySelector(".CodeMirror-dialog"))&&r.getBoundingClientRect().bottom-4>t.cursorCoords(n,"window").top&&((u=r).style.opacity=.4)})))};a(t,m(t),c,h,(function(n,o){var i=e.keyName(n),a=t.getOption("extraKeys"),s=a&&a[i]||e.keyMap[t.getOption("keyMap")][i];"findNext"==s||"findPrev"==s||"findPersistentNext"==s||"findPersistentPrev"==s?(e.e_stop(n),p(t,r(t),o),t.execCommand(s)):"find"!=s&&"findPersistent"!=s||(e.e_stop(n),h(o,n))})),i&&c&&(p(t,l,c),d(t,n))}else s(t,m(t),"Search for:",c,(function(e){e&&!l.query&&t.operation((function(){p(t,l,e),l.posFrom=l.posTo=t.getCursor(),d(t,n)}))}))}function d(t,n,o){t.operation((function(){var a=r(t),s=i(t,a.query,n?a.posFrom:a.posTo);(s.find(n)||(s=i(t,a.query,n?e.Pos(t.lastLine()):e.Pos(t.firstLine(),0)),s.find(n)))&&(t.setSelection(s.from(),s.to()),t.scrollIntoView({from:s.from(),to:s.to()},20),a.posFrom=s.from(),a.posTo=s.to(),o&&o(s.from(),s.to()))}))}function _(e){e.operation((function(){var t=r(e);t.lastQuery=t.query,t.query&&(t.query=t.queryText=null,e.removeOverlay(t.overlay),t.annotate&&(t.annotate.clear(),t.annotate=null))}))}function f(e,t){var n=e?document.createElement(e):document.createDocumentFragment();for(var r in t)n[r]=t[r];for(var o=2;o '+e.phrase("(Use line:column or scroll% syntax)")+""}function r(e,t){var n=Number(t);return/^[-+]/.test(t)?e.getCursor().line+n:n-1}e.defineOption("search",{bottom:!1}),e.commands.jumpToLine=function(e){var o=e.getCursor();t(e,n(e),e.phrase("Jump to line:"),o.line+1+":"+o.ch,(function(t){var n;if(t)if(n=/^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(t))e.setCursor(r(e,n[1]),Number(n[2]));else if(n=/^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(t)){var i=Math.round(e.lineCount()*Number(n[1])/100);/^[-+]/.test(n[1])&&(i=o.line+i+1),e.setCursor(i-1,o.ch)}else(n=/^\s*\:?\s*([\+\-]?\d+)\s*/.exec(t))&&e.setCursor(r(e,n[1]),o.ch)}))},e.keyMap["default"]["Alt-G"]="jumpToLine"}))},"23de":function(e,t,n){(function(e){e(n("56b3"),n("715d"))})((function(e){"use strict";var t={style:"matchhighlight",minChars:2,delay:100,wordsOnly:!1,annotateScrollbar:!1,showToken:!1,trim:!0};function n(e){for(var n in this.options={},t)this.options[n]=(e&&e.hasOwnProperty(n)?e:t)[n];this.overlay=this.timeout=null,this.matchesonscroll=null,this.active=!1}function r(e){var t=e.state.matchHighlighter;(t.active||e.hasFocus())&&i(e,t)}function o(e){var t=e.state.matchHighlighter;t.active||(t.active=!0,i(e,t))}function i(e,t){clearTimeout(t.timeout),t.timeout=setTimeout((function(){l(e)}),t.options.delay)}function a(e,t,n,r){var o=e.state.matchHighlighter;if(e.addOverlay(o.overlay=p(t,n,r)),o.options.annotateScrollbar&&e.showMatchesOnScrollbar){var i=n?new RegExp((/\w/.test(t.charAt(0))?"\\b":"")+t.replace(/[\\\[.+*?(){|^$]/g,"\\$&")+(/\w/.test(t.charAt(t.length-1))?"\\b":"")):t;o.matchesonscroll=e.showMatchesOnScrollbar(i,!1,{className:"CodeMirror-selection-highlight-scrollbar"})}}function s(e){var t=e.state.matchHighlighter;t.overlay&&(e.removeOverlay(t.overlay),t.overlay=null,t.matchesonscroll&&(t.matchesonscroll.clear(),t.matchesonscroll=null))}function l(e){e.operation((function(){var t=e.state.matchHighlighter;if(s(e),e.somethingSelected()||!t.options.showToken){var n=e.getCursor("from"),r=e.getCursor("to");if(n.line==r.line&&(!t.options.wordsOnly||c(e,n,r))){var o=e.getRange(n,r);t.options.trim&&(o=o.replace(/^\s+|\s+$/g,"")),o.length>=t.options.minChars&&a(e,o,!1,t.options.style)}}else{var i=!0===t.options.showToken?/[\w$]/:t.options.showToken,l=e.getCursor(),u=e.getLine(l.line),p=l.ch,h=p;while(p&&i.test(u.charAt(p-1)))--p;while(h0){var o={line:t.line,ch:t.ch-1},i=e.getRange(o,t);if(null===i.match(/\W/))return!1}if(n.ch=this.gap.to)break;r.to.line>=this.gap.from&&this.matches.splice(t--,1)}var o=this.cm.getSearchCursor(this.query,e.Pos(this.gap.from,0),{caseFold:this.caseFold,multiline:this.options.multiline}),i=this.options&&this.options.maxMatches||n;while(o.findNext()){r={from:o.from(),to:o.to()};if(r.from.line>=this.gap.to)break;if(this.matches.splice(t++,0,r),this.matches.length>i)break}this.gap=null}},t.prototype.onChange=function(t){var n=t.from.line,o=e.changeEnd(t).line,i=o-t.to.line;if(this.gap?(this.gap.from=Math.min(r(this.gap.from,n,i),t.from.line),this.gap.to=Math.max(r(this.gap.to,n,i),t.from.line)):this.gap={from:t.from.line,to:o+1},i)for(var a=0;aa)return t.charCoords(e,"local")[n?"top":"bottom"];var o=t.heightAtLine(l,"local");return o+(n?0:l.height)}var u=t.lastLine();if(t.display.barWidth)for(var p,h=0;hu)){var _=p||c(d.from,!0)*n,f=c(d.to,!1)*n;while(hu)break;if(p=c(o[h+1].from,!0)*n,p>f+.9)break;d=o[++h],f=c(d.to,!1)*n}if(f!=_){var m=Math.max(f-_,3),g=r.appendChild(document.createElement("div"));g.style.cssText="position: absolute; right: 0px; width: "+Math.max(t.display.barWidth-1,2)+"px; top: "+(_+this.buttonHeight)+"px; height: "+m+"px",g.className=this.options.className,d.id&&g.setAttribute("annotation-id",d.id)}}}this.div.textContent="",this.div.appendChild(r)},t.prototype.clear=function(){this.cm.off("refresh",this.resizeHandler),this.cm.off("markerAdded",this.resizeHandler),this.cm.off("markerCleared",this.resizeHandler),this.changeHandler&&this.cm.off("changes",this.changeHandler),this.div.parentNode.removeChild(this.div)}}))},b2d8:function(module,exports,__webpack_require__){!function(e,t){module.exports=t()}(0,(function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=62)}([function(e,t,n){"use strict";function r(e){return Object.prototype.toString.call(e)}function o(e){return"[object String]"===r(e)}function i(e,t){return w.call(e,t)}function a(e){return Array.prototype.slice.call(arguments,1).forEach((function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach((function(n){e[n]=t[n]}))}})),e}function s(e,t,n){return[].concat(e.slice(0,t),n,e.slice(t+1))}function l(e){return!(e>=55296&&e<=57343)&&!(e>=64976&&e<=65007)&&65535!=(65535&e)&&65534!=(65535&e)&&!(e>=0&&e<=8)&&11!==e&&!(e>=14&&e<=31)&&!(e>=127&&e<=159)&&!(e>1114111)}function c(e){if(e>65535){e-=65536;var t=55296+(e>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}function u(e,t){var n=0;return i(D,t)?D[t]:35===t.charCodeAt(0)&&E.test(t)&&(n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10),l(n))?c(n):e}function p(e){return e.indexOf("\\")<0?e:e.replace(x,"$1")}function h(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(C,(function(e,t,n){return t||u(e,n)}))}function d(e){return S[e]}function _(e){return T.test(e)?e.replace(A,d):e}function f(e){return e.replace(L,"\\$&")}function m(e){switch(e){case 9:case 32:return!0}return!1}function g(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}function b(e){return M.test(e)}function v(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function k(e){return e.trim().replace(/\s+/g," ").toUpperCase()}var w=Object.prototype.hasOwnProperty,x=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,y=/&([a-z#][a-z0-9]{1,31});/gi,C=new RegExp(x.source+"|"+y.source,"gi"),E=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,D=n(48),T=/[&<>"]/,A=/[&<>"]/g,S={"&":"&","<":"<",">":">",'"':"""},L=/[.?*+^$[\]\\(){}|-]/g,M=n(33);t.lib={},t.lib.mdurl=n(52),t.lib.ucmicro=n(187),t.assign=a,t.isString=o,t.has=i,t.unescapeMd=p,t.unescapeAll=h,t.isValidEntityCode=l,t.fromCodePoint=c,t.escapeHtml=_,t.arrayReplaceAt=s,t.isSpace=m,t.isWhiteSpace=g,t.isMdAsciiPunct=v,t.isPunctChar=b,t.escapeRE=f,t.normalizeReference=k},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){e.exports=!n(11)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(e,t,n){var r=n(5),o=n(13);e.exports=n(3)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(9),o=n(41),i=n(28),a=Object.defineProperty;t.f=n(3)?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(81),o=n(19);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(26)("wks"),o=n(14),i=n(1).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){var r=n(8);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t){var n=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=n)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=!0},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t){function n(e,t){var n=e[1]||"",o=e[3];if(!o)return n;if(t&&"function"==typeof btoa){var i=r(o);return[n].concat(o.sources.map((function(e){return"/*# sourceURL="+o.sourceRoot+e+" */"}))).concat([i]).join("\n")}return[n].join("\n")}function r(e){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"}e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var r=n(t,e);return t[2]?"@media "+t[2]+"{"+r+"}":r})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var r={},o=0;on.parts.length&&(r.parts.length=n.parts.length)}else{var a=[];for(o=0;o0)return n[0].addEventListener("load",(function(){t()})),void t();var r=document.createElement("script"),o=document.getElementsByTagName("head")[0];r.type="text/javascript",r.charset="UTF-8",r.src=e,r.addEventListener?r.addEventListener("load",(function(){t()}),!1):r.attachEvent&&r.attachEvent("onreadystatechange",(function(){"loaded"===window.event.srcElement.readyState&&t()})),o.appendChild(r)}function i(e,t){if("function"!=typeof t&&(t=function(){}),document.querySelectorAll("link[href='"+e+"']").length>0)t();else{var n=document.createElement("link"),r=document.getElementsByTagName("head")[0];n.rel="stylesheet",n.href=e,n.addEventListener?n.addEventListener("load",(function(){t()}),!1):n.attachEvent&&n.attachEvent("onreadystatechange",(function(){"loaded"===window.event.srcElement.readyState&&t()})),r.appendChild(n)}}n.d(t,"g",(function(){return a})),n.d(t,"i",(function(){return s})),n.d(t,"j",(function(){return l})),n.d(t,"k",(function(){return c})),n.d(t,"h",(function(){return u})),n.d(t,"l",(function(){return p})),n.d(t,"m",(function(){return h})),n.d(t,"e",(function(){return d})),n.d(t,"f",(function(){return _})),n.d(t,"b",(function(){return f})),t.d=o,t.c=i,n.d(t,"a",(function(){return m}));var a=function(e,t,n){var o=t.prefix,i=t.subfix,a=t.str;if(t.type,e.focus(),"number"==typeof e.selectionStart&&"number"==typeof e.selectionEnd){var s=e.selectionStart,l=e.selectionEnd,c=e.value;s===l?(e.value=c.substring(0,s)+o+a+i+c.substring(l,c.length),e.selectionStart=s+o.length,e.selectionEnd=s+(a.length+o.length)):c.substring(s-o.length,s)===o&&c.substring(l,l+i.length)===i&&r(o,i,c,s,l)?(e.value=c.substring(0,s-o.length)+c.substring(s,l)+c.substring(l+i.length,c.length),e.selectionStart=s-o.length,e.selectionEnd=l-o.length):(e.value=c.substring(0,s)+o+c.substring(s,l)+i+c.substring(l,c.length),e.selectionStart=s+o.length,e.selectionEnd=s+(l-s+o.length))}else alert("Error: Browser version is too low");n.d_value=e.value,e.focus()},s=function(e){var t=e.getTextareaDom();if("number"==typeof t.selectionStart&&"number"==typeof t.selectionEnd){var n=t.selectionStart,r=t.selectionEnd,o=t.value;if(n===r)t.value=o.substring(0,n)+"1. "+o.substring(r,o.length),t.selectionEnd=t.selectionStart=n+3;else{for(var i=n;i>0&&"\n"!==o.substring(i-1,i);)i--;for(var a=o.substring(i,r),s=a.split("\n"),l=0;l0&&"\n"!==o.substring(i-1,i);)i--;for(var a=r;a0&&"\n"!==o.substring(i-1,i);)i--;var a=o.substring(i,r),s=a.replace(/\n/g,"\n- ");s="- "+s,t.value=o.substring(0,i)+s+o.substring(r,o.length),t.selectionStart=i,t.selectionEnd=r+s.length-a.length}}else alert("Error: Browser version is too low");e.d_value=t.value,t.focus()},u=function(e,t){t=t?new Array(t).fill(" ").join(""):"\t";var n=e.getTextareaDom();if("number"==typeof n.selectionStart&&"number"==typeof n.selectionEnd){var r=n.selectionStart,o=n.selectionEnd,i=n.value,a=i.substring(0,r).split("\n").pop();if(a.match(/^\s*[0-9]+\.\s+\S*/)){var s=a.replace(/(\d+)/,1);n.value=i.substring(0,r-s.length)+t+s+i.substring(o,i.length)}else a.match(/^\s*-\s+\S*/)?n.value=i.substring(0,r-a.length)+t+a+i.substring(o,i.length):n.value=i.substring(0,r)+t+i.substring(o,i.length);n.selectionStart=n.selectionEnd=r+t.length}else alert("Error: Browser version is too low");e.d_value=n.value,n.focus()},p=function(e,t){var n=new RegExp(t?"\\s{"+t+"}":"\t");console.log("regTab:",n);var r=e.getTextareaDom();if("number"==typeof r.selectionStart&&"number"==typeof r.selectionEnd){var o=r.selectionStart,i=r.selectionEnd,a=r.value,s=a.substring(0,o).split("\n").pop();s.search(n)>=0&&(r.value=a.substring(0,o-s.length)+s.replace(n,"")+a.substring(i,a.length),r.selectionStart=r.selectionEnd=o-(t||1))}else alert("Error: Browser version is too low");e.d_value=r.value,r.focus()},h=function(e,t){var n=e.getTextareaDom();if("number"==typeof n.selectionStart&&"number"==typeof n.selectionEnd){var r=n.selectionStart,o=n.selectionEnd,i=n.value,a=i.substring(0,r).split("\n").pop(),s=a.match(/^\s*(?:[0-9]+\.|-)\s+\S+/);if(s){t.preventDefault();var l=s.shift().match(/^\s*(?:[0-9]+\.|-)\s/).shift();if(l.search(/-/)>=0)n.value=i.substring(0,r)+"\n"+l+i.substring(o,i.length),n.selectionStart=n.selectionEnd=r+l.length+1;else{var c=l.replace(/(\d+)/,parseInt(l)+1);n.value=i.substring(0,r)+"\n"+c+i.substring(o,i.length),n.selectionStart=n.selectionEnd=r+c.length+1}}else{var u=a.match(/^\s*(?:[0-9]+\.|-)\s+$/);if(u){t.preventDefault();var p=u.shift().length;n.value=i.substring(0,r-p)+"\n"+i.substring(o,i.length),n.selectionStart=n.selectionEnd=r-p}}}else alert("Error: Browser version is too low");e.d_value=n.value,n.focus()},d=function(e,t){var n=void 0;n=e.$refs.navigationContent,n.innerHTML=e.d_render;var r=n.children;if(r.length)for(var o=0;o=0&&n.scrollHeight!==t.edit_scroll_height&&n.scrollHeight-n.offsetHeight-n.scrollTop<=30&&(t.$refs.vNoteEdit.scrollTop=n.scrollHeight-n.offsetHeight,r=1),t.edit_scroll_height=n.scrollHeight,t.$refs.vShowContent.scrollHeight>t.$refs.vShowContent.offsetHeight&&(t.$refs.vShowContent.scrollTop=(t.$refs.vShowContent.scrollHeight-t.$refs.vShowContent.offsetHeight)*r)},f=function(e){e.$el.addEventListener("fullscreenchange",(function(t){e.$toolbar_right_read_change_status()}),!1),e.$el.addEventListener("mozfullscreenchange",(function(t){e.$toolbar_right_read_change_status()}),!1),e.$el.addEventListener("webkitfullscreenchange",(function(t){e.$toolbar_right_read_change_status()}),!1),e.$el.addEventListener("msfullscreenchange",(function(t){e.$toolbar_right_read_change_status()}),!1)},m=function(e){e.$refs.vShowContent.addEventListener("click",(function(t){t=t||window.event;var n=t.srcElement?t.srcElement:t.target;"IMG"===n.tagName&&(null!=e.imageClick?e.imageClick(n):e.d_preview_imgsrc=n.src)}))}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t){e.exports={}},function(e,t,n){var r=n(46),o=n(20);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var r=n(5).f,o=n(2),i=n(7)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){var r=n(26)("keys"),o=n(14);e.exports=function(e){return r[e]||(r[e]=o(e))}},function(e,t,n){var r=n(10),o=n(1),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:r.version,mode:n(12)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(8);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){var r=n(1),o=n(10),i=n(12),a=n(30),s=n(5).f;e.exports=function(e){var t=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==e.charAt(0)||e in t||s(t,e,{value:a.f(e)})}},function(e,t,n){t.f=n(7)},function(e,t,n){"use strict";function r(){this.__rules__=[],this.__cache__=null}r.prototype.__find__=function(e){for(var t=0;t=0&&(n=this.attrs[t][1]),n},r.prototype.attrJoin=function(e,t){var n=this.attrIndex(e);n<0?this.attrPush([e,t]):this.attrs[n][1]=this.attrs[n][1]+" "+t},e.exports=r},function(e,t){e.exports=/[!-#%-\*,-/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E49\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},function(e,t,n){function r(e){o||n(194)}var o=!1,i=n(16)(n(59),n(191),r,"data-v-62b9e4d1",null);i.options.__file="C:\\Users\\LWK\\Desktop\\mavonEditor-master\\mavonEditor-master\\src\\components\\md-toolbar-left.vue",i.esModule&&Object.keys(i.esModule).some((function(e){return"default"!==e&&"__"!==e.substr(0,2)}))&&console.error("named exports are not supported in *.vue files."),i.options.functional&&console.error("[vue-loader] md-toolbar-left.vue: functional components are not supported with templates, they should use render functions."),e.exports=i.exports},function(e,t,n){var r=n(16)(n(60),n(189),null,null,null);r.options.__file="C:\\Users\\LWK\\Desktop\\mavonEditor-master\\mavonEditor-master\\src\\components\\md-toolbar-right.vue",r.esModule&&Object.keys(r.esModule).some((function(e){return"default"!==e&&"__"!==e.substr(0,2)}))&&console.error("named exports are not supported in *.vue files."),r.options.functional&&console.error("[vue-loader] md-toolbar-right.vue: functional components are not supported with templates, they should use render functions."),e.exports=r.exports},function(e,t,n){"use strict";t.a={"1c":"1c",abnf:"abnf",accesslog:"accesslog",actionscript:"actionscript",as:"actionscript",ada:"ada",apache:"apache",apacheconf:"apache",applescript:"applescript",osascript:"applescript",arduino:"arduino",armasm:"armasm",arm:"armasm",asciidoc:"asciidoc",adoc:"asciidoc",aspectj:"aspectj",autohotkey:"autohotkey",ahk:"autohotkey",autoit:"autoit",avrasm:"avrasm",awk:"awk",axapta:"axapta",bash:"bash",sh:"bash",zsh:"bash",basic:"basic",bnf:"bnf",brainfuck:"brainfuck",bf:"brainfuck",cal:"cal",capnproto:"capnproto",capnp:"capnproto",ceylon:"ceylon",clean:"clean",icl:"clean",dcl:"clean","clojure-repl":"clojure-repl",clojure:"clojure",clj:"clojure",cmake:"cmake","cmake.in":"cmake",coffeescript:"coffeescript",coffee:"coffeescript",cson:"coffeescript",iced:"coffeescript",coq:"coq",cos:"cos",cls:"cos",cpp:"cpp",c:"cpp",cc:"cpp",h:"cpp","c++":"cpp","h++":"cpp",hpp:"cpp",crmsh:"crmsh",crm:"crmsh",pcmk:"crmsh",crystal:"crystal",cr:"crystal",cs:"cs",csharp:"cs",csp:"csp",css:"css",d:"d",dart:"dart",delphi:"delphi",dpr:"delphi",dfm:"delphi",pas:"delphi",pascal:"delphi",freepascal:"delphi",lazarus:"delphi",lpr:"delphi",lfm:"delphi",diff:"diff",patch:"diff",django:"django",jinja:"django",dns:"dns",bind:"dns",zone:"dns",dockerfile:"dockerfile",docker:"dockerfile",dos:"dos",bat:"dos",cmd:"dos",dsconfig:"dsconfig",dts:"dts",dust:"dust",dst:"dust",ebnf:"ebnf",elixir:"elixir",elm:"elm",erb:"erb","erlang-repl":"erlang-repl",erlang:"erlang",erl:"erlang",excel:"excel",xlsx:"excel",xls:"excel",fix:"fix",flix:"flix",fortran:"fortran",f90:"fortran",f95:"fortran",fsharp:"fsharp",fs:"fsharp",gams:"gams",gms:"gams",gauss:"gauss",gss:"gauss",gcode:"gcode",nc:"gcode",gherkin:"gherkin",feature:"gherkin",glsl:"glsl",go:"go",golang:"go",golo:"golo",gradle:"gradle",groovy:"groovy",haml:"haml",handlebars:"handlebars",hbs:"handlebars","html.hbs":"handlebars","html.handlebars":"handlebars",haskell:"haskell",hs:"haskell",haxe:"haxe",hx:"haxe",hsp:"hsp",htmlbars:"htmlbars",http:"http",https:"http",hy:"hy",hylang:"hy",inform7:"inform7",i7:"inform7",ini:"ini",toml:"ini",irpf90:"irpf90",java:"java",jsp:"java",javascript:"javascript",js:"javascript",jsx:"javascript","jboss-cli":"jboss-cli","wildfly-cli":"jboss-cli",json:"json","julia-repl":"julia-repl",julia:"julia",kotlin:"kotlin",lasso:"lasso",ls:"livescript",lassoscript:"lasso",ldif:"ldif",leaf:"leaf",less:"less",lisp:"lisp",livecodeserver:"livecodeserver",livescript:"livescript",llvm:"llvm",lsl:"lsl",lua:"lua",makefile:"makefile",mk:"makefile",mak:"makefile",markdown:"markdown",md:"markdown",mkdown:"markdown",mkd:"markdown",mathematica:"mathematica",mma:"mathematica",matlab:"matlab",maxima:"maxima",mel:"mel",mercury:"mercury",m:"mercury",moo:"mercury",mipsasm:"mipsasm",mips:"mipsasm",mizar:"mizar",mojolicious:"mojolicious",monkey:"monkey",moonscript:"moonscript",moon:"moonscript",n1ql:"n1ql",nginx:"nginx",nginxconf:"nginx",nimrod:"nimrod",nim:"nimrod",nix:"nix",nixos:"nix",nsis:"nsis",objectivec:"objectivec",mm:"objectivec",objc:"objectivec","obj-c":"objectivec",ocaml:"ocaml",ml:"sml",openscad:"openscad",scad:"openscad",oxygene:"oxygene",parser3:"parser3",perl:"perl",pl:"perl",pm:"perl",pf:"pf","pf.conf":"pf",php:"php",php3:"php",php4:"php",php5:"php",php6:"php",pony:"pony",powershell:"powershell",ps:"powershell",processing:"processing",profile:"profile",prolog:"prolog",protobuf:"protobuf",puppet:"puppet",pp:"puppet",purebasic:"purebasic",pb:"purebasic",pbi:"purebasic",python:"python",py:"python",gyp:"python",q:"q",k:"q",kdb:"q",qml:"qml",qt:"qml",r:"r",rib:"rib",roboconf:"roboconf",graph:"roboconf",instances:"roboconf",routeros:"routeros",mikrotik:"routeros",rsl:"rsl",ruby:"ruby",rb:"ruby",gemspec:"ruby",podspec:"ruby",thor:"ruby",irb:"ruby",ruleslanguage:"ruleslanguage",rust:"rust",rs:"rust",scala:"scala",scheme:"scheme",scilab:"scilab",sci:"scilab",scss:"scss",shell:"shell",console:"shell",smali:"smali",smalltalk:"smalltalk",st:"smalltalk",sml:"sml",sqf:"sqf",sql:"sql",stan:"stan",stata:"stata",do:"stata",ado:"stata",step21:"step21",p21:"step21",step:"step21",stp:"step21",stylus:"stylus",styl:"stylus",subunit:"subunit",swift:"swift",taggerscript:"taggerscript",tap:"tap",tcl:"tcl",tk:"tcl",tex:"tex",thrift:"thrift",tp:"tp",twig:"twig",craftcms:"twig",typescript:"typescript",ts:"typescript",vala:"vala",vbnet:"vbnet",vb:"vbnet","vbscript-html":"vbscript-html",vbscript:"vbscript",vbs:"vbscript",verilog:"verilog",v:"verilog",sv:"verilog",svh:"verilog",vhdl:"vhdl",vim:"vim",x86asm:"x86asm",xl:"xl",tao:"xl",xml:"xml",html:"xml",xhtml:"xml",rss:"xml",atom:"xml",xjb:"xml",xsd:"xml",xsl:"xml",plist:"xml",xquery:"xquery",xpath:"xquery",xq:"xquery",yaml:"yaml",yml:"yaml",YAML:"yaml",zephir:"zephir",zep:"zephir"}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=n(72),i=r(o),a=n(71),s=r(a),l="function"==typeof s.default&&"symbol"==typeof i.default?function(e){return typeof e}:function(e){return e&&"function"==typeof s.default&&e.constructor===s.default&&e!==s.default.prototype?"symbol":typeof e};t.default="function"==typeof s.default&&"symbol"===l(i.default)?function(e){return void 0===e?"undefined":l(e)}:function(e){return e&&"function"==typeof s.default&&e.constructor===s.default&&e!==s.default.prototype?"symbol":void 0===e?"undefined":l(e)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(8),o=n(1).document,i=r(o)&&r(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t,n){var r=n(1),o=n(10),i=n(78),a=n(4),s=n(2),l=function(e,t,n){var c,u,p,h=e&l.F,d=e&l.G,_=e&l.S,f=e&l.P,m=e&l.B,g=e&l.W,b=d?o:o[t]||(o[t]={}),v=b.prototype,k=d?r:_?r[t]:(r[t]||{}).prototype;for(c in d&&(n=t),n)(u=!h&&k&&void 0!==k[c])&&s(b,c)||(p=u?k[c]:n[c],b[c]=d&&"function"!=typeof k[c]?n[c]:m&&u?i(p,r):g&&k[c]==p?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(p):f&&"function"==typeof p?i(Function.call,p):p,f&&((b.virtual||(b.virtual={}))[c]=p,e&l.R&&v&&!v[c]&&a(v,c,p)))};l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,e.exports=l},function(e,t,n){e.exports=!n(3)&&!n(11)((function(){return 7!=Object.defineProperty(n(39)("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){"use strict";var r=n(12),o=n(40),i=n(47),a=n(4),s=n(21),l=n(83),c=n(24),u=n(89),p=n(7)("iterator"),h=!([].keys&&"next"in[].keys()),d=function(){return this};e.exports=function(e,t,n,_,f,m,g){l(n,t,_);var b,v,k,w=function(e){if(!h&&e in E)return E[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},x=t+" Iterator",y="values"==f,C=!1,E=e.prototype,D=E[p]||E["@@iterator"]||f&&E[f],T=D||w(f),A=f?y?w("entries"):T:void 0,S="Array"==t&&E.entries||D;if(S&&(k=u(S.call(new e)))!==Object.prototype&&k.next&&(c(k,x,!0),r||"function"==typeof k[p]||a(k,p,d)),y&&D&&"values"!==D.name&&(C=!0,T=function(){return D.call(this)}),r&&!g||!h&&!C&&E[p]||a(E,p,T),s[t]=T,s[x]=d,f)if(b={values:y?T:w("values"),keys:m?T:w("keys"),entries:A},g)for(v in b)v in E||i(E,v,b[v]);else o(o.P+o.F*(h||C),t,b);return b}},function(e,t,n){var r=n(9),o=n(86),i=n(20),a=n(25)("IE_PROTO"),s=function(){},l=function(){var e,t=n(39)("iframe"),r=i.length;for(t.style.display="none",n(80).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write("