├── .gitignore ├── images ├── 1.png ├── 2.png ├── 3.png ├── home-20210726.png ├── example-2021072701.jpg ├── example-2021072702.jpg └── example-2021072703.jpg ├── .gitattributes ├── src ├── main │ ├── resources │ │ ├── static │ │ │ ├── images │ │ │ │ ├── bg.jpg │ │ │ │ ├── logo.jpg │ │ │ │ └── favicon.ico │ │ │ ├── lib │ │ │ │ ├── layui │ │ │ │ │ └── font │ │ │ │ │ │ ├── iconfont.eot │ │ │ │ │ │ ├── iconfont.ttf │ │ │ │ │ │ ├── iconfont.woff │ │ │ │ │ │ └── iconfont.woff2 │ │ │ │ ├── layui-bak │ │ │ │ │ ├── font │ │ │ │ │ │ ├── iconfont.eot │ │ │ │ │ │ ├── iconfont.ttf │ │ │ │ │ │ ├── iconfont.woff │ │ │ │ │ │ └── iconfont.woff2 │ │ │ │ │ └── css │ │ │ │ │ │ ├── modules │ │ │ │ │ │ ├── layer │ │ │ │ │ │ │ └── default │ │ │ │ │ │ │ │ ├── icon.png │ │ │ │ │ │ │ │ ├── icon-ext.png │ │ │ │ │ │ │ │ ├── loading-0.gif │ │ │ │ │ │ │ │ ├── loading-1.gif │ │ │ │ │ │ │ │ ├── loading-2.gif │ │ │ │ │ │ │ │ └── layer.css │ │ │ │ │ │ ├── code.css │ │ │ │ │ │ └── laydate │ │ │ │ │ │ │ └── default │ │ │ │ │ │ │ └── laydate.css │ │ │ │ │ │ └── layui.css │ │ │ │ └── css │ │ │ │ │ └── normalize.css │ │ │ ├── util │ │ │ │ ├── LayerUtils.js │ │ │ │ ├── Variable.js │ │ │ │ ├── Utils.js │ │ │ │ ├── AjaxUtils.js │ │ │ │ └── CacheUtils.js │ │ │ ├── data │ │ │ │ ├── DataConfig.js │ │ │ │ └── DatabaseConfig.js │ │ │ ├── css │ │ │ │ └── index.css │ │ │ └── js │ │ │ │ └── index.js │ │ ├── banner.txt │ │ ├── application.yml │ │ └── templates │ │ │ └── index.html │ └── java │ │ └── com │ │ └── fengwenyi │ │ └── codegenerator │ │ ├── vo │ │ ├── VersionResponseVo.java │ │ └── CodeGeneratorRequestVo.java │ │ ├── service │ │ ├── IIndexService.java │ │ └── impl │ │ │ └── IndexServiceImpl.java │ │ ├── config │ │ └── ErwinProperties.java │ │ ├── MyBatisPlusCodeGeneratorApplication.java │ │ ├── controller │ │ └── IndexController.java │ │ ├── Config.java │ │ ├── bo │ │ └── CodeGeneratorBo.java │ │ └── generator │ │ └── MyAutoGenerator.java └── test │ └── java │ └── com │ └── fengwenyi │ └── codegenerator │ ├── MyBatisPlusCodeGeneratorApplicationTests.java │ └── CodeGeneratorTests.java ├── Dockerfile ├── LICENSE ├── README.md ├── LOG.md └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | .idea 3 | /mybatis-plus-code-generator.iml 4 | /temp/ 5 | -------------------------------------------------------------------------------- /images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/images/1.png -------------------------------------------------------------------------------- /images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/images/2.png -------------------------------------------------------------------------------- /images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/images/3.png -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=java 2 | *.css linguist-language=java 3 | *.html linguist-language=java -------------------------------------------------------------------------------- /images/home-20210726.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/images/home-20210726.png -------------------------------------------------------------------------------- /images/example-2021072701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/images/example-2021072701.jpg -------------------------------------------------------------------------------- /images/example-2021072702.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/images/example-2021072702.jpg -------------------------------------------------------------------------------- /images/example-2021072703.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/images/example-2021072703.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/images/bg.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/images/logo.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/images/favicon.ico -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui/font/iconfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui/font/iconfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui/font/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui/font/iconfont.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui-bak/font/iconfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui-bak/font/iconfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui-bak/font/iconfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/font/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui-bak/font/iconfont.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/css/modules/layer/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui-bak/css/modules/layer/default/icon.png -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/css/modules/layer/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui-bak/css/modules/layer/default/icon-ext.png -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/css/modules/layer/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui-bak/css/modules/layer/default/loading-0.gif -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/css/modules/layer/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui-bak/css/modules/layer/default/loading-1.gif -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/css/modules/layer/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fengwenyi/mybatis-plus-code-generator/HEAD/src/main/resources/static/lib/layui-bak/css/modules/layer/default/loading-2.gif -------------------------------------------------------------------------------- /src/main/resources/static/util/LayerUtils.js: -------------------------------------------------------------------------------- 1 | // 弹窗-失败 2 | function alertFail(layer, msg) { 3 | layer.alert(msg,{ icon: 5 });//失败的表情 4 | } 5 | 6 | // 弹窗-成功 7 | function alertSuccess(layer, msg) { 8 | layer.alert(msg, { icon: 6 }); 9 | } -------------------------------------------------------------------------------- /src/main/resources/static/data/DataConfig.js: -------------------------------------------------------------------------------- 1 | let dataConfig = {} 2 | 3 | // 保存 4 | function dataConfigSave(val) { 5 | setDataConfig(val) 6 | } 7 | 8 | // 查询 9 | function dataConfigQueryAll() { 10 | return getDataConfig() 11 | } 12 | 13 | // 删除 14 | function dataConfigDelete() { 15 | removeDataConfig() 16 | } -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:17-jdk-alpine 2 | MAINTAINER Erwin Feng xfsy_2015@163.com 3 | ENV TZ=Asia/Shanghai 4 | RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone 5 | COPY target/mybatis-plus-code-generator-*.jar mybatis-plus-code-generator.jar 6 | ENTRYPOINT ["sh", "-c", "java -jar mybatis-plus-code-generator.jar"] -------------------------------------------------------------------------------- /src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | ==================================================================================================================== 2 | 3 | ${erwin.app.name} - Powered By Erwin Feng 4 | 5 | ${erwin.app.version} 6 | 7 | ==================================================================================================================== -------------------------------------------------------------------------------- /src/test/java/com/fengwenyi/codegenerator/MyBatisPlusCodeGeneratorApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator; 2 | 3 | import org.springframework.boot.test.context.SpringBootTest; 4 | 5 | /** 6 | * @author Erwin Feng 7 | * @since 2021-07-12 8 | */ 9 | @SpringBootTest 10 | public class MyBatisPlusCodeGeneratorApplicationTests { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/static/util/Variable.js: -------------------------------------------------------------------------------- 1 | const HTTP_POST = 'POST'; 2 | const HTTP_GET = 'GET'; 3 | 4 | const KEY_DB_ADDRESS = 'MPCG-KEY-DB-ADDRESS'; 5 | const KEY_DB_USERNAME = 'MPCG-KEY-DB-USERNAME'; 6 | const KEY_DB_PASSWORD = 'MPCG-KEY-DB-PASSWORD'; 7 | const KEY_AUTHOR = 'MPCG-KEY-AUTHOR'; 8 | const KEY_OUTPUT_DIR = 'MPCG-KEY-OUTPUT-DIR'; 9 | 10 | const KEY_LIST_DB = 'MPCG-KEY-LIST-DB'; 11 | 12 | const KEY_DATA_CONFIG = 'MPCG-KEY-DATA-CONFIG'; -------------------------------------------------------------------------------- /src/main/java/com/fengwenyi/codegenerator/vo/VersionResponseVo.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author Erwin Feng 7 | * @since 2022-04-10 8 | */ 9 | @Data 10 | public class VersionResponseVo { 11 | 12 | private String latestVersion; 13 | private String content; 14 | private String releaseUrl; 15 | private String downloadUrl; 16 | private Integer upgradeType; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8899 3 | 4 | spring: 5 | application: 6 | name: mybatis-plus-code-generator 7 | thymeleaf: 8 | enabled: true 9 | prefix: classpath:/templates/ 10 | mode: HTML 11 | encoding: UTF-8 12 | servlet: 13 | content-type: text/html 14 | suffix: .html 15 | cache: false 16 | mvc: 17 | static-path-pattern: /static/** 18 | 19 | logging: 20 | level: 21 | com.fengwenyi: debug 22 | com.baomidou: debug 23 | 24 | erwin: 25 | app: 26 | name: @project.artifactId@ 27 | version: @project.version@ -------------------------------------------------------------------------------- /src/main/java/com/fengwenyi/codegenerator/service/IIndexService.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator.service; 2 | 3 | import com.fengwenyi.api.result.ResultTemplate; 4 | import com.fengwenyi.codegenerator.vo.CodeGeneratorRequestVo; 5 | 6 | /** 7 | * @author Erwin Feng 8 | * @since 2021-07-12 9 | */ 10 | public interface IIndexService { 11 | 12 | /** 13 | * 生成代码 14 | * @param requestVo 15 | * @return 16 | */ 17 | ResultTemplate codeGenerator(CodeGeneratorRequestVo requestVo); 18 | 19 | /** 20 | * 升级检查 21 | * */ 22 | String versionCheck(String version); 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/fengwenyi/codegenerator/config/ErwinProperties.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | /** 8 | * @author Erwin Feng 9 | * @since 2021-12-20 10 | */ 11 | @Data 12 | @Configuration 13 | @ConfigurationProperties("erwin") 14 | public class ErwinProperties { 15 | 16 | private App app; 17 | 18 | @Data 19 | public static class App { 20 | private String name; 21 | private String version; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020-2024 Erwin Feng 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/test/java/com/fengwenyi/codegenerator/CodeGeneratorTests.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator; 2 | 3 | import com.baomidou.mybatisplus.annotation.DbType; 4 | import org.junit.jupiter.api.Test; 5 | 6 | /** 7 | * @author Erwin Feng 8 | * @since 2020/5/29 9 | */ 10 | public class CodeGeneratorTests { 11 | 12 | @Test 13 | public void testMySQLCodeGenerator() { 14 | DbType dbType = DbType.MYSQL; 15 | String dbUrl = "jdbc:mysql://192.168.16.128:3306/study-spring-boot-mybatis-plus"; 16 | String username = "root"; 17 | String password = "123456"; 18 | String driver = "com.mysql.cj.jdbc.Driver"; 19 | // 表前缀,生成的实体类,不含前缀 20 | String [] tablePrefixes = {}; 21 | // 表名,为空,生成所有的表 22 | String [] tableNames = {}; 23 | // 字段前缀 24 | String [] fieldPrefixes = {}; 25 | // 排除的表名 26 | String [] excludeTableNames = {}; 27 | // 基础包名 28 | String packageName = "com.fengwenyi.studyspringbootmybatisplus.db"; 29 | //CommonUtils.execute(dbType, dbUrl, username, password, driver, tablePrefixes, tableNames, packageName, fieldPrefixes, excludeTableNames); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/resources/static/util/Utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 字符串判空 3 | * @param x 4 | * @returns {boolean} 5 | */ 6 | function isEmpty(x) { 7 | return x === null 8 | || x === undefined 9 | || x.trim() === '' 10 | || x.trim() === 'null' 11 | || x.trim() === 'undefined'; 12 | } 13 | 14 | /** 15 | * 字符串判非空 16 | * @param x 17 | * @returns {boolean} 18 | */ 19 | function isNotEmpty(x) { 20 | return !isEmpty(x); 21 | } 22 | 23 | /** 24 | * 对象判空 25 | * @param x 26 | * @returns {boolean} 27 | */ 28 | function isNull(x) { 29 | return x === null 30 | || x === undefined; 31 | } 32 | 33 | /** 34 | * 对象判非空 35 | * @param x 36 | * @returns {boolean} 37 | */ 38 | function nonNull(x) { 39 | return !isNull(x) 40 | } 41 | 42 | /** 43 | * 随机颜色 44 | * @returns {string} 45 | */ 46 | function randomColor(){ 47 | let colorAngle = Math.floor(Math.random()*360); 48 | return 'hsla('+ colorAngle +',100%,50%,1)'; 49 | } 50 | 51 | function guid() { 52 | return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 53 | let r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); 54 | return v.toString(16); 55 | }); 56 | } -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/css/modules/code.css: -------------------------------------------------------------------------------- 1 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view .layui-code-ol li:first-child{padding-top:10px}.layui-code-view .layui-code-ol li:last-child{padding-bottom:10px}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none} -------------------------------------------------------------------------------- /src/main/resources/static/util/AjaxUtils.js: -------------------------------------------------------------------------------- 1 | function ajaxPost(jQuery, layer, url, data, funcSuc) { 2 | let layerIndex; 3 | jQuery.ajax({ 4 | url: url, 5 | type: HTTP_POST, 6 | // 请求的媒体类型 7 | contentType: "application/json;charset=UTF-8", 8 | data: data, 9 | beforeSend:function () { 10 | layerIndex = layer.load(0, { shade: 0.1 }); 11 | }, 12 | success: funcSuc, 13 | error: function (response) { 14 | let responseJSON = response.responseJSON; 15 | let errMsg = response.statusText; 16 | if (isNotEmpty(responseJSON)) { 17 | errMsg = responseJSON.message; 18 | } 19 | alertFail(layer, errMsg); 20 | }, 21 | complete: function () { 22 | layer.close(layerIndex); 23 | }, 24 | }); 25 | return false; 26 | } 27 | 28 | function ajaxGet(jQuery, layer, url, data, funcSuc) { 29 | let layerIndex; 30 | jQuery.ajax({ 31 | url: url, 32 | type: HTTP_GET, 33 | data: data, 34 | beforeSend:function () { 35 | layerIndex = layer.load(0, { shade: 0.1 }); 36 | }, 37 | success: funcSuc, 38 | error: function (response) { 39 | let responseJSON = response.responseJSON; 40 | let errMsg = response.statusText; 41 | if (isNotEmpty(responseJSON)) { 42 | errMsg = responseJSON.message; 43 | } 44 | alertFail(layer, errMsg); 45 | }, 46 | complete: function () { 47 | layer.close(layerIndex); 48 | }, 49 | }); 50 | return false; 51 | } -------------------------------------------------------------------------------- /src/main/resources/static/data/DatabaseConfig.js: -------------------------------------------------------------------------------- 1 | let dbConfigList = [] 2 | 3 | function dataDbConfigAdd(key, data) { 4 | dataDbConfigQueryList() 5 | if (dbConfigList.length > 4) { 6 | return false; 7 | } 8 | let map = { 9 | k: key, 10 | v: data 11 | } 12 | dbConfigList.push(map) 13 | setListDb(dbConfigList) 14 | return true; 15 | } 16 | 17 | function dataDbConfigUpdate(key, data) { 18 | dataDbConfigQueryList() 19 | for (let i = 0; i < dbConfigList.length; i++) { 20 | let map = dbConfigList[i]; 21 | if (map.k === key) { 22 | map.v = data; 23 | dbConfigList[i] = map; 24 | setListDb(dbConfigList) 25 | return true; 26 | } 27 | } 28 | return false; 29 | } 30 | 31 | function dataDbConfigQueryList() { 32 | dbConfigList = getListDb() 33 | if (isNull(dbConfigList)) { 34 | dbConfigList = [] 35 | } 36 | return dbConfigList; 37 | } 38 | 39 | function dataDbConfigQueryByKey(key) { 40 | dataDbConfigQueryList() 41 | for (let i = 0; i < dbConfigList.length; i++) { 42 | if (dbConfigList[i].k === key) { 43 | return dbConfigList[i]; 44 | } 45 | } 46 | } 47 | 48 | function dataDbConfigCount() { 49 | dataDbConfigQueryList() 50 | return dbConfigList.length; 51 | } 52 | 53 | function dataDbConfigDelete(key) { 54 | dataDbConfigQueryList() 55 | for (let i = 0; i < dbConfigList.length; i++) { 56 | let map = dbConfigList[i]; 57 | if (map.k === key) { 58 | dbConfigList.splice(i, 1); 59 | setListDb(dbConfigList) 60 | return true; 61 | } 62 | } 63 | return true; 64 | } -------------------------------------------------------------------------------- /src/main/java/com/fengwenyi/codegenerator/MyBatisPlusCodeGeneratorApplication.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.context.ApplicationContext; 7 | import org.springframework.core.env.Environment; 8 | 9 | import java.net.InetAddress; 10 | import java.net.UnknownHostException; 11 | 12 | /** 13 | * @author Erwin Feng 14 | * @since 2021-07-12 15 | */ 16 | @SpringBootApplication 17 | @Slf4j 18 | public class MyBatisPlusCodeGeneratorApplication { 19 | 20 | public static void main(String[] args) { 21 | ApplicationContext application = SpringApplication.run(MyBatisPlusCodeGeneratorApplication.class, args); 22 | Environment env = application.getEnvironment(); 23 | String ip; 24 | try { 25 | ip = InetAddress.getLocalHost().getHostAddress(); 26 | } catch (UnknownHostException e) { 27 | throw new RuntimeException(e); 28 | } 29 | String port = env.getProperty("server.port"); 30 | String appName = env.getProperty("spring.application.name"); 31 | String path = env.getProperty("server.servlet.context-path"); 32 | 33 | String msg = "\n---------------------------------------------------------------------------" 34 | + "\n\tApplication "+ appName + " is running! Access URLs:" 35 | + "\n\tLocal: \t\thttp://localhost:" + port 36 | + "\n\tExternal: \thttp://" + ip + ":" + port 37 | + "\n---------------------------------------------------------------------------" 38 | ; 39 | 40 | log.info(msg); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/resources/static/util/CacheUtils.js: -------------------------------------------------------------------------------- 1 | // 数据库地址 2 | function setDbAddress(dbAddress) { 3 | localStorage.setItem(KEY_DB_ADDRESS, dbAddress) 4 | } 5 | 6 | function getDbAddress() { 7 | return localStorage.getItem(KEY_DB_ADDRESS) 8 | } 9 | 10 | // 数据库用户名 11 | function setDbUsername(dbUsername) { 12 | localStorage.setItem(KEY_DB_USERNAME, dbUsername) 13 | } 14 | 15 | function getDbUsername() { 16 | return localStorage.getItem(KEY_DB_USERNAME) 17 | } 18 | 19 | // 数据库密码 20 | function setDbPassword(dbPassword) { 21 | localStorage.setItem(KEY_DB_PASSWORD, dbPassword) 22 | } 23 | 24 | function getDbPassword() { 25 | return localStorage.getItem(KEY_DB_PASSWORD) 26 | } 27 | 28 | // 作者 29 | function setAuthor(author) { 30 | localStorage.setItem(KEY_AUTHOR, author) 31 | } 32 | 33 | function getAuthor() { 34 | return localStorage.getItem(KEY_AUTHOR) 35 | } 36 | 37 | function removeAuthor() { 38 | return localStorage.removeItem(KEY_AUTHOR) 39 | } 40 | 41 | // 输出目录 42 | function setOutputDir(outputDir) { 43 | localStorage.setItem(KEY_OUTPUT_DIR, outputDir) 44 | } 45 | 46 | function getOutputDir() { 47 | return localStorage.getItem(KEY_OUTPUT_DIR) 48 | } 49 | 50 | // 列表-数据库 51 | function setListDb(list) { 52 | let val = JSON.stringify(list) 53 | localStorage.setItem(KEY_LIST_DB, val) 54 | } 55 | 56 | function getListDb() { 57 | let val = localStorage.getItem(KEY_LIST_DB) 58 | return JSON.parse(val) 59 | } 60 | 61 | function removeListDb() { 62 | return localStorage.removeItem(KEY_LIST_DB) 63 | } 64 | 65 | // 数据配置 66 | function setDataConfig(obj) { 67 | let val = JSON.stringify(obj) 68 | localStorage.setItem(KEY_DATA_CONFIG, val) 69 | } 70 | 71 | function getDataConfig() { 72 | let val = localStorage.getItem(KEY_DATA_CONFIG) 73 | return JSON.parse(val) 74 | } 75 | 76 | function removeDataConfig() { 77 | return localStorage.removeItem(KEY_DATA_CONFIG) 78 | } -------------------------------------------------------------------------------- /src/main/java/com/fengwenyi/codegenerator/controller/IndexController.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator.controller; 2 | 3 | import com.fengwenyi.api.result.ResultTemplate; 4 | //import com.fengwenyi.apistarter.annotation.IgnoreResponseAdvice; 5 | import com.fengwenyi.codegenerator.config.ErwinProperties; 6 | import com.fengwenyi.codegenerator.service.IIndexService; 7 | import com.fengwenyi.codegenerator.vo.CodeGeneratorRequestVo; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Controller; 10 | import org.springframework.ui.Model; 11 | import org.springframework.validation.annotation.Validated; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | /** 15 | * @author Erwin Feng 16 | * @since 2021-07-12 17 | */ 18 | @Controller 19 | public class IndexController { 20 | 21 | private IIndexService indexService; 22 | private ErwinProperties erwinProperties; 23 | 24 | @RequestMapping("/") 25 | public String index(Model model) { 26 | model.addAttribute("version", erwinProperties.getApp().getVersion()); 27 | return "index"; 28 | } 29 | 30 | @PostMapping("/code-generator") 31 | @ResponseBody 32 | public ResultTemplate codeGenerator(@RequestBody @Validated CodeGeneratorRequestVo requestVo) { 33 | return indexService.codeGenerator(requestVo); 34 | } 35 | 36 | @Autowired 37 | public void setIndexService(IIndexService indexService) { 38 | this.indexService = indexService; 39 | } 40 | 41 | @Autowired 42 | public void setErwinProperties(ErwinProperties erwinProperties) { 43 | this.erwinProperties = erwinProperties; 44 | } 45 | 46 | @PostMapping("/versionCheck") 47 | @ResponseBody 48 | // @IgnoreResponseAdvice 49 | public String versionCheck() { 50 | return indexService.versionCheck(erwinProperties.getApp().getVersion()); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/fengwenyi/codegenerator/Config.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator; 2 | 3 | /** 4 | * @author Erwin Feng 5 | * @since 2019-04-17 12:04 6 | */ 7 | public class Config { 8 | 9 | /** 包名:controller */ 10 | public static final String PACKAGE_NAME_CONTROLLER = "controller"; 11 | 12 | /** 包名:service */ 13 | public static final String PACKAGE_NAME_SERVICE = "repository"; 14 | 15 | /** 包名:service.impl */ 16 | public static final String PACKAGE_NAME_SERVICE_IMPL = "repository.impl"; 17 | 18 | /** 包名:model */ 19 | public static final String PACKAGE_NAME_MODEL = "entity"; 20 | 21 | /** 包名:dao */ 22 | public static final String PACKAGE_NAME_DAO = "dao"; 23 | 24 | /** 目录名:xml */ 25 | public static final String DIR_NAME_XML = "mapper"; 26 | 27 | /** 文件名后缀:Model */ 28 | public static final String FILE_NAME_MODEL = "%sEntity"; 29 | 30 | /** 文件名后缀:Dao */ 31 | public static final String FILE_NAME_DAO = "I%sDao"; 32 | 33 | /** 文件名后缀:Mapper */ 34 | public static final String FILE_NAME_XML = "%sMapper"; 35 | 36 | /** MP开头,Service结尾 */ 37 | public static final String FILE_NAME_SERVICE = "MP%sRepository"; 38 | 39 | /** 文件名后缀:ServiceImpl */ 40 | public static final String FILE_NAME_SERVICE_IMPL = "%sRepositoryImpl"; 41 | 42 | /** 文件名后缀:Controller */ 43 | public static final String FILE_NAME_CONTROLLER = "%sController"; 44 | 45 | /** 逻辑删除字段 */ 46 | public static final String FIELD_LOGIC_DELETE_NAME = "delete_status"; 47 | 48 | 49 | /** 乐观锁字段名 */ 50 | public static final String FIELD_VERSION_NAME = "version"; 51 | 52 | /** 作者 */ 53 | public static final String AUTHOR = "Erwin Feng"; 54 | 55 | /** 生成文件的输出目录 */ 56 | public static String PROJECT_PATH = System.getProperty("user.dir"); 57 | 58 | /** 输出目录 */ 59 | public static final String OUTPUT_DIR = PROJECT_PATH + "/temp/code-generator"; 60 | 61 | /** 模板引擎。velocity / freemarker / beetl */ 62 | public static final String TEMPLATE_ENGINE = "velocity"; 63 | 64 | /** 是否支持Swagger,默认不支持 */ 65 | public static final Boolean SWAGGER_SUPPORT = false; 66 | 67 | } 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MyBatis-Plus 代码生成器 2 | 3 | ## Current Version 4 | 5 | 3.5.7-1 6 | 7 | 说明: 除最后一位,前面的为mybatis-plus-generator的版本号,最后一位为该版本迭代次数。 8 | 9 | 10 | 11 | ## 概述 12 | 13 | 代码生成器,又被叫做逆向工程,MyBatis官方为了推广,自己也写了一个,我之前也使用这个,功能也是非常强大,强大以为支持自定义配置,那么问题来了,我该怎么配置才合理呢,所以,有人把所有的配置项都弄成中文的,还有人开发了生成插件,这些在我以往的博文中都看看到。MyBatis-Plus的代码生成器到底怎么样,这我就不评判了,我就这样说,用用看吧。 14 | 15 | **功能列表:** 16 | 17 | * [x] 自动生成model类 18 | 19 | * [x] 自动生成dao接口 20 | 21 | * [x] 自动生成xml文件 22 | 23 | * [x] 自动生成service接口 24 | 25 | * [x] 自动生成service实现类 26 | 27 | * [x] model支持Builder模式 28 | 29 | * [x] 支持swagger2 30 | 31 | * [x] 支持生成数据库字段常量 32 | 33 | * [x] 支持生成Kotlin代码 34 | 35 | * [x] ……more…… 36 | 37 | ## 使用指南 38 | 39 | ### 启动项目 40 | 41 | #### 方案1: jar 42 | 43 | 下载:[mybatis-plus-code-generator-3.5.7-1.jar](https://github.com/fengwenyi/mybatis-plus-code-generator/releases/download/3.5.4.1-2/mybatis-plus-code-generator-3.5.7-1.jar) 44 | 45 | 运行: 46 | 47 | ```shell 48 | java -jar mybatis-plus-code-generator-3.5.7-1.jar 49 | ``` 50 | 51 | #### 方案2: docker 52 | 53 | ```shell 54 | # 拉取镜像 55 | docker pull fengwenyi/mybatis-plus-code-generator 56 | 57 | # 启动服务 58 | docker run -d -p 8899:8899 --name code-generator -v ~/temp:/temp fengwenyi/mybatis-plus-code-generator 59 | 60 | # 查看日志 61 | docker logs -f code-generator 62 | 63 | # 进入容器 64 | docker exec -it code-generator sh 65 | # or 66 | docker attach code-generator 67 | ``` 68 | 69 | 挂在目录说明: 70 | 71 | > ~/temp:/temp 72 | 73 | 冒号前面为挂在的目录,你这个自定义,比如:e:/temp。 74 | 75 | 冒号后面为docker容器目录。 76 | 77 | #### 方案3: git clone 78 | 79 | 将项目git clone到本地,运行即可。 80 | 81 | 82 | #### 访问 83 | 84 | > http://localhost:8899 85 | 86 | 访问上面地址,你就会看的如下高端、大气、上档次的界面了。 87 | 88 | ![](./images/home-20210726.png) 89 | 90 | ### 生成代码 91 | 92 | #### 填写表单信息 93 | 94 | 必填的主要有两部分,包名和数据库连接信息配置。 95 | 96 | 这里的包名,指的是,生成的数据库相关的类,要放在哪个包下面。 97 | 98 | ![](./images/example-2021072701.jpg) 99 | 100 | #### 生成代码 101 | 102 | 会生成如下文件: 103 | 104 | ![](./images/example-2021072702.jpg) 105 | 106 | 数据库表如下: 107 | 108 | ![](./images/example-2021072703.jpg) 109 | 110 | 111 | 112 | ## 其他 113 | 114 | [更新日志](LOG.md) 115 | 116 | 117 | 忽略的字段: 118 | 119 | ``` 120 | id 121 | create_date_time 122 | update_date_time 123 | status 124 | 125 | create_user_id 126 | create_user_name 127 | update_user_id 128 | update_user_name 129 | enabled_state 130 | deleted_state 131 | ``` 132 | 133 | ## 问题 134 | 135 | - docker本机部署,数据库也在本地,数据库连接地址不能是localhost或者127.0.0.1,要填本机IP -------------------------------------------------------------------------------- /src/main/java/com/fengwenyi/codegenerator/vo/CodeGeneratorRequestVo.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author Erwin Feng 7 | * @since 2021-07-12 8 | */ 9 | @Data 10 | public class CodeGeneratorRequestVo { 11 | 12 | // 包名 13 | private String packageName; 14 | 15 | // 数据库类型 16 | private String dbTypeName; 17 | // 数据库服务器 18 | private String host; 19 | // 数据库名称 20 | private String username; 21 | // 数据库密码 22 | private String password; 23 | // 数据库驱动 24 | private String driver; 25 | // 数据库名称 26 | private String dbName; 27 | 28 | // 表名 29 | private String tableNames; 30 | // 表前缀 31 | private String tablePrefixes; 32 | // 字段前缀 33 | private String fieldPrefixes; 34 | // 排出表的表名 35 | private String excludeTableNames; 36 | // 忽略的字段 37 | private String ignoreColumns; 38 | 39 | // 作者 40 | private String author; 41 | // 输入目录 42 | private String outDir; 43 | 44 | // 实体类包名 45 | private String packageEntity; 46 | // mapper包名 47 | private String packageMapper; 48 | // mapper XML目录名 49 | private String packageMapperXml; 50 | // service包名 51 | private String packageService; 52 | // serviceImpl包名 53 | private String packageServiceImpl; 54 | // controller包名 55 | private String packageController; 56 | 57 | // 实体类文件名格式 58 | private String fileNamePatternEntity; 59 | // mapper文件名格式 60 | private String fileNamePatternMapper; 61 | // mapper XML文件名格式 62 | private String fileNamePatternMapperXml; 63 | // service文件名格式 64 | private String fileNamePatternService; 65 | // serviceImpl文件名格式 66 | private String fileNamePatternServiceImpl; 67 | // controller文件名格式 68 | private String fileNamePatternController; 69 | 70 | // 逻辑删除字段 71 | private String fieldLogicDelete; 72 | // 乐观锁字段 73 | private String fieldVersion; 74 | 75 | // 模版引擎 76 | private String templateEngine; 77 | // 是否支持Swagger 78 | private Boolean swaggerSupport; 79 | // JDK版本 80 | private String jdkVersion; 81 | // 日期时间类型 82 | private String dateTimeType; 83 | 84 | // 是否开启Lombok 85 | private Boolean lombokModel; 86 | // 是否使用构建者模型 87 | private Boolean lombokChainModel; 88 | 89 | // 字段注解 90 | private Boolean fieldAnnotation; 91 | 92 | // 列常量 93 | private Boolean columnConstant; 94 | 95 | // 二级缓存 96 | private Boolean enableCache; 97 | 98 | // 基础结果Map 99 | private Boolean baseResultMap; 100 | 101 | // 基础列名List 102 | private Boolean baseColumnList; 103 | 104 | // 实体父类的全类名 105 | private String superClassName; 106 | 107 | // mapper注解 108 | private Boolean mapperAnnotation; 109 | 110 | } 111 | -------------------------------------------------------------------------------- /src/main/java/com/fengwenyi/codegenerator/bo/CodeGeneratorBo.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator.bo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | /** 7 | * @author Erwin Feng 8 | * @since 2021-07-14 9 | */ 10 | @Data 11 | @Accessors(chain = true) 12 | public class CodeGeneratorBo { 13 | 14 | // 包名 15 | private String packageName; 16 | 17 | // 数据库类型 18 | private String dbType; 19 | // 数据库连接地址 20 | private String dbUrl; 21 | // 数据库名称 22 | private String username; 23 | // 数据库密码 24 | private String password; 25 | // 数据库驱动 26 | private String driver; 27 | 28 | // 表名 29 | private String [] tableNames; 30 | // 表前缀 31 | private String [] tablePrefixes; 32 | // 字段前缀 33 | private String [] fieldPrefixes; 34 | // 排出表的表名 35 | private String [] excludeTableNames; 36 | // 忽略的字段 37 | private String [] ignoreColumns; 38 | 39 | // 作者 40 | private String author; 41 | // 输入目录 42 | private String outDir; 43 | 44 | // 实体类包名 45 | private String packageEntity; 46 | // mapper包名 47 | private String packageMapper; 48 | // mapper XML目录名 49 | private String packageMapperXml; 50 | // service包名 51 | private String packageService; 52 | // serviceImpl包名 53 | private String packageServiceImpl; 54 | // controller包名 55 | private String packageController; 56 | 57 | // 实体类文件名格式 58 | private String fileNamePatternEntity; 59 | // mapper文件名格式 60 | private String fileNamePatternMapper; 61 | // mapper XML文件名格式 62 | private String fileNamePatternMapperXml; 63 | // service文件名格式 64 | private String fileNamePatternService; 65 | // serviceImpl文件名格式 66 | private String fileNamePatternServiceImpl; 67 | // controller文件名格式 68 | private String fileNamePatternController; 69 | 70 | // 逻辑删除字段 71 | private String fieldLogicDelete; 72 | // 乐观锁字段 73 | private String fieldVersion; 74 | 75 | // 模版引擎 76 | private String templateEngine; 77 | // 是否支持Swagger 78 | private Boolean swaggerSupport; 79 | // JDK版本 80 | private String jdkVersion; 81 | // 日期时间类型 82 | private String dateTimeType; 83 | 84 | // 是否开启Lombok 85 | private Boolean lombokModel; 86 | 87 | // 是否使用构建者模型 88 | private Boolean lombokChainModel; 89 | 90 | // 字段注解 91 | private Boolean fieldAnnotation; 92 | 93 | // 列常量 94 | private Boolean columnConstant; 95 | 96 | // 二级缓存 97 | private Boolean enableCache; 98 | 99 | // 基础结果Map 100 | private Boolean baseResultMap; 101 | 102 | // 基础列名List 103 | private Boolean baseColumnList; 104 | 105 | // 实体父类的全类名 106 | private String superClassName; 107 | 108 | // mapper注解 109 | private Boolean mapperAnnotation; 110 | 111 | 112 | } 113 | -------------------------------------------------------------------------------- /src/main/resources/static/css/index.css: -------------------------------------------------------------------------------- 1 | 2 | html { 3 | font-size: 62.5%; 4 | } 5 | 6 | .home-bg { 7 | width: 100%; 8 | height: 100vh; 9 | position: absolute; 10 | top: 0; 11 | left: 0; 12 | z-index: -1; 13 | overflow: hidden; 14 | } 15 | 16 | .home-bg:after { 17 | position: absolute; 18 | top: -20px; 19 | right: -20px; 20 | bottom: -20px; 21 | left: -20px; 22 | content: ''; 23 | z-index: -1; 24 | /*background-image: url('https://api.dujin.org/bing/1366.php');*/ 25 | background-image: url('/static/images/bg.jpg'); 26 | background-repeat: no-repeat; 27 | -webkit-background-size: cover; 28 | -moz-background-size: cover; 29 | -o-background-size: cover; 30 | background-size: cover; 31 | background-position: 50% 50%; 32 | /*-webkit-filter: blur(10px);*/ 33 | /*filter: blur(10px);*/ 34 | } 35 | 36 | .header { 37 | width: 100%; 38 | height: 100px; 39 | display: flex; 40 | align-items: center; 41 | } 42 | 43 | .header .logo { 44 | height: 60px; 45 | border-radius: 10px; 46 | } 47 | 48 | .header .title { 49 | margin-left: 20px; 50 | color: #333; 51 | } 52 | 53 | .form-container { 54 | margin-top: 30px; 55 | width: 500px; 56 | border-right: 1px solid #eee; 57 | padding-right: 100px; 58 | } 59 | 60 | .layui-form-label { 61 | width: 120px; 62 | } 63 | 64 | .layui-input-block { 65 | margin-left: 150px; 66 | } 67 | 68 | .red-star { 69 | color: #FF5722; 70 | margin-right: 5px; 71 | } 72 | 73 | .main-panel { 74 | width: calc(100% - 100px); 75 | min-height: 500px; 76 | display: flex; 77 | background-color: #fff; 78 | padding: 50px; 79 | border-radius: 5px; 80 | box-shadow: 0 0 10px #333; 81 | opacity: .95; 82 | } 83 | 84 | .main-panel .main-left-panel { 85 | width: 470px; 86 | min-height: 100px; 87 | position: relative; 88 | } 89 | 90 | .main-panel .main-right-panel { 91 | width: calc(100% - 600px); 92 | min-height: 100px; 93 | border-left: 1px solid #ccc; 94 | margin-left: 80px; 95 | padding-left: 50px; 96 | } 97 | 98 | .panel-submit-btn { 99 | /*margin-top: 6rem;*/ 100 | position: absolute; 101 | bottom: 1rem; 102 | } 103 | 104 | .bottom-panel { 105 | margin-top: 2rem; 106 | } 107 | 108 | 109 | .box-database-config { 110 | padding: 30px; 111 | width: 500px; 112 | display: none; 113 | } 114 | 115 | 116 | 117 | .footer { 118 | margin-top: 100px; 119 | margin-bottom: 50px; 120 | font-size: 1.4rem; 121 | color: #777; 122 | } 123 | 124 | .footer .btn-upgrade { 125 | margin-left: 10px; 126 | } 127 | 128 | .footer .box-links { 129 | margin-top: 1rem; 130 | } 131 | 132 | .footer .box-links a { 133 | color: #06c; 134 | } 135 | 136 | .footer .box-links a:hover { 137 | text-decoration: underline; 138 | } 139 | 140 | .footer .box-copyright { 141 | 142 | } 143 | 144 | .footer .box-copyright a { 145 | color: #777; 146 | text-decoration: underline; 147 | } -------------------------------------------------------------------------------- /src/main/java/com/fengwenyi/codegenerator/service/impl/IndexServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator.service.impl; 2 | 3 | import com.baomidou.mybatisplus.annotation.DbType; 4 | import com.fengwenyi.api.result.ResultTemplate; 5 | import com.fengwenyi.codegenerator.bo.CodeGeneratorBo; 6 | import com.fengwenyi.codegenerator.generator.MyAutoGenerator; 7 | import com.fengwenyi.codegenerator.service.IIndexService; 8 | import com.fengwenyi.codegenerator.vo.CodeGeneratorRequestVo; 9 | import com.fengwenyi.javalib.http.HttpUtils; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.apache.commons.lang3.exception.ExceptionUtils; 12 | import org.springframework.beans.BeanUtils; 13 | import org.springframework.stereotype.Service; 14 | import org.springframework.util.StringUtils; 15 | 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | /** 20 | * @author Erwin Feng 21 | * @since 2021-07-12 22 | */ 23 | @Service 24 | @Slf4j 25 | public class IndexServiceImpl implements IIndexService { 26 | 27 | @Override 28 | public ResultTemplate codeGenerator(CodeGeneratorRequestVo requestVo) { 29 | 30 | CodeGeneratorBo bo = new CodeGeneratorBo(); 31 | 32 | BeanUtils.copyProperties(requestVo, bo); 33 | 34 | handleDb(requestVo, bo); 35 | handleTable(requestVo, bo); 36 | 37 | return execute(bo); 38 | 39 | } 40 | 41 | @Override 42 | public String versionCheck(String version) { 43 | String url = "https://windrunner-api.fengwenyi.com/wr-basic/app-version/check?" + 44 | "appCode=mybatis-plus-code-generator&version=" + version; 45 | return HttpUtils.get(url); 46 | } 47 | 48 | private ResultTemplate execute(CodeGeneratorBo bo) { 49 | try { 50 | new MyAutoGenerator(bo).execute(); 51 | return ResultTemplate.success(); 52 | } catch (Exception e) { 53 | String errMsg = ExceptionUtils.getStackTrace(e); 54 | log.error(errMsg); 55 | } 56 | return ResultTemplate.fail(); 57 | } 58 | 59 | 60 | // 处理数据库 61 | private void handleDb(CodeGeneratorRequestVo requestVo, CodeGeneratorBo bo) { 62 | String dbUrl = ""; 63 | String username = requestVo.getUsername(); 64 | String password = requestVo.getPassword(); 65 | String driver = ""; 66 | if (!StringUtils.hasText(requestVo.getDbTypeName()) 67 | || DbType.getDbType(requestVo.getDbTypeName()) == DbType.MYSQL) { 68 | // mysql 69 | dbUrl = "jdbc:mysql://" + requestVo.getHost() + "/" + requestVo.getDbName(); 70 | driver = "com.mysql.cj.jdbc.Driver"; 71 | } else if (DbType.getDbType(requestVo.getDbTypeName()) == DbType.ORACLE) { 72 | dbUrl = "jdbc:oracle:thin:@" + requestVo.getHost() + ":" + requestVo.getDbName(); 73 | driver = "oracle.jdbc.OracleDriver"; 74 | } else if (DbType.getDbType(requestVo.getDbTypeName()) == DbType.SQL_SERVER){ 75 | dbUrl = "jdbc:sqlserver://" + requestVo.getHost() + ";DatabaseName=" + requestVo.getDbName(); 76 | driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; 77 | } else if (DbType.getDbType(requestVo.getDbTypeName()) == DbType.POSTGRE_SQL) { 78 | dbUrl = "jdbc:postgresql://" + requestVo.getHost() + "/" + requestVo.getDbName(); 79 | driver = "org.postgresql.Driver"; 80 | } else { 81 | // Asserts.fail("暂不支持的数据库类型"); 82 | throw new RuntimeException("暂不支持的数据库类型"); 83 | } 84 | bo.setDbUrl(dbUrl).setDriver(driver).setUsername(username).setPassword(password); 85 | } 86 | 87 | // 处理表 88 | private void handleTable(CodeGeneratorRequestVo requestVo, CodeGeneratorBo bo) { 89 | bo 90 | .setTableNames(split(requestVo.getTableNames())) 91 | .setTablePrefixes(split(requestVo.getTablePrefixes())) 92 | .setFieldPrefixes(split(requestVo.getFieldPrefixes())) 93 | .setExcludeTableNames(split(requestVo.getExcludeTableNames())) 94 | .setIgnoreColumns(split(requestVo.getIgnoreColumns())) 95 | ; 96 | } 97 | 98 | private String[] split(String value) { 99 | if (!StringUtils.hasText(value)) { 100 | return new String[]{}; 101 | } 102 | List valueList = new ArrayList<>(); 103 | String[] values; 104 | if (value.contains(",")) { 105 | values = value.split(","); 106 | } else if (value.contains("\n")) { 107 | values = value.split("\n"); 108 | } else { 109 | values = value.split(" "); 110 | } 111 | for (String str : values) { 112 | str = str.trim(); 113 | if (StringUtils.hasText(str)) { 114 | valueList.add(str); 115 | } 116 | } 117 | String[] result = new String[valueList.size()]; 118 | return valueList.toArray(result); 119 | } 120 | 121 | } 122 | -------------------------------------------------------------------------------- /src/main/java/com/fengwenyi/codegenerator/generator/MyAutoGenerator.java: -------------------------------------------------------------------------------- 1 | package com.fengwenyi.codegenerator.generator; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.generator.FastAutoGenerator; 5 | import com.baomidou.mybatisplus.generator.config.DataSourceConfig; 6 | import com.baomidou.mybatisplus.generator.config.GlobalConfig; 7 | import com.baomidou.mybatisplus.generator.config.PackageConfig; 8 | import com.baomidou.mybatisplus.generator.config.StrategyConfig; 9 | import com.baomidou.mybatisplus.generator.config.builder.Entity; 10 | import com.baomidou.mybatisplus.generator.config.builder.Mapper; 11 | import com.baomidou.mybatisplus.generator.config.rules.DateType; 12 | import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; 13 | import com.fengwenyi.codegenerator.Config; 14 | import com.fengwenyi.codegenerator.bo.CodeGeneratorBo; 15 | import org.apache.commons.lang3.BooleanUtils; 16 | import org.springframework.util.StringUtils; 17 | 18 | /** 19 | * @author Erwin Feng 20 | * @since 2021-09-26 21 | */ 22 | public class MyAutoGenerator { 23 | 24 | private final CodeGeneratorBo bo; 25 | 26 | public MyAutoGenerator(CodeGeneratorBo bo) { 27 | this.bo = bo; 28 | } 29 | 30 | public void execute() { 31 | FastAutoGenerator.create(dataSourceBuilder()) 32 | .globalConfig(this::globalConfigBuilder) 33 | .packageConfig(this::packageConfigBuilder) 34 | .strategyConfig(this::strategyConfigBuilder) 35 | .execute(); 36 | } 37 | 38 | public DataSourceConfig.Builder dataSourceBuilder() { 39 | return new DataSourceConfig.Builder(bo.getDbUrl(), bo.getUsername(), bo.getPassword()); 40 | } 41 | 42 | public void globalConfigBuilder(GlobalConfig.Builder builder) { 43 | 44 | builder.author(bo.getAuthor()); 45 | 46 | String outDir = Config.OUTPUT_DIR; 47 | if (StringUtils.hasText(bo.getOutDir())) { 48 | outDir = bo.getOutDir(); 49 | } 50 | builder.outputDir(outDir); 51 | 52 | /*if (!"8".equalsIgnoreCase(bo.getJdkVersion())) { 53 | 54 | }*/ 55 | 56 | DateType dateType = DateType.TIME_PACK; 57 | if ("java.util".equalsIgnoreCase(bo.getDateTimeType())) { 58 | dateType = DateType.ONLY_DATE; 59 | } 60 | builder.dateType(dateType); 61 | 62 | if (BooleanUtils.isTrue(bo.getSwaggerSupport())) { 63 | builder.enableSwagger(); 64 | } 65 | 66 | } 67 | 68 | public void packageConfigBuilder(PackageConfig.Builder builder) { 69 | builder 70 | .parent(bo.getPackageName()) 71 | // builder.moduleName(""); 72 | .controller(bo.getPackageController()) 73 | .entity(bo.getPackageEntity()) 74 | .mapper(bo.getPackageMapper()) 75 | .xml(bo.getPackageMapperXml()) 76 | .service(bo.getPackageService()) 77 | .serviceImpl(bo.getPackageServiceImpl()); 78 | } 79 | 80 | public void strategyConfigBuilder(StrategyConfig.Builder builder) { 81 | builder.addInclude(bo.getTableNames()) 82 | .addFieldPrefix(bo.getFieldPrefixes()) 83 | .addTablePrefix(bo.getTablePrefixes()) 84 | .addExclude(bo.getExcludeTableNames()) 85 | .entityBuilder() 86 | .naming(NamingStrategy.underline_to_camel) 87 | //.enableChainModel() 88 | //.enableLombok() 89 | //.enableActiveRecord() 90 | .formatFileName(bo.getFileNamePatternEntity()) 91 | .idType(IdType.ASSIGN_ID) 92 | .logicDeleteColumnName(bo.getFieldLogicDelete()) 93 | .versionColumnName(bo.getFieldVersion()) 94 | .superClass(bo.getSuperClassName()) 95 | .addIgnoreColumns(bo.getIgnoreColumns()) 96 | .mapperBuilder() 97 | .formatMapperFileName(bo.getFileNamePatternMapper()) 98 | .formatXmlFileName(bo.getFileNamePatternMapperXml()) 99 | .serviceBuilder() 100 | .formatServiceFileName(bo.getFileNamePatternService()) 101 | .formatServiceImplFileName(bo.getFileNamePatternServiceImpl()) 102 | .controllerBuilder() 103 | .enableRestStyle() 104 | .enableHyphenStyle(); 105 | 106 | Entity.Builder entityBuilder = builder.entityBuilder(); 107 | if (BooleanUtils.isTrue(bo.getLombokChainModel())) { 108 | entityBuilder.enableChainModel(); 109 | } 110 | if (BooleanUtils.isTrue(bo.getLombokModel())) { 111 | entityBuilder.enableLombok(); 112 | } 113 | if (BooleanUtils.isTrue(bo.getColumnConstant())) { 114 | entityBuilder.enableColumnConstant(); 115 | } 116 | // 字段注解 117 | if (BooleanUtils.isTrue(bo.getFieldAnnotation())) { 118 | entityBuilder.enableTableFieldAnnotation(); 119 | } 120 | 121 | Mapper.Builder mapperBuilder = builder.mapperBuilder(); 122 | if (BooleanUtils.isTrue(bo.getBaseResultMap())) { 123 | mapperBuilder.enableBaseResultMap(); 124 | } 125 | if (BooleanUtils.isTrue(bo.getBaseColumnList())) { 126 | mapperBuilder.enableBaseColumnList(); 127 | } 128 | 129 | // 开启mapper注解 130 | if (BooleanUtils.isTrue(bo.getMapperAnnotation())) { 131 | mapperBuilder.enableMapperAnnotation(); 132 | } 133 | } 134 | 135 | } 136 | -------------------------------------------------------------------------------- /LOG.md: -------------------------------------------------------------------------------- 1 | # 更新日志 2 | 3 | ## v3.5.7-1 (2024-08-11) 4 | 5 | 从这个版本开始,采用 Java 17,spring boot 使用 3 系列 6 | 7 | :arrow_up: Dependency Upgrades 8 | 9 | - Upgrade to Spring Boot 3.3.2 10 | - java version 17 11 | 12 | 13 | ## v3.5.4.1-2 (2023-12-16) 14 | 15 | 这个版本主要是对前端库 layui 进行版本升级 16 | 17 | :arrow_up: Dependency Upgrades 18 | 19 | - Upgrade to Spring Boot 2.7.18 20 | - Upgrade to layui 2.9.0 21 | 22 | 不再提供单独的下载链接! 23 | 24 | 25 | ## v3.5.4.1-1 (2023-11-26) 26 | 27 | :star: New Features 28 | 29 | - 支持 PostgreSQL 30 | - mapper接口文件命名:I%sMapper, service接口文件命名:IMp%sService, serviceImpl文件命名:Mp%sServiceImpl。 31 | - service 包名改为 mp 32 | 33 | :arrow_up: Dependency Upgrades 34 | 35 | - Upgrade to Spring Boot 2.7.17 36 | - Upgrade to mybatis-plus-generator 3.5.4.1 37 | - Upgrade to mybatis-plus 3.5.4.1 38 | - Upgrade to JavaLib 2.2.2 39 | 40 | :bug: Bug Fixes 41 | 42 | - 应该是一处判断错误导致始终无法使用util.Date ([#33](https://github.com/fengwenyi/mybatis-plus-code-generator/pull/33)) 43 | 44 | 45 | ## v3.5.2.8 46 | 47 | 这是一个常规版本升级。 48 | 49 | :star: New Features 50 | 51 | - 更改日期时间类型选择描述。(之前是 jdk 版本) 52 | - 逻辑删除字段名称:deleted_state。(之前是 delete_state) 53 | - jdk 版本改为 8。(之前是 17,spring boot 3.0.0 会改回17) 54 | 55 | :arrow_up: Dependency Upgrades 56 | 57 | - Upgrade to Spring Boot 2.7.6 58 | - Upgrade to JavaLib 2.2.2 59 | 60 | 61 | 62 | ## v3.5.2.7 63 | 64 | 2022.06.27 ~ 2022.07.02 65 | 66 | :star: New Features 67 | 68 | - 控制台提供访问地址日志打印,点击即可访问 69 | 70 | :bug: Bug Fixes 71 | 72 | - 修复版本校验更新失败的问题 ([#31](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/31)) 73 | 74 | 75 | 76 | ## v3.5.2.6 77 | 78 | 2022.06.20 ~ 2022.06.25 79 | 80 | :star: New Features 81 | 82 | - 配置支持缓存 ([#22](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/22)) 83 | - 优化 Dao 文件名,去掉前缀 `I` 84 | - 优化 Repository 文件名,去掉前缀 `MP` 85 | 86 | 87 | :arrow_up: Dependency Upgrades 88 | 89 | - Upgrade to Spring Boot 2.7.1 90 | - Upgrade to api-spring-boot-starter 1.3.2 91 | 92 | 93 | 94 | ## v3.5.2.5 95 | 96 | 2022.04.22 ~ 2022.06.07 97 | 98 | - 【fix】修复版本更新内容可能乱码的问题 [#29](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/29) 99 | - 【Upgrade】Upgrade to Spring Boot 2.7.0 100 | - 【Upgrade】Upgrade to MyBatis Plus 3.5.2 101 | - 【Upgrade】Upgrade to api-spring-boot-starter 1.3.0 102 | - 【Upgrade】Upgrade to mysql8 8.0.29 103 | - 【Upgrade】Upgrade to SQL Server 10.2.1.jre17 104 | - 【Dependency】dependency JavaLib 2.1.6 105 | 106 | 107 | ## v3.5.2.4 108 | 109 | 2022.04.10 ~ 2022.04.20 110 | 111 | - 【修复】修复每次版本升级校验时,最新版不出现弹窗 [#28](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/28) 112 | - 【优化】优化版本检查接口,让用户无感知 113 | - 【升级】api-spring-boot-starter -> 1.2.0 114 | 115 | ## v3.5.2.3 116 | 117 | 2022.04.09 ~ 2022.04.10 118 | 119 | - 【新增】正式支持配置多个数据源 120 | - 【新增】支持版本更新检查 121 | - 【升级】api-spring-boot-starter -> 1.0.1 122 | 123 | ## v3.5.2.2 124 | 125 | 2022.04.03 ~ 2022.04.04 126 | 127 | - 【升级】spring boot 2.6.6 128 | - 【升级】mysql8 8.0.28 129 | 130 | ## v3.5.2.1 131 | 132 | 2021.11.30 - 2022.03.08 133 | 134 | - 【尝鲜】数据库可以配置多个(浏览器刷新会清空)。 135 | - 【优化】docker容器中jar名称改为 `mybatis-plus-code-generator.jar` 136 | - 【优化】打包发布命令自动获取版本 137 | - 【升级】spring boot 2.6.4 138 | - 【升级】MyBatis-Plus-Generator 3.5.2 139 | - 【升级】MyBatis-Plus 3.5.1 140 | - 【升级】beetl 3.10.0.RELEASE 141 | - 【升级】SQL Server 10.2.0.jre17 142 | 143 | ## v3.5.1.4 144 | 145 | 2021.11.28 146 | 147 | - 【变更】jdk 1.8 -> 17。 148 | - 【变更】端口调整 8080 -> 8899。 149 | - 【新增】恢复支持docker部署。[#21](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/21) 150 | - 【新增】banner显示版本。 151 | - 【修复】修复前端页面解析接口响应提示信息字段不正确([#19](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/19)) 。 152 | - 【修复】修复作者个人网站链接地址不对的问题。 153 | - 【修复】docker形式部署,输出目录指向的是服务器。[#18](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/18) 154 | - 【调整】`可选配置` 和 `表配置` 交换。 155 | - 【优化】界面优化。 156 | - 【优化】优化shell脚本。[#20](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/20) 157 | - 【升级】spring-boot -> 2.6.0。 158 | - 【升级】beetl -> 3.8.1.RELEASE。 159 | 160 | 161 | ## v3.5.1.3 162 | 163 | 2021-10-21 164 | 165 | 这是一个BUG修复版本。 166 | 167 | - 【变更】不支持docker部署 168 | - 【修复】修复数据库类型前后端参数不一致,导致无法选择数据库类型的问题([#16](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/16)) 169 | - 【优化】代码优化,去除没有用到或者多余的代码 170 | - 【变更】逻辑删除字段,delete_status -> delete_state。 171 | - 【移除】删除自定义DbType,改用 `com.baomidou.mybatisplus.annotation.DbType` 172 | - 【升级】spring boot -> 2.5.6。 173 | - 【升级】api-spring-boot-starter -> 1.1.0。 174 | - 【升级】junit -> 1.13.2。 175 | 176 | ## v3.5.1.2 177 | 178 | 2021-10-14 179 | 180 | - 【新增】新增支持是否开启 `@Mapper` 配置([#5](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/5)) 181 | - 【新增】页面增加源码链接 182 | - 【新增】缓存数据库连接信息([#15](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/15)) 183 | - 【优化】界面优化 184 | - 【优化】使用必应图片作为背景,每日自动更换 185 | - 【清理】pom.xml 186 | - 【升级】mssql-jdbc -> 9.4.0.jre16 187 | - 【升级】velocity-engine-core -> 2.3 188 | - 【升级】freemarker -> 2.3.31 189 | - 【升级】beetl -> 3.7.0.RELEASE 190 | 191 | ## v3.5.1.1 192 | 193 | 2021-09-26 194 | 195 | - 【修复】修复上个版本,xml文件无法自定义目录的问题 196 | - 【变动】实体类,开启lombok注解,@Data变更为@Getter和@Setter 197 | - 【优化】重写MyAutoGenerator,与之前版本不兼容 198 | - 【优化】优化boolean处理 199 | - 【升级】mysql-plus-generator -> 3.5.1 200 | - 【升级】mysql-plus -> 3.4.3.4 201 | - 【升级】mysql8 -> 8.0.26 202 | - 【升级】mysql5 -> 5.1.49 203 | - 【升级】spring-boot -> 2.5.5 204 | 205 | 206 | ## v3.5.0.3 207 | 208 | - 【修复】修复关闭字段注解无效的问题。([#13](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/13)) 209 | - 【新增】服务docker化。([#12](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/12)) 210 | - 【升级】spring-boot 2.5.4 211 | - 【升级】api-spring-boot-starter 1.0.1 212 | 213 | ## v3.5.0.2 214 | 215 | - 【新增】新增忽略字段,继承父类的字段不再生成 216 | - 【修复】修复开启swagger支持报错问题([#9](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/9)) 217 | - 【修复】修复开启lombok却不生效的问题([#10](https://github.com/fengwenyi/mybatis-plus-code-generator/issues/10)) 218 | 219 | ## v3.5.0.1 220 | 221 | - mybatis-plus-generator版本升级到3.5.0 222 | - 生成器的代码重构,MyAutoGenerator 223 | - 更新阿里云Maven仓库地址 224 | - 引入 api-spring-boot-starter 依赖 225 | - 删除 CommonUtils 226 | - 删除全局异常处理,由 api-spring-boot-starter 处理 227 | - 删除业务异常(BizException),改为 api-spring-boot-starter 的 ApiException 228 | - 新增debug日志打印 229 | 230 | ## v3.4.1-3 231 | 232 | - 实体类支持lombok配置 #6 233 | - 实体类支持数据库字段配置 #7 234 | - XML自定义配置 #8 235 | 236 | ## 2021.07.27 237 | 238 | - 优化提供的默认值。 239 | - 修复说明文档运行命令不正确的问题。 240 | - 调整数据库信息输入的顺序。 241 | - 数据库密码输入框改为明文。 242 | - 优化说明文档。 243 | 244 | ## 2021.07.26 245 | 246 | - 提供更多配置。 247 | - 优化界面。 248 | - 加入banner。 249 | 250 | ## 2021.07.13 251 | 252 | - 通过UI界面录入数据库参数生成代码。 -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/css/modules/laydate/default/laydate.css: -------------------------------------------------------------------------------- 1 | .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;animation-name:laydate-downbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #C9C9C9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-footer span:hover{color:#5FB878}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#666}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#B5FFF8}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eee;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} -------------------------------------------------------------------------------- /src/main/resources/static/lib/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in iOS. 9 | */ 10 | 11 | html { 12 | line-height: 1.15; /* 1 */ 13 | -webkit-text-size-adjust: 100%; /* 2 */ 14 | } 15 | 16 | /* Sections 17 | ========================================================================== */ 18 | 19 | /** 20 | * Remove the margin in all browsers. 21 | */ 22 | 23 | body { 24 | margin: 0; 25 | } 26 | 27 | /** 28 | * Render the `main` element consistently in IE. 29 | */ 30 | 31 | main { 32 | display: block; 33 | } 34 | 35 | /** 36 | * Correct the font size and margin on `h1` elements within `section` and 37 | * `article` contexts in Chrome, Firefox, and Safari. 38 | */ 39 | 40 | h1 { 41 | font-size: 2em; 42 | margin: 0.67em 0; 43 | } 44 | 45 | /* Grouping content 46 | ========================================================================== */ 47 | 48 | /** 49 | * 1. Add the correct box sizing in Firefox. 50 | * 2. Show the overflow in Edge and IE. 51 | */ 52 | 53 | hr { 54 | box-sizing: content-box; /* 1 */ 55 | height: 0; /* 1 */ 56 | overflow: visible; /* 2 */ 57 | } 58 | 59 | /** 60 | * 1. Correct the inheritance and scaling of font size in all browsers. 61 | * 2. Correct the odd `em` font sizing in all browsers. 62 | */ 63 | 64 | pre { 65 | font-family: monospace, monospace; /* 1 */ 66 | font-size: 1em; /* 2 */ 67 | } 68 | 69 | /* Text-level semantics 70 | ========================================================================== */ 71 | 72 | /** 73 | * Remove the gray background on active links in IE 10. 74 | */ 75 | 76 | a { 77 | background-color: transparent; 78 | } 79 | 80 | /** 81 | * 1. Remove the bottom border in Chrome 57- 82 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 83 | */ 84 | 85 | abbr[title] { 86 | border-bottom: none; /* 1 */ 87 | text-decoration: underline; /* 2 */ 88 | text-decoration: underline dotted; /* 2 */ 89 | } 90 | 91 | /** 92 | * Add the correct font weight in Chrome, Edge, and Safari. 93 | */ 94 | 95 | b, 96 | strong { 97 | font-weight: bolder; 98 | } 99 | 100 | /** 101 | * 1. Correct the inheritance and scaling of font size in all browsers. 102 | * 2. Correct the odd `em` font sizing in all browsers. 103 | */ 104 | 105 | code, 106 | kbd, 107 | samp { 108 | font-family: monospace, monospace; /* 1 */ 109 | font-size: 1em; /* 2 */ 110 | } 111 | 112 | /** 113 | * Add the correct font size in all browsers. 114 | */ 115 | 116 | small { 117 | font-size: 80%; 118 | } 119 | 120 | /** 121 | * Prevent `sub` and `sup` elements from affecting the line height in 122 | * all browsers. 123 | */ 124 | 125 | sub, 126 | sup { 127 | font-size: 75%; 128 | line-height: 0; 129 | position: relative; 130 | vertical-align: baseline; 131 | } 132 | 133 | sub { 134 | bottom: -0.25em; 135 | } 136 | 137 | sup { 138 | top: -0.5em; 139 | } 140 | 141 | /* Embedded content 142 | ========================================================================== */ 143 | 144 | /** 145 | * Remove the border on images inside links in IE 10. 146 | */ 147 | 148 | img { 149 | border-style: none; 150 | } 151 | 152 | /* Forms 153 | ========================================================================== */ 154 | 155 | /** 156 | * 1. Change the font styles in all browsers. 157 | * 2. Remove the margin in Firefox and Safari. 158 | */ 159 | 160 | button, 161 | input, 162 | optgroup, 163 | select, 164 | textarea { 165 | font-family: inherit; /* 1 */ 166 | font-size: 100%; /* 1 */ 167 | line-height: 1.15; /* 1 */ 168 | margin: 0; /* 2 */ 169 | } 170 | 171 | /** 172 | * Show the overflow in IE. 173 | * 1. Show the overflow in Edge. 174 | */ 175 | 176 | button, 177 | input { /* 1 */ 178 | overflow: visible; 179 | } 180 | 181 | /** 182 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 183 | * 1. Remove the inheritance of text transform in Firefox. 184 | */ 185 | 186 | button, 187 | select { /* 1 */ 188 | text-transform: none; 189 | } 190 | 191 | /** 192 | * Correct the inability to style clickable types in iOS and Safari. 193 | */ 194 | 195 | button, 196 | [type="button"], 197 | [type="reset"], 198 | [type="submit"] { 199 | -webkit-appearance: button; 200 | } 201 | 202 | /** 203 | * Remove the inner border and padding in Firefox. 204 | */ 205 | 206 | button::-moz-focus-inner, 207 | [type="button"]::-moz-focus-inner, 208 | [type="reset"]::-moz-focus-inner, 209 | [type="submit"]::-moz-focus-inner { 210 | border-style: none; 211 | padding: 0; 212 | } 213 | 214 | /** 215 | * Restore the focus styles unset by the previous rule. 216 | */ 217 | 218 | button:-moz-focusring, 219 | [type="button"]:-moz-focusring, 220 | [type="reset"]:-moz-focusring, 221 | [type="submit"]:-moz-focusring { 222 | outline: 1px dotted ButtonText; 223 | } 224 | 225 | /** 226 | * Correct the padding in Firefox. 227 | */ 228 | 229 | fieldset { 230 | padding: 0.35em 0.75em 0.625em; 231 | } 232 | 233 | /** 234 | * 1. Correct the text wrapping in Edge and IE. 235 | * 2. Correct the color inheritance from `fieldset` elements in IE. 236 | * 3. Remove the padding so developers are not caught out when they zero out 237 | * `fieldset` elements in all browsers. 238 | */ 239 | 240 | legend { 241 | box-sizing: border-box; /* 1 */ 242 | color: inherit; /* 2 */ 243 | display: table; /* 1 */ 244 | max-width: 100%; /* 1 */ 245 | padding: 0; /* 3 */ 246 | white-space: normal; /* 1 */ 247 | } 248 | 249 | /** 250 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 251 | */ 252 | 253 | progress { 254 | vertical-align: baseline; 255 | } 256 | 257 | /** 258 | * Remove the default vertical scrollbar in IE 10+. 259 | */ 260 | 261 | textarea { 262 | overflow: auto; 263 | } 264 | 265 | /** 266 | * 1. Add the correct box sizing in IE 10. 267 | * 2. Remove the padding in IE 10. 268 | */ 269 | 270 | [type="checkbox"], 271 | [type="radio"] { 272 | box-sizing: border-box; /* 1 */ 273 | padding: 0; /* 2 */ 274 | } 275 | 276 | /** 277 | * Correct the cursor style of increment and decrement buttons in Chrome. 278 | */ 279 | 280 | [type="number"]::-webkit-inner-spin-button, 281 | [type="number"]::-webkit-outer-spin-button { 282 | height: auto; 283 | } 284 | 285 | /** 286 | * 1. Correct the odd appearance in Chrome and Safari. 287 | * 2. Correct the outline style in Safari. 288 | */ 289 | 290 | [type="search"] { 291 | -webkit-appearance: textfield; /* 1 */ 292 | outline-offset: -2px; /* 2 */ 293 | } 294 | 295 | /** 296 | * Remove the inner padding in Chrome and Safari on macOS. 297 | */ 298 | 299 | [type="search"]::-webkit-search-decoration { 300 | -webkit-appearance: none; 301 | } 302 | 303 | /** 304 | * 1. Correct the inability to style clickable types in iOS and Safari. 305 | * 2. Change font properties to `inherit` in Safari. 306 | */ 307 | 308 | ::-webkit-file-upload-button { 309 | -webkit-appearance: button; /* 1 */ 310 | font: inherit; /* 2 */ 311 | } 312 | 313 | /* Interactive 314 | ========================================================================== */ 315 | 316 | /* 317 | * Add the correct display in Edge, IE 10+, and Firefox. 318 | */ 319 | 320 | details { 321 | display: block; 322 | } 323 | 324 | /* 325 | * Add the correct display in all browsers. 326 | */ 327 | 328 | summary { 329 | display: list-item; 330 | } 331 | 332 | /* Misc 333 | ========================================================================== */ 334 | 335 | /** 336 | * Add the correct display in IE 10+. 337 | */ 338 | 339 | template { 340 | display: none; 341 | } 342 | 343 | /** 344 | * Add the correct display in IE 10. 345 | */ 346 | 347 | [hidden] { 348 | display: none; 349 | } -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | com.fengwenyi 9 | mybatis-plus-code-generator 10 | 3.5.7-1 11 | jar 12 | mybatis-plus-code-generator 13 | MyBatis-Plus Code Generator 14 | https://github.com/fengwenyi/mybatis-plus-code-generator 15 | 16 | 17 | org.springframework.boot 18 | spring-boot-starter-parent 19 | 3.3.2 20 | 21 | 22 | 23 | 24 | UTF-8 25 | UTF-8 26 | 17 27 | 3.3.2 28 | 3.5.7 29 | 3.5.7 30 | 5.1.49 31 | 8.0.29 32 | 9.0.0 33 | 11.2.0.3 34 | 10.2.1.jre17 35 | 1.7.26 36 | 2.3 37 | 2.3.33 38 | 3.16.2.RELEASE 39 | 3.0.0 40 | 42.7.3 41 | 3.0.0 42 | 3.16.0 43 | 2.0.13 44 | 45 | 46 | 47 | 48 | 49 | com.baomidou 50 | mybatis-plus-generator 51 | ${mybatis-plus-generator.version} 52 | 53 | 54 | 55 | com.baomidou 56 | mybatis-plus 57 | ${mybatis-plus.version} 58 | 59 | 60 | 61 | 66 | 67 | 68 | 69 | com.mysql 70 | mysql-connector-j 71 | ${mysql9.version} 72 | 73 | 74 | 75 | 76 | com.oracle 77 | ojdbc6 78 | ${oracle.version} 79 | 80 | 81 | 82 | 83 | com.microsoft.sqlserver 84 | mssql-jdbc 85 | ${sql-server.version} 86 | 87 | 88 | 89 | org.apache.velocity 90 | velocity-engine-core 91 | ${velocity.version} 92 | 93 | 94 | 95 | org.freemarker 96 | freemarker 97 | ${freemarker.version} 98 | 99 | 100 | 101 | com.ibeetl 102 | beetl 103 | ${beetl.version} 104 | 105 | 106 | 107 | org.springframework.boot 108 | spring-boot-starter-thymeleaf 109 | 110 | 111 | 112 | org.springframework.boot 113 | spring-boot-starter-web 114 | 115 | 116 | 117 | org.springframework.boot 118 | spring-boot-devtools 119 | runtime 120 | true 121 | 122 | 123 | 124 | org.springframework.boot 125 | spring-boot-starter-test 126 | test 127 | 128 | 129 | 130 | org.projectlombok 131 | lombok 132 | 133 | 134 | 135 | com.fengwenyi 136 | JavaLib 137 | ${JavaLib.version} 138 | 139 | 140 | 141 | 142 | org.springframework.boot 143 | spring-boot-configuration-processor 144 | true 145 | 146 | 147 | 148 | 149 | org.postgresql 150 | postgresql 151 | ${postgresql.version} 152 | 153 | 154 | 155 | com.fengwenyi 156 | api-result 157 | ${api-result.version} 158 | 159 | 160 | 161 | org.apache.commons 162 | commons-lang3 163 | ${apache-commons-lang3.version} 164 | 165 | 166 | 167 | org.slf4j 168 | slf4j-api 169 | ${slf4j.version} 170 | 171 | 172 | 173 | 174 | 175 | 176 | org.springframework.boot 177 | spring-boot-maven-plugin 178 | 179 | 180 | 181 | 182 | 183 | 184 | aliyun-public 185 | https://maven.aliyun.com/repository/public 186 | 187 | 188 | aliyun-central 189 | https://maven.aliyun.com/repository/central 190 | 191 | 192 | aliyun-spring 193 | https://maven.aliyun.com/repository/spring 194 | 195 | 196 | aliyun-google 197 | https://maven.aliyun.com/repository/google 198 | 199 | 200 | spring-release 201 | https://repo.spring.io/release 202 | 203 | 204 | spring-milestone 205 | https://repo.spring.io/milestone 206 | 207 | 208 | 209 | -------------------------------------------------------------------------------- /src/main/resources/static/js/index.js: -------------------------------------------------------------------------------- 1 | 2 | layui.use(function() { 3 | let layer = layui.layer 4 | ,form = layui.form 5 | ,jQuery = layui.jquery; 6 | 7 | let $ = jQuery; 8 | 9 | let author = 'Erwin Feng'; 10 | let htmlInitOptionSelect = ''; 11 | let htmlInitOptionAdd = ''; 12 | 13 | let dbAddress = getDbAddress(); 14 | let dbUsername = getDbUsername(); 15 | let dbPassword = getDbPassword(); 16 | let outputDir = getOutputDir(); 17 | 18 | jQuery("#author").val(author); 19 | jQuery("#dbAddress").val(dbAddress); 20 | jQuery("#dbUsername").val(dbUsername); 21 | jQuery("#dbPassword").val(dbPassword); 22 | jQuery("#outputDir").val(outputDir); 23 | 24 | formSetVal() 25 | 26 | let layerIndex; 27 | 28 | showDbConfigSelect(); 29 | 30 | function showDbConfigSelect() { 31 | let dbConfigList = dataDbConfigQueryList() 32 | $.each(dbConfigList, function(i, item) { 33 | showDbConfigSelectHtml(item) 34 | }); 35 | } 36 | 37 | function showDbConfigSelectHtml(item) { 38 | let k = item.k; 39 | let name = item.v.name 40 | let html = ''; 41 | // let html = new Option(name, k); 42 | $('#dbConfigSelect').append(html); 43 | $('#boxDbConfigSelect').append(html); 44 | form.render('select'); 45 | } 46 | 47 | // 监听点击修改昵按钮 48 | jQuery('#btnEditDatabaseConfig').on('click', function () { 49 | layerIndex = layer.open({ 50 | type: 1, 51 | title: '数据库配置', 52 | closeBtn: 1, //不显示关闭按钮 53 | anim: 5, 54 | shade: [0.5], 55 | area: ['', ''], 56 | shadeClose: true, //开启遮罩关闭 57 | content: jQuery('.box-database-config') 58 | }); 59 | }); 60 | 61 | form.on('submit(formDatabaseConfigSave)', function (data) { 62 | let key = data.field.key; 63 | if (isEmpty(key)) { 64 | key = guid(); 65 | data.field.key = key; 66 | dataDbConfigAdd(key, data.field); 67 | let o = data.field; 68 | form.val('boxFormDbConfig', o); 69 | let obj = dataDbConfigQueryByKey(key); 70 | if (nonNull(obj)) { 71 | showDbConfigSelectHtml(obj); 72 | } // 有问题 73 | } else { 74 | dataDbConfigUpdate(key, data.field); 75 | $("#dbConfigSelect").empty(); 76 | $("#boxDbConfigSelect").empty(); 77 | $("#dbConfigSelect").append(htmlInitOptionSelect); 78 | $("#boxDbConfigSelect").append(htmlInitOptionAdd); 79 | showDbConfigSelect(); 80 | } 81 | return false; 82 | }); 83 | 84 | // 添加 85 | form.on('submit(boxBtnDbConfigAdd)', function () { 86 | let count = dataDbConfigCount(); 87 | // console.log(count) 88 | if (count > 4) { 89 | alertFail(layer, "数量限制不能再添加") 90 | return false; 91 | } 92 | $("#boxFormDbConfig")[0].reset(); 93 | layui.form.render(); 94 | return false; 95 | }); 96 | 97 | // 删除 98 | form.on('submit(boxBtnDbConfigDelete)', function (data) { 99 | $("#boxFormDbConfig")[0].reset(); 100 | layui.form.render(); 101 | dataDbConfigDelete(data.field.key); 102 | $("#dbConfigSelect").empty(); 103 | $("#boxDbConfigSelect").empty(); 104 | $("#dbConfigSelect").append(htmlInitOptionSelect); 105 | $("#boxDbConfigSelect").append(htmlInitOptionAdd); 106 | showDbConfigSelect(); 107 | form.render('select'); 108 | return false; 109 | }); 110 | 111 | 112 | //监听提交 113 | form.on('submit(formCodeGenerator)', function(data){ 114 | handleFormSubmit(data); 115 | return false; 116 | }); 117 | 118 | // 监听点击保存配置按钮 119 | form.on('submit(formCodeGeneratorConfigSave)', function(data){ 120 | formCache(data); 121 | return false; 122 | }); 123 | 124 | // 处理form提交请求 125 | function handleFormSubmit(data) { 126 | let url = "/code-generator"; 127 | let param = JSON.stringify(data.field); 128 | ajaxPost(jQuery, layer, url, param, function (response) { 129 | if (response.success) { 130 | handleCache(data.field); 131 | alertSuccess(layer, response.message); 132 | } else { 133 | alertFail(layer, response.message); 134 | } 135 | }); 136 | } 137 | 138 | // 缓存 139 | function handleCache(formData) { 140 | setDbAddress(formData.host); 141 | setDbUsername(formData.username) 142 | setDbPassword(formData.password) 143 | setAuthor(formData.author) 144 | setOutputDir(formData.outDir) 145 | } 146 | 147 | form.on('select(boxFormDbConfigSelect)', function(data){ 148 | let key = data.value; 149 | if (nonNull(key)) { 150 | let dbConfigObj = dataDbConfigQueryByKey(key) 151 | if (nonNull(dbConfigObj)) { 152 | let formVal = dbConfigObj.v 153 | form.val('boxFormDbConfig', formVal) 154 | } 155 | } 156 | }); 157 | 158 | // 选择数据库 159 | form.on('select(selectDbConfig)', function(data){ 160 | let key = data.value; 161 | if (nonNull(key)) { 162 | let dbConfigObj = dataDbConfigQueryByKey(key) 163 | if (nonNull(dbConfigObj)) { 164 | let formVal = dbConfigObj.v 165 | form.val('formFull', formVal) 166 | } 167 | } 168 | }); 169 | 170 | // 监听点击检查更新按钮 171 | jQuery('#btnVersionCheck').on('click', () => handleVersionCheck(true)) 172 | 173 | // 检查版本更新 174 | handleVersionCheck(false) 175 | 176 | /** 177 | * 版本检查 178 | * @param whetherNewVersionTip 是否显示是新版本提示 179 | */ 180 | function handleVersionCheck(whetherNewVersionTip) { 181 | let url = '/versionCheck' 182 | jQuery.ajax({ 183 | url: url, 184 | type: HTTP_POST, 185 | success: (res) => handleVersionCheckReponse(res, whetherNewVersionTip) 186 | }); 187 | } 188 | 189 | function handleVersionCheckReponse(res, whetherNewVersionTip) { 190 | let response = JSON.parse(res) 191 | if (nonNull(response)) { 192 | if (response.success) { 193 | let data = response.body 194 | if (data.upgrade) { 195 | let latestVersion = data.latestVersion 196 | let releaseUrl = data.releaseUrl 197 | layerNewVersion(latestVersion, releaseUrl) 198 | } else { 199 | if (whetherNewVersionTip) { 200 | alertSuccess(layer, '已经是最新版本'); 201 | } 202 | } 203 | } 204 | } 205 | } 206 | 207 | /** 208 | * 新版本弹窗 209 | * @param version 210 | * @param url 211 | */ 212 | function layerNewVersion(version, url) { 213 | //边缘弹出 214 | layer.open({ 215 | type: 1 216 | , title: '版本更新' 217 | , area: ['260px', '200px'] 218 | , offset: 'rt' //具体配置参考:offset参数项 219 | , content: '
' + version + ' 已经发布
' 220 | , btn: '详情' 221 | , btnAlign: 'c' //按钮居中 222 | , shade: 0 //不显示遮罩 223 | , yes: function () { 224 | if (isNotEmpty(url)) { 225 | window.open(url) 226 | } 227 | } 228 | }); 229 | } 230 | 231 | // form 数据缓存 232 | function formCache(data) { 233 | setDataConfig(data.field) 234 | layer.msg('保存成功') 235 | } 236 | 237 | // form 赋值 238 | function formSetVal() { 239 | let data = getDataConfig() 240 | if (nonNull(data)) { 241 | form.val('formFull', data) 242 | } 243 | } 244 | 245 | jQuery('#formCodeGeneratorConfigDelete').on('click', function () { 246 | dataConfigDelete() 247 | layer.msg('清除成功') 248 | }) 249 | 250 | }); -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/css/modules/layer/default/layer.css: -------------------------------------------------------------------------------- 1 | .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:50px;line-height:50px;border-bottom:1px solid #F0F0F0;font-size:14px;color:#333;overflow:hidden;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:17px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:300px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:300px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgnext,.layui-layer-imgprev{position:fixed;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:30px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:30px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:40px;line-height:40px;background-color:#000\9;filter:Alpha(opacity=60);background-color:rgba(2,0,0,.35);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} -------------------------------------------------------------------------------- /src/main/resources/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | MyBatis-Plus代码生成器 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
45 |
46 | 47 |
48 | 49 | 50 | 51 |

MyBatis-Plus代码生成器

52 |
53 | 54 | 57 | 58 |
59 | 60 |
61 |
62 | 63 | 64 |
*项目
65 | 66 |
67 | 68 |
69 | 71 |
72 |
73 | 74 |
75 | 76 |
77 | 79 |
80 |
81 | 82 |
*数据库配置
83 | 84 | 95 | 96 | 103 | 104 | 111 | 112 | 119 | 120 | 121 |
122 | 123 |
124 | 127 |
128 | 131 |
132 | 133 |
134 | 135 |
136 | 138 |
139 |
140 | 141 | 142 |
可选配置
143 | 144 |
145 | 146 |
147 | 149 |
150 |
151 |
152 | 153 |
154 | 156 |
157 |
158 | 159 |
160 |
161 | 162 | 163 |
164 |
165 | 166 | 167 |
168 |
169 | 170 |
171 |
172 |
173 |
174 |

表配置

175 |
176 |
177 | 178 |
179 | 180 |
181 |
182 | 183 |
184 | 185 |
186 | 187 |
188 |
189 | 190 |
191 | 192 |
193 | 195 |
196 |
197 | 198 |
199 | 200 |
201 | 203 |
204 |
205 | 206 |
207 | 208 |
209 |
211 |
212 |
213 |
214 |
215 |

包名配置

216 |
217 |
218 | 219 |
220 | 222 |
223 |
224 |
225 | 226 |
227 | 229 |
230 |
231 |
232 | 233 |
234 | 236 |
237 |
238 | 239 |
240 | 241 |
242 | 244 |
245 |
246 |
247 | 248 |
249 | 251 |
252 |
253 | 254 |
255 | 256 |
257 | 259 |
260 |
261 |
262 |
263 |
264 |

文件名格式

265 |
266 |
267 | 268 |
269 | 271 |
272 |
273 |
274 | 275 |
276 | 278 |
279 |
280 |
281 | 282 |
283 | 285 |
286 |
287 | 288 |
289 | 290 |
291 | 293 |
294 |
295 |
296 | 297 |
298 | 300 |
301 |
302 | 303 |
304 | 305 |
306 | 308 |
309 |
310 |
311 |
312 |
313 |

字段名配置

314 |
315 |
316 | 317 |
318 | 320 |
321 |
322 | 323 |
324 | 325 |
326 | 328 |
329 |
330 |
331 |
332 | 333 |
334 |

实体类配置

335 |
336 |
337 | 338 |
339 | 341 |
342 |
343 | 344 | 351 |
352 | 353 |
354 | 355 | 356 |
357 |
358 | 359 |
360 | 361 |
362 | 364 |
365 |
366 | 367 |
368 | 369 |
370 | 372 |
373 |
374 | 375 |
376 | 377 |
378 | 380 |
381 |
382 | 383 |
384 | 385 |
386 | 388 |
389 |
390 |
391 |
392 | 393 |
394 |

XML配置

395 |
396 | 403 | 404 |
405 | 406 |
407 | 409 |
410 |
411 | 412 |
413 | 414 |
415 | 417 |
418 |
419 |
420 |
421 | 422 |
423 |

其他配置

424 |
425 | 433 | 434 |
435 | 436 |
437 | 439 |
440 |
441 | 442 |
443 |
444 |
445 |
446 |
447 | 448 |
449 | 450 |
451 |
452 |
453 | 454 |
455 |
456 | 459 |
460 | 461 | 464 | 467 |
468 | 469 | 474 | 475 |
476 | 477 |
478 | 480 |
481 |
482 | 483 |
484 | 485 |
486 | 492 |
493 |
494 | 495 |
496 | 497 |
498 | 500 |
501 |
502 | 503 |
504 | 505 |
506 | 508 |
509 |
510 | 511 |
512 | 513 |
514 | 516 |
517 |
518 | 519 |
520 |
521 |
522 | 523 | 533 |
534 | 535 | -------------------------------------------------------------------------------- /src/main/resources/static/lib/layui-bak/css/layui.css: -------------------------------------------------------------------------------- 1 | .layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}a,body{color:#333}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-edge,hr{height:0;overflow:hidden}.layui-layout-body,.layui-side,.layui-side-scroll{overflow-x:hidden}.layui-edge,.layui-elip,hr{overflow:hidden}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:rgba(0,0,0,.85);font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{line-height:0;margin:10px 0;padding:0;border:none!important;border-bottom:1px solid #eee!important;clear:both;background:0 0}a{text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-btn,.layui-btn-group,.layui-edge{display:inline-block}.layui-edge{width:0;border-width:6px;border-style:dashed;border-color:transparent}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;white-space:nowrap}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=256);src:url(../font/iconfont.eot?v=256#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=256) format('woff2'),url(../font/iconfont.woff?v=256) format('woff'),url(../font/iconfont.ttf?v=256) format('truetype'),url(../font/iconfont.svg?v=256#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-key:before{content:"\e683"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-ios:before{content:"\e680"}.layui-icon-at:before{content:"\e687"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-addition:before{content:"\e624"}.layui-icon-home:before{content:"\e68e"}.layui-icon-time:before{content:"\e68d"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-logout:before{content:"\e682"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-android:before{content:"\e684"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-service:before{content:"\e626"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-print:before{content:"\e66d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-export:before{content:"\e67d"}.layui-icon-rss:before{content:"\e808"}.layui-icon-slider:before{content:"\e714"}.layui-icon-email:before{content:"\e618"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-light:before{content:"\e748"}.layui-icon-gift:before{content:"\e627"}.layui-icon-mute:before{content:"\e685"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-music:before{content:"\e690"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px}.layui-side-scroll{position:relative;width:220px;height:100%}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;z-index:900;width:auto;box-sizing:border-box}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#FAFAFA}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.6;border-left:5px solid #5FB878;border-radius:0 2px 2px 0;background-color:#FAFAFA}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#FAFAFA;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card-body,.layui-card-header,.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-panel,.layui-textarea{position:relative}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-form-select dl,.layui-panel{box-shadow:1px 1px 4px rgb(0 0 0 / 8%)}.layui-card:last-child{margin-bottom:0}.layui-card-header{height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body{padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{border-width:1px;border-style:solid;border-radius:2px;background-color:#fff;color:#666}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-border,.layui-border-black,.layui-border-blue,.layui-border-cyan,.layui-border-green,.layui-border-orange,.layui-border-red{border-width:1px;border-style:solid}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#FAFAFA!important;color:#666!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{color:#666!important}.layui-border-red{border-color:#FF5722!important;color:#FF5722!important}.layui-border-orange{border-color:#FFB800!important;color:#FFB800!important}.layui-border-green{border-color:#009688!important;color:#009688!important}.layui-border-cyan{border-color:#2F4056!important;color:#2F4056!important}.layui-border-blue{border-color:#1E9FFF!important;color:#1E9FFF!important}.layui-border-black{border-color:#393D49!important;color:#393D49!important}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.6;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-text p{margin:10px 0}.layui-text p:first-child{margin-top:0}.layui-font-12{font-size:12px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-red{color:#FF5722!important}.layui-font-orange{color:#FFB800!important}.layui-font-green{color:#009688!important}.layui-font-cyan{color:#2F4056!important}.layui-font-blue{color:#01AAED!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\9;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#666}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-checked{background-color:#5FB878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#FBFBFB!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#eee!important}.layui-input:focus,.layui-textarea:focus{border-color:#d2d2d2!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#F6F6F6;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878!important;background-color:#5FB878;color:#fff}.layui-checkbox-disabled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2!important}.layui-checkbox-disabled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disabled,.layui-checkbox-disabled i{border-color:#eee!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disabled span{background-color:#eee!important}.layui-checkbox-disabled em{color:#d2d2d2!important}.layui-checkbox-disabled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover *,.layui-form-radioed,.layui-form-radioed>i{color:#5FB878}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled *{color:#c2c2c2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FAFAFA;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #eee}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#eee;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#FAFAFA}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-menu li,.layui-menu-body-title a:hover,.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#F6F6F6}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-colorpicker-alpha-slider,.layui-colorpicker-side-slider,.layui-menu,.layui-menu *,.layui-nav{box-sizing:border-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff}.layui-menu li,.layui-menu-body-title a{padding:5px 15px}.layui-menu li{position:relative;margin:1px 0;width:calc(100% + 1px);line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer}.layui-menu li:hover{background-color:#F6F6F6}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group .layui-menu-body-title,.layui-menu-item-parent .layui-menu-body-title{padding-right:25px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default;text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:rgba(0,0,0,1)}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-breadcrumb,.layui-tree-btnGroup{visibility:hidden}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#F6F6F6!important;color:#5FB878}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#5FB878}.layui-menu .layui-menu-item-checked:after{position:absolute;right:0;top:0;bottom:0;border-right:3px solid #5FB878;content:""}.layui-menu-body-title{position:relative;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title>.layui-icon{position:absolute;right:0;top:0;font-size:14px}.layui-menu-body-title>.layui-icon-right{right:-1px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#5FB878}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:66666666;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#666;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#F6F6F6;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#F6F6F6;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child{display:block;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-breadcrumb{font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#FAFAFA}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-transfer-active,.layui-transfer-box{display:inline-block;vertical-align:middle}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#666}.layui-transfer-active{margin:0 15px}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5FB878;border-color:#5FB878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#FBFBFB;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#F6F6F6;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:66666666;width:280px;margin:5px 0;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-iconClick,.layui-tree-main{display:inline-block;vertical-align:middle}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#666}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-btnGroup,.layui-tree-editInput{position:relative;vertical-align:middle;display:inline-block}.layui-tree-spread>.layui-tree-entry>.layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#666}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout} --------------------------------------------------------------------------------