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

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

+     * user_age -> userAge
+     * user_address_detail -> userAddressDetail
+     * user__age -> userAge
+     * name -> name
+     * _name -> _name
+     * _name_ -> _name_
+     * _user_age -> _userAge
+     * _user__age -> _userAge
+     * user_age_ -> userAge_
+     * _user_age_ -> _userAge_
+     * name__ -> name__
+     * __name -> __name
+     * 
+ * + * + * @param field 字段 + * @return 返回转换后的字段 + */ + public static String underlineFilter(String field) { + if (StringUtils.isNotBlank(field)) { + char underLine = '_'; + int underLineCountLeading = findCharCount(field, underLine, false); + int underLineCountTailing = findCharCount(field, underLine, true); + // 去除首尾'_' + field = StringUtil.trimLeadingCharacter(field, underLine); + field = StringUtil.trimTrailingCharacter(field, underLine); + if (isSingleAllUpper(field)) { + return field.toLowerCase(); + } + if (field.contains(UNDER_LINE)) { + field = field.toLowerCase(); + } + String[] arr = field.split("_+"); + return join(arr, underLineCountLeading, underLineCountTailing); + } + return ""; + } + + /** + * 是不是全部大写的单词,如:NAME, ADDRESS + * @param name 单词 + * @return true:是 + */ + private static boolean isSingleAllUpper(String name) { + if (name.contains(UNDER_LINE)) { + return false; + } + return Objects.equals(name, name.toUpperCase()); + } + + private static String join(String[] arr, int underLineCountLeading, int underLineCountTailing) { + if (arr.length > 1) { + for (int i = 1; i < arr.length; i++) { + arr[i] = upperFirstLetter(arr[i]); + } + } + StringBuilder ret = new StringBuilder(); + char underLine = '_'; + for (int i = 0; i < underLineCountLeading; i++) { + ret.append(underLine); + } + ret.append(String.join("", arr)); + for (int i = 0; i < underLineCountTailing; i++) { + ret.append(underLine); + } + return ret.toString(); + } + + private static int findCharCount(String str, char searchChar, boolean reverse) { + if (StringUtils.isEmpty(str)) { + return 0; + } + int count = 0; + char[] chars = str.toCharArray(); + + if (reverse) { + for (int i = chars.length - 1; i >= 0; i--) { + if (chars[i] == searchChar) { + count++; + } else { + break; + } + } + } else { + for (char aChar : chars) { + if (aChar == searchChar) { + count++; + } else { + break; + } + } + } + return count; + } + + public static String convertString(Object object) { + if (object == null) { + return ""; + } + return String.valueOf(object); + } + + /** + * 过滤"." + * + * @param field 字段 + * @return 返回新字段 + */ + public static String dotFilter(String field) { + if (StringUtils.isNotBlank(field)) { + if (field.contains(".")) { + String[] words = field.split("\\."); + StringBuilder ret = new StringBuilder(); + for (String str : words) { + ret.append(upperFirstLetter(str)); + } + return ret.toString(); + } + } + return field; + } + + /** + * 将第一个字母转换成大写。 name -> Name + * + * @param str 字符串 + * @return 返回新字段 + */ + public static String upperFirstLetter(String str) { + if (StringUtils.isNotBlank(str)) { + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + return str; + } + + /** + * 将第一个字母转换成小写。Name -> name + * + * @param str 字符串 + * @return 返回新内容 + */ + public static String lowerFirstLetter(String str) { + if (StringUtils.isNotBlank(str)) { + return str.substring(0, 1).toLowerCase() + str.substring(1); + } + return str; + } + + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FileUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FileUtil.java new file mode 100644 index 00000000..bbb7a0de --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FileUtil.java @@ -0,0 +1,10 @@ +package com.gitee.gen.util; + +/** + * @author 六如 + */ +public class FileUtil { + + + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FormatUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FormatUtil.java new file mode 100644 index 00000000..13660e06 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/FormatUtil.java @@ -0,0 +1,50 @@ +package com.gitee.gen.util; + +import org.dom4j.Document; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.SAXReader; +import org.dom4j.io.XMLWriter; + +import java.io.StringReader; +import java.io.StringWriter; + +/** + * 代码格式化 + * @author tanghc + */ +public class FormatUtil { + + public static String formatXml(String input) { + try{ + SAXReader reader = new SAXReader(); + // System.out.println(reader); + // 注释:创建一个串的字符输入流 + StringReader in = new StringReader(input); + Document doc = reader.read(in); + // System.out.println(doc.getRootElement()); + // 注释:创建输出格式 + OutputFormat formater = OutputFormat.createPrettyPrint(); + // formater=OutputFormat.createCompactFormat(); + // 注释:设置xml的输出编码 + formater.setEncoding("utf-8"); + // TAB缩进 + formater.setIndent(" "); + // 注释:创建输出(目标) + StringWriter out = new StringWriter(); + // 注释:创建输出流 + XMLWriter writer = new XMLWriter(out, formater); + // 注释:输出格式化的串到目标中,执行后。格式化后的串保存在out中。 + writer.write(doc); + + writer.close(); + // 注释:返回我们格式化后的结果 + return out.toString(); + }catch (Exception e) { + e.printStackTrace(); + return input; + } + } + + + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SqlTypeUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SqlTypeUtil.java new file mode 100644 index 00000000..69350661 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SqlTypeUtil.java @@ -0,0 +1,161 @@ +package com.gitee.gen.util; + +import com.gitee.gen.gen.TypeEnum; + +import java.util.HashMap; +import java.util.Map; + +/** + * 字段类型转换 + */ +public class SqlTypeUtil { + private static final Map javaTypeMap = new HashMap<>(); + private static final Map javaBoxTypeMap = new HashMap<>(); + private static final Map mybatisTypeMap = new HashMap<>(); + + static { + javaTypeMap.put("bigint", "long"); + javaTypeMap.put("binary", "byte[]"); + javaTypeMap.put("bit", "boolean"); + javaTypeMap.put("boolean", "boolean"); + javaTypeMap.put("blob", "byte[]"); + javaTypeMap.put("char", "String"); + javaTypeMap.put("date", "Date"); + javaTypeMap.put("datetime", "Date"); + javaTypeMap.put("decimal", "BigDecimal"); + javaTypeMap.put("double", "double"); + javaTypeMap.put("float", "float"); + javaTypeMap.put("int", "int"); + javaTypeMap.put("integer", "int"); + javaTypeMap.put("image", "byte[]"); + javaTypeMap.put("money", "BigDecimal"); + javaTypeMap.put("nchar", "String"); + javaTypeMap.put("ntext", "byte"); + javaTypeMap.put("numeric", "BigDecimal"); + javaTypeMap.put("nvarchar", "String"); + javaTypeMap.put("real", "float"); + javaTypeMap.put("smalldatetime", "Date"); + javaTypeMap.put("smallint", "int"); + javaTypeMap.put("smallmoney", "BigDecimal"); + javaTypeMap.put("sql_variant", "String"); + javaTypeMap.put("text", "String"); + javaTypeMap.put("tinyint", "int"); + javaTypeMap.put("timestamp", "Date"); + javaTypeMap.put("uniqueidentifier", "String"); + javaTypeMap.put("varbinary", "byte[]"); + javaTypeMap.put("varchar", "String"); + + + javaBoxTypeMap.put("bigint", "Long"); + javaBoxTypeMap.put("binary", "Byte[]"); + javaBoxTypeMap.put("bit", "Boolean"); + javaBoxTypeMap.put("bool", "Boolean"); + javaBoxTypeMap.put("boolean", "Boolean"); + javaBoxTypeMap.put("blob", "Byte[]"); + javaBoxTypeMap.put("char", "String"); + javaBoxTypeMap.put("date", "Date"); + javaBoxTypeMap.put("datetime", "Date"); + javaBoxTypeMap.put("decimal", "BigDecimal"); + javaBoxTypeMap.put("double", "Double"); + javaBoxTypeMap.put("float", "Float"); + javaBoxTypeMap.put("int", "Integer"); + javaBoxTypeMap.put("integer", "Integer"); + javaBoxTypeMap.put("image", "Byte[]"); + javaBoxTypeMap.put("money", "BigDecimal"); + javaBoxTypeMap.put("nchar", "String"); + javaBoxTypeMap.put("ntext", "String"); + javaBoxTypeMap.put("numeric", "BigDecimal"); + javaBoxTypeMap.put("nvarchar", "String"); + javaBoxTypeMap.put("real", "Float"); + javaBoxTypeMap.put("smalldatetime", "Date"); + javaBoxTypeMap.put("smallint", "Integer"); + javaBoxTypeMap.put("smallmoney", "BigDecimal"); + javaBoxTypeMap.put("sql_variant", "String"); + javaBoxTypeMap.put("text", "String"); + javaBoxTypeMap.put("tinyint", "Integer"); + javaBoxTypeMap.put("timestamp", "Date"); + javaBoxTypeMap.put("uniqueidentifier", "String"); + javaBoxTypeMap.put("varbinary", "Byte[]"); + javaBoxTypeMap.put("varchar", "String"); + + + mybatisTypeMap.put("bigint", "BIGINT"); + mybatisTypeMap.put("binary", "BLOB"); + mybatisTypeMap.put("bit", "BOOLEAN"); + mybatisTypeMap.put("boolean", "BOOLEAN"); + mybatisTypeMap.put("blob", "BLOB"); + mybatisTypeMap.put("char", "CHAR"); + mybatisTypeMap.put("date", "TIMESTAMP"); + mybatisTypeMap.put("datetime", "TIMESTAMP"); + mybatisTypeMap.put("decimal", "DECIMAL"); + mybatisTypeMap.put("double", "DOUBLE"); + mybatisTypeMap.put("float", "FLOAT"); + mybatisTypeMap.put("int", "INTEGER"); + mybatisTypeMap.put("integer", "INTEGER"); + mybatisTypeMap.put("image", "BLOB"); + mybatisTypeMap.put("money", "DECIMAL"); + mybatisTypeMap.put("nchar", "NCHAR"); + mybatisTypeMap.put("ntext", "VARCHAR"); + mybatisTypeMap.put("numeric", "DECIMAL"); + mybatisTypeMap.put("nvarchar", "NVARCHAR"); + mybatisTypeMap.put("real", "FLOAT"); + mybatisTypeMap.put("smalldatetime", "TIMESTAMP"); + mybatisTypeMap.put("smallint", "INTEGER"); + mybatisTypeMap.put("smallmoney", "DECIMAL"); + mybatisTypeMap.put("sql_variant", "VARCHAR"); + mybatisTypeMap.put("text", "VARCHAR"); + mybatisTypeMap.put("tinyint", "TINYINT"); + mybatisTypeMap.put("timestamp", "TIMESTAMP"); + mybatisTypeMap.put("uniqueidentifier", "VARCHAR"); + mybatisTypeMap.put("varbinary", "BLOB"); + mybatisTypeMap.put("varchar", "VARCHAR"); + } + + public static final Map TYPE_MYBATIS_MAP = new HashMap<>(64); + + static { + TYPE_MYBATIS_MAP.put(TypeEnum.BIT.getType(), "BOOLEAN"); + TYPE_MYBATIS_MAP.put(TypeEnum.BOOLEAN.getType(), "BOOLEAN"); + TYPE_MYBATIS_MAP.put(TypeEnum.TINYINT.getType(), "TINYINT"); + TYPE_MYBATIS_MAP.put(TypeEnum.SMALLINT.getType(), "INTEGER"); + TYPE_MYBATIS_MAP.put(TypeEnum.INT.getType(), "INTEGER"); + TYPE_MYBATIS_MAP.put(TypeEnum.BIGINT.getType(), "BIGINT"); + TYPE_MYBATIS_MAP.put(TypeEnum.FLOAT.getType(), "FLOAT"); + TYPE_MYBATIS_MAP.put(TypeEnum.DOUBLE.getType(), "DOUBLE"); + TYPE_MYBATIS_MAP.put(TypeEnum.DECIMAL.getType(), "DECIMAL"); + TYPE_MYBATIS_MAP.put(TypeEnum.VARCHAR.getType(), "VARCHAR"); + TYPE_MYBATIS_MAP.put(TypeEnum.DATETIME.getType(), "TIMESTAMP"); + TYPE_MYBATIS_MAP.put(TypeEnum.BLOB.getType(), "BLOB"); + } + + /** + * 将sql字段类型转换为java字段类型 + * @param sqlType 数据库字段类型 + * @return 找不到类型默认返回String + */ + public static String convertToJavaType(String sqlType){ + String javaType = javaTypeMap.get(sqlType); + return javaType == null ? "String" : javaType; + } + + /** + * 将sql字段类型转换为java装箱字段类型 + * @param sqlType 数据库字段类型 + * @return 找不到类型默认返回String + */ + public static String convertToJavaBoxType(String sqlType){ + String javaType = javaBoxTypeMap.get(sqlType); + return javaType == null ? "String" : javaType; + } + + /** + * 将sql字段类型转换为mybatis的jdbcType + * @param sqlType 数据库字段类型 + * @return 找不到类型默认返回VARCHAR + */ + public static String convertToMyBatisJdbcType(String sqlType){ + String javaType = mybatisTypeMap.get(sqlType); + return javaType == null ? "VARCHAR" : javaType; + } + +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/StringUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/StringUtil.java new file mode 100644 index 00000000..64d1d6a9 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/StringUtil.java @@ -0,0 +1,51 @@ +package com.gitee.gen.util; + +import org.apache.commons.lang.StringUtils; + +/** + * @author thc + */ +public class StringUtil { + + /** + * Trim leading whitespace from the given {@code String}. + * @param str the {@code String} to check + * @return the trimmed {@code String} + * @see Character#isWhitespace + */ + public static String trimLeadingWhitespace(String str) { + if (StringUtils.isBlank(str)) { + return str; + } + + int beginIdx = 0; + while (beginIdx < str.length() && Character.isWhitespace(str.charAt(beginIdx))) { + beginIdx++; + } + return str.substring(beginIdx); + } + + public static String trimLeadingCharacter(String str, char leadingCharacter) { + if (StringUtils.isBlank(str)) { + return str; + } + + int beginIdx = 0; + while (beginIdx < str.length() && leadingCharacter == str.charAt(beginIdx)) { + beginIdx++; + } + return str.substring(beginIdx); + } + + public static String trimTrailingCharacter(String str, char trailingCharacter) { + if (StringUtils.isBlank(str)) { + return str; + } + + int endIdx = str.length() - 1; + while (endIdx >= 0 && trailingCharacter == str.charAt(endIdx)) { + endIdx--; + } + return str.substring(0, endIdx + 1); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SystemUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SystemUtil.java new file mode 100644 index 00000000..2f84fd3f --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/SystemUtil.java @@ -0,0 +1,45 @@ +package com.gitee.gen.util; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +/** + * @author tanghc + */ +public class SystemUtil { + + private static volatile String binPath; + + /** + * 获取程序执行目录,即jar包所在的目录。此方法只在部署后有用,开发模式下,这里返回target路径 + * + * @return 返回路径 + */ + public static String getBinPath() { + if (binPath == null) { + synchronized (SystemUtil.class) { + if (binPath == null) { + String path = SystemUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + try { + path = URLDecoder.decode(path, "UTF-8"); + path = StringUtil.trimTrailingCharacter(path, '/'); + int index = path.lastIndexOf('/'); + path = path.substring(0, index); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + binPath = path; + } + } + } + return binPath; + } + + public static String getUserDir() { + return System.getProperty("user.dir"); + } + + public static String getUserHome() { + return System.getProperty("user.home"); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/TemplateMetaUtils.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/TemplateMetaUtils.java new file mode 100644 index 00000000..feba0d4f --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/TemplateMetaUtils.java @@ -0,0 +1,106 @@ +package com.gitee.gen.util; + +import com.gitee.gen.entity.TemplateConfig; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * 模板元信息工具类 + */ +public final class TemplateMetaUtils { + + private TemplateMetaUtils() { + } + + /** + * 解析模板内容中的元信息 + */ + public static Map parseMetaContent(String content) { + content = StringUtil.trimLeadingWhitespace(content); + if (content != null && content.startsWith("##")) { + int rowIdx = content.indexOf('\n'); + String metaInfo = content.substring(2, rowIdx); + return parseMetaRow(metaInfo); + } + return Collections.emptyMap(); + } + + /** + * 解析元数据信息 + */ + public static Map parseMetaRow(String row) { + char[] charArray = row.toCharArray(); + + Map data = new HashMap<>(); + + StringBuilder kvBuilder = new StringBuilder(); + // 剩余未闭合表达式数量 + int leftExpr = 0; + for (int i = 0, len = charArray.length, end = len - 1; i < len; i++) { + char c = charArray[i]; + boolean kvEnd = false; + if (i == end) { + kvBuilder.append(c); + kvEnd = true; + } else if (',' == c && leftExpr == 0) { + kvEnd = true; + } + + if (kvEnd) { + String[] kv = kvBuilder.toString().trim().split("="); + data.put(kv[0].trim(), kv.length == 1 ? null : kv[1].trim()); + kvBuilder = new StringBuilder(); + continue; + } + + kvBuilder.append(c); + switch (c) { + case '{': + case '(': + leftExpr++; + break; + case '}': + case ')': + leftExpr--; + break; + default: + break; + } + } + if (leftExpr > 0) { + throw new RuntimeException("读取元数据失败,有" + leftExpr + "个表达式未闭合"); + } + return data; + } + + /** + * 生成元数据的模板内容 + */ + public static String generateMetaContent(TemplateConfig template) { + String content = StringUtil.trimLeadingWhitespace(template.getContent()); + String metaRow = generateMetaRow(template); + if (content.startsWith("##")) { + int rowIdx = content.indexOf('\n'); + if(rowIdx == -1) { + content = metaRow; + } else { + content = metaRow + content.substring(rowIdx); + } + } else { + content = metaRow + "\n" + content; + } + return content; + } + + /** + * 解析元数据信息 + */ + public static String generateMetaRow(TemplateConfig template) { + String format = "## filename=%s, folder=%s"; + String filename = template.getFileName() != null ? template.getFileName() : ""; + String folder = template.getFolder() != null ? template.getFolder() : ""; + return String.format(format, filename, folder); + } +} diff --git a/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/VelocityUtil.java b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/VelocityUtil.java new file mode 100644 index 00000000..db1a958d --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/java/com/gitee/gen/util/VelocityUtil.java @@ -0,0 +1,42 @@ +package com.gitee.gen.util; + +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.apache.velocity.runtime.log.NullLogChute; + +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; + +/** + * Velocity工具类,根据模板内容生成文件 + */ +public class VelocityUtil { + private VelocityUtil() { + super(); + } + + static { + // 禁止输出日志 + Velocity.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM, new NullLogChute()); + Velocity.init(); + } + + private final static String LOG_TAG = "velocity_log"; + + public static String generate(VelocityContext context, String template) { + StringReader reader = new StringReader(template); + StringWriter writer = new StringWriter(); + // 不用vm文件 + Velocity.evaluate(context, writer, LOG_TAG, reader); + + try { + writer.close(); + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return writer.toString(); + } +} diff --git a/sop-admin/sop-code-gen/src/main/resources/app.yml b/sop-admin/sop-code-gen/src/main/resources/app.yml new file mode 100644 index 00000000..48d0f584 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/app.yml @@ -0,0 +1,88 @@ +solon.app: + name: gen +server: + port: 6969 + + +# sqlite3 +#LOCAL_DB: ${user.home}/gen.db +gen.db1: + url: "jdbc:sqlite:" + driverClassName: org.sqlite.JDBC + userName: + password: + +# mysql +dbms: + enable: false +# host: localhost:3306 +# database: gen +# username: root +# password: root + +gen.db2: + url: jdbc:mysql://${dbms.host:localhost:3306}/${dbms.database:gen}?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai + driverClassName: com.mysql.cj.jdbc.Driver + userName: ${dbms.username:gen} + password: ${dbms.password:} + +# 配置数据源对应的 mybatis 信息(要与 DataSource bean 的名字对上) +mybatis.db1: + mappers: #支持包名 或 类名(大写开头 或 *)或 xml(.xml结尾)//支持 ** 或 * 占位符 + - "com.gitee.gen.mapper.*" #这个表达式同上效果 + - "classpath:mybatis/**/*.xml" + configuration: #扩展配置(要与 Configuration 类的属性一一对应) + cacheEnabled: false + mapperVerifyEnabled: true #如果为 true,则要求所有 mapper 有 @Mapper 主解 + mapUnderscoreToCamelCase: true + +gen: + format-xml: ${GEN_FORMAT_XML:true} + db-name: ${GEN_DBNAME:gen} + +# log +solon.logging.appender: + console: + level: INFO + enable: true #是否启用 + file: + name: "logs/${solon.app.name}" + level: INFO + enable: false #是否启用 + extension: ".log" #v2.2.18 后支持(例:.log, .log.gz, .log.zip) + maxFileSize: "10 MB" + maxHistory: "7" + cloud: + level: INFO + enable: false #是否启用 + + +# 2.0.3新增 +# 连接方式管理, {HOST},{PORT},{DB_NAME} 表示占位符 +connect: + 1: + name: MySQL + driver: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://{HOST}:{PORT}/{DB_NAME}?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + serviceName: com.gitee.gen.gen.mysql.MySqlService + 2: + name: Oracle + driver: oracle.jdbc.driver.OracleDriver + url: jdbc:oracle:thin:@{HOST}:{PORT}{DB_NAME} + serviceName: com.gitee.gen.gen.oracle.OracleService + 3: + name: "SQL Server" + driver: com.microsoft.sqlserver.jdbc.SQLServerDriver + url: jdbc:sqlserver://{HOST}:{PORT};DatabaseName={DB_NAME};trustServerCertificate=true + serviceName: com.gitee.gen.gen.sqlserver.SqlServerService + 4: + name: PostgreSQL + driver: org.postgresql.Driver + url: jdbc:postgresql://{HOST}:{PORT}/{DB_NAME} + serviceName: com.gitee.gen.gen.postgresql.PostgreSqlService + 5: + name: "达梦" + driver: dm.jdbc.driver.DmDriver + url: jdbc:dm://{HOST}:{PORT}/{DB_NAME} + serviceName: com.gitee.gen.gen.dm.DmService + diff --git a/sop-admin/sop-code-gen/src/main/resources/gen_init.db b/sop-admin/sop-code-gen/src/main/resources/gen_init.db new file mode 100644 index 0000000000000000000000000000000000000000..bf04d3e4c76baaa5dddfc439cb6bb9e2d4f046a2 GIT binary patch literal 98304 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 + + + + + + + + + + + + + + + + + + + + + + + + t.id + , t.db_type + , t.db_desc + , t.driver_class + , t.db_name + , t.schema_name + , t.host + , t.port + , t.username + , t.password + , t.is_deleted + , t.package_name + , t.del_prefix + , t.group_id + , t.author + , t.db_group_name + + + + + + + + + + + INSERT INTO datasource_config + + db_type, + db_desc, + driver_class, + db_name, + schema_name, + host, + port, + username, + password, + is_deleted, + package_name, + del_prefix, + group_id, + author, + db_group_name, + + + #{dbType}, + #{dbDesc}, + #{driverClass}, + #{dbName}, + #{schemaName}, + #{host}, + #{port}, + #{username}, + #{password}, + #{isDeleted}, + #{packageName}, + #{delPrefix}, + #{groupId}, + #{author}, + #{dbGroupName}, + + + + + + INSERT INTO datasource_config + + + + db_type, + + + db_desc, + + + driver_class, + + + db_name, + + + schema_name, + + + host, + + + port, + + + username, + + + password, + + + is_deleted, + + + package_name, + + + del_prefix, + + + group_id, + + + author, + + + db_group_name, + + + + + #{dbType}, + + + #{dbDesc}, + + + #{driverClass}, + + + #{dbName}, + + + #{schemaName}, + + + #{host}, + + + #{port}, + + + #{username}, + + + #{password}, + + + #{isDeleted}, + + + #{packageName}, + + + #{delPrefix}, + + + #{groupId}, + + + #{author}, + + + #{dbGroupName}, + + + + + + + UPDATE datasource_config + + db_type=#{dbType}, + db_desc=#{dbDesc}, + driver_class=#{driverClass}, + db_name=#{dbName}, + schema_name=#{schemaName}, + host=#{host}, + port=#{port}, + username=#{username}, + password=#{password}, + is_deleted=#{isDeleted}, + package_name=#{packageName}, + del_prefix=#{delPrefix}, + group_id=#{groupId}, + author=#{author}, + db_group_name=#{dbGroupName}, + + WHERE id = #{id} + + + + + + UPDATE datasource_config + + + db_type=#{dbType}, + + + db_desc=#{dbDesc}, + + + driver_class=#{driverClass}, + + + db_name=#{dbName}, + + + schema_name=#{schemaName}, + + + host=#{host}, + + + port=#{port}, + + + username=#{username}, + + + password=#{password}, + + + is_deleted=#{isDeleted}, + + + package_name=#{packageName}, + + + del_prefix=#{delPrefix}, + + + group_id=#{groupId}, + + + author=#{author}, + + + db_group_name=#{dbGroupName}, + + + WHERE id = #{id} + + + + + + UPDATE datasource_config + SET is_deleted=1 + WHERE id = #{id} + + + + \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/GenerateHistoryMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/GenerateHistoryMapper.xml new file mode 100644 index 00000000..1cc11f09 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/GenerateHistoryMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + t.id + , t.config_content + , t.md5_value + , t.generate_time + + + + + + + + + + + INSERT INTO generate_history + + config_content, + md5_value, + generate_time, + + + #{configContent}, + #{md5Value}, + #{generateTime}, + + + + + + INSERT INTO generate_history + + + + config_content, + + + md5_value, + + + generate_time, + + + + + #{configContent}, + + + #{md5Value}, + + + #{generateTime}, + + + + + + + UPDATE generate_history + + config_content=#{configContent}, + md5_value=#{md5Value}, + generate_time=#{generateTime}, + + WHERE id = #{id} + + + + + + UPDATE generate_history + + + config_content=#{configContent}, + + + md5_value=#{md5Value}, + + + generate_time=#{generateTime}, + + + WHERE id = #{id} + + + + + + UPDATE generate_history + SET is_deleted=1 + WHERE id = #{id} + + + + + \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/SystemConfigMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/SystemConfigMapper.xml new file mode 100644 index 00000000..773c8322 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/SystemConfigMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + t.id, t.config_key, t.config_value, t.remark + + + + + + + + INSERT INTO system_config + config_key, config_value, remark, + #{configKey}, #{configValue}, #{remark}, + + + INSERT INTO system_config + + config_key, + config_value, + remark, + + + #{configKey}, + #{configValue}, + #{remark}, + + + + UPDATE system_config + config_key=#{configKey}, config_value=#{configValue}, remark=#{remark}, WHERE id = #{id} + + + UPDATE system_config + + config_key=#{configKey}, + config_value=#{configValue}, + remark=#{remark}, + WHERE id = #{id} + + + UPDATE system_config SET is_deleted=1 WHERE id = #{id} + diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateConfigMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateConfigMapper.xml new file mode 100644 index 00000000..84561e7b --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateConfigMapper.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + t.id + , t.group_id + , t.group_name + , t.name + , t.folder + , t.file_name + , t.content + , t.is_deleted + + + + + + + + + + + + + INSERT INTO template_config + + group_id, + group_name, + name, + folder, + file_name, + content, + is_deleted, + + + #{groupId}, + #{groupName}, + #{name}, + #{folder}, + #{fileName}, + #{content}, + #{isDeleted}, + + + + + + INSERT INTO template_config + + + + group_id, + + + group_name, + + + name, + + + file_name, + + + content, + + + is_deleted, + + + + + #{groupId}, + + + #{groupName}, + + + #{name}, + + + #{fileName}, + + + #{content}, + + + #{isDeleted}, + + + + + + + UPDATE template_config + + group_id=#{groupId}, + group_name=#{groupName}, + name=#{name}, + file_name=#{fileName}, + content=#{content}, + is_deleted=#{isDeleted}, + + WHERE id = #{id} + + + + + + UPDATE template_config + + + group_id=#{groupId}, + + + group_name=#{groupName}, + + + name=#{name}, + + + folder=#{folder}, + + + file_name=#{fileName}, + + + content=#{content}, + + + is_deleted=#{isDeleted}, + + + WHERE id = #{id} + + + + + + UPDATE template_config + SET is_deleted=1 + WHERE id = #{id} + + + + + + + + UPDATE template_config + SET group_name = #{groupName} + WHERE group_id = #{groupId} + + + + UPDATE template_config + SET is_deleted=1 + WHERE group_id = #{groupId} + + + + + diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateGroupMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateGroupMapper.xml new file mode 100644 index 00000000..69be989b --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/TemplateGroupMapper.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + t.id + , t.group_name + , t.is_deleted + + + + + + + + + + + + + INSERT INTO template_group + + group_name, + is_deleted, + + + #{groupName}, + #{isDeleted}, + + + + + + INSERT INTO template_group + + + + group_name, + + + is_deleted, + + + + + #{groupName}, + + + #{isDeleted}, + + + + + + + UPDATE template_group + + group_name=#{groupName}, + is_deleted=#{isDeleted}, + + WHERE id = #{id} + + + + + + UPDATE template_group + + + group_name=#{groupName}, + + + is_deleted=#{isDeleted}, + + + WHERE id = #{id} + + + + + + UPDATE template_group + SET is_deleted = 1 + WHERE id = #{id} + + + + \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/TypeConfigMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/TypeConfigMapper.xml new file mode 100644 index 00000000..d39bee2c --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/TypeConfigMapper.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + t.id , t.db_type , t.base_type , t.box_type + + + + + + INSERT INTO type_config + db_type, base_type, box_type, + #{dbType}, #{baseType}, #{boxType}, + + + INSERT INTO type_config + + db_type, + base_type, + box_type, + + + #{dbType}, + #{baseType}, + #{boxType}, + + + + UPDATE type_config + db_type=#{dbType}, base_type=#{baseType}, box_type=#{boxType}, WHERE id = #{id} + + + UPDATE type_config + + db_type=#{dbType}, + base_type=#{baseType}, + box_type=#{boxType}, + WHERE id = #{id} + + + UPDATE type_config SET is_deleted=1 WHERE id = #{id} + diff --git a/sop-admin/sop-code-gen/src/main/resources/mybatis/UpgradeMapper.xml b/sop-admin/sop-code-gen/src/main/resources/mybatis/UpgradeMapper.xml new file mode 100644 index 00000000..2a7d9f56 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/mybatis/UpgradeMapper.xml @@ -0,0 +1,48 @@ + + + + + + ${sql} + + + + ALTER TABLE ${tableName} ADD ${columnName} ${type} + + + + alter table ${tableName} add column(${columnName} ${type}); + + + + ALTER TABLE ${tableName} ADD COLUMN ${columnName} ${type} + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/favicon.ico b/sop-admin/sop-code-gen/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..34b63ac63a87ee3ea8e7a0f3f5b5406c437e2112 GIT binary patch literal 67646 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 X;@D+E7Ad=S_FbjlW&KY_+xPzm3MBT? literal 0 HcmV?d00001 diff --git a/sop-admin/sop-code-gen/src/main/resources/static/help/velocity.md b/sop-admin/sop-code-gen/src/main/resources/static/help/velocity.md new file mode 100644 index 00000000..e7ecfb42 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/help/velocity.md @@ -0,0 +1,86 @@ +# Velocity语法 + +在 Velocity 中所有的关键字都是以`#`开头的,而所有的变量则是以`$`开头。 + +## 注释 + +单行注释 + +`## 这是单行注释` + +多行注释 + +```html +#* + +xxx + + *# +``` + +## 变量 + +声明变量 + +```html +#set($name = "velocity") +#set($foo = 1) +``` + +使用: + +```html +My name is ${name} +``` + +## 循环 + +```html +#foreach($item in $list) + $item + ${foreach.index} +#end +``` + +其中,`$item`代表遍历的每一项,`${foreach.index}`表示当前循环次数的计数器,从0开始 + + +for循环跳出`#break` + +```html +#foreach($item in $list) + #if($item.name == "张三") + #break + #end +#end +``` + +## 条件控制 + +```html +#if(condition) +...dosonmething... +#elseif(condition) +...dosomething... +#else +...dosomething... +#end +``` + +如: + +```html +#if( "${table.comment}" != "" ) +/** + * ${table.comment} + */ +#end +``` + +## 关系和逻操作符 + +```html +#if($foo && $bar) + xxx +#end +``` diff --git a/sop-admin/sop-code-gen/src/main/resources/static/index.html b/sop-admin/sop-code-gen/src/main/resources/static/index.html new file mode 100644 index 00000000..f74497af --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/index.html @@ -0,0 +1 @@ +代码生成工具
\ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/app.d83b2768.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/app.d83b2768.css new file mode 100644 index 00000000..413534b0 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/app.d83b2768.css @@ -0,0 +1 @@ +.app-breadcrumb.el-breadcrumb[data-v-33d79dae]{display:inline-block;font-size:14px;line-height:50px;margin-left:8px}.app-breadcrumb.el-breadcrumb .no-redirect[data-v-33d79dae]{color:#97a8be;cursor:text}.hamburger[data-v-49e15297]{display:inline-block;vertical-align:middle;width:20px;height:20px}.hamburger.is-active[data-v-49e15297]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.navbar[data-v-58ce17d6]{height:50px;overflow:hidden;position:relative;background:#fff;-webkit-box-shadow:0 1px 4px rgba(0,21,41,.08);box-shadow:0 1px 4px rgba(0,21,41,.08)}.navbar .hamburger-container[data-v-58ce17d6]{line-height:46px;height:100%;float:left;cursor:pointer;-webkit-transition:background .3s;transition:background .3s;-webkit-tap-highlight-color:transparent}.navbar .hamburger-container[data-v-58ce17d6]:hover{background:rgba(0,0,0,.025)}.navbar .breadcrumb-container[data-v-58ce17d6]{float:left}.navbar .right-menu[data-v-58ce17d6]{float:right;height:100%;line-height:50px;padding-right:10px}.navbar .right-menu[data-v-58ce17d6]:focus{outline:none}.navbar .right-menu .right-menu-item[data-v-58ce17d6]{display:inline-block;padding:0 8px;height:100%;font-size:18px;color:#5a5e66;vertical-align:text-bottom}.navbar .right-menu .right-menu-item.hover-effect[data-v-58ce17d6]{cursor:pointer;-webkit-transition:background .3s;transition:background .3s}.navbar .right-menu .right-menu-item.hover-effect[data-v-58ce17d6]:hover{background:rgba(0,0,0,.025)}.navbar .right-menu .avatar-container[data-v-58ce17d6]{margin-right:30px}.navbar .right-menu .avatar-container .avatar-wrapper[data-v-58ce17d6]{margin-top:5px;position:relative}.navbar .right-menu .avatar-container .avatar-wrapper .user-avatar[data-v-58ce17d6]{cursor:pointer;width:40px;height:40px;border-radius:10px}.navbar .right-menu .avatar-container .avatar-wrapper .el-icon-caret-bottom[data-v-58ce17d6]{cursor:pointer;position:absolute;right:-20px;top:25px;font-size:12px}.sidebarLogoFade-enter-active[data-v-4a3d5d44]{-webkit-transition:opacity 1.5s;transition:opacity 1.5s}.sidebarLogoFade-enter[data-v-4a3d5d44],.sidebarLogoFade-leave-to[data-v-4a3d5d44]{opacity:0}.sidebar-logo-container[data-v-4a3d5d44]{position:relative;width:100%;height:50px;line-height:50px;background:#2b2f3a;padding-left:10px;overflow:hidden}.sidebar-logo-container .sidebar-logo-link[data-v-4a3d5d44]{height:100%;width:100%}.sidebar-logo-container .sidebar-logo-link .sidebar-logo[data-v-4a3d5d44]{width:32px;height:32px;vertical-align:middle;margin-right:12px}.sidebar-logo-container .sidebar-logo-link .sidebar-title[data-v-4a3d5d44]{display:inline-block;margin:0;color:#fff;font-weight:600;line-height:50px;font-size:14px;font-family:Avenir,Helvetica Neue,Arial,Helvetica,sans-serif;vertical-align:middle}.sidebar-logo-container.collapse .sidebar-logo[data-v-4a3d5d44]{margin-right:0}.app-main[data-v-43c24f68]{min-height:calc(100vh - 50px);width:100%;position:relative;overflow:hidden}.fixed-header+.app-main[data-v-43c24f68]{padding-top:50px}[data-v-4f739cf0]:export{menuText:#bfcbd9;menuActiveText:#409eff;subMenuActiveText:#f4f4f5;menuBg:#304156;menuHover:#263445;subMenuBg:#1f2d3d;subMenuHover:#001528;sideBarWidth:210px}.app-wrapper[data-v-4f739cf0]{position:relative;height:100%;width:100%}.app-wrapper[data-v-4f739cf0]:after{content:"";display:table;clear:both}.app-wrapper.mobile.openSidebar[data-v-4f739cf0]{position:fixed;top:0}.drawer-bg[data-v-4f739cf0]{background:#000;opacity:.3;width:100%;top:0;height:100%;position:absolute;z-index:999}.fixed-header[data-v-4f739cf0]{position:fixed;top:0;right:0;z-index:9;width:calc(100% - 210px);-webkit-transition:width .28s;transition:width .28s}.hideSidebar .fixed-header[data-v-4f739cf0]{width:calc(100% - 54px)}.mobile .fixed-header[data-v-4f739cf0]{width:100%}.svg-icon[data-v-53ff2da0]{width:1em;height:1em;vertical-align:-.15em;fill:currentColor;overflow:hidden}.fade-enter-active,.fade-leave-active{-webkit-transition:opacity .28s;transition:opacity .28s}.fade-enter,.fade-leave-active{opacity:0}.breadcrumb-enter-active,.breadcrumb-leave-active{-webkit-transition:all .5s;transition:all .5s}.breadcrumb-enter,.breadcrumb-leave-active{opacity:0;-webkit-transform:translateX(20px);transform:translateX(20px)}.breadcrumb-move{-webkit-transition:all .5s;transition:all .5s}.breadcrumb-leave-active{position:absolute}.el-breadcrumb__inner,.el-breadcrumb__inner a{font-weight:400!important}.el-upload input[type=file]{display:none!important}.el-upload__input{display:none}.el-dialog{-webkit-transform:none;transform:none;left:0;position:relative;margin:0 auto}.upload-container .el-upload{width:100%}.upload-container .el-upload .el-upload-dragger{width:100%;height:200px}.el-dropdown-menu a{display:block}#app .main-container{min-height:100%;-webkit-transition:margin-left .28s;transition:margin-left .28s;margin-left:210px;position:relative}#app .sidebar-container{-webkit-transition:width .28s;transition:width .28s;width:210px!important;background-color:#304156;height:100%;position:fixed;font-size:0;top:0;bottom:0;left:0;z-index:1001;overflow:hidden}#app .sidebar-container .horizontal-collapse-transition{-webkit-transition:width 0s ease-in-out,padding-left 0s ease-in-out,padding-right 0s ease-in-out;transition:width 0s ease-in-out,padding-left 0s ease-in-out,padding-right 0s ease-in-out}#app .sidebar-container .scrollbar-wrapper{overflow-x:hidden!important}#app .sidebar-container .el-scrollbar__bar.is-vertical{right:0}#app .sidebar-container .el-scrollbar{height:100%}#app .sidebar-container.has-logo .el-scrollbar{height:calc(100% - 50px)}#app .sidebar-container .is-horizontal{display:none}#app .sidebar-container a{display:inline-block;width:100%;overflow:hidden}#app .sidebar-container .svg-icon{margin-right:16px}#app .sidebar-container .el-menu{border:none;height:100%;width:100%!important}#app .sidebar-container .el-submenu__title:hover,#app .sidebar-container .submenu-title-noDropdown:hover{background-color:#263445!important}#app .sidebar-container .is-active>.el-submenu__title{color:#f4f4f5!important}#app .sidebar-container .el-submenu .el-menu-item,#app .sidebar-container .nest-menu .el-submenu>.el-submenu__title{min-width:210px!important;background-color:#1f2d3d!important}#app .sidebar-container .el-submenu .el-menu-item:hover,#app .sidebar-container .nest-menu .el-submenu>.el-submenu__title:hover{background-color:#001528!important}#app .hideSidebar .sidebar-container{width:54px!important}#app .hideSidebar .main-container{margin-left:54px}#app .hideSidebar .svg-icon{margin-right:0}#app .hideSidebar .submenu-title-noDropdown{padding:0!important;position:relative}#app .hideSidebar .submenu-title-noDropdown .el-tooltip{padding:0!important}#app .hideSidebar .submenu-title-noDropdown .el-tooltip .svg-icon{margin-left:20px}#app .hideSidebar .el-submenu{overflow:hidden}#app .hideSidebar .el-submenu>.el-submenu__title{padding:0!important}#app .hideSidebar .el-submenu>.el-submenu__title .svg-icon{margin-left:20px}#app .hideSidebar .el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}#app .hideSidebar .el-menu--collapse .el-submenu>.el-submenu__title>span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}#app .el-menu--collapse .el-menu .el-submenu{min-width:210px!important}#app .mobile .main-container{margin-left:0}#app .mobile .sidebar-container{-webkit-transition:-webkit-transform .28s;transition:-webkit-transform .28s;transition:transform .28s;transition:transform .28s,-webkit-transform .28s;width:210px!important}#app .mobile.hideSidebar .sidebar-container{pointer-events:none;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transform:translate3d(-210px,0,0);transform:translate3d(-210px,0,0)}#app .withoutAnimation .main-container,#app .withoutAnimation .sidebar-container{-webkit-transition:none;transition:none}.el-menu--vertical>.el-menu .svg-icon{margin-right:16px}.el-menu--vertical .el-menu-item:hover,.el-menu--vertical .nest-menu .el-submenu>.el-submenu__title:hover{background-color:#263445!important}.el-menu--vertical>.el-menu--popup{max-height:100vh;overflow-y:auto}.el-menu--vertical>.el-menu--popup::-webkit-scrollbar-track-piece{background:#d3dce6}.el-menu--vertical>.el-menu--popup::-webkit-scrollbar{width:6px}.el-menu--vertical>.el-menu--popup::-webkit-scrollbar-thumb{background:#99a9bf;border-radius:20px}body{height:100%;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Arial,sans-serif}label{font-weight:700}html{-webkit-box-sizing:border-box;box-sizing:border-box}#app,html{height:100%}*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}a:active,a:focus{outline:none}a,a:focus,a:hover{cursor:pointer;color:inherit;text-decoration:none}div:focus{outline:none}.clearfix:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.app-container{padding:20px}.CodeMirror{padding:0;border:1px solid #eee;height:auto}.CodeMirror-scroll{height:auto;overflow-y:hidden;overflow-x:auto}.el-aside{border-right:1px solid #eee;padding-right:10px}.el-main{padding-top:0}.el-backtop{z-index:99999}.cell .el-link{margin-bottom:1px}.cell .el-button{padding:0}.param-table .el-form{width:100%;display:inline-block}.param-table .el-form .el-form-item{margin-bottom:0}.param-table .el-form .el-form-item .el-form-item__content .el-form-item__error{position:inherit}.param-table .el-switch{margin-bottom:2px} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-10204558.7315ca47.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-10204558.7315ca47.css new file mode 100644 index 00000000..3918c01a --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-10204558.7315ca47.css @@ -0,0 +1 @@ +.cm-s-neat span.cm-comment{color:#a86}.cm-s-neat span.cm-keyword{line-height:1em;font-weight:700;color:#00f}.cm-s-neat span.cm-string{color:#a22}.cm-s-neat span.cm-builtin{line-height:1em;font-weight:700;color:#077}.cm-s-neat span.cm-special{line-height:1em;font-weight:700;color:#0aa}.cm-s-neat span.cm-variable{color:#000}.cm-s-neat span.cm-atom,.cm-s-neat span.cm-number{color:#3a3}.cm-s-neat span.cm-meta{color:#555}.cm-s-neat span.cm-link{color:#3a3}.cm-s-neat .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-neat .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important}.cm-s-darcula{font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif}.cm-s-darcula.CodeMirror{background:#2b2b2b;color:#a9b7c6}.cm-s-darcula span.cm-meta{color:#bbb529}.cm-s-darcula span.cm-number{color:#6897bb}.cm-s-darcula span.cm-keyword{color:#cc7832;line-height:1em;font-weight:700}.cm-s-darcula span.cm-def{color:#a9b7c6;font-style:italic}.cm-s-darcula span.cm-variable,.cm-s-darcula span.cm-variable-2{color:#a9b7c6}.cm-s-darcula span.cm-variable-3{color:#9876aa}.cm-s-darcula span.cm-type{color:#abc;font-weight:700}.cm-s-darcula span.cm-property{color:#ffc66d}.cm-s-darcula span.cm-operator{color:#a9b7c6}.cm-s-darcula span.cm-string,.cm-s-darcula span.cm-string-2{color:#6a8759}.cm-s-darcula span.cm-comment{color:#61a151;font-style:italic}.cm-s-darcula span.cm-atom,.cm-s-darcula span.cm-link{color:#cc7832}.cm-s-darcula span.cm-error{color:#bc3f3c}.cm-s-darcula span.cm-tag{color:#629755;font-weight:700;font-style:italic;text-decoration:underline}.cm-s-darcula span.cm-attribute{color:#6897bb}.cm-s-darcula span.cm-qualifier{color:#6a8759}.cm-s-darcula span.cm-bracket{color:#a9b7c6}.cm-s-darcula span.cm-builtin,.cm-s-darcula span.cm-special{color:#ff9e59}.cm-s-darcula span.cm-matchhighlight{color:#fff;background-color:rgba(50,89,48,.7);font-weight:400}.cm-s-darcula span.cm-searching{color:#fff;background-color:rgba(61,115,59,.7);font-weight:400}.cm-s-darcula .CodeMirror-cursor{border-left:1px solid #a9b7c6}.cm-s-darcula .CodeMirror-activeline-background{background:#323232}.cm-s-darcula .CodeMirror-gutters{background:#313335;border-right:1px solid #313335}.cm-s-darcula .CodeMirror-guttermarker{color:#ffee80}.cm-s-darcula .CodeMirror-guttermarker-subtle{color:#d0d0d0}.cm-s-darcula .CodeMirrir-linenumber{color:#606366}.cm-s-darcula .CodeMirror-matchingbracket{background-color:#3b514d;color:#ffef28!important;font-weight:700}.cm-s-darcula div.CodeMirror-selected{background:#214283}.CodeMirror-hints.darcula{font-family:Menlo,Monaco,Consolas,Courier New,monospace;color:#9c9e9e;background-color:#3b3e3f!important}.CodeMirror-hints.darcula .CodeMirror-hint-active{background-color:#494d4e!important;color:#9c9e9e!important}.cm-s-material.CodeMirror{background-color:#263238;color:#eff}.cm-s-material .CodeMirror-gutters{background:#263238;color:#546e7a;border:none}.cm-s-material .CodeMirror-guttermarker,.cm-s-material .CodeMirror-guttermarker-subtle,.cm-s-material .CodeMirror-linenumber{color:#546e7a}.cm-s-material .CodeMirror-cursor{border-left:1px solid #fc0}.cm-s-material .cm-animate-fat-cursor,.cm-s-material.cm-fat-cursor .CodeMirror-cursor{background-color:rgba(93,109,92,.5019607843137255)!important}.cm-s-material.CodeMirror-focused div.CodeMirror-selected,.cm-s-material div.CodeMirror-selected{background:rgba(128,203,196,.2)}.cm-s-material .CodeMirror-line::selection,.cm-s-material .CodeMirror-line>span::selection,.cm-s-material .CodeMirror-line>span>span::selection{background:rgba(128,203,196,.2)}.cm-s-material .CodeMirror-line::-moz-selection,.cm-s-material .CodeMirror-line>span::-moz-selection,.cm-s-material .CodeMirror-line>span>span::-moz-selection{background:rgba(128,203,196,.2)}.cm-s-material .CodeMirror-activeline-background{background:rgba(0,0,0,.5)}.cm-s-material .cm-keyword{color:#c792ea}.cm-s-material .cm-operator{color:#89ddff}.cm-s-material .cm-variable-2{color:#eff}.cm-s-material .cm-type,.cm-s-material .cm-variable-3{color:#f07178}.cm-s-material .cm-builtin{color:#ffcb6b}.cm-s-material .cm-atom{color:#f78c6c}.cm-s-material .cm-number{color:#ff5370}.cm-s-material .cm-def{color:#82aaff}.cm-s-material .cm-string{color:#c3e88d}.cm-s-material .cm-string-2{color:#f07178}.cm-s-material .cm-comment{color:#546e7a}.cm-s-material .cm-variable{color:#f07178}.cm-s-material .cm-tag{color:#ff5370}.cm-s-material .cm-meta{color:#ffcb6b}.cm-s-material .cm-attribute,.cm-s-material .cm-property{color:#c792ea}.cm-s-material .cm-qualifier,.cm-s-material .cm-type,.cm-s-material .cm-variable-3{color:#decb6b}.cm-s-material .cm-error{color:#fff;background-color:#ff5370}.cm-s-material .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.CodeMirror-dialog{position:absolute;left:0;right:0;background:inherit;z-index:15;padding:.1em .8em;overflow:hidden;color:inherit}.CodeMirror-dialog-top{border-bottom:1px solid #eee;top:0}.CodeMirror-dialog-bottom{border-top:1px solid #eee;bottom:0}.CodeMirror-dialog input{border:none;outline:none;background:transparent;width:20em;color:inherit;font-family:monospace}.CodeMirror-dialog button{font-size:70%} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-1eecf382.89945ab3.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-1eecf382.89945ab3.css new file mode 100644 index 00000000..e267514b --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-1eecf382.89945ab3.css @@ -0,0 +1 @@ +.tpl-table{color:#606266;font-size:14px;margin-bottom:10px;width:100%}.tpl-table tr th{padding-right:10px}.tpl-table tr td .el-form-item--mini{margin-bottom:0!important}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label,.el-form-item__content{line-height:20px}.velocity-tip{color:#606266;font-size:13px;font-weight:400}.velocity-var li{font-size:14px;color:#606266;line-height:26px}.velocity-var a{color:#409eff;font-weight:500}.velocity-var a:hover{color:rgba(64,158,255,.75)}.hasFix{position:fixed;top:0}.el-dropdown-link{cursor:pointer;color:#409eff}.el-icon-arrow-down{font-size:12px}span.split{color:#ccc;margin:0 3px} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-3f781f70.a37cd815.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-3f781f70.a37cd815.css new file mode 100644 index 00000000..5adab285 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-3f781f70.a37cd815.css @@ -0,0 +1 @@ +.wscn-http404-container[data-v-c095f994]{-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);position:absolute;top:40%;left:50%}.wscn-http404[data-v-c095f994]{position:relative;width:1200px;padding:0 50px;overflow:hidden}.wscn-http404 .pic-404[data-v-c095f994]{position:relative;float:left;width:600px;overflow:hidden}.wscn-http404 .pic-404__parent[data-v-c095f994]{width:100%}.wscn-http404 .pic-404__child[data-v-c095f994]{position:absolute}.wscn-http404 .pic-404__child.left[data-v-c095f994]{width:80px;top:17px;left:220px;opacity:0;-webkit-animation-name:cloudLeft-data-v-c095f994;animation-name:cloudLeft-data-v-c095f994;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}.wscn-http404 .pic-404__child.mid[data-v-c095f994]{width:46px;top:10px;left:420px;opacity:0;-webkit-animation-name:cloudMid-data-v-c095f994;animation-name:cloudMid-data-v-c095f994;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1.2s;animation-delay:1.2s}.wscn-http404 .pic-404__child.right[data-v-c095f994]{width:62px;top:100px;left:500px;opacity:0;-webkit-animation-name:cloudRight-data-v-c095f994;animation-name:cloudRight-data-v-c095f994;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}@-webkit-keyframes cloudLeft-data-v-c095f994{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@keyframes cloudLeft-data-v-c095f994{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@-webkit-keyframes cloudMid-data-v-c095f994{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@keyframes cloudMid-data-v-c095f994{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@-webkit-keyframes cloudRight-data-v-c095f994{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}@keyframes cloudRight-data-v-c095f994{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}.wscn-http404 .bullshit[data-v-c095f994]{position:relative;float:left;width:300px;padding:30px 0;overflow:hidden}.wscn-http404 .bullshit__oops[data-v-c095f994]{font-size:32px;line-height:40px;color:#1482f0;margin-bottom:20px;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__headline[data-v-c095f994],.wscn-http404 .bullshit__oops[data-v-c095f994]{font-weight:700;opacity:0;-webkit-animation-name:slideUp-data-v-c095f994;animation-name:slideUp-data-v-c095f994;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__headline[data-v-c095f994]{font-size:20px;line-height:24px;color:#222;margin-bottom:10px;-webkit-animation-delay:.1s;animation-delay:.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-c095f994]{font-size:13px;line-height:21px;color:grey;margin-bottom:30px;-webkit-animation-delay:.2s;animation-delay:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-c095f994],.wscn-http404 .bullshit__return-home[data-v-c095f994]{opacity:0;-webkit-animation-name:slideUp-data-v-c095f994;animation-name:slideUp-data-v-c095f994;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__return-home[data-v-c095f994]{display:block;float:left;width:110px;height:36px;background:#1482f0;border-radius:100px;text-align:center;color:#fff;font-size:14px;line-height:36px;cursor:pointer;-webkit-animation-delay:.3s;animation-delay:.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes slideUp-data-v-c095f994{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes slideUp-data-v-c095f994{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-49e8d1e8.e2948cc9.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-49e8d1e8.e2948cc9.css new file mode 100644 index 00000000..02ed69e4 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-49e8d1e8.e2948cc9.css @@ -0,0 +1 @@ +.code-gen{margin:0 auto;width:70%}.code-gen .el-input{width:450px}.code-gen .el-row h4{text-align:center}.code-gen .el-row .el-button{margin-top:20px}.el-table .hidden-row{display:none}#templateSelect .el-input{width:100%} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-734ead8e.dfbde295.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-734ead8e.dfbde295.css new file mode 100644 index 00000000..9b9987b4 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-734ead8e.dfbde295.css @@ -0,0 +1 @@ +.cm-s-neat span.cm-comment{color:#a86}.cm-s-neat span.cm-keyword{line-height:1em;font-weight:700;color:#00f}.cm-s-neat span.cm-string{color:#a22}.cm-s-neat span.cm-builtin{line-height:1em;font-weight:700;color:#077}.cm-s-neat span.cm-special{line-height:1em;font-weight:700;color:#0aa}.cm-s-neat span.cm-variable{color:#000}.cm-s-neat span.cm-atom,.cm-s-neat span.cm-number{color:#3a3}.cm-s-neat span.cm-meta{color:#555}.cm-s-neat span.cm-link{color:#3a3}.cm-s-neat .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-neat .CodeMirror-matchingbracket{outline:1px solid grey;color:#000!important} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-aacd9526.2864c242.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-aacd9526.2864c242.css new file mode 100644 index 00000000..e167b074 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-aacd9526.2864c242.css @@ -0,0 +1 @@ +.dashboard-container[data-v-22edc0ee]{margin:30px}.dashboard-text[data-v-22edc0ee]{font-size:18px;line-height:46px} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-elementUI.f2af0811.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-elementUI.f2af0811.css new file mode 100644 index 00000000..70a49155 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-elementUI.f2af0811.css @@ -0,0 +1 @@ +.el-pagination--small .arrow.disabled,.el-table--hidden,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.is-hidden>*{visibility:hidden}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing),.el-message__closeBtn:focus,.el-message__content:focus,.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing),.el-rate:active,.el-rate:focus,.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing),.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}.el-input__suffix,.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}@font-face{font-family:element-icons;src:url(../../static/fonts/element-icons.535877f5.woff) format("woff"),url(../../static/fonts/element-icons.732389de.ttf) format("truetype");font-weight:400;font-display:"auto";font-style:normal}[class*=" el-icon-"],[class^=el-icon-]{font-family:element-icons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;vertical-align:baseline;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-icon-ice-cream-round:before{content:"\E6A0"}.el-icon-ice-cream-square:before{content:"\E6A3"}.el-icon-lollipop:before{content:"\E6A4"}.el-icon-potato-strips:before{content:"\E6A5"}.el-icon-milk-tea:before{content:"\E6A6"}.el-icon-ice-drink:before{content:"\E6A7"}.el-icon-ice-tea:before{content:"\E6A9"}.el-icon-coffee:before{content:"\E6AA"}.el-icon-orange:before{content:"\E6AB"}.el-icon-pear:before{content:"\E6AC"}.el-icon-apple:before{content:"\E6AD"}.el-icon-cherry:before{content:"\E6AE"}.el-icon-watermelon:before{content:"\E6AF"}.el-icon-grape:before{content:"\E6B0"}.el-icon-refrigerator:before{content:"\E6B1"}.el-icon-goblet-square-full:before{content:"\E6B2"}.el-icon-goblet-square:before{content:"\E6B3"}.el-icon-goblet-full:before{content:"\E6B4"}.el-icon-goblet:before{content:"\E6B5"}.el-icon-cold-drink:before{content:"\E6B6"}.el-icon-coffee-cup:before{content:"\E6B8"}.el-icon-water-cup:before{content:"\E6B9"}.el-icon-hot-water:before{content:"\E6BA"}.el-icon-ice-cream:before{content:"\E6BB"}.el-icon-dessert:before{content:"\E6BC"}.el-icon-sugar:before{content:"\E6BD"}.el-icon-tableware:before{content:"\E6BE"}.el-icon-burger:before{content:"\E6BF"}.el-icon-knife-fork:before{content:"\E6C1"}.el-icon-fork-spoon:before{content:"\E6C2"}.el-icon-chicken:before{content:"\E6C3"}.el-icon-food:before{content:"\E6C4"}.el-icon-dish-1:before{content:"\E6C5"}.el-icon-dish:before{content:"\E6C6"}.el-icon-moon-night:before{content:"\E6EE"}.el-icon-moon:before{content:"\E6F0"}.el-icon-cloudy-and-sunny:before{content:"\E6F1"}.el-icon-partly-cloudy:before{content:"\E6F2"}.el-icon-cloudy:before{content:"\E6F3"}.el-icon-sunny:before{content:"\E6F6"}.el-icon-sunset:before{content:"\E6F7"}.el-icon-sunrise-1:before{content:"\E6F8"}.el-icon-sunrise:before{content:"\E6F9"}.el-icon-heavy-rain:before{content:"\E6FA"}.el-icon-lightning:before{content:"\E6FB"}.el-icon-light-rain:before{content:"\E6FC"}.el-icon-wind-power:before{content:"\E6FD"}.el-icon-baseball:before{content:"\E712"}.el-icon-soccer:before{content:"\E713"}.el-icon-football:before{content:"\E715"}.el-icon-basketball:before{content:"\E716"}.el-icon-ship:before{content:"\E73F"}.el-icon-truck:before{content:"\E740"}.el-icon-bicycle:before{content:"\E741"}.el-icon-mobile-phone:before{content:"\E6D3"}.el-icon-service:before{content:"\E6D4"}.el-icon-key:before{content:"\E6E2"}.el-icon-unlock:before{content:"\E6E4"}.el-icon-lock:before{content:"\E6E5"}.el-icon-watch:before{content:"\E6FE"}.el-icon-watch-1:before{content:"\E6FF"}.el-icon-timer:before{content:"\E702"}.el-icon-alarm-clock:before{content:"\E703"}.el-icon-map-location:before{content:"\E704"}.el-icon-delete-location:before{content:"\E705"}.el-icon-add-location:before{content:"\E706"}.el-icon-location-information:before{content:"\E707"}.el-icon-location-outline:before{content:"\E708"}.el-icon-location:before{content:"\E79E"}.el-icon-place:before{content:"\E709"}.el-icon-discover:before{content:"\E70A"}.el-icon-first-aid-kit:before{content:"\E70B"}.el-icon-trophy-1:before{content:"\E70C"}.el-icon-trophy:before{content:"\E70D"}.el-icon-medal:before{content:"\E70E"}.el-icon-medal-1:before{content:"\E70F"}.el-icon-stopwatch:before{content:"\E710"}.el-icon-mic:before{content:"\E711"}.el-icon-copy-document:before{content:"\E718"}.el-icon-full-screen:before{content:"\E719"}.el-icon-switch-button:before{content:"\E71B"}.el-icon-aim:before{content:"\E71C"}.el-icon-crop:before{content:"\E71D"}.el-icon-odometer:before{content:"\E71E"}.el-icon-time:before{content:"\E71F"}.el-icon-bangzhu:before{content:"\E724"}.el-icon-close-notification:before{content:"\E726"}.el-icon-microphone:before{content:"\E727"}.el-icon-turn-off-microphone:before{content:"\E728"}.el-icon-position:before{content:"\E729"}.el-icon-postcard:before{content:"\E72A"}.el-icon-message:before{content:"\E72B"}.el-icon-chat-line-square:before{content:"\E72D"}.el-icon-chat-dot-square:before{content:"\E72E"}.el-icon-chat-dot-round:before{content:"\E72F"}.el-icon-chat-square:before{content:"\E730"}.el-icon-chat-line-round:before{content:"\E731"}.el-icon-chat-round:before{content:"\E732"}.el-icon-set-up:before{content:"\E733"}.el-icon-turn-off:before{content:"\E734"}.el-icon-open:before{content:"\E735"}.el-icon-connection:before{content:"\E736"}.el-icon-link:before{content:"\E737"}.el-icon-cpu:before{content:"\E738"}.el-icon-thumb:before{content:"\E739"}.el-icon-female:before{content:"\E73A"}.el-icon-male:before{content:"\E73B"}.el-icon-guide:before{content:"\E73C"}.el-icon-news:before{content:"\E73E"}.el-icon-price-tag:before{content:"\E744"}.el-icon-discount:before{content:"\E745"}.el-icon-wallet:before{content:"\E747"}.el-icon-coin:before{content:"\E748"}.el-icon-money:before{content:"\E749"}.el-icon-bank-card:before{content:"\E74A"}.el-icon-box:before{content:"\E74B"}.el-icon-present:before{content:"\E74C"}.el-icon-sell:before{content:"\E6D5"}.el-icon-sold-out:before{content:"\E6D6"}.el-icon-shopping-bag-2:before{content:"\E74D"}.el-icon-shopping-bag-1:before{content:"\E74E"}.el-icon-shopping-cart-2:before{content:"\E74F"}.el-icon-shopping-cart-1:before{content:"\E750"}.el-icon-shopping-cart-full:before{content:"\E751"}.el-icon-smoking:before{content:"\E752"}.el-icon-no-smoking:before{content:"\E753"}.el-icon-house:before{content:"\E754"}.el-icon-table-lamp:before{content:"\E755"}.el-icon-school:before{content:"\E756"}.el-icon-office-building:before{content:"\E757"}.el-icon-toilet-paper:before{content:"\E758"}.el-icon-notebook-2:before{content:"\E759"}.el-icon-notebook-1:before{content:"\E75A"}.el-icon-files:before{content:"\E75B"}.el-icon-collection:before{content:"\E75C"}.el-icon-receiving:before{content:"\E75D"}.el-icon-suitcase-1:before{content:"\E760"}.el-icon-suitcase:before{content:"\E761"}.el-icon-film:before{content:"\E763"}.el-icon-collection-tag:before{content:"\E765"}.el-icon-data-analysis:before{content:"\E766"}.el-icon-pie-chart:before{content:"\E767"}.el-icon-data-board:before{content:"\E768"}.el-icon-data-line:before{content:"\E76D"}.el-icon-reading:before{content:"\E769"}.el-icon-magic-stick:before{content:"\E76A"}.el-icon-coordinate:before{content:"\E76B"}.el-icon-mouse:before{content:"\E76C"}.el-icon-brush:before{content:"\E76E"}.el-icon-headset:before{content:"\E76F"}.el-icon-umbrella:before{content:"\E770"}.el-icon-scissors:before{content:"\E771"}.el-icon-mobile:before{content:"\E773"}.el-icon-attract:before{content:"\E774"}.el-icon-monitor:before{content:"\E775"}.el-icon-search:before{content:"\E778"}.el-icon-takeaway-box:before{content:"\E77A"}.el-icon-paperclip:before{content:"\E77D"}.el-icon-printer:before{content:"\E77E"}.el-icon-document-add:before{content:"\E782"}.el-icon-document:before{content:"\E785"}.el-icon-document-checked:before{content:"\E786"}.el-icon-document-copy:before{content:"\E787"}.el-icon-document-delete:before{content:"\E788"}.el-icon-document-remove:before{content:"\E789"}.el-icon-tickets:before{content:"\E78B"}.el-icon-folder-checked:before{content:"\E77F"}.el-icon-folder-delete:before{content:"\E780"}.el-icon-folder-remove:before{content:"\E781"}.el-icon-folder-add:before{content:"\E783"}.el-icon-folder-opened:before{content:"\E784"}.el-icon-folder:before{content:"\E78A"}.el-icon-edit-outline:before{content:"\E764"}.el-icon-edit:before{content:"\E78C"}.el-icon-date:before{content:"\E78E"}.el-icon-c-scale-to-original:before{content:"\E7C6"}.el-icon-view:before{content:"\E6CE"}.el-icon-loading:before{content:"\E6CF"}.el-icon-rank:before{content:"\E6D1"}.el-icon-sort-down:before{content:"\E7C4"}.el-icon-sort-up:before{content:"\E7C5"}.el-icon-sort:before{content:"\E6D2"}.el-icon-finished:before{content:"\E6CD"}.el-icon-refresh-left:before{content:"\E6C7"}.el-icon-refresh-right:before{content:"\E6C8"}.el-icon-refresh:before{content:"\E6D0"}.el-icon-video-play:before{content:"\E7C0"}.el-icon-video-pause:before{content:"\E7C1"}.el-icon-d-arrow-right:before{content:"\E6DC"}.el-icon-d-arrow-left:before{content:"\E6DD"}.el-icon-arrow-up:before{content:"\E6E1"}.el-icon-arrow-down:before{content:"\E6DF"}.el-icon-arrow-right:before{content:"\E6E0"}.el-icon-arrow-left:before{content:"\E6DE"}.el-icon-top-right:before{content:"\E6E7"}.el-icon-top-left:before{content:"\E6E8"}.el-icon-top:before{content:"\E6E6"}.el-icon-bottom:before{content:"\E6EB"}.el-icon-right:before{content:"\E6E9"}.el-icon-back:before{content:"\E6EA"}.el-icon-bottom-right:before{content:"\E6EC"}.el-icon-bottom-left:before{content:"\E6ED"}.el-icon-caret-top:before{content:"\E78F"}.el-icon-caret-bottom:before{content:"\E790"}.el-icon-caret-right:before{content:"\E791"}.el-icon-caret-left:before{content:"\E792"}.el-icon-d-caret:before{content:"\E79A"}.el-icon-share:before{content:"\E793"}.el-icon-menu:before{content:"\E798"}.el-icon-s-grid:before{content:"\E7A6"}.el-icon-s-check:before{content:"\E7A7"}.el-icon-s-data:before{content:"\E7A8"}.el-icon-s-opportunity:before{content:"\E7AA"}.el-icon-s-custom:before{content:"\E7AB"}.el-icon-s-claim:before{content:"\E7AD"}.el-icon-s-finance:before{content:"\E7AE"}.el-icon-s-comment:before{content:"\E7AF"}.el-icon-s-flag:before{content:"\E7B0"}.el-icon-s-marketing:before{content:"\E7B1"}.el-icon-s-shop:before{content:"\E7B4"}.el-icon-s-open:before{content:"\E7B5"}.el-icon-s-management:before{content:"\E7B6"}.el-icon-s-ticket:before{content:"\E7B7"}.el-icon-s-release:before{content:"\E7B8"}.el-icon-s-home:before{content:"\E7B9"}.el-icon-s-promotion:before{content:"\E7BA"}.el-icon-s-operation:before{content:"\E7BB"}.el-icon-s-unfold:before{content:"\E7BC"}.el-icon-s-fold:before{content:"\E7A9"}.el-icon-s-platform:before{content:"\E7BD"}.el-icon-s-order:before{content:"\E7BE"}.el-icon-s-cooperation:before{content:"\E7BF"}.el-icon-bell:before{content:"\E725"}.el-icon-message-solid:before{content:"\E799"}.el-icon-video-camera:before{content:"\E772"}.el-icon-video-camera-solid:before{content:"\E796"}.el-icon-camera:before{content:"\E779"}.el-icon-camera-solid:before{content:"\E79B"}.el-icon-download:before{content:"\E77C"}.el-icon-upload2:before{content:"\E77B"}.el-icon-upload:before{content:"\E7C3"}.el-icon-picture-outline-round:before{content:"\E75F"}.el-icon-picture-outline:before{content:"\E75E"}.el-icon-picture:before{content:"\E79F"}.el-icon-close:before{content:"\E6DB"}.el-icon-check:before{content:"\E6DA"}.el-icon-plus:before{content:"\E6D9"}.el-icon-minus:before{content:"\E6D8"}.el-icon-help:before{content:"\E73D"}.el-icon-s-help:before{content:"\E7B3"}.el-icon-circle-close:before{content:"\E78D"}.el-icon-circle-check:before{content:"\E720"}.el-icon-circle-plus-outline:before{content:"\E723"}.el-icon-remove-outline:before{content:"\E722"}.el-icon-zoom-out:before{content:"\E776"}.el-icon-zoom-in:before{content:"\E777"}.el-icon-error:before{content:"\E79D"}.el-icon-success:before{content:"\E79C"}.el-icon-circle-plus:before{content:"\E7A0"}.el-icon-remove:before{content:"\E7A2"}.el-icon-info:before{content:"\E7A1"}.el-icon-question:before{content:"\E7A4"}.el-icon-warning-outline:before{content:"\E6C9"}.el-icon-warning:before{content:"\E7A3"}.el-icon-goods:before{content:"\E7C2"}.el-icon-s-goods:before{content:"\E7B2"}.el-icon-star-off:before{content:"\E717"}.el-icon-star-on:before{content:"\E797"}.el-icon-more-outline:before{content:"\E6CC"}.el-icon-more:before{content:"\E794"}.el-icon-phone-outline:before{content:"\E6CB"}.el-icon-phone:before{content:"\E795"}.el-icon-user:before{content:"\E6E3"}.el-icon-user-solid:before{content:"\E7A5"}.el-icon-setting:before{content:"\E6CA"}.el-icon-s-tools:before{content:"\E7AC"}.el-icon-delete:before{content:"\E6D7"}.el-icon-delete-solid:before{content:"\E7C9"}.el-icon-eleme:before{content:"\E7C7"}.el-icon-platform-eleme:before{content:"\E7CA"}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotating{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.el-pagination{white-space:nowrap;padding:2px 5px;color:#303133;font-weight:700}.el-pagination:after,.el-pagination:before{display:table;content:""}.el-pagination:after{clear:both}.el-pagination button,.el-pagination span:not([class*=suffix]){display:inline-block;font-size:13px;min-width:35.5px;height:28px;line-height:28px;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.el-pagination .el-select .el-input{width:100px;margin:0 5px}.el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:#409eff}.el-pagination button:disabled{color:#c0c4cc;background-color:#fff;cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:50% no-repeat #fff;background-size:16px;cursor:pointer;margin:0;color:#303133}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700}.el-pagination .btn-prev{padding-right:12px}.el-pagination .btn-next{padding-left:12px}.el-pagination .el-pager li.disabled{color:#c0c4cc;cursor:not-allowed}.el-pager li,.el-pager li.btn-quicknext:hover,.el-pager li.btn-quickprev:hover{cursor:pointer}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.el-pagination--small .more:before,.el-pagination--small li.more:before{line-height:24px}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:22px;line-height:22px}.el-pagination--small .el-pagination__editor,.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:22px}.el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#606266}.el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.el-pagination__sizes .el-input .el-input__inner:hover{border-color:#409eff}.el-pagination__total{margin-right:10px;font-weight:400;color:#606266}.el-pagination__jump{margin-left:24px;font-weight:400;color:#606266}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__rightwrapper{float:right}.el-pagination__editor{line-height:18px;padding:0 2px;height:28px;text-align:center;margin:0 2px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px}.el-pager,.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:28px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 5px;background-color:#f4f4f5;color:#606266;min-width:30px;border-radius:2px}.el-pagination.is-background .btn-next.disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.disabled{color:#c0c4cc}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:#409eff}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:#409eff;color:#fff}.el-dialog,.el-pager li{background:#fff;-webkit-box-sizing:border-box}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{margin:0 3px;min-width:22px}.el-pager,.el-pager li{vertical-align:top;margin:0;display:inline-block}.el-pager{-ms-user-select:none;user-select:none;list-style:none;font-size:0}.el-date-table,.el-pager,.el-table th{-webkit-user-select:none;-moz-user-select:none}.el-pager .more:before{line-height:30px}.el-pager li{padding:0 4px;font-size:13px;min-width:35.5px;height:28px;line-height:28px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center}.el-menu--collapse .el-menu .el-submenu,.el-menu--popup{min-width:200px}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:28px;color:#303133}.el-pager li.btn-quicknext.disabled,.el-pager li.btn-quickprev.disabled{color:#c0c4cc}.el-pager li.active+li{border-left:0}.el-pager li:hover{color:#409eff}.el-pager li.active{color:#409eff;cursor:default}@-webkit-keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{to{opacity:0}}.el-dialog{position:relative;margin:0 auto 50px;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#409eff}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px;word-break:break-all}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete-suggestion{margin:5px 0;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;border:1px solid #e4e7ed;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.el-dropdown-menu,.el-menu--collapse .el-submenu .el-menu{z-index:10;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#606266;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li.highlighted,.el-autocomplete-suggestion li:hover{background-color:#f5f7fa}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.el-autocomplete-suggestion.is-loading li:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:#fff}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.el-dropdown .el-dropdown__caret-button:before{content:"";position:absolute;display:block;width:1px;top:5px;bottom:5px;left:0;background:hsla(0,0%,100%,.5)}.el-dropdown .el-dropdown__caret-button.el-button--default:before{background:rgba(220,223,230,.5)}.el-dropdown .el-dropdown__caret-button:hover:before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown-menu{position:absolute;top:0;left:0;padding:10px 0;margin:5px 0;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-dropdown-menu__item{list-style:none;line-height:36px;padding:0 20px;margin:0;font-size:14px;color:#606266;cursor:pointer;outline:0}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#ecf5ff;color:#66b1ff}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #ebeef5}.el-dropdown-menu__item--divided:before{content:"";height:6px;display:block;margin:0 -20px;background-color:#fff}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-menu{border-right:1px solid #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0}.el-menu,.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-menu:after,.el-menu:before{display:table;content:""}.el-menu:after{clear:both}.el-menu.el-menu--horizontal{border-bottom:1px solid #e6e6e6}.el-menu--horizontal{border-right:none}.el-menu--horizontal>.el-menu-item{float:left;height:60px;line-height:60px;margin:0;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #409eff;color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#fff;float:none;height:36px;line-height:36px;padding:0 10px;color:#909399}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:#303133}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid #409eff;color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-submenu{position:relative}.el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;border:1px solid #e4e7ed;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu-item,.el-submenu__title{height:56px;line-height:56px;position:relative;-webkit-box-sizing:border-box;white-space:nowrap;list-style:none}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.el-menu--popup{z-index:100;border:none;padding:5px 0;border-radius:2px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{outline:0;background-color:#ecf5ff}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:#409eff}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;-webkit-box-sizing:border-box;box-sizing:border-box}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{outline:0;background-color:#ecf5ff}.el-submenu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.el-submenu__icon-arrow{position:absolute;top:50%;right:20px;margin-top:-7px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:12px}.el-submenu.is-active .el-submenu__title{border-bottom-color:#409eff}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#909399}.el-radio-button__inner,.el-radio-group{display:inline-block;line-height:1;vertical-align:middle}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.el-radio-group{font-size:0}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{white-space:nowrap;background:#fff;border:1px solid #dcdfe6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;position:relative;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#409eff}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#fff;background-color:#409eff;border-color:#409eff;-webkit-box-shadow:-1px 0 0 0 #409eff;box-shadow:-1px 0 0 0 #409eff}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#f2f6fc}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-popover,.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #409eff;box-shadow:0 0 2px 2px #409eff}.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;vertical-align:middle;color:#303133}.el-switch__label.is-active{color:#409eff}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #dcdfe6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#dcdfe6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#fff}.el-switch.is-checked .el-switch__core{border-color:#409eff;background-color:#409eff}.el-switch.is-checked .el-switch__core:after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #e4e7ed;border-radius:4px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#409eff;background-color:#fff}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#f5f7fa}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected:after{position:absolute;right:20px;font-family:element-icons;content:"\E6DA";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#fff}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#f5f7fa}.el-select-dropdown__item.selected{color:#409eff;font-weight:700}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type):after{content:"";position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#e4e7ed}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{display:inline-block;position:relative}.el-select .el-select__tags>span{display:contents}.el-select:hover .el-input__inner{border-color:#c0c4cc}.el-select .el-input__inner{cursor:pointer;padding-right:35px}.el-select .el-input__inner:focus{border-color:#409eff}.el-select .el-input .el-select__caret{color:#c0c4cc;font-size:14px;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotate(180deg);transform:rotate(180deg);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotate(0);transform:rotate(0)}.el-select .el-input .el-select__caret.is-show-close{font-size:14px;text-align:center;-webkit-transform:rotate(180deg);transform:rotate(180deg);border-radius:100%;color:#c0c4cc;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-select .el-input .el-select__caret.is-show-close:hover{color:#909399}.el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__inner:hover{border-color:#e4e7ed}.el-select .el-input.is-focus .el-input__inner{border-color:#409eff}.el-select>.el-input{display:block}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-mini{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#c0c4cc;line-height:18px;font-size:14px}.el-select__close:hover{color:#909399}.el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-select .el-tag__close{margin-top:-2px}.el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:#f0f2f5}.el-select .el-tag__close.el-icon-close{background-color:#c0c4cc;right:-7px;top:0;color:#fff}.el-select .el-tag__close.el-icon-close:hover{background-color:#909399}.el-table,.el-table__expanded-cell{background-color:#fff}.el-select .el-tag__close.el-icon-close:before{display:block;-webkit-transform:translateY(.5px);transform:translateY(.5px)}.el-table{position:relative;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;max-width:100%;font-size:14px;color:#606266}.el-table--mini,.el-table--small,.el-table__expand-icon{font-size:12px}.el-table__empty-block{min-height:60px;text-align:center;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:#909399}.el-table__expand-column .cell{padding:0;text-align:center}.el-table__expand-icon{position:relative;cursor:pointer;color:#666;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out;height:20px}.el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit td.gutter,.el-table--fit th.gutter{border-right-width:1px}.el-table--scrollable-x .el-table__body-wrapper{overflow-x:auto}.el-table--scrollable-y .el-table__body-wrapper{overflow-y:auto}.el-table thead{color:#909399;font-weight:500}.el-table thead.is-group th{background:#f5f7fa}.el-table th,.el-table tr{background-color:#fff}.el-table td,.el-table th{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left}.el-table td.is-center,.el-table th.is-center{text-align:center}.el-table td.is-right,.el-table th.is-right{text-align:right}.el-table td.gutter,.el-table th.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table--medium td,.el-table--medium th{padding:10px 0}.el-table--small td,.el-table--small th{padding:8px 0}.el-table--mini td,.el-table--mini th{padding:6px 0}.el-table--border td:first-child .cell,.el-table--border th:first-child .cell,.el-table .cell{padding-left:10px}.el-table tr input[type=checkbox]{margin:0}.el-table td,.el-table th.is-leaf{border-bottom:1px solid #ebeef5}.el-table th.is-sortable{cursor:pointer}.el-table th{overflow:hidden;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.el-table th>.cell{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;vertical-align:middle;padding-left:10px;padding-right:10px;width:100%}.el-table th>.cell.highlight{color:#409eff}.el-table th.required>div:before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-table td.gutter{width:0}.el-table .cell{-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding-right:10px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--border,.el-table--group{border:1px solid #ebeef5}.el-table--border:after,.el-table--group:after,.el-table:before{content:"";position:absolute;background-color:#ebeef5;z-index:1}.el-table--border:after,.el-table--group:after{top:0;right:0;width:1px;height:100%}.el-table:before{left:0;bottom:0;width:100%;height:1px}.el-table--border{border-right:none;border-bottom:none}.el-table--border.el-loading-parent--relative{border-color:transparent}.el-table--border td,.el-table--border th,.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:1px solid #ebeef5}.el-table--border th.gutter:last-of-type{border-bottom:1px solid #ebeef5;border-bottom-width:1px}.el-table--border th,.el-table__fixed-right-patch{border-bottom:1px solid #ebeef5}.el-table__fixed,.el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.el-table__fixed-right:before,.el-table__fixed:before{content:"";position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#ebeef5;z-index:4}.el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#fff}.el-table__fixed-right{top:0;left:auto;right:0}.el-table__fixed-right .el-table__fixed-body-wrapper,.el-table__fixed-right .el-table__fixed-footer-wrapper,.el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.el-table__fixed-footer-wrapper tbody td{border-top:1px solid #ebeef5;background-color:#f5f7fa;color:#606266}.el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__footer-wrapper{margin-top:-1px}.el-table__footer-wrapper td{border-top:1px solid #ebeef5}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td,.el-table__header-wrapper tbody td{background-color:#f5f7fa;color:#606266}.el-table__body-wrapper{overflow:hidden;position:relative}.el-table__body-wrapper.is-scrolling-left~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right,.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.el-picker-panel,.el-table-filter{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right{border-left:1px solid #ebeef5}.el-table .caret-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:5px solid transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:#c0c4cc;top:5px}.el-table .sort-caret.descending{border-top-color:#c0c4cc;bottom:7px}.el-table .ascending .sort-caret.ascending{border-bottom-color:#409eff}.el-table .descending .sort-caret.descending{border-top-color:#409eff}.el-table .hidden-columns{position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td{background:#fafafa}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td{background-color:#ecf5ff}.el-table__body tr.hover-row.current-row>td,.el-table__body tr.hover-row.el-table__row--striped.current-row>td,.el-table__body tr.hover-row.el-table__row--striped>td,.el-table__body tr.hover-row>td{background-color:#f5f7fa}.el-table__body tr.current-row>td{background-color:#ecf5ff}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #ebeef5;z-index:10}.el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.el-table__column-filter-trigger i{color:#909399;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.el-table--enable-row-transition .el-table__body td{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td{background-color:#f5f7fa}.el-table--fluid-height .el-table__fixed,.el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:20px;line-height:20px;height:20px;text-align:center;margin-right:3px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:1px solid #ebeef5;border-radius:2px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:2px 0}.el-date-table td,.el-date-table td div{height:30px;-webkit-box-sizing:border-box}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.el-table-filter__list-item:hover{background-color:#ecf5ff;color:#66b1ff}.el-table-filter__list-item.is-active{background-color:#409eff;color:#fff}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid #ebeef5;padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:#606266;cursor:pointer;font-size:13px;padding:0 3px}.el-date-table.is-week-mode .el-date-table__row.current div,.el-date-table.is-week-mode .el-date-table__row:hover div,.el-date-table td.in-range div,.el-date-table td.in-range div:hover{background-color:#f2f6fc}.el-table-filter__bottom button:hover{color:#409eff}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:block;margin-right:5px;margin-bottom:8px;margin-left:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-date-table{font-size:12px;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#606266}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td{width:32px;padding:4px 0;text-align:center;cursor:pointer;position:relative}.el-date-table td,.el-date-table td div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td div{padding:3px 0}.el-date-table td span{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:50%}.el-date-table td.next-month,.el-date-table td.prev-month{color:#c0c4cc}.el-date-table td.today{position:relative}.el-date-table td.today span{color:#409eff;font-weight:700}.el-date-table td.today.end-date span,.el-date-table td.today.start-date span{color:#fff}.el-date-table td.available:hover{color:#409eff}.el-date-table td.current:not(.disabled) span{color:#fff;background-color:#409eff}.el-date-table td.end-date div,.el-date-table td.start-date div{color:#fff}.el-date-table td.end-date span,.el-date-table td.start-date span{background-color:#409eff}.el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled div{background-color:#f5f7fa;opacity:1;cursor:not-allowed;color:#c0c4cc}.el-date-table td.selected div{margin-left:5px;margin-right:5px;background-color:#f2f6fc;border-radius:15px}.el-date-table td.selected div:hover{background-color:#f2f6fc}.el-date-table td.selected span{background-color:#409eff;color:#fff;border-radius:15px}.el-date-table td.week{font-size:80%;color:#606266}.el-month-table,.el-year-table{font-size:12px;border-collapse:collapse}.el-date-table th{padding:5px;color:#606266;font-weight:400;border-bottom:1px solid #ebeef5}.el-month-table{margin:-1px}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-month-table td.today .cell{color:#409eff;font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#fff}.el-month-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#c0c4cc}.el-month-table td.disabled .cell:hover{color:#c0c4cc}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:#606266;margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:#409eff}.el-month-table td.in-range div,.el-month-table td.in-range div:hover{background-color:#f2f6fc}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#fff}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#fff;background-color:#409eff}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:#409eff}.el-year-table{margin:-1px}.el-year-table .el-icon{color:#303133}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:#409eff;font-weight:700}.el-year-table td.disabled .cell{background-color:#f5f7fa;cursor:not-allowed;color:#c0c4cc}.el-year-table td.disabled .cell:hover{color:#c0c4cc}.el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#606266;margin:0 auto}.el-year-table td .cell:hover,.el-year-table td.current:not(.disabled) .cell{color:#409eff}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#303133}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#fff}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:1px solid #ebeef5}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#606266}.el-date-picker__header-label.active,.el-date-picker__header-label:hover{color:#409eff}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.selected:not(.disabled){color:#409eff;font-weight:700}.time-select-item.disabled{color:#e4e7ed;cursor:not-allowed}.time-select-item:hover{background-color:#f5f7fa;font-weight:700;cursor:pointer}.el-date-editor{position:relative;display:inline-block;text-align:left}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:220px}.el-date-editor--monthrange.el-input,.el-date-editor--monthrange.el-input__inner{width:300px}.el-date-editor--daterange.el-input,.el-date-editor--daterange.el-input__inner,.el-date-editor--timerange.el-input,.el-date-editor--timerange.el-input__inner{width:350px}.el-date-editor--datetimerange.el-input,.el-date-editor--datetimerange.el-input__inner{width:400px}.el-date-editor--dates .el-input__inner{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .el-icon-circle-close{cursor:pointer}.el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#c0c4cc;float:left;line-height:32px}.el-date-editor .el-range-input,.el-date-editor .el-range-separator{height:100%;margin:0;text-align:center;display:inline-block;font-size:14px}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;padding:0;width:39%;color:#606266}.el-date-editor .el-range-input::-webkit-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input:-ms-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::-ms-input-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::-moz-placeholder{color:#c0c4cc}.el-date-editor .el-range-input::placeholder{color:#c0c4cc}.el-date-editor .el-range-separator{padding:0 5px;line-height:32px;width:5%;color:#303133}.el-date-editor .el-range__close-icon{font-size:14px;color:#c0c4cc;width:25px;display:inline-block;float:right;line-height:32px}.el-range-editor.el-input__inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:3px 10px}.el-range-editor .el-range-input{line-height:1}.el-range-editor.is-active,.el-range-editor.is-active:hover{border-color:#409eff}.el-range-editor--medium.el-input__inner{height:36px}.el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.el-range-editor--medium .el-range-input{font-size:14px}.el-range-editor--medium .el-range__close-icon,.el-range-editor--medium .el-range__icon{line-height:28px}.el-range-editor--small.el-input__inner{height:32px}.el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.el-range-editor--small .el-range-input{font-size:13px}.el-range-editor--small .el-range__close-icon,.el-range-editor--small .el-range__icon{line-height:24px}.el-range-editor--mini.el-input__inner{height:28px}.el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.el-range-editor--mini .el-range-input{font-size:12px}.el-range-editor--mini .el-range__close-icon,.el-range-editor--mini .el-range__icon{line-height:20px}.el-range-editor.is-disabled{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:#e4e7ed}.el-range-editor.is-disabled input{background-color:#f5f7fa;color:#c0c4cc;cursor:not-allowed}.el-range-editor.is-disabled input::-webkit-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input:-ms-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::-ms-input-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::-moz-placeholder{color:#c0c4cc}.el-range-editor.is-disabled input::placeholder{color:#c0c4cc}.el-range-editor.is-disabled .el-range-separator{color:#c0c4cc}.el-picker-panel{color:#606266;border:1px solid #e4e7ed;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#fff;border-radius:4px;line-height:30px;margin:5px 0}.el-picker-panel,.el-popover,.el-time-panel{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-picker-panel__body-wrapper:after,.el-picker-panel__body:after{content:"";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#fff;position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:#409eff}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#409eff}.el-picker-panel__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:#303133;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:#409eff}.el-picker-panel__icon-btn.is-disabled{color:#bbb}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid #e4e4e4;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;background-color:#fff;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__input.el-input .el-input__inner,.el-time-spinner__list{padding:0;text-align:center}.el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#fff;cursor:default}.el-time-spinner__arrow{font-size:12px;color:#909399;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:#409eff}.el-time-spinner__arrow.el-icon-arrow-up{top:10px}.el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__list{margin:0;list-style:none}.el-time-spinner__list:after,.el-time-spinner__list:before{content:"";display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#606266}.el-time-spinner__item:hover:not(.disabled):not(.active){background:#f5f7fa;cursor:pointer}.el-time-spinner__item.active:not(.disabled){color:#303133;font-weight:700}.el-time-spinner__item.disabled{color:#c0c4cc;cursor:not-allowed}.el-time-panel{margin:5px 0;border:1px solid #e4e7ed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:2px;position:absolute;width:180px;left:0;z-index:1000;user-select:none;-webkit-box-sizing:content-box;box-sizing:content-box}.el-slider__button,.el-slider__button-wrapper,.el-time-panel{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content:after,.el-time-panel__content:before{content:"";top:50%;position:absolute;margin-top:-15px;height:32px;z-index:-1;left:0;right:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding-top:6px;text-align:left;border-top:1px solid #e4e7ed;border-bottom:1px solid #e4e7ed}.el-time-panel__content:after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content:before{padding-left:50%;margin-right:12%;margin-left:12%}.el-time-panel__content.has-seconds:after{left:66.66667%}.el-time-panel__content.has-seconds:before{padding-left:33.33333%}.el-time-panel__footer{border-top:1px solid #e4e4e4;padding:4px;height:36px;line-height:25px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:#303133}.el-time-panel__btn.confirm{font-weight:800;color:#409eff}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px}.el-time-range-picker__cell{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid #e4e7ed}.el-popover{position:absolute;background:#fff;min-width:150px;border:1px solid #ebeef5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);word-break:break-all}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#fff;border-radius:4px;border:1px solid #ebeef5;font-size:18px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.el-message-box__wrapper:after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box__header{position:relative;padding:15px 15px 10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#303133}.el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus,.el-message-box__input input.invalid,.el-message-box__input input.invalid:focus{border-color:#f56c6c}.el-message-box__headerbtn .el-message-box__close{color:#909399}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:#409eff}.el-message-box__content{padding:10px 15px;color:#606266;font-size:14px}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.el-message-box__status:before{padding-left:1px}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.el-message-box__status.el-icon-success{color:#67c23a}.el-message-box__status.el-icon-info{color:#909399}.el-message-box__status.el-icon-warning{color:#e6a23c}.el-message-box__status.el-icon-error{color:#f56c6c}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:#f56c6c;font-size:12px;min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;text-align:right}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.el-message-box--center{padding-bottom:30px}.el-message-box--center .el-message-box__header{padding-top:30px}.el-message-box--center .el-message-box__title{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;-webkit-transform:translateY(-1px);transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__content{text-align:center}.el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.msgbox-fade-leave-active{-webkit-animation:msgbox-fade-out .3s;animation:msgbox-fade-out .3s}@-webkit-keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes msgbox-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb:after,.el-breadcrumb:before{display:table;content:""}.el-breadcrumb:after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#c0c4cc}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner.is-link,.el-breadcrumb__inner a{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner.is-link:hover,.el-breadcrumb__inner a:hover{color:#409eff;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover{font-weight:400;color:#606266;cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item:after,.el-form-item:before{display:table;content:""}.el-form-item:after{clear:both}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label-wrap{float:left}.el-form-item__label-wrap .el-form-item__label{display:inline-block;float:none}.el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content:after,.el-form-item__content:before{display:table;content:""}.el-form-item__content:after{clear:both}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:#f56c6c;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:"*";color:#f56c6c;margin-right:4px}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#f56c6c}.el-form-item--feedback .el-input__validateIcon{display:inline-block}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#409eff;z-index:1;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);list-style:none}.el-tabs__new-tab{float:right;border:1px solid #d3dce6;height:18px;width:18px;line-height:18px;margin:12px 0 9px 10px;border-radius:3px;text-align:center;font-size:12px;color:#d3dce6;cursor:pointer;-webkit-transition:all .15s;transition:all .15s}.el-collapse-item__arrow,.el-tabs__nav{-webkit-transition:-webkit-transform .3s}.el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8);transform:scale(.8)}.el-tabs__new-tab:hover{color:#409eff}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap:after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#e4e7ed;z-index:1}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after,.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;transition:-webkit-transform .3s;-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;float:left;z-index:2}.el-tabs__nav.is-stretch{min-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.el-tabs__nav.is-stretch>*{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:40px;display:inline-block;list-style:none;font-size:14px;font-weight:500;color:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus.is-active.is-focus:not(:active){-webkit-box-shadow:0 0 2px 2px #409eff inset;box-shadow:inset 0 0 2px 2px #409eff;border-radius:3px}.el-tabs__item .el-icon-close{border-radius:50%;text-align:center;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);margin-left:5px}.el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.el-tabs__item .el-icon-close:hover{background-color:#c0c4cc;color:#fff}.el-tabs__item.is-active{color:#409eff}.el-tabs__item:hover{color:#409eff;cursor:pointer}.el-tabs__item.is-disabled{color:#c0c4cc;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #e4e7ed}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #e4e7ed;border-bottom:none;border-radius:4px 4px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .el-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;-webkit-transform-origin:100% 50%;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close,.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #e4e7ed;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#fff}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--border-card{background:#fff;border:1px solid #dcdfe6;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04);box-shadow:0 2px 4px 0 rgba(0,0,0,.12),0 0 6px 0 rgba(0,0,0,.04)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#f5f7fa;border-bottom:1px solid #e4e7ed;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__item{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);border:1px solid transparent;margin-top:-1px;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#409eff;background-color:#fff;border-right-color:#dcdfe6;border-left-color:#dcdfe6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:#409eff}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#c0c4cc}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #dcdfe6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left:after{right:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left,.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid #e4e7ed;border-bottom:none;border-top:1px solid #e4e7ed;text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #e4e7ed;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid #e4e7ed;border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #e4e7ed;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #e4e7ed}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #e4e7ed;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid #e4e7ed;border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #e4e7ed;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave .3s;animation:slideInLeft-leave .3s}@-webkit-keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes slideInRight-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft-enter{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}.el-tree{position:relative;cursor:default;background:#fff;color:#606266}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#909399;font-size:14px}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:#409eff}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:#f5f7fa}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:#409eff;color:#fff}.el-tree-node__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:26px;cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:#f5f7fa}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:#c0c4cc;font-size:12px;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__label{font-size:14px}.el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#c0c4cc}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#f0f7ff}.el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#fff;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-light .el-alert__closebtn{color:#c0c4cc}.el-alert.is-dark .el-alert__closebtn,.el-alert.is-dark .el-alert__description{color:#fff}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success.is-light{background-color:#f0f9eb;color:#67c23a}.el-alert--success.is-light .el-alert__description{color:#67c23a}.el-alert--success.is-dark{background-color:#67c23a;color:#fff}.el-alert--info.is-light{background-color:#f4f4f5;color:#909399}.el-alert--info.is-dark{background-color:#909399;color:#fff}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning.is-light{background-color:#fdf6ec;color:#e6a23c}.el-alert--warning.is-light .el-alert__description{color:#e6a23c}.el-alert--warning.is-dark{background-color:#e6a23c;color:#fff}.el-alert--error.is-light{background-color:#fef0f0;color:#f56c6c}.el-alert--error.is-light .el-alert__description{color:#f56c6c}.el-alert--error.is-dark{background-color:#f56c6c;color:#fff}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert-fade-enter,.el-alert-fade-leave-active,.el-loading-fade-enter,.el-loading-fade-leave-active,.el-notification-fade-leave-active{opacity:0}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ebeef5;position:fixed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:13px;margin-right:8px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67c23a}.el-notification .el-icon-error{color:#f56c6c}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#e6a23c}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.el-input-number .el-input{display:block}.el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.el-input-number__decrease,.el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#f5f7fa;color:#606266;cursor:pointer;font-size:13px}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:#409eff}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#409eff}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #dcdfe6}.el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #dcdfe6}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:#e4e7ed;color:#e4e7ed}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:#e4e7ed;cursor:not-allowed}.el-input-number--medium{width:200px;line-height:34px}.el-input-number--medium .el-input-number__decrease,.el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.el-input-number--small{width:130px;line-height:30px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.el-input-number--mini{width:130px;line-height:26px}.el-input-number--mini .el-input-number__decrease,.el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.el-input-number--mini .el-input-number__decrease [class*=el-icon],.el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #dcdfe6}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;bottom:1px;top:auto;left:auto;border-right:none;border-left:1px solid #dcdfe6;border-radius:0 0 4px}.el-input-number.is-controls-right[class*=medium] [class*=decrease],.el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.el-input-number.is-controls-right[class*=mini] [class*=decrease],.el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow:after{content:" ";border-width:5px}.el-progress-bar__inner:after,.el-row:after,.el-row:before,.el-slider:after,.el-slider:before,.el-slider__button-wrapper:after,.el-upload-cover:after{content:""}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow:after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow:after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow:after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow:after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#fff}.el-tooltip__popper.is-light{background:#fff;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow:after{border-top-color:#fff}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow:after{border-bottom-color:#fff}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow:after{border-left-color:#fff}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow:after{border-right-color:#fff}.el-slider:after,.el-slider:before{display:table}.el-slider__button-wrapper .el-tooltip,.el-slider__button-wrapper:after{vertical-align:middle;display:inline-block}.el-slider:after{clear:both}.el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#e4e7ed;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.el-slider__runway.show-input{margin-right:160px;width:auto}.el-slider__runway.disabled{cursor:default}.el-slider__runway.disabled .el-slider__bar{background-color:#c0c4cc}.el-slider__runway.disabled .el-slider__button{border-color:#c0c4cc}.el-slider__runway.disabled .el-slider__button-wrapper.dragging,.el-slider__runway.disabled .el-slider__button-wrapper.hover,.el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.disabled .el-slider__button.dragging,.el-slider__runway.disabled .el-slider__button.hover,.el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1);cursor:not-allowed}.el-slider__button-wrapper,.el-slider__stop{-webkit-transform:translateX(-50%);position:absolute}.el-slider__input{float:right;margin-top:3px;width:130px}.el-slider__input.el-input-number--mini{margin-top:5px}.el-slider__input.el-input-number--medium{margin-top:0}.el-slider__input.el-input-number--large{margin-top:-2px}.el-slider__bar{height:6px;background-color:#409eff;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.el-slider__button-wrapper{height:36px;width:36px;z-index:1001;top:-15px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:normal}.el-slider__button-wrapper:after{height:100%}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{width:16px;height:16px;border:2px solid #409eff;background-color:#fff;border-radius:50%;-webkit-transition:.2s;transition:.2s;user-select:none}.el-image-viewer__btn,.el-slider__button,.el-step__icon-inner{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{height:6px;width:6px;border-radius:100%;background-color:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);font-size:14px;color:#909399;margin-top:15px}.el-slider.is-vertical{position:relative}.el-slider.is-vertical .el-slider__runway{width:6px;height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:6px;height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px}.el-slider.is-vertical .el-slider__button-wrapper,.el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #dcdfe6;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase~.el-input .el-input__inner{border-bottom-left-radius:0;border-bottom-right-radius:0}.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#c0c4cc}.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#409eff}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:hsla(0,0%,100%,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-col-pull-0,.el-col-pull-1,.el-col-pull-2,.el-col-pull-3,.el-col-pull-4,.el-col-pull-5,.el-col-pull-6,.el-col-pull-7,.el-col-pull-8,.el-col-pull-9,.el-col-pull-10,.el-col-pull-11,.el-col-pull-13,.el-col-pull-14,.el-col-pull-15,.el-col-pull-16,.el-col-pull-17,.el-col-pull-18,.el-col-pull-19,.el-col-pull-20,.el-col-pull-21,.el-col-pull-22,.el-col-pull-23,.el-col-pull-24,.el-col-push-0,.el-col-push-1,.el-col-push-2,.el-col-push-3,.el-col-push-4,.el-col-push-5,.el-col-push-6,.el-col-push-7,.el-col-push-8,.el-col-push-9,.el-col-push-10,.el-col-push-11,.el-col-push-12,.el-col-push-13,.el-col-push-14,.el-col-push-15,.el-col-push-16,.el-col-push-17,.el-col-push-18,.el-col-push-19,.el-col-push-20,.el-col-push-21,.el-col-push-22,.el-col-push-23,.el-col-push-24,.el-row{position:relative}.el-loading-spinner .el-loading-text{color:#409eff;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#409eff;stroke-linecap:round}.el-loading-spinner i{color:#409eff}@-webkit-keyframes loading-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loading-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-row{-webkit-box-sizing:border-box;box-sizing:border-box}.el-row:after,.el-row:before{display:table}.el-row:after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-col-0,.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}[class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-upload--picture-card,.el-upload-dragger{-webkit-box-sizing:border-box;cursor:pointer}.el-col-0{width:0}.el-col-offset-0{margin-left:0}.el-col-pull-0{right:0}.el-col-push-0{left:0}.el-col-1{width:4.16667%}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{right:4.16667%}.el-col-push-1{left:4.16667%}.el-col-2{width:8.33333%}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{right:8.33333%}.el-col-push-2{left:8.33333%}.el-col-3{width:12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{right:12.5%}.el-col-push-3{left:12.5%}.el-col-4{width:16.66667%}.el-col-offset-4{margin-left:16.66667%}.el-col-pull-4{right:16.66667%}.el-col-push-4{left:16.66667%}.el-col-5{width:20.83333%}.el-col-offset-5{margin-left:20.83333%}.el-col-pull-5{right:20.83333%}.el-col-push-5{left:20.83333%}.el-col-6{width:25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{right:25%}.el-col-push-6{left:25%}.el-col-7{width:29.16667%}.el-col-offset-7{margin-left:29.16667%}.el-col-pull-7{right:29.16667%}.el-col-push-7{left:29.16667%}.el-col-8{width:33.33333%}.el-col-offset-8{margin-left:33.33333%}.el-col-pull-8{right:33.33333%}.el-col-push-8{left:33.33333%}.el-col-9{width:37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{right:37.5%}.el-col-push-9{left:37.5%}.el-col-10{width:41.66667%}.el-col-offset-10{margin-left:41.66667%}.el-col-pull-10{right:41.66667%}.el-col-push-10{left:41.66667%}.el-col-11{width:45.83333%}.el-col-offset-11{margin-left:45.83333%}.el-col-pull-11{right:45.83333%}.el-col-push-11{left:45.83333%}.el-col-12{width:50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{position:relative;right:50%}.el-col-push-12{left:50%}.el-col-13{width:54.16667%}.el-col-offset-13{margin-left:54.16667%}.el-col-pull-13{right:54.16667%}.el-col-push-13{left:54.16667%}.el-col-14{width:58.33333%}.el-col-offset-14{margin-left:58.33333%}.el-col-pull-14{right:58.33333%}.el-col-push-14{left:58.33333%}.el-col-15{width:62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{right:62.5%}.el-col-push-15{left:62.5%}.el-col-16{width:66.66667%}.el-col-offset-16{margin-left:66.66667%}.el-col-pull-16{right:66.66667%}.el-col-push-16{left:66.66667%}.el-col-17{width:70.83333%}.el-col-offset-17{margin-left:70.83333%}.el-col-pull-17{right:70.83333%}.el-col-push-17{left:70.83333%}.el-col-18{width:75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{right:75%}.el-col-push-18{left:75%}.el-col-19{width:79.16667%}.el-col-offset-19{margin-left:79.16667%}.el-col-pull-19{right:79.16667%}.el-col-push-19{left:79.16667%}.el-col-20{width:83.33333%}.el-col-offset-20{margin-left:83.33333%}.el-col-pull-20{right:83.33333%}.el-col-push-20{left:83.33333%}.el-col-21{width:87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{right:87.5%}.el-col-push-21{left:87.5%}.el-col-22{width:91.66667%}.el-col-offset-22{margin-left:91.66667%}.el-col-pull-22{right:91.66667%}.el-col-push-22{left:91.66667%}.el-col-23{width:95.83333%}.el-col-offset-23{margin-left:95.83333%}.el-col-pull-23{right:95.83333%}.el-col-push-23{left:95.83333%}.el-col-24{width:100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{right:100%}.el-col-push-24{left:100%}@media only screen and (max-width:767px){.el-col-xs-0{display:none;width:0}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{width:4.16667%}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{width:8.33333%}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{width:12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{width:16.66667%}.el-col-xs-offset-4{margin-left:16.66667%}.el-col-xs-pull-4{position:relative;right:16.66667%}.el-col-xs-push-4{position:relative;left:16.66667%}.el-col-xs-5{width:20.83333%}.el-col-xs-offset-5{margin-left:20.83333%}.el-col-xs-pull-5{position:relative;right:20.83333%}.el-col-xs-push-5{position:relative;left:20.83333%}.el-col-xs-6{width:25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{width:29.16667%}.el-col-xs-offset-7{margin-left:29.16667%}.el-col-xs-pull-7{position:relative;right:29.16667%}.el-col-xs-push-7{position:relative;left:29.16667%}.el-col-xs-8{width:33.33333%}.el-col-xs-offset-8{margin-left:33.33333%}.el-col-xs-pull-8{position:relative;right:33.33333%}.el-col-xs-push-8{position:relative;left:33.33333%}.el-col-xs-9{width:37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{width:41.66667%}.el-col-xs-offset-10{margin-left:41.66667%}.el-col-xs-pull-10{position:relative;right:41.66667%}.el-col-xs-push-10{position:relative;left:41.66667%}.el-col-xs-11{width:45.83333%}.el-col-xs-offset-11{margin-left:45.83333%}.el-col-xs-pull-11{position:relative;right:45.83333%}.el-col-xs-push-11{position:relative;left:45.83333%}.el-col-xs-12{width:50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{width:54.16667%}.el-col-xs-offset-13{margin-left:54.16667%}.el-col-xs-pull-13{position:relative;right:54.16667%}.el-col-xs-push-13{position:relative;left:54.16667%}.el-col-xs-14{width:58.33333%}.el-col-xs-offset-14{margin-left:58.33333%}.el-col-xs-pull-14{position:relative;right:58.33333%}.el-col-xs-push-14{position:relative;left:58.33333%}.el-col-xs-15{width:62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{width:66.66667%}.el-col-xs-offset-16{margin-left:66.66667%}.el-col-xs-pull-16{position:relative;right:66.66667%}.el-col-xs-push-16{position:relative;left:66.66667%}.el-col-xs-17{width:70.83333%}.el-col-xs-offset-17{margin-left:70.83333%}.el-col-xs-pull-17{position:relative;right:70.83333%}.el-col-xs-push-17{position:relative;left:70.83333%}.el-col-xs-18{width:75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{width:79.16667%}.el-col-xs-offset-19{margin-left:79.16667%}.el-col-xs-pull-19{position:relative;right:79.16667%}.el-col-xs-push-19{position:relative;left:79.16667%}.el-col-xs-20{width:83.33333%}.el-col-xs-offset-20{margin-left:83.33333%}.el-col-xs-pull-20{position:relative;right:83.33333%}.el-col-xs-push-20{position:relative;left:83.33333%}.el-col-xs-21{width:87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{width:91.66667%}.el-col-xs-offset-22{margin-left:91.66667%}.el-col-xs-pull-22{position:relative;right:91.66667%}.el-col-xs-push-22{position:relative;left:91.66667%}.el-col-xs-23{width:95.83333%}.el-col-xs-offset-23{margin-left:95.83333%}.el-col-xs-pull-23{position:relative;right:95.83333%}.el-col-xs-push-23{position:relative;left:95.83333%}.el-col-xs-24{width:100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{display:none;width:0}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{width:4.16667%}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{width:8.33333%}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{width:12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{width:16.66667%}.el-col-sm-offset-4{margin-left:16.66667%}.el-col-sm-pull-4{position:relative;right:16.66667%}.el-col-sm-push-4{position:relative;left:16.66667%}.el-col-sm-5{width:20.83333%}.el-col-sm-offset-5{margin-left:20.83333%}.el-col-sm-pull-5{position:relative;right:20.83333%}.el-col-sm-push-5{position:relative;left:20.83333%}.el-col-sm-6{width:25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{width:29.16667%}.el-col-sm-offset-7{margin-left:29.16667%}.el-col-sm-pull-7{position:relative;right:29.16667%}.el-col-sm-push-7{position:relative;left:29.16667%}.el-col-sm-8{width:33.33333%}.el-col-sm-offset-8{margin-left:33.33333%}.el-col-sm-pull-8{position:relative;right:33.33333%}.el-col-sm-push-8{position:relative;left:33.33333%}.el-col-sm-9{width:37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{width:41.66667%}.el-col-sm-offset-10{margin-left:41.66667%}.el-col-sm-pull-10{position:relative;right:41.66667%}.el-col-sm-push-10{position:relative;left:41.66667%}.el-col-sm-11{width:45.83333%}.el-col-sm-offset-11{margin-left:45.83333%}.el-col-sm-pull-11{position:relative;right:45.83333%}.el-col-sm-push-11{position:relative;left:45.83333%}.el-col-sm-12{width:50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{width:54.16667%}.el-col-sm-offset-13{margin-left:54.16667%}.el-col-sm-pull-13{position:relative;right:54.16667%}.el-col-sm-push-13{position:relative;left:54.16667%}.el-col-sm-14{width:58.33333%}.el-col-sm-offset-14{margin-left:58.33333%}.el-col-sm-pull-14{position:relative;right:58.33333%}.el-col-sm-push-14{position:relative;left:58.33333%}.el-col-sm-15{width:62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{width:66.66667%}.el-col-sm-offset-16{margin-left:66.66667%}.el-col-sm-pull-16{position:relative;right:66.66667%}.el-col-sm-push-16{position:relative;left:66.66667%}.el-col-sm-17{width:70.83333%}.el-col-sm-offset-17{margin-left:70.83333%}.el-col-sm-pull-17{position:relative;right:70.83333%}.el-col-sm-push-17{position:relative;left:70.83333%}.el-col-sm-18{width:75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{width:79.16667%}.el-col-sm-offset-19{margin-left:79.16667%}.el-col-sm-pull-19{position:relative;right:79.16667%}.el-col-sm-push-19{position:relative;left:79.16667%}.el-col-sm-20{width:83.33333%}.el-col-sm-offset-20{margin-left:83.33333%}.el-col-sm-pull-20{position:relative;right:83.33333%}.el-col-sm-push-20{position:relative;left:83.33333%}.el-col-sm-21{width:87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{width:91.66667%}.el-col-sm-offset-22{margin-left:91.66667%}.el-col-sm-pull-22{position:relative;right:91.66667%}.el-col-sm-push-22{position:relative;left:91.66667%}.el-col-sm-23{width:95.83333%}.el-col-sm-offset-23{margin-left:95.83333%}.el-col-sm-pull-23{position:relative;right:95.83333%}.el-col-sm-push-23{position:relative;left:95.83333%}.el-col-sm-24{width:100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{display:none;width:0}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{width:4.16667%}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{width:8.33333%}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{width:12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{width:16.66667%}.el-col-md-offset-4{margin-left:16.66667%}.el-col-md-pull-4{position:relative;right:16.66667%}.el-col-md-push-4{position:relative;left:16.66667%}.el-col-md-5{width:20.83333%}.el-col-md-offset-5{margin-left:20.83333%}.el-col-md-pull-5{position:relative;right:20.83333%}.el-col-md-push-5{position:relative;left:20.83333%}.el-col-md-6{width:25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{width:29.16667%}.el-col-md-offset-7{margin-left:29.16667%}.el-col-md-pull-7{position:relative;right:29.16667%}.el-col-md-push-7{position:relative;left:29.16667%}.el-col-md-8{width:33.33333%}.el-col-md-offset-8{margin-left:33.33333%}.el-col-md-pull-8{position:relative;right:33.33333%}.el-col-md-push-8{position:relative;left:33.33333%}.el-col-md-9{width:37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{width:41.66667%}.el-col-md-offset-10{margin-left:41.66667%}.el-col-md-pull-10{position:relative;right:41.66667%}.el-col-md-push-10{position:relative;left:41.66667%}.el-col-md-11{width:45.83333%}.el-col-md-offset-11{margin-left:45.83333%}.el-col-md-pull-11{position:relative;right:45.83333%}.el-col-md-push-11{position:relative;left:45.83333%}.el-col-md-12{width:50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{width:54.16667%}.el-col-md-offset-13{margin-left:54.16667%}.el-col-md-pull-13{position:relative;right:54.16667%}.el-col-md-push-13{position:relative;left:54.16667%}.el-col-md-14{width:58.33333%}.el-col-md-offset-14{margin-left:58.33333%}.el-col-md-pull-14{position:relative;right:58.33333%}.el-col-md-push-14{position:relative;left:58.33333%}.el-col-md-15{width:62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{width:66.66667%}.el-col-md-offset-16{margin-left:66.66667%}.el-col-md-pull-16{position:relative;right:66.66667%}.el-col-md-push-16{position:relative;left:66.66667%}.el-col-md-17{width:70.83333%}.el-col-md-offset-17{margin-left:70.83333%}.el-col-md-pull-17{position:relative;right:70.83333%}.el-col-md-push-17{position:relative;left:70.83333%}.el-col-md-18{width:75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{width:79.16667%}.el-col-md-offset-19{margin-left:79.16667%}.el-col-md-pull-19{position:relative;right:79.16667%}.el-col-md-push-19{position:relative;left:79.16667%}.el-col-md-20{width:83.33333%}.el-col-md-offset-20{margin-left:83.33333%}.el-col-md-pull-20{position:relative;right:83.33333%}.el-col-md-push-20{position:relative;left:83.33333%}.el-col-md-21{width:87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{width:91.66667%}.el-col-md-offset-22{margin-left:91.66667%}.el-col-md-pull-22{position:relative;right:91.66667%}.el-col-md-push-22{position:relative;left:91.66667%}.el-col-md-23{width:95.83333%}.el-col-md-offset-23{margin-left:95.83333%}.el-col-md-pull-23{position:relative;right:95.83333%}.el-col-md-push-23{position:relative;left:95.83333%}.el-col-md-24{width:100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{display:none;width:0}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{width:4.16667%}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{width:8.33333%}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{width:12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{width:16.66667%}.el-col-lg-offset-4{margin-left:16.66667%}.el-col-lg-pull-4{position:relative;right:16.66667%}.el-col-lg-push-4{position:relative;left:16.66667%}.el-col-lg-5{width:20.83333%}.el-col-lg-offset-5{margin-left:20.83333%}.el-col-lg-pull-5{position:relative;right:20.83333%}.el-col-lg-push-5{position:relative;left:20.83333%}.el-col-lg-6{width:25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{width:29.16667%}.el-col-lg-offset-7{margin-left:29.16667%}.el-col-lg-pull-7{position:relative;right:29.16667%}.el-col-lg-push-7{position:relative;left:29.16667%}.el-col-lg-8{width:33.33333%}.el-col-lg-offset-8{margin-left:33.33333%}.el-col-lg-pull-8{position:relative;right:33.33333%}.el-col-lg-push-8{position:relative;left:33.33333%}.el-col-lg-9{width:37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{width:41.66667%}.el-col-lg-offset-10{margin-left:41.66667%}.el-col-lg-pull-10{position:relative;right:41.66667%}.el-col-lg-push-10{position:relative;left:41.66667%}.el-col-lg-11{width:45.83333%}.el-col-lg-offset-11{margin-left:45.83333%}.el-col-lg-pull-11{position:relative;right:45.83333%}.el-col-lg-push-11{position:relative;left:45.83333%}.el-col-lg-12{width:50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{width:54.16667%}.el-col-lg-offset-13{margin-left:54.16667%}.el-col-lg-pull-13{position:relative;right:54.16667%}.el-col-lg-push-13{position:relative;left:54.16667%}.el-col-lg-14{width:58.33333%}.el-col-lg-offset-14{margin-left:58.33333%}.el-col-lg-pull-14{position:relative;right:58.33333%}.el-col-lg-push-14{position:relative;left:58.33333%}.el-col-lg-15{width:62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{width:66.66667%}.el-col-lg-offset-16{margin-left:66.66667%}.el-col-lg-pull-16{position:relative;right:66.66667%}.el-col-lg-push-16{position:relative;left:66.66667%}.el-col-lg-17{width:70.83333%}.el-col-lg-offset-17{margin-left:70.83333%}.el-col-lg-pull-17{position:relative;right:70.83333%}.el-col-lg-push-17{position:relative;left:70.83333%}.el-col-lg-18{width:75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{width:79.16667%}.el-col-lg-offset-19{margin-left:79.16667%}.el-col-lg-pull-19{position:relative;right:79.16667%}.el-col-lg-push-19{position:relative;left:79.16667%}.el-col-lg-20{width:83.33333%}.el-col-lg-offset-20{margin-left:83.33333%}.el-col-lg-pull-20{position:relative;right:83.33333%}.el-col-lg-push-20{position:relative;left:83.33333%}.el-col-lg-21{width:87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{width:91.66667%}.el-col-lg-offset-22{margin-left:91.66667%}.el-col-lg-pull-22{position:relative;right:91.66667%}.el-col-lg-push-22{position:relative;left:91.66667%}.el-col-lg-23{width:95.83333%}.el-col-lg-offset-23{margin-left:95.83333%}.el-col-lg-pull-23{position:relative;right:95.83333%}.el-col-lg-push-23{position:relative;left:95.83333%}.el-col-lg-24{width:100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{display:none;width:0}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{width:4.16667%}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{width:8.33333%}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{width:12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{width:16.66667%}.el-col-xl-offset-4{margin-left:16.66667%}.el-col-xl-pull-4{position:relative;right:16.66667%}.el-col-xl-push-4{position:relative;left:16.66667%}.el-col-xl-5{width:20.83333%}.el-col-xl-offset-5{margin-left:20.83333%}.el-col-xl-pull-5{position:relative;right:20.83333%}.el-col-xl-push-5{position:relative;left:20.83333%}.el-col-xl-6{width:25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{width:29.16667%}.el-col-xl-offset-7{margin-left:29.16667%}.el-col-xl-pull-7{position:relative;right:29.16667%}.el-col-xl-push-7{position:relative;left:29.16667%}.el-col-xl-8{width:33.33333%}.el-col-xl-offset-8{margin-left:33.33333%}.el-col-xl-pull-8{position:relative;right:33.33333%}.el-col-xl-push-8{position:relative;left:33.33333%}.el-col-xl-9{width:37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{width:41.66667%}.el-col-xl-offset-10{margin-left:41.66667%}.el-col-xl-pull-10{position:relative;right:41.66667%}.el-col-xl-push-10{position:relative;left:41.66667%}.el-col-xl-11{width:45.83333%}.el-col-xl-offset-11{margin-left:45.83333%}.el-col-xl-pull-11{position:relative;right:45.83333%}.el-col-xl-push-11{position:relative;left:45.83333%}.el-col-xl-12{width:50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{width:54.16667%}.el-col-xl-offset-13{margin-left:54.16667%}.el-col-xl-pull-13{position:relative;right:54.16667%}.el-col-xl-push-13{position:relative;left:54.16667%}.el-col-xl-14{width:58.33333%}.el-col-xl-offset-14{margin-left:58.33333%}.el-col-xl-pull-14{position:relative;right:58.33333%}.el-col-xl-push-14{position:relative;left:58.33333%}.el-col-xl-15{width:62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{width:66.66667%}.el-col-xl-offset-16{margin-left:66.66667%}.el-col-xl-pull-16{position:relative;right:66.66667%}.el-col-xl-push-16{position:relative;left:66.66667%}.el-col-xl-17{width:70.83333%}.el-col-xl-offset-17{margin-left:70.83333%}.el-col-xl-pull-17{position:relative;right:70.83333%}.el-col-xl-push-17{position:relative;left:70.83333%}.el-col-xl-18{width:75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{width:79.16667%}.el-col-xl-offset-19{margin-left:79.16667%}.el-col-xl-pull-19{position:relative;right:79.16667%}.el-col-xl-push-19{position:relative;left:79.16667%}.el-col-xl-20{width:83.33333%}.el-col-xl-offset-20{margin-left:83.33333%}.el-col-xl-pull-20{position:relative;right:83.33333%}.el-col-xl-push-20{position:relative;left:83.33333%}.el-col-xl-21{width:87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{width:91.66667%}.el-col-xl-offset-22{margin-left:91.66667%}.el-col-xl-pull-22{position:relative;right:91.66667%}.el-col-xl-push-22{position:relative;left:91.66667%}.el-col-xl-23{width:95.83333%}.el-col-xl-offset-23{margin-left:95.83333%}.el-col-xl-pull-23{position:relative;right:95.83333%}.el-col-xl-push-23{position:relative;left:95.83333%}.el-col-xl-24{width:100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}@-webkit-keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}.el-upload{display:inline-block;text-align:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:#606266;margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;opacity:0;filter:alpha(opacity=0)}.el-upload--picture-card{background-color:#fbfdff;border:1px dashed #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;line-height:146px;vertical-align:top}.el-upload--picture-card i{font-size:28px;color:#8c939d}.el-upload--picture-card:hover,.el-upload:focus{border-color:#409eff;color:#409eff}.el-upload:focus .el-upload-dragger{border-color:#409eff}.el-upload-dragger{background-color:#fff;border:1px dashed #d9d9d9;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:360px;height:180px;text-align:center;position:relative;overflow:hidden}.el-upload-dragger .el-icon-upload{font-size:67px;color:#c0c4cc;margin:40px 0 16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:1px solid #dcdfe6;margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:#606266;font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:#409eff;font-style:normal}.el-upload-dragger:hover{border-color:#409eff}.el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #409eff}.el-upload-list{margin:0;padding:0;list-style:none}.el-upload-list__item{-webkit-transition:all .5s cubic-bezier(.55,0,.1,1);transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:#606266;line-height:1.8;margin-top:5px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item:first-child{margin-top:10px}.el-upload-list__item .el-icon-upload-success{color:#67c23a}.el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#606266}.el-upload-list__item .el-icon-close:hover{opacity:1}.el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:#409eff}.el-upload-list__item:hover{background-color:#f5f7fa}.el-upload-list__item:hover .el-icon-close{display:inline-block}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#409eff;cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip{display:inline-block}.el-upload-list__item.is-success:active .el-icon-close-tip,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip{display:none}.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.el-upload-list__item-name{color:#606266;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#909399;line-height:inherit}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#606266;display:none}.el-upload-list__item-delete:hover{color:#409eff}.el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;width:148px;height:148px;margin:0 8px 8px 0;display:inline-block}.el-upload-list--picture-card .el-upload-list__item .el-icon-check,.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon-close,.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;text-align:center;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s}.el-upload-list--picture-card .el-upload-list__item-actions:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:#fff;border:1px solid #c0ccda;border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:10px;padding:10px 10px 10px 90px;height:92px}.el-upload-list--picture .el-upload-list__item .el-icon-check,.el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{background:0 0;-webkit-box-shadow:none;box-shadow:none;top:-2px;right:-12px}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item-thumbnail{vertical-align:middle;display:inline-block;width:70px;height:70px;float:left;position:relative;z-index:1;margin-left:-80px;background-color:#fff}.el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 1px 1px #ccc;box-shadow:0 1px 1px #ccc}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover:after{display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{position:absolute;right:-15px;top:-6px;width:40px;height:24px;background:#13ce66;text-align:center;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-shadow:0 0 1pc 1px rgba(0,0,0,.2);box-shadow:0 0 1pc 1px rgba(0,0,0,.2)}.el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#fff;font-size:14px;cursor:pointer;vertical-align:middle;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);margin-top:60px}.el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#fff;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:#303133}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress-bar,.el-progress-bar__inner:after,.el-progress-bar__innerText,.el-spinner{display:inline-block;vertical-align:middle}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67c23a}.el-progress.is-success .el-progress__text{color:#67c23a}.el-progress.is-warning .el-progress-bar__inner{background-color:#e6a23c}.el-progress.is-warning .el-progress__text{color:#e6a23c}.el-progress.is-exception .el-progress-bar__inner{background-color:#f56c6c}.el-progress.is-exception .el-progress__text{color:#f56c6c}.el-progress-bar{padding-right:50px;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#ebeef5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#409eff;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-card,.el-message{border-radius:4px;overflow:hidden}.el-progress-bar__inner:after{height:100%}.el-progress-bar__innerText{color:#fff;font-size:12px;margin:0 5px}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-width:1px;border-style:solid;border-color:#ebeef5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,transform .4s,top .4s;transition:opacity .3s,transform .4s,top .4s,-webkit-transform .4s;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67c23a}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#e6a23c}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#f56c6c}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#c0c4cc;font-size:16px}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67c23a}.el-message .el-icon-error{color:#f56c6c}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#e6a23c}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{background-color:#f56c6c;border-radius:10px;color:#fff;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #fff}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#409eff}.el-badge__content--success{background-color:#67c23a}.el-badge__content--warning{background-color:#e6a23c}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#f56c6c}.el-card{border:1px solid #ebeef5;background-color:#fff;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__body{padding:20px}.el-rate{height:20px;line-height:1}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#c0c4cc;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-step.is-vertical,.el-steps{display:-webkit-box;display:-ms-flexbox}.el-rate__text{font-size:14px;vertical-align:middle}.el-steps{display:-webkit-box;display:-ms-flexbox;display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#f5f7fa}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{-ms-flex-preferred-size:auto!important;flex-basis:auto!important;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:#303133;border-color:#303133}.el-step__head.is-wait{color:#c0c4cc;border-color:#c0c4cc}.el-step__head.is-success{color:#67c23a;border-color:#67c23a}.el-step__head.is-error{color:#f56c6c;border-color:#f56c6c}.el-step__head.is-finish{color:#409eff;border-color:#409eff}.el-step__icon{position:relative;z-index:1;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:24px;height:24px;font-size:14px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;-webkit-transition:.15s ease-out;transition:.15s ease-out}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{display:inline-block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:#c0c4cc}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;-webkit-transition:.15s ease-out;transition:.15s ease-out;-webkit-box-sizing:border-box;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:#303133}.el-step__title.is-wait{color:#c0c4cc}.el-step__title.is-success{color:#67c23a}.el-step__title.is-error{color:#f56c6c}.el-step__title.is-finish{color:#409eff}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:#303133}.el-step__description.is-wait{color:#c0c4cc}.el-step__description.is-success{color:#67c23a}.el-step__description.is-error{color:#f56c6c}.el-step__description.is-finish{color:#409eff}.el-step.is-horizontal{display:inline-block}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:-webkit-box;display:-ms-flexbox;display:flex}.el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-step.is-simple .el-step__arrow:after,.el-step.is-simple .el-step__arrow:before{content:"";display:inline-block;position:absolute;height:15px;width:1px;background:#c0c4cc}.el-step.is-simple .el-step__arrow:before{-webkit-transform:rotate(-45deg) translateY(-4px);transform:rotate(-45deg) translateY(-4px);-webkit-transform-origin:0 0;transform-origin:0 0}.el-step.is-simple .el-step__arrow:after{-webkit-transform:rotate(45deg) translateY(4px);transform:rotate(45deg) translateY(4px);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-carousel{position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#fff;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:2}.el-carousel__indicators--horizontal{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#c0c4cc;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:12px 4px}.el-carousel__indicator--vertical{padding:4px 12px}.el-carousel__indicator--vertical .el-carousel__button{width:2px;height:15px}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#fff;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.el-carousel__item,.el-carousel__mask{height:100%;top:0;left:0;position:absolute}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item--card,.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#fff;opacity:.24;-webkit-transition:.2s;transition:.2s}.el-fade-in-enter,.el-fade-in-leave-active,.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active,.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active,.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-enter-active,.el-fade-in-leave-active,.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;-webkit-transform:scale(1);transform:scale(1);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45);transform:scale(.45)}.collapse-transition{-webkit-transition:height .3s ease-in-out,padding-top .3s ease-in-out,padding-bottom .3s ease-in-out;transition:height .3s ease-in-out,padding-top .3s ease-in-out,padding-bottom .3s ease-in-out}.horizontal-collapse-transition{-webkit-transition:width .3s ease-in-out,padding-left .3s ease-in-out,padding-right .3s ease-in-out;transition:width .3s ease-in-out,padding-left .3s ease-in-out,padding-right .3s ease-in-out}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.el-collapse{border-top:1px solid #ebeef5;border-bottom:1px solid #ebeef5}.el-collapse-item.is-disabled .el-collapse-item__header{color:#bbb;cursor:not-allowed}.el-collapse-item__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:48px;line-height:48px;background-color:#fff;color:#303133;cursor:pointer;border-bottom:1px solid #ebeef5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s;outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;transition:-webkit-transform .3s;-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-weight:300}.el-collapse-item__arrow.is-active{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:#409eff}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;background-color:#fff;overflow:hidden;box-sizing:border-box;border-bottom:1px solid #ebeef5}.el-cascader__tags,.el-collapse-item__wrap,.el-tag{-webkit-box-sizing:border-box}.el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#303133;line-height:1.769230769230769}.el-collapse-item:last-child{margin-bottom:-1px}.el-popper .popper__arrow,.el-popper .popper__arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0,0,0,.03));filter:drop-shadow(0 2px 12px rgba(0,0,0,.03))}.el-popper .popper__arrow:after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#ebeef5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow:after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#ebeef5}.el-popper[x-placement^=bottom] .popper__arrow:after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#ebeef5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow:after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#ebeef5}.el-popper[x-placement^=left] .popper__arrow:after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.el-tag{background-color:#ecf5ff;border-color:#d9ecff;display:inline-block;height:32px;padding:0 10px;line-height:30px;font-size:12px;color:#409eff;border-width:1px;border-style:solid;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap}.el-tag.is-hit{border-color:#409eff}.el-tag .el-tag__close{color:#409eff}.el-tag .el-tag__close:hover{color:#fff;background-color:#409eff}.el-tag.el-tag--info{background-color:#f4f4f5;border-color:#e9e9eb;color:#909399}.el-tag.el-tag--info.is-hit{border-color:#909399}.el-tag.el-tag--info .el-tag__close{color:#909399}.el-tag.el-tag--info .el-tag__close:hover{color:#fff;background-color:#909399}.el-tag.el-tag--success{background-color:#f0f9eb;border-color:#e1f3d8;color:#67c23a}.el-tag.el-tag--success.is-hit{border-color:#67c23a}.el-tag.el-tag--success .el-tag__close{color:#67c23a}.el-tag.el-tag--success .el-tag__close:hover{color:#fff;background-color:#67c23a}.el-tag.el-tag--warning{background-color:#fdf6ec;border-color:#faecd8;color:#e6a23c}.el-tag.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#e6a23c}.el-tag.el-tag--danger{background-color:#fef0f0;border-color:#fde2e2;color:#f56c6c}.el-tag.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f56c6c}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;vertical-align:middle;top:-1px;right:-5px}.el-tag .el-icon-close:before{display:block}.el-tag--dark{background-color:#409eff;color:#fff}.el-tag--dark,.el-tag--dark.is-hit{border-color:#409eff}.el-tag--dark .el-tag__close{color:#fff}.el-tag--dark .el-tag__close:hover{color:#fff;background-color:#66b1ff}.el-tag--dark.el-tag--info{background-color:#909399;border-color:#909399;color:#fff}.el-tag--dark.el-tag--info.is-hit{border-color:#909399}.el-tag--dark.el-tag--info .el-tag__close{color:#fff}.el-tag--dark.el-tag--info .el-tag__close:hover{color:#fff;background-color:#a6a9ad}.el-tag--dark.el-tag--success{background-color:#67c23a;border-color:#67c23a;color:#fff}.el-tag--dark.el-tag--success.is-hit{border-color:#67c23a}.el-tag--dark.el-tag--success .el-tag__close{color:#fff}.el-tag--dark.el-tag--success .el-tag__close:hover{color:#fff;background-color:#85ce61}.el-tag--dark.el-tag--warning{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.el-tag--dark.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag--dark.el-tag--warning .el-tag__close{color:#fff}.el-tag--dark.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#ebb563}.el-tag--dark.el-tag--danger{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.el-tag--dark.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag--dark.el-tag--danger .el-tag__close{color:#fff}.el-tag--dark.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f78989}.el-tag--plain{background-color:#fff;border-color:#b3d8ff;color:#409eff}.el-tag--plain.is-hit{border-color:#409eff}.el-tag--plain .el-tag__close{color:#409eff}.el-tag--plain .el-tag__close:hover{color:#fff;background-color:#409eff}.el-tag--plain.el-tag--info{background-color:#fff;border-color:#d3d4d6;color:#909399}.el-tag--plain.el-tag--info.is-hit{border-color:#909399}.el-tag--plain.el-tag--info .el-tag__close{color:#909399}.el-tag--plain.el-tag--info .el-tag__close:hover{color:#fff;background-color:#909399}.el-tag--plain.el-tag--success{background-color:#fff;border-color:#c2e7b0;color:#67c23a}.el-tag--plain.el-tag--success.is-hit{border-color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close{color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close:hover{color:#fff;background-color:#67c23a}.el-tag--plain.el-tag--warning{background-color:#fff;border-color:#f5dab1;color:#e6a23c}.el-tag--plain.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close:hover{color:#fff;background-color:#e6a23c}.el-tag--plain.el-tag--danger{background-color:#fff;border-color:#fbc4c4;color:#f56c6c}.el-tag--plain.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close:hover{color:#fff;background-color:#f56c6c}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.el-cascader{display:inline-block;position:relative;font-size:14px;line-height:40px}.el-cascader:not(.is-disabled):hover .el-input__inner{cursor:pointer;border-color:#c0c4cc}.el-cascader .el-input .el-input__inner:focus,.el-cascader .el-input.is-focus .el-input__inner{border-color:#409eff}.el-cascader .el-input{cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis}.el-cascader .el-input .el-icon-arrow-down{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-size:14px}.el-cascader .el-input .el-icon-arrow-down.is-reverse{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.el-cascader .el-input .el-icon-circle-close:hover{color:#909399}.el-cascader--medium{font-size:14px;line-height:36px}.el-cascader--small{font-size:13px;line-height:32px}.el-cascader--mini{font-size:12px;line-height:28px}.el-cascader.is-disabled .el-cascader__label{z-index:2;color:#c0c4cc}.el-cascader__dropdown{margin:5px 0;font-size:14px;background:#fff;border:1px solid #e4e7ed;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:normal;text-align:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-cascader__tags .el-tag{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:#f0f2f5}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{-webkit-box-flex:0;-ms-flex:none;flex:none;background-color:#c0c4cc;color:#fff}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:#909399}.el-cascader__suggestion-panel{border-radius:4px}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:14px;color:#606266;text-align:center}.el-cascader__suggestion-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:#f5f7fa}.el-cascader__suggestion-item.is-checked{color:#409eff;font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:#c0c4cc}.el-cascader__search-input{-webkit-box-flex:1;-ms-flex:1;flex:1;height:24px;min-width:60px;margin:2px 0 2px 15px;padding:0;color:#606266;border:none;outline:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-cascader__search-input::-webkit-input-placeholder{color:#c0c4cc}.el-cascader__search-input:-ms-input-placeholder{color:#c0c4cc}.el-cascader__search-input::-ms-input-placeholder{color:#c0c4cc}.el-cascader__search-input::-moz-placeholder{color:#c0c4cc}.el-cascader__search-input::placeholder{color:#c0c4cc}.el-color-predefine{font-size:12px;margin-top:8px;width:280px}.el-color-predefine,.el-color-predefine__colors{display:-webkit-box;display:-ms-flexbox;display:flex}.el-color-predefine__colors{-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{-webkit-box-shadow:0 0 3px 2px #409eff;box-shadow:0 0 3px 2px #409eff}.el-color-predefine__color-selector>div{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px}.el-color-hue-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,color-stop(0,red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:-webkit-gradient(linear,left top,left bottom,color-stop(0,red),color-stop(17%,#ff0),color-stop(33%,#0f0),color-stop(50%,#0ff),color-stop(67%,#00f),color-stop(83%,#f0f),to(red));background:linear-gradient(180deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.el-color-svpanel__white{background:-webkit-gradient(linear,left top,right top,from(#fff),to(hsla(0,0%,100%,0)));background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(transparent));background:linear-gradient(0deg,#000,transparent)}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;-webkit-box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;-webkit-transform:translate(-2px,-2px);transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-alpha-slider__bar{position:relative;background:-webkit-gradient(linear,left top,right top,color-stop(0,hsla(0,0%,100%,0)),to(#fff));background:linear-gradient(90deg,hsla(0,0%,100%,0) 0,#fff);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;-webkit-box-shadow:0 0 2px rgba(0,0,0,.6);box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:-webkit-gradient(linear,left top,left bottom,color-stop(0,hsla(0,0%,100%,0)),to(#fff));background:linear-gradient(180deg,hsla(0,0%,100%,0) 0,#fff)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper:after{content:"";display:table;clear:both}.el-color-dropdown__btns{margin-top:6px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-dropdown__btn{border:1px solid #dcdcdc;color:#333;line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.el-color-dropdown__btn:hover{color:#409eff;border-color:#409eff}.el-color-dropdown__link-btn{cursor:pointer;color:#409eff;text-decoration:none;padding:15px;font-size:12px}.el-color-dropdown__link-btn:hover{color:tint(#409eff,20%)}.el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--medium{height:36px}.el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.el-color-picker--small{height:32px}.el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker--mini{height:28px}.el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.el-color-picker--mini .el-color-picker__empty,.el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:hsla(0,0%,100%,.7)}.el-color-picker__trigger{display:inline-block;height:40px;width:40px;padding:4px;border:1px solid #e6e6e6;border-radius:4px;font-size:0;cursor:pointer}.el-color-picker__color,.el-color-picker__trigger{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.el-color-picker__color{display:block;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.el-color-picker__empty,.el-color-picker__icon{top:50%;left:50%;font-size:12px;position:absolute}.el-color-picker__empty{color:#999}.el-color-picker__empty,.el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.el-color-picker__icon{display:inline-block;width:100%;color:#fff;text-align:center}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;-webkit-box-sizing:content-box;box-sizing:content-box;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-textarea{position:relative;display:inline-block;width:100%;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#fff;background-image:none;border:1px solid #dcdfe6;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#c0c4cc}.el-textarea__inner:-ms-input-placeholder{color:#c0c4cc}.el-textarea__inner::-ms-input-placeholder{color:#c0c4cc}.el-textarea__inner::-moz-placeholder{color:#c0c4cc}.el-textarea__inner::placeholder{color:#c0c4cc}.el-textarea__inner:hover{border-color:#c0c4cc}.el-textarea__inner:focus{outline:0;border-color:#409eff}.el-textarea .el-input__count{color:#909399;background:#fff;position:absolute;font-size:12px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::-moz-placeholder{color:#c0c4cc}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#c0c4cc}.el-textarea.is-exceed .el-textarea__inner{border-color:#f56c6c}.el-textarea.is-exceed .el-input__count{color:#f56c6c}.el-input{position:relative;font-size:14px;display:inline-block;width:100%}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner,.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#c0c4cc;font-size:14px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#909399;font-size:12px}.el-input .el-input__count .el-input__count-inner{background:#fff;line-height:normal;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#fff;background-image:none;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;display:inline-block;font-size:inherit;height:40px;line-height:40px;outline:0;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.el-input__prefix,.el-input__suffix{position:absolute;top:0;-webkit-transition:all .3s;height:100%;color:#c0c4cc;text-align:center}.el-input__inner::-ms-reveal{display:none}.el-input__inner::-webkit-input-placeholder{color:#c0c4cc}.el-input__inner:-ms-input-placeholder{color:#c0c4cc}.el-input__inner::-ms-input-placeholder{color:#c0c4cc}.el-input__inner::-moz-placeholder{color:#c0c4cc}.el-input__inner::placeholder{color:#c0c4cc}.el-input__inner:hover{border-color:#c0c4cc}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409eff;outline:0}.el-input__suffix{right:5px;-webkit-transition:all .3s;transition:all .3s}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{left:5px}.el-input__icon,.el-input__prefix{-webkit-transition:all .3s;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;line-height:40px}.el-input__icon:after{content:"";height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#f5f7fa;border-color:#e4e7ed;color:#c0c4cc;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::-moz-placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__inner::placeholder{color:#c0c4cc}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-link,.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-input.is-exceed .el-input__inner{border-color:#f56c6c}.el-input.is-exceed .el-input__suffix .el-input__count{color:#f56c6c}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#f5f7fa;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #dcdfe6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--prepend .el-input__inner,.el-input-group__append{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input__inner::-ms-clear{display:none;width:0;height:0}.el-transfer{font-size:14px}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#fff;background-color:#409eff;font-size:0}.el-transfer-panel__item+.el-transfer-panel__item,.el-transfer__button [class*=el-icon-]+span{margin-left:0}.el-transfer__button.is-with-texts{border-radius:4px}.el-transfer__button.is-disabled,.el-transfer__button.is-disabled:hover{border:1px solid #dcdfe6;background-color:#f5f7fa;color:#c0c4cc}.el-transfer__button:first-child{margin-bottom:10px}.el-transfer__button:nth-child(2){margin:0}.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer-panel{border:1px solid #ebeef5;border-radius:4px;overflow:hidden;background:#fff;display:inline-block;vertical-align:middle;width:200px;max-height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:246px}.el-transfer-panel__body.is-with-footer{padding-bottom:40px}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:246px;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block!important}.el-transfer-panel__item.el-checkbox{color:#606266}.el-transfer-panel__item:hover{color:#409eff}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:24px;line-height:30px}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.el-transfer-panel__filter .el-input__inner{height:32px;width:100%;font-size:12px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:16px;padding-right:10px;padding-left:30px}.el-transfer-panel__filter .el-input__icon{margin-left:5px}.el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#f5f7fa;margin:0;padding-left:15px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#303133;font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#909399;font-size:12px;font-weight:400}.el-divider__text,.el-link{font-weight:500;font-size:14px}.el-transfer-panel .el-transfer-panel__footer{height:40px;background:#fff;margin:0;padding:0;border-top:1px solid #ebeef5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.el-transfer-panel .el-transfer-panel__footer:after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-container,.el-timeline-item__node{display:-webkit-box;display:-ms-flexbox}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#606266}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#909399;text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner:after{height:6px;width:3px;left:4px}.el-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;box-sizing:border-box;min-width:0}.el-aside,.el-container,.el-header{-webkit-box-sizing:border-box}.el-container.is-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.el-header{padding:0 20px}.el-aside,.el-header{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-aside{overflow:auto}.el-footer,.el-main{-webkit-box-sizing:border-box}.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;padding:20px}.el-footer,.el-main{-webkit-box-sizing:border-box;box-sizing:border-box}.el-footer{padding:0 20px;-ms-flex-negative:0;flex-shrink:0}.el-timeline{margin:0;font-size:14px;list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid #e4e7ed}.el-timeline-item__icon{color:#fff;font-size:13px}.el-timeline-item__node{position:absolute;background-color:#e4e7ed;border-radius:50%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image__error,.el-timeline-item__dot{display:-webkit-box;display:-ms-flexbox}.el-timeline-item__node--normal{left:-1px;width:12px;height:12px}.el-timeline-item__node--large{left:-2px;width:14px;height:14px}.el-timeline-item__node--primary{background-color:#409eff}.el-timeline-item__node--success{background-color:#67c23a}.el-timeline-item__node--warning{background-color:#e6a23c}.el-timeline-item__node--danger{background-color:#f56c6c}.el-timeline-item__node--info{background-color:#909399}.el-timeline-item__dot{position:absolute;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-timeline-item__content{color:#303133}.el-timeline-item__timestamp{color:#909399;line-height:1;font-size:13px}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;padding:0}.el-drawer,.el-empty,.el-result{-webkit-box-orient:vertical;-webkit-box-direction:normal}.el-link.is-underline:hover:after{content:"";position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid #409eff}.el-link.el-link--default:after,.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:#409eff}.el-link.is-disabled{cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default{color:#606266}.el-link.el-link--default:hover{color:#409eff}.el-link.el-link--default.is-disabled{color:#c0c4cc}.el-link.el-link--primary{color:#409eff}.el-link.el-link--primary:hover{color:#66b1ff}.el-link.el-link--primary.is-disabled{color:#a0cfff}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:#f56c6c}.el-link.el-link--danger{color:#f56c6c}.el-link.el-link--danger:hover{color:#f78989}.el-link.el-link--danger.is-disabled{color:#fab6b6}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:#67c23a}.el-link.el-link--success{color:#67c23a}.el-link.el-link--success:hover{color:#85ce61}.el-link.el-link--success.is-disabled{color:#b3e19d}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:#e6a23c}.el-link.el-link--warning{color:#e6a23c}.el-link.el-link--warning:hover{color:#ebb563}.el-link.el-link--warning.is-disabled{color:#f3d19e}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:#909399}.el-link.el-link--info{color:#909399}.el-link.el-link--info:hover{color:#a6a9ad}.el-link.el-link--info.is-disabled{color:#c8c9cc}.el-divider{background-color:#dcdfe6;position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative}.el-divider__text{position:absolute;background-color:#fff;padding:0 20px;color:#303133}.el-image__error,.el-image__placeholder{background:#f5f7fa}.el-divider__text.is-left{left:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-divider__text.is-center{left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image__error,.el-image__inner,.el-image__placeholder{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top}.el-image__inner--center{position:relative;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block}.el-image__error{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:14px;color:#c0c4cc;vertical-align:middle}.el-image__preview{cursor:pointer}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:50%;opacity:.8;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box;user-select:none}.el-button,.el-checkbox,.el-image-viewer__btn{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:24px;color:#fff;background-color:#606266}.el-image-viewer__canvas{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image-viewer__actions{left:50%;bottom:30px;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:282px;height:44px;padding:0 23px;background-color:#606266;border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around}.el-image-viewer__next,.el-image-viewer__prev{top:50%;width:44px;height:44px;font-size:24px;color:#fff;background-color:#606266;border-color:#fff}.el-image-viewer__prev{left:40px}.el-image-viewer__next,.el-image-viewer__prev{-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image-viewer__next{right:40px;text-indent:2px}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in .3s;animation:viewer-fade-in .3s}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out .3s;animation:viewer-fade-out .3s}@-webkit-keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@keyframes viewer-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}to{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}to{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button{margin-left:10px}.el-button:focus,.el-button:hover{color:#409eff;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#fff;border-color:#409eff;color:#409eff}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:#fff;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#fff;border-color:#ebeef5;color:#c0c4cc}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:"";position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:hsla(0,0%,100%,.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#fff;background-color:#409eff;border-color:#409eff}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#fff}.el-button--primary.is-active,.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#fff;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409eff;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409eff;border-color:#409eff;color:#fff}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#fff;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#fff;background-color:#67c23a;border-color:#67c23a}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#fff}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#fff}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#fff;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67c23a;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67c23a;border-color:#67c23a;color:#fff}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#fff;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#fff;background-color:#e6a23c;border-color:#e6a23c}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#fff}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#fff}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#fff;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#e6a23c;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#e6a23c;border-color:#e6a23c;color:#fff}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#fff;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#fff}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#fff}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#fff;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#f56c6c;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#f56c6c;border-color:#f56c6c;color:#fff}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#fff;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#fff;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#fff}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#fff}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#fff;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#fff}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#fff;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--text,.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover,.el-button--text:active{border-color:transparent}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--mini,.el-button--small{font-size:12px;border-radius:3px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small,.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini.is-circle{padding:7px}.el-button--text{color:#409eff;background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;background-color:transparent}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group:after,.el-button-group:before{display:table;content:""}.el-button-group:after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button.is-active,.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--primary:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--primary:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--success:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--success:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--warning:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--warning:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--danger:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--danger:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--info:first-child{border-right-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--info:last-child{border-left-color:hsla(0,0%,100%,.5)}.el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:hsla(0,0%,100%,.5);border-right-color:hsla(0,0%,100%,.5)}.el-calendar{background-color:#fff}.el-calendar__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:12px 20px;border-bottom:1px solid #ebeef5}.el-backtop,.el-page-header{display:-webkit-box;display:-ms-flexbox}.el-calendar__title{color:#000;-ms-flex-item-align:center;align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:#606266;font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:#c0c4cc}.el-backtop,.el-calendar-table td.is-today{color:#409eff}.el-calendar-table td{border-bottom:1px solid #ebeef5;border-right:1px solid #ebeef5;vertical-align:top;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}.el-calendar-table td.is-selected{background-color:#f2f8fe}.el-calendar-table tr:first-child td{border-top:1px solid #ebeef5}.el-calendar-table tr td:first-child{border-left:1px solid #ebeef5}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px;height:85px}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:#f2f8fe}.el-backtop{position:fixed;background-color:#fff;width:40px;height:40px;border-radius:50%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:20px;-webkit-box-shadow:0 0 6px rgba(0,0,0,.12);box-shadow:0 0 6px rgba(0,0,0,.12);cursor:pointer;z-index:5}.el-backtop:hover{background-color:#f2f6fc}.el-page-header{line-height:24px}.el-page-header,.el-page-header__left{display:-webkit-box;display:-ms-flexbox;display:flex}.el-page-header__left{cursor:pointer;margin-right:40px;position:relative}.el-page-header__left:after{content:"";position:absolute;width:1px;height:16px;right:-20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#dcdfe6}.el-checkbox,.el-checkbox__input{display:inline-block;position:relative;white-space:nowrap}.el-page-header__left .el-icon-back{font-size:18px;margin-right:6px;-ms-flex-item-align:center;align-self:center}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:#303133}.el-checkbox{color:#606266;font-weight:500;font-size:14px;cursor:pointer;user-select:none;margin-right:30px}.el-checkbox,.el-checkbox-button__inner,.el-empty__image img,.el-radio{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:normal;height:40px}.el-checkbox.is-bordered.is-checked{border-color:#409eff}.el-checkbox.is-bordered.is-disabled{border-color:#ebeef5;cursor:not-allowed}.el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px;height:36px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:5px 15px 5px 10px;border-radius:3px;height:32px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox.is-bordered.el-checkbox--mini{padding:3px 15px 3px 10px;border-radius:3px;height:28px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox__input{cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#dcdfe6;cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{cursor:not-allowed;border-color:#c0c4cc}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#f2f6fc;border-color:#dcdfe6}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:#c0c4cc}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#f2f6fc;border-color:#dcdfe6}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:#c0c4cc;border-color:#c0c4cc}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#409eff;border-color:#409eff}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:#c0c4cc;cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner:after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:#409eff}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:#409eff}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{content:"";position:absolute;display:block;background-color:#fff;height:2px;-webkit-transform:scale(.5);transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:1px solid #dcdfe6;border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;background-color:#fff;z-index:1;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:#409eff}.el-checkbox__inner:after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:1px solid #fff;border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:3px;-webkit-transition:-webkit-transform .15s ease-in .05s;transition:-webkit-transform .15s ease-in .05s;transition:transform .15s ease-in .05s;transition:transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;-webkit-transform-origin:center;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox-button,.el-checkbox-button__inner{display:inline-block;position:relative}.el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.el-checkbox:last-of-type{margin-right:0}.el-checkbox-button__inner{line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#fff;border:1px solid #dcdfe6;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-checkbox-button__inner.is-round{padding:12px 20px}.el-checkbox-button__inner:hover{color:#409eff}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-radio,.el-radio__input{line-height:1;white-space:nowrap;outline:0}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:#fff;background-color:#409eff;border-color:#409eff;-webkit-box-shadow:-1px 0 0 0 #8cc5ff;box-shadow:-1px 0 0 0 #8cc5ff}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:#409eff}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:#ebeef5}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#409eff}.el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.el-checkbox-group{font-size:0}.el-radio,.el-radio--medium.is-bordered .el-radio__label{font-size:14px}.el-radio{color:#606266;font-weight:500;cursor:pointer;margin-right:30px}.el-cascader-node>.el-radio,.el-radio:last-child{margin-right:0}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-radio.is-bordered.is-checked{border-color:#409eff}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#ebeef5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#f5f7fa;border-color:#e4e7ed}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio__input{cursor:pointer;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner:after{cursor:not-allowed;background-color:#f5f7fa}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:#c0c4cc}.el-radio__input.is-disabled+span.el-radio__label{color:#c0c4cc;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#409eff;background:#409eff}.el-radio__input.is-checked .el-radio__inner:after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#409eff}.el-radio__input.is-focus .el-radio__inner{border-color:#409eff}.el-radio__inner{border:1px solid #dcdfe6;border-radius:100%;width:14px;height:14px;background-color:#fff;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box}.el-radio__inner:hover{border-color:#409eff}.el-radio__inner:after{width:4px;height:4px;border-radius:100%;background-color:#fff;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #409eff;box-shadow:0 0 2px 2px #409eff}.el-radio__label{font-size:14px;padding-left:10px}.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity .34s ease-out;transition:opacity .34s ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:background-color .3s;transition:background-color .3s}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity .12s ease-out;transition:opacity .12s ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-cascader-panel{display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:4px;font-size:14px}.el-cascader-panel.is-bordered{border:1px solid #e4e7ed;border-radius:4px}.el-cascader-menu{min-width:180px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#606266;border-right:1px solid #e4e7ed}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu:last-child .el-cascader-node{padding-right:20px}.el-cascader-menu__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;-webkit-box-sizing:border-box;box-sizing:border-box}.el-avatar,.el-drawer{-webkit-box-sizing:border-box;overflow:hidden}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;color:#c0c4cc}.el-cascader-node{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:#606266}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:#409eff;font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:#f5f7fa}.el-cascader-node.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-avatar{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;color:#fff;background:#c0c4cc;width:40px;height:40px;line-height:40px;font-size:14px}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-drawer,.el-drawer__header{display:-webkit-box;display:-ms-flexbox}.el-empty__image img,.el-empty__image svg{vertical-align:top;height:100%;width:100%}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px}.el-drawer.ltr,.el-drawer.rtl,.el-drawer__container{top:0;bottom:0;height:100%}@-webkit-keyframes el-drawer-fade-in{0%{opacity:0}to{opacity:1}}@keyframes el-drawer-fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%);transform:translate(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%);transform:translate(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes rtl-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(100%);transform:translate(100%)}}@keyframes rtl-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(100%);transform:translate(100%)}}@-webkit-keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%);transform:translate(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%);transform:translate(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes ltr-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(-100%);transform:translate(-100%)}}@keyframes ltr-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translate(-100%);transform:translate(-100%)}}@-webkit-keyframes ttb-drawer-in{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ttb-drawer-in{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes ttb-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes ttb-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes btt-drawer-in{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes btt-drawer-in{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes btt-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes btt-drawer-out{0%{-webkit-transform:translate(0);transform:translate(0)}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}.el-drawer{position:absolute;box-sizing:border-box;background-color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);outline:0}.el-drawer,.el-drawer__body>*,.el-empty{-webkit-box-sizing:border-box}.el-drawer.rtl{-webkit-animation:rtl-drawer-out .3s;animation:rtl-drawer-out .3s;right:0}.el-drawer__open .el-drawer.rtl{-webkit-animation:rtl-drawer-in .3s 1ms;animation:rtl-drawer-in .3s 1ms}.el-drawer.ltr{-webkit-animation:ltr-drawer-out .3s;animation:ltr-drawer-out .3s;left:0}.el-drawer__open .el-drawer.ltr{-webkit-animation:ltr-drawer-in .3s 1ms;animation:ltr-drawer-in .3s 1ms}.el-drawer.ttb{-webkit-animation:ttb-drawer-out .3s;animation:ttb-drawer-out .3s;top:0}.el-drawer__open .el-drawer.ttb{-webkit-animation:ttb-drawer-in .3s 1ms;animation:ttb-drawer-in .3s 1ms}.el-drawer.btt{-webkit-animation:btt-drawer-out .3s;animation:btt-drawer-out .3s;bottom:0}.el-drawer__open .el-drawer.btt{-webkit-animation:btt-drawer-in .3s 1ms;animation:btt-drawer-in .3s 1ms}.el-drawer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0}.el-drawer__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#72767b;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:32px;padding:20px 20px 0}.el-drawer__header>:first-child,.el-drawer__title{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-drawer__title{margin:0;line-height:inherit;font-size:1rem}.el-drawer__close-btn{border:none;cursor:pointer;font-size:20px;color:inherit;background-color:transparent}.el-drawer__body{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.el-drawer__body>*{-webkit-box-sizing:border-box;box-sizing:border-box}.el-drawer.btt,.el-drawer.ttb,.el-drawer__container{width:100%;left:0;right:0}.el-drawer__container{position:relative}.el-drawer-fade-enter-active{-webkit-animation:el-drawer-fade-in .3s;animation:el-drawer-fade-in .3s}.el-drawer-fade-leave-active{animation:el-drawer-fade-in .3s reverse}.el-popconfirm__main{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin:0}@-webkit-keyframes el-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}@keyframes el-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}.el-skeleton{width:100%}.el-skeleton__first-line,.el-skeleton__paragraph{height:16px;margin-top:16px;background:#f2f2f2}.el-skeleton.is-animated .el-skeleton__item{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#f2f2f2),color-stop(37%,#e6e6e6),color-stop(63%,#f2f2f2));background:linear-gradient(90deg,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);background-size:400% 100%;-webkit-animation:el-skeleton-loading 1.4s ease infinite;animation:el-skeleton-loading 1.4s ease infinite}.el-skeleton__item{background:#f2f2f2;display:inline-block;height:16px;border-radius:4px;width:100%}.el-empty,.el-skeleton__image{display:-webkit-box;display:-ms-flexbox}.el-skeleton__circle{border-radius:50%;width:36px;height:36px;line-height:36px}.el-skeleton__circle--lg{width:40px;height:40px;line-height:40px}.el-skeleton__circle--md{width:28px;height:28px;line-height:28px}.el-skeleton__button{height:40px;width:64px;border-radius:4px}.el-skeleton__p{width:100%}.el-skeleton__p.is-last{width:61%}.el-skeleton__p.is-first{width:33%}.el-skeleton__text{width:100%;height:13px}.el-skeleton__caption{height:12px}.el-skeleton__h1{height:20px}.el-skeleton__h3{height:18px}.el-skeleton__h5{height:16px}.el-skeleton__image{width:unset;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:0}.el-skeleton__image svg{fill:#dcdde0;width:22%;height:22%}.el-empty{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 0}.el-empty__image{width:160px}.el-empty__image img{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:contain;object-fit:contain}.el-empty__image svg{fill:#dcdde0}.el-empty__description{margin-top:20px}.el-empty__description p{margin:0;font-size:14px;color:#909399}.el-empty__bottom,.el-result__title{margin-top:20px}.el-descriptions{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:14px;color:#303133}.el-descriptions__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}.el-descriptions__title{font-size:16px;font-weight:700}.el-descriptions--mini,.el-descriptions--small{font-size:12px}.el-descriptions__body{color:#606266;background-color:#fff}.el-descriptions__body table{border-collapse:collapse;width:100%;table-layout:fixed}.el-descriptions__body table td,.el-descriptions__body table th{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;font-weight:400;line-height:1.5}.el-descriptions__body table td.is-left,.el-descriptions__body table th.is-left{text-align:left}.el-descriptions__body table td.is-center,.el-descriptions__body table th.is-center{text-align:center}.el-descriptions__body table td.is-right,.el-descriptions__body table th.is-right{text-align:right}.el-descriptions .is-bordered{table-layout:auto}.el-descriptions .is-bordered td,.el-descriptions .is-bordered th{border:1px solid #ebeef5;padding:12px 10px}.el-descriptions :not(.is-bordered) td,.el-descriptions :not(.is-bordered) th{padding-bottom:12px}.el-descriptions--medium.is-bordered td,.el-descriptions--medium.is-bordered th{padding:10px}.el-descriptions--medium:not(.is-bordered) td,.el-descriptions--medium:not(.is-bordered) th{padding-bottom:10px}.el-descriptions--small.is-bordered td,.el-descriptions--small.is-bordered th{padding:8px 10px}.el-descriptions--small:not(.is-bordered) td,.el-descriptions--small:not(.is-bordered) th{padding-bottom:8px}.el-descriptions--mini.is-bordered td,.el-descriptions--mini.is-bordered th{padding:6px 10px}.el-descriptions--mini:not(.is-bordered) td,.el-descriptions--mini:not(.is-bordered) th{padding-bottom:6px}.el-descriptions-item__container{display:-webkit-box;display:-ms-flexbox;display:flex}.el-descriptions-item__label.has-colon:after{content:":";position:relative;top:-.5px}.el-descriptions-item__label.is-bordered-label{font-weight:700;color:#909399;background:#fafafa}.el-descriptions-item__label:not(.is-bordered-label){margin-right:10px}.el-result{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 30px}.el-result__icon svg{width:64px;height:64px}.el-result__title p{margin:0;font-size:20px;color:#303133;line-height:1.3}.el-result__subtitle{margin-top:10px}.el-result__subtitle p{margin:0;font-size:14px;color:#606266;line-height:1.3}.el-result__extra{margin-top:30px}.el-result .icon-success{fill:#67c23a}.el-result .icon-error{fill:#f56c6c}.el-result .icon-info{fill:#909399}.el-result .icon-warning{fill:#e6a23c} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-libs.c716f4ea.css b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-libs.c716f4ea.css new file mode 100644 index 00000000..39af0b08 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/css/chunk-libs.c716f4ea.css @@ -0,0 +1 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;-webkit-box-shadow:0 0 10px #29d,0 0 5px #29d;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translateY(-4px);transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;-webkit-box-sizing:border-box;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:transparent}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:transparent}.cm-fat-cursor{caret-color:transparent}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;height:100%;outline:none;position:relative;z-index:0}.CodeMirror-sizer{position:relative;border-right:50px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none;outline:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-50px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-webkit-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:none} \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/fonts/element-icons.535877f5.woff b/sop-admin/sop-code-gen/src/main/resources/static/static/fonts/element-icons.535877f5.woff new file mode 100644 index 0000000000000000000000000000000000000000..02b9a2539e425a7a8c244faba92527602be76212 GIT binary patch literal 28200 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
%#5t+7yTm^Z{)9pPFdh-)p? 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 literal 0 HcmV?d00001 diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/img/404_cloud.0f4bc32b.png b/sop-admin/sop-code-gen/src/main/resources/static/static/img/404_cloud.0f4bc32b.png new file mode 100644 index 0000000000000000000000000000000000000000..c6281d09013e0a2c5f8e699a0a6038d9480291e5 GIT binary patch literal 4766 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 literal 0 HcmV?d00001 diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/js/app.c7a9a8f2.js b/sop-admin/sop-code-gen/src/main/resources/static/static/js/app.c7a9a8f2.js new file mode 100644 index 00000000..0ddf5e54 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/js/app.c7a9a8f2.js @@ -0,0 +1 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["app"],{0:function(e,t,n){e.exports=n("56d7")},"0372":function(e,t,n){},"18f0":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-link",use:"icon-link-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"2a3d":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-password",use:"icon-password-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"30c3":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-example",use:"icon-example-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},3673:function(e,t,n){},"3ef9":function(e,t,n){},4181:function(e,t,n){},"47f1":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-table",use:"icon-table-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"4df5":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-eye",use:"icon-eye-usage",viewBox:"0 0 128 64",content:''});r.a.add(c);t["default"]=c},"51ff":function(e,t,n){var a={"./dashboard.svg":"f782","./example.svg":"30c3","./eye-open.svg":"d7ec","./eye.svg":"4df5","./form.svg":"eb1b","./link.svg":"18f0","./nested.svg":"dcf8","./password.svg":"2a3d","./table.svg":"47f1","./tree.svg":"93cd","./user.svg":"b3b5"};function i(e){var t=o(e);return n(t)}function o(e){var t=a[e];if(!(t+1)){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}return t}i.keys=function(){return Object.keys(a)},i.resolve=o,e.exports=i,i.id="51ff"},"56d7":function(e,t,n){"use strict";n.r(t);n("cadf"),n("551c"),n("f751"),n("097d");var a=n("2b0e"),i=(n("f5df"),n("5c96")),o=n.n(i),r=(n("0fae"),n("f0d9")),c=n.n(r),s=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"app"}},[n("router-view")],1)},u=[],l={name:"App"},d=l,h=n("2877"),m=Object(h["a"])(d,s,u,!1,null,null,null),f=m.exports,p=n("2f62"),v=(n("7f7f"),{sidebar:function(e){return e.app.sidebar},device:function(e){return e.app.device},token:function(e){return e.user.token},avatar:function(e){return e.user.avatar},name:function(e){return e.user.name}}),b=v,g=n("a78e"),w=n.n(g),x={sidebar:{opened:!w.a.get("sidebarStatus")||!!+w.a.get("sidebarStatus"),withoutAnimation:!1},device:"desktop"},y={TOGGLE_SIDEBAR:function(e){e.sidebar.opened=!e.sidebar.opened,e.sidebar.withoutAnimation=!1,e.sidebar.opened?w.a.set("sidebarStatus",1):w.a.set("sidebarStatus",0)},CLOSE_SIDEBAR:function(e,t){w.a.set("sidebarStatus",0),e.sidebar.opened=!1,e.sidebar.withoutAnimation=t},TOGGLE_DEVICE:function(e,t){e.device=t}},C={toggleSideBar:function(e){var t=e.commit;t("TOGGLE_SIDEBAR")},closeSideBar:function(e,t){var n=e.commit,a=t.withoutAnimation;n("CLOSE_SIDEBAR",a)},toggleDevice:function(e,t){var n=e.commit;n("TOGGLE_DEVICE",t)}},_={namespaced:!0,state:x,mutations:y,actions:C},k=n("83d6"),S=n.n(k),z=S.a.showSettings,B=S.a.fixedHeader,O=S.a.sidebarLogo,H={showSettings:z,fixedHeader:B,sidebarLogo:O},M={CHANGE_SETTING:function(e,t){var n=t.key,a=t.value;e.hasOwnProperty(n)&&(e[n]=a)}},T={changeSetting:function(e,t){var n=e.commit;n("CHANGE_SETTING",t)}},E={namespaced:!0,state:H,mutations:M,actions:T},$=n("bc3a"),L=n.n($),A="sop-admin-token";function V(){return w.a.get(A)}function j(e){return w.a.set(A,e)}function P(){return w.a.remove(A)}var I=L.a.create({baseURL:"",withCredentials:!0,timeout:5e3});I.interceptors.request.use((function(e){return xt.getters.token&&(e.headers["X-Token"]=V()),e}),(function(e){return console.log(e),Promise.reject(e)})),I.interceptors.response.use((function(e){var t=e.data;return 2e4!==t.code?(Object(i["Message"])({message:t.message||"error",type:"error",duration:5e3}),50008!==t.code&&50012!==t.code&&50014!==t.code||i["MessageBox"].confirm("You have been logged out, you can cancel to stay on this page, or log in again","Confirm logout",{confirmButtonText:"Re-Login",cancelButtonText:"Cancel",type:"warning"}).then((function(){xt.dispatch("user/resetToken").then((function(){location.reload()}))})),Promise.reject(t.message||"error")):t}),(function(e){return console.log("err"+e),Object(i["Message"])({message:e.message,type:"error",duration:5e3}),Promise.reject(e)}));var N=I;function D(e){return N({url:"/user/login",method:"post",data:e})}function q(e){return N({url:"/user/info",method:"get",params:{token:e}})}function R(){return N({url:"/user/logout",method:"post"})}var G=n("8c4f"),F=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"app-wrapper",class:e.classObj},["mobile"===e.device&&e.sidebar.opened?n("div",{staticClass:"drawer-bg",on:{click:e.handleClickOutside}}):e._e(),e._v(" "),n("sidebar",{staticClass:"sidebar-container"}),e._v(" "),n("div",{staticClass:"main-container"},[n("div",{class:{"fixed-header":e.fixedHeader}},[n("navbar")],1),e._v(" "),n("app-main")],1)],1)},U=[],K=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"navbar"},[n("hamburger",{staticClass:"hamburger-container",attrs:{"is-active":e.sidebar.opened},on:{toggleClick:e.toggleSideBar}}),e._v(" "),n("breadcrumb",{staticClass:"breadcrumb-container"}),e._v(" "),n("div",{staticClass:"right-menu"},[n("el-link",{attrs:{type:"primary",underline:!1,href:"https://gitee.com/durcframework/code-gen",target:"_blank"}},[e._v("Git")])],1)],1)},W=[],J=n("db72"),X=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-breadcrumb",{staticClass:"app-breadcrumb",attrs:{separator:"/"}},[n("transition-group",{attrs:{name:"breadcrumb"}},e._l(e.levelList,(function(t,a){return n("el-breadcrumb-item",{key:t.path},["noRedirect"===t.redirect||a==e.levelList.length-1?n("span",{staticClass:"no-redirect"},[e._v(e._s(t.meta.title))]):n("a",{on:{click:function(n){return n.preventDefault(),e.handleLink(t)}}},[e._v(e._s(t.meta.title))])])})),1)],1)},Y=[],Q=n("bd11"),Z=n.n(Q),ee={data:function(){return{levelList:null}},watch:{$route:function(){this.getBreadcrumb()}},created:function(){this.getBreadcrumb()},methods:{getBreadcrumb:function(){var e=this.$route.matched.filter((function(e){return e.meta&&e.meta.title})),t=e[0];this.isDashboard(t)||(e=[{path:"/dashboard",meta:{title:"首页"}}].concat(e)),this.levelList=e.filter((function(e){return e.meta&&e.meta.title&&!1!==e.meta.breadcrumb}))},isDashboard:function(e){var t=e&&e.name;return!!t&&t.trim().toLocaleLowerCase()==="Dashboard".toLocaleLowerCase()},pathCompile:function(e){var t=this.$route.params,n=Z.a.compile(e);return n(t)},handleLink:function(e){var t=e.redirect,n=e.path;t?this.$router.push(t):this.$router.push(this.pathCompile(n))}}},te=ee,ne=(n("8a0e"),Object(h["a"])(te,X,Y,!1,null,"33d79dae",null)),ae=ne.exports,ie=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticStyle:{padding:"0 15px"},on:{click:e.toggleClick}},[n("svg",{staticClass:"hamburger",class:{"is-active":e.isActive},attrs:{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg",width:"64",height:"64"}},[n("path",{attrs:{d:"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"}})])])},oe=[],re={name:"Hamburger",props:{isActive:{type:Boolean,default:!1}},methods:{toggleClick:function(){this.$emit("toggleClick")}}},ce=re,se=(n("8dd0"),Object(h["a"])(ce,ie,oe,!1,null,"49e15297",null)),ue=se.exports,le={components:{Breadcrumb:ae,Hamburger:ue},computed:Object(J["a"])({},Object(p["b"])(["sidebar","avatar"])),methods:{toggleSideBar:function(){this.$store.dispatch("app/toggleSideBar")},doLogout:function(){this.logout()}}},de=le,he=(n("fbed"),Object(h["a"])(de,K,W,!1,null,"58ce17d6",null)),me=he.exports,fe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{class:{"has-logo":e.showLogo}},[e.showLogo?n("logo",{attrs:{collapse:e.isCollapse}}):e._e(),e._v(" "),n("el-scrollbar",{attrs:{"wrap-class":"scrollbar-wrapper"}},[n("el-menu",{attrs:{"default-active":e.activeMenu,collapse:e.isCollapse,"background-color":e.variables.menuBg,"text-color":e.variables.menuText,"unique-opened":!1,"active-text-color":e.variables.menuActiveText,"collapse-transition":!1,mode:"vertical"}},e._l(e.routes,(function(e){return n("sidebar-item",{key:e.path,attrs:{item:e,"base-path":e.path}})})),1)],1)],1)},pe=[],ve=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"sidebar-logo-container",class:{collapse:e.collapse}},[n("transition",{attrs:{name:"sidebarLogoFade"}},[e.collapse?n("router-link",{key:"collapse",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[e.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:e.logo}}):n("h1",{staticClass:"sidebar-title"},[e._v(e._s(e.title)+" ")])]):n("router-link",{key:"expand",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[e.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:e.logo}}):e._e(),e._v(" "),n("h1",{staticClass:"sidebar-title"},[e._v(e._s(e.title)+" ")])])],1)],1)},be=[],ge={name:"SidebarLogo",props:{collapse:{type:Boolean,required:!0}},data:function(){return{title:"代码生成工具",logo:"https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png"}}},we=ge,xe=(n("c9bc"),Object(h["a"])(we,ve,be,!1,null,"4a3d5d44",null)),ye=xe.exports,Ce=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.item.hidden?e._e():n("div",{staticClass:"menu-wrapper"},[!e.hasOneShowingChild(e.item.children,e.item)||e.onlyOneChild.children&&!e.onlyOneChild.noShowingChildren||e.item.alwaysShow?n("el-submenu",{ref:"subMenu",attrs:{index:e.resolvePath(e.item.path),"popper-append-to-body":""}},[n("template",{slot:"title"},[e.item.meta?n("item",{attrs:{icon:e.item.meta&&e.item.meta.icon,title:e.item.meta.title}}):e._e()],1),e._v(" "),e._l(e.item.children,(function(t){return n("sidebar-item",{key:t.path,staticClass:"nest-menu",attrs:{"is-nest":!0,item:t,"base-path":e.resolvePath(t.path)}})}))],2):[e.onlyOneChild.meta?n("app-link",{attrs:{to:e.resolvePath(e.onlyOneChild.path)}},[n("el-menu-item",{class:{"submenu-title-noDropdown":!e.isNest},attrs:{index:e.resolvePath(e.onlyOneChild.path)}},[n("item",{attrs:{icon:e.onlyOneChild.meta.icon||e.item.meta&&e.item.meta.icon,title:e.onlyOneChild.meta.title}})],1)],1):e._e()]],2)},_e=[],ke=n("df7c"),Se=n.n(ke);function ze(e){return/^(https?:|mailto:|tel:)/.test(e)}var Be,Oe,He={name:"MenuItem",functional:!0,props:{icon:{type:String,default:""},title:{type:String,default:""}},render:function(e,t){var n=t.props,a=n.icon,i=n.title,o=[];return a&&o.push(e("svg-icon",{attrs:{"icon-class":a}})),i&&o.push(e("span",{slot:"title"},[i])),o}},Me=He,Te=Object(h["a"])(Me,Be,Oe,!1,null,null,null),Ee=Te.exports,$e=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("component",e._b({},"component",e.linkProps(e.to),!1),[e._t("default")],2)},Le=[],Ae={props:{to:{type:String,required:!0}},methods:{linkProps:function(e){return ze(e)?{is:"a",href:e,target:"_blank",rel:"noopener"}:{is:"router-link",to:e}}}},Ve=Ae,je=Object(h["a"])(Ve,$e,Le,!1,null,null,null),Pe=je.exports,Ie={computed:{device:function(){return this.$store.state.app.device}},mounted:function(){this.fixBugIniOS()},methods:{fixBugIniOS:function(){var e=this,t=this.$refs.subMenu;if(t){var n=t.handleMouseleave;t.handleMouseleave=function(t){"mobile"!==e.device&&n(t)}}}}},Ne={name:"SidebarItem",components:{Item:Ee,AppLink:Pe},mixins:[Ie],props:{item:{type:Object,required:!0},isNest:{type:Boolean,default:!1},basePath:{type:String,default:""}},data:function(){return this.onlyOneChild=null,{}},methods:{hasOneShowingChild:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1?arguments[1]:void 0,a=t.filter((function(t){return!t.hidden&&(e.onlyOneChild=t,!0)}));return 1===a.length||0===a.length&&(this.onlyOneChild=Object(J["a"])(Object(J["a"])({},n),{},{path:"",noShowingChildren:!0}),!0)},resolvePath:function(e){return ze(e)?e:ze(this.basePath)?this.basePath:Se.a.resolve(this.basePath,e)}}},De=Ne,qe=Object(h["a"])(De,Ce,_e,!1,null,null,null),Re=qe.exports,Ge=n("cf1e"),Fe=n.n(Ge),Ue={components:{SidebarItem:Re,Logo:ye},computed:Object(J["a"])(Object(J["a"])({},Object(p["b"])(["sidebar"])),{},{routes:function(){return this.$router.options.routes},activeMenu:function(){var e=this.$route,t=e.meta,n=e.path;return t.activeMenu?t.activeMenu:n},showLogo:function(){return this.$store.state.settings.sidebarLogo},variables:function(){return Fe.a},isCollapse:function(){return!this.sidebar.opened}})},Ke=Ue,We=Object(h["a"])(Ke,fe,pe,!1,null,null,null),Je=We.exports,Xe=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("section",{staticClass:"app-main"},[n("transition",{attrs:{name:"fade-transform",mode:"out-in"}},[n("router-view",{key:e.key})],1)],1)},Ye=[],Qe={name:"AppMain",computed:{key:function(){return this.$route.fullPath}}},Ze=Qe,et=(n("e405"),Object(h["a"])(Ze,Xe,Ye,!1,null,"43c24f68",null)),tt=et.exports,nt=document,at=nt.body,it=992,ot={watch:{$route:function(e){"mobile"===this.device&&this.sidebar.opened&&xt.dispatch("app/closeSideBar",{withoutAnimation:!1})}},beforeMount:function(){window.addEventListener("resize",this.$_resizeHandler)},beforeDestroy:function(){window.removeEventListener("resize",this.$_resizeHandler)},mounted:function(){var e=this.$_isMobile();e&&(xt.dispatch("app/toggleDevice","mobile"),xt.dispatch("app/closeSideBar",{withoutAnimation:!0}))},methods:{$_isMobile:function(){var e=at.getBoundingClientRect();return e.width-1'});r.a.add(c);t["default"]=c},a1c9:function(e,t,n){},b20f:function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},b3ae:function(e,t,n){"use strict";n("4181")},b3b5:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-user",use:"icon-user-usage",viewBox:"0 0 130 130",content:''});r.a.add(c);t["default"]=c},c9bc:function(e,t,n){"use strict";n("a1c9")},cf1e:function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},d7ec:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-eye-open",use:"icon-eye-open-usage",viewBox:"0 0 1024 1024",content:''});r.a.add(c);t["default"]=c},dcf8:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-nested",use:"icon-nested-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},e1ad:function(e,t,n){},e405:function(e,t,n){"use strict";n("0372")},eb1b:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-form",use:"icon-form-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},f782:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),c=new i.a({id:"icon-dashboard",use:"icon-dashboard-usage",viewBox:"0 0 128 100",content:''});r.a.add(c);t["default"]=c},fbed:function(e,t,n){"use strict";n("6d93")}},[[0,"runtime","chunk-elementUI","chunk-libs"]]]); \ No newline at end of file diff --git a/sop-admin/sop-code-gen/src/main/resources/static/static/js/chunk-10204558.4a42f0ee.js b/sop-admin/sop-code-gen/src/main/resources/static/static/js/chunk-10204558.4a42f0ee.js new file mode 100644 index 00000000..3a9a3325 --- /dev/null +++ b/sop-admin/sop-code-gen/src/main/resources/static/static/js/chunk-10204558.4a42f0ee.js @@ -0,0 +1 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-10204558"],{"0b6c":function(e,t,n){(function(e){e(n("56b3"),n("b933"),n("2aed"))})((function(e){"use strict";function t(e,t){return"string"==typeof e?e=new RegExp(e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),t?"gi":"g"):e.global||(e=new RegExp(e.source,e.ignoreCase?"gi":"g")),{token:function(t){e.lastIndex=t.pos;var n=e.exec(t.string);if(n&&n.index==t.pos)return t.pos+=n[0].length||1,"searching";n?t.pos=n.index:t.skipToEnd()}}}function n(){this.posFrom=this.posTo=this.lastQuery=this.query=null,this.overlay=null}function r(e){return e.state.search||(e.state.search=new n)}function o(e){return"string"==typeof e&&e==e.toLowerCase()}function i(e,t,n){return e.getSearchCursor(t,n,{caseFold:o(t),multiline:!0})}function a(e,t,n,r,o){e.openDialog(t,r,{value:n,selectValueOnOpen:!0,closeOnEnter:!1,onClose:function(){_(e)},onKeyDown:o,bottom:e.options.search.bottom})}function s(e,t,n,r,o){e.openDialog?e.openDialog(t,o,{value:r,selectValueOnOpen:!0,bottom:e.options.search.bottom}):o(prompt(n,r))}function l(e,t,n,r){e.openConfirm?e.openConfirm(t,r):confirm(n)&&r[0]()}function c(e){return e.replace(/\\([nrt\\])/g,(function(e,t){return"n"==t?"\n":"r"==t?"\r":"t"==t?"\t":"\\"==t?"\\":e}))}function u(e){var t=e.match(/^\/(.*)\/([a-z]*)$/);if(t)try{e=new RegExp(t[1],-1==t[2].indexOf("i")?"":"i")}catch(n){}else e=c(e);return("string"==typeof e?""==e:e.test(""))&&(e=/x^/),e}function p(e,n,r){n.queryText=r,n.query=u(r),e.removeOverlay(n.overlay,o(n.query)),n.overlay=t(n.query,o(n.query)),e.addOverlay(n.overlay),e.showMatchesOnScrollbar&&(n.annotate&&(n.annotate.clear(),n.annotate=null),n.annotate=e.showMatchesOnScrollbar(n.query,o(n.query)))}function h(t,n,o,i){var l=r(t);if(l.query)return d(t,n);var c=t.getSelection()||l.lastQuery;if(c instanceof RegExp&&"x^"==c.source&&(c=null),o&&t.openDialog){var u=null,h=function(n,r){e.e_stop(r),n&&(n!=l.queryText&&(p(t,l,n),l.posFrom=l.posTo=t.getCursor()),u&&(u.style.opacity=1),d(t,r.shiftKey,(function(e,n){var r;n.line<3&&document.querySelector&&(r=t.display.wrapper.querySelector(".CodeMirror-dialog"))&&r.getBoundingClientRect().bottom-4>t.cursorCoords(n,"window").top&&((u=r).style.opacity=.4)})))};a(t,m(t),c,h,(function(n,o){var i=e.keyName(n),a=t.getOption("extraKeys"),s=a&&a[i]||e.keyMap[t.getOption("keyMap")][i];"findNext"==s||"findPrev"==s||"findPersistentNext"==s||"findPersistentPrev"==s?(e.e_stop(n),p(t,r(t),o),t.execCommand(s)):"find"!=s&&"findPersistent"!=s||(e.e_stop(n),h(o,n))})),i&&c&&(p(t,l,c),d(t,n))}else s(t,m(t),"Search for:",c,(function(e){e&&!l.query&&t.operation((function(){p(t,l,e),l.posFrom=l.posTo=t.getCursor(),d(t,n)}))}))}function d(t,n,o){t.operation((function(){var a=r(t),s=i(t,a.query,n?a.posFrom:a.posTo);(s.find(n)||(s=i(t,a.query,n?e.Pos(t.lastLine()):e.Pos(t.firstLine(),0)),s.find(n)))&&(t.setSelection(s.from(),s.to()),t.scrollIntoView({from:s.from(),to:s.to()},20),a.posFrom=s.from(),a.posTo=s.to(),o&&o(s.from(),s.to()))}))}function _(e){e.operation((function(){var t=r(e);t.lastQuery=t.query,t.query&&(t.query=t.queryText=null,e.removeOverlay(t.overlay),t.annotate&&(t.annotate.clear(),t.annotate=null))}))}function f(e,t){var n=e?document.createElement(e):document.createDocumentFragment();for(var r in t)n[r]=t[r];for(var o=2;o '+e.phrase("(Use line:column or scroll% syntax)")+""}function r(e,t){var n=Number(t);return/^[-+]/.test(t)?e.getCursor().line+n:n-1}e.defineOption("search",{bottom:!1}),e.commands.jumpToLine=function(e){var o=e.getCursor();t(e,n(e),e.phrase("Jump to line:"),o.line+1+":"+o.ch,(function(t){var n;if(t)if(n=/^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(t))e.setCursor(r(e,n[1]),Number(n[2]));else if(n=/^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(t)){var i=Math.round(e.lineCount()*Number(n[1])/100);/^[-+]/.test(n[1])&&(i=o.line+i+1),e.setCursor(i-1,o.ch)}else(n=/^\s*\:?\s*([\+\-]?\d+)\s*/.exec(t))&&e.setCursor(r(e,n[1]),o.ch)}))},e.keyMap["default"]["Alt-G"]="jumpToLine"}))},"23de":function(e,t,n){(function(e){e(n("56b3"),n("715d"))})((function(e){"use strict";var t={style:"matchhighlight",minChars:2,delay:100,wordsOnly:!1,annotateScrollbar:!1,showToken:!1,trim:!0};function n(e){for(var n in this.options={},t)this.options[n]=(e&&e.hasOwnProperty(n)?e:t)[n];this.overlay=this.timeout=null,this.matchesonscroll=null,this.active=!1}function r(e){var t=e.state.matchHighlighter;(t.active||e.hasFocus())&&i(e,t)}function o(e){var t=e.state.matchHighlighter;t.active||(t.active=!0,i(e,t))}function i(e,t){clearTimeout(t.timeout),t.timeout=setTimeout((function(){l(e)}),t.options.delay)}function a(e,t,n,r){var o=e.state.matchHighlighter;if(e.addOverlay(o.overlay=p(t,n,r)),o.options.annotateScrollbar&&e.showMatchesOnScrollbar){var i=n?new RegExp((/\w/.test(t.charAt(0))?"\\b":"")+t.replace(/[\\\[.+*?(){|^$]/g,"\\$&")+(/\w/.test(t.charAt(t.length-1))?"\\b":"")):t;o.matchesonscroll=e.showMatchesOnScrollbar(i,!1,{className:"CodeMirror-selection-highlight-scrollbar"})}}function s(e){var t=e.state.matchHighlighter;t.overlay&&(e.removeOverlay(t.overlay),t.overlay=null,t.matchesonscroll&&(t.matchesonscroll.clear(),t.matchesonscroll=null))}function l(e){e.operation((function(){var t=e.state.matchHighlighter;if(s(e),e.somethingSelected()||!t.options.showToken){var n=e.getCursor("from"),r=e.getCursor("to");if(n.line==r.line&&(!t.options.wordsOnly||c(e,n,r))){var o=e.getRange(n,r);t.options.trim&&(o=o.replace(/^\s+|\s+$/g,"")),o.length>=t.options.minChars&&a(e,o,!1,t.options.style)}}else{var i=!0===t.options.showToken?/[\w$]/:t.options.showToken,l=e.getCursor(),u=e.getLine(l.line),p=l.ch,h=p;while(p&&i.test(u.charAt(p-1)))--p;while(h0){var o={line:t.line,ch:t.ch-1},i=e.getRange(o,t);if(null===i.match(/\W/))return!1}if(n.ch=this.gap.to)break;r.to.line>=this.gap.from&&this.matches.splice(t--,1)}var o=this.cm.getSearchCursor(this.query,e.Pos(this.gap.from,0),{caseFold:this.caseFold,multiline:this.options.multiline}),i=this.options&&this.options.maxMatches||n;while(o.findNext()){r={from:o.from(),to:o.to()};if(r.from.line>=this.gap.to)break;if(this.matches.splice(t++,0,r),this.matches.length>i)break}this.gap=null}},t.prototype.onChange=function(t){var n=t.from.line,o=e.changeEnd(t).line,i=o-t.to.line;if(this.gap?(this.gap.from=Math.min(r(this.gap.from,n,i),t.from.line),this.gap.to=Math.max(r(this.gap.to,n,i),t.from.line)):this.gap={from:t.from.line,to:o+1},i)for(var a=0;aa)return t.charCoords(e,"local")[n?"top":"bottom"];var o=t.heightAtLine(l,"local");return o+(n?0:l.height)}var u=t.lastLine();if(t.display.barWidth)for(var p,h=0;hu)){var _=p||c(d.from,!0)*n,f=c(d.to,!1)*n;while(hu)break;if(p=c(o[h+1].from,!0)*n,p>f+.9)break;d=o[++h],f=c(d.to,!1)*n}if(f!=_){var m=Math.max(f-_,3),g=r.appendChild(document.createElement("div"));g.style.cssText="position: absolute; right: 0px; width: "+Math.max(t.display.barWidth-1,2)+"px; top: "+(_+this.buttonHeight)+"px; height: "+m+"px",g.className=this.options.className,d.id&&g.setAttribute("annotation-id",d.id)}}}this.div.textContent="",this.div.appendChild(r)},t.prototype.clear=function(){this.cm.off("refresh",this.resizeHandler),this.cm.off("markerAdded",this.resizeHandler),this.cm.off("markerCleared",this.resizeHandler),this.changeHandler&&this.cm.off("changes",this.changeHandler),this.div.parentNode.removeChild(this.div)}}))},b2d8:function(module,exports,__webpack_require__){!function(e,t){module.exports=t()}(0,(function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=62)}([function(e,t,n){"use strict";function r(e){return Object.prototype.toString.call(e)}function o(e){return"[object String]"===r(e)}function i(e,t){return w.call(e,t)}function a(e){return Array.prototype.slice.call(arguments,1).forEach((function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach((function(n){e[n]=t[n]}))}})),e}function s(e,t,n){return[].concat(e.slice(0,t),n,e.slice(t+1))}function l(e){return!(e>=55296&&e<=57343)&&!(e>=64976&&e<=65007)&&65535!=(65535&e)&&65534!=(65535&e)&&!(e>=0&&e<=8)&&11!==e&&!(e>=14&&e<=31)&&!(e>=127&&e<=159)&&!(e>1114111)}function c(e){if(e>65535){e-=65536;var t=55296+(e>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}function u(e,t){var n=0;return i(D,t)?D[t]:35===t.charCodeAt(0)&&E.test(t)&&(n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10),l(n))?c(n):e}function p(e){return e.indexOf("\\")<0?e:e.replace(x,"$1")}function h(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(C,(function(e,t,n){return t||u(e,n)}))}function d(e){return S[e]}function _(e){return T.test(e)?e.replace(A,d):e}function f(e){return e.replace(L,"\\$&")}function m(e){switch(e){case 9:case 32:return!0}return!1}function g(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}function b(e){return M.test(e)}function v(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function k(e){return e.trim().replace(/\s+/g," ").toUpperCase()}var w=Object.prototype.hasOwnProperty,x=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,y=/&([a-z#][a-z0-9]{1,31});/gi,C=new RegExp(x.source+"|"+y.source,"gi"),E=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,D=n(48),T=/[&<>"]/,A=/[&<>"]/g,S={"&":"&","<":"<",">":">",'"':"""},L=/[.?*+^$[\]\\(){}|-]/g,M=n(33);t.lib={},t.lib.mdurl=n(52),t.lib.ucmicro=n(187),t.assign=a,t.isString=o,t.has=i,t.unescapeMd=p,t.unescapeAll=h,t.isValidEntityCode=l,t.fromCodePoint=c,t.escapeHtml=_,t.arrayReplaceAt=s,t.isSpace=m,t.isWhiteSpace=g,t.isMdAsciiPunct=v,t.isPunctChar=b,t.escapeRE=f,t.normalizeReference=k},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){e.exports=!n(11)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(e,t,n){var r=n(5),o=n(13);e.exports=n(3)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(9),o=n(41),i=n(28),a=Object.defineProperty;t.f=n(3)?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(81),o=n(19);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(26)("wks"),o=n(14),i=n(1).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){var r=n(8);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t){var n=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=n)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=!0},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t){function n(e,t){var n=e[1]||"",o=e[3];if(!o)return n;if(t&&"function"==typeof btoa){var i=r(o);return[n].concat(o.sources.map((function(e){return"/*# sourceURL="+o.sourceRoot+e+" */"}))).concat([i]).join("\n")}return[n].join("\n")}function r(e){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"}e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var r=n(t,e);return t[2]?"@media "+t[2]+"{"+r+"}":r})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var r={},o=0;on.parts.length&&(r.parts.length=n.parts.length)}else{var a=[];for(o=0;o0)return n[0].addEventListener("load",(function(){t()})),void t();var r=document.createElement("script"),o=document.getElementsByTagName("head")[0];r.type="text/javascript",r.charset="UTF-8",r.src=e,r.addEventListener?r.addEventListener("load",(function(){t()}),!1):r.attachEvent&&r.attachEvent("onreadystatechange",(function(){"loaded"===window.event.srcElement.readyState&&t()})),o.appendChild(r)}function i(e,t){if("function"!=typeof t&&(t=function(){}),document.querySelectorAll("link[href='"+e+"']").length>0)t();else{var n=document.createElement("link"),r=document.getElementsByTagName("head")[0];n.rel="stylesheet",n.href=e,n.addEventListener?n.addEventListener("load",(function(){t()}),!1):n.attachEvent&&n.attachEvent("onreadystatechange",(function(){"loaded"===window.event.srcElement.readyState&&t()})),r.appendChild(n)}}n.d(t,"g",(function(){return a})),n.d(t,"i",(function(){return s})),n.d(t,"j",(function(){return l})),n.d(t,"k",(function(){return c})),n.d(t,"h",(function(){return u})),n.d(t,"l",(function(){return p})),n.d(t,"m",(function(){return h})),n.d(t,"e",(function(){return d})),n.d(t,"f",(function(){return _})),n.d(t,"b",(function(){return f})),t.d=o,t.c=i,n.d(t,"a",(function(){return m}));var a=function(e,t,n){var o=t.prefix,i=t.subfix,a=t.str;if(t.type,e.focus(),"number"==typeof e.selectionStart&&"number"==typeof e.selectionEnd){var s=e.selectionStart,l=e.selectionEnd,c=e.value;s===l?(e.value=c.substring(0,s)+o+a+i+c.substring(l,c.length),e.selectionStart=s+o.length,e.selectionEnd=s+(a.length+o.length)):c.substring(s-o.length,s)===o&&c.substring(l,l+i.length)===i&&r(o,i,c,s,l)?(e.value=c.substring(0,s-o.length)+c.substring(s,l)+c.substring(l+i.length,c.length),e.selectionStart=s-o.length,e.selectionEnd=l-o.length):(e.value=c.substring(0,s)+o+c.substring(s,l)+i+c.substring(l,c.length),e.selectionStart=s+o.length,e.selectionEnd=s+(l-s+o.length))}else alert("Error: Browser version is too low");n.d_value=e.value,e.focus()},s=function(e){var t=e.getTextareaDom();if("number"==typeof t.selectionStart&&"number"==typeof t.selectionEnd){var n=t.selectionStart,r=t.selectionEnd,o=t.value;if(n===r)t.value=o.substring(0,n)+"1. "+o.substring(r,o.length),t.selectionEnd=t.selectionStart=n+3;else{for(var i=n;i>0&&"\n"!==o.substring(i-1,i);)i--;for(var a=o.substring(i,r),s=a.split("\n"),l=0;l0&&"\n"!==o.substring(i-1,i);)i--;for(var a=r;a0&&"\n"!==o.substring(i-1,i);)i--;var a=o.substring(i,r),s=a.replace(/\n/g,"\n- ");s="- "+s,t.value=o.substring(0,i)+s+o.substring(r,o.length),t.selectionStart=i,t.selectionEnd=r+s.length-a.length}}else alert("Error: Browser version is too low");e.d_value=t.value,t.focus()},u=function(e,t){t=t?new Array(t).fill(" ").join(""):"\t";var n=e.getTextareaDom();if("number"==typeof n.selectionStart&&"number"==typeof n.selectionEnd){var r=n.selectionStart,o=n.selectionEnd,i=n.value,a=i.substring(0,r).split("\n").pop();if(a.match(/^\s*[0-9]+\.\s+\S*/)){var s=a.replace(/(\d+)/,1);n.value=i.substring(0,r-s.length)+t+s+i.substring(o,i.length)}else a.match(/^\s*-\s+\S*/)?n.value=i.substring(0,r-a.length)+t+a+i.substring(o,i.length):n.value=i.substring(0,r)+t+i.substring(o,i.length);n.selectionStart=n.selectionEnd=r+t.length}else alert("Error: Browser version is too low");e.d_value=n.value,n.focus()},p=function(e,t){var n=new RegExp(t?"\\s{"+t+"}":"\t");console.log("regTab:",n);var r=e.getTextareaDom();if("number"==typeof r.selectionStart&&"number"==typeof r.selectionEnd){var o=r.selectionStart,i=r.selectionEnd,a=r.value,s=a.substring(0,o).split("\n").pop();s.search(n)>=0&&(r.value=a.substring(0,o-s.length)+s.replace(n,"")+a.substring(i,a.length),r.selectionStart=r.selectionEnd=o-(t||1))}else alert("Error: Browser version is too low");e.d_value=r.value,r.focus()},h=function(e,t){var n=e.getTextareaDom();if("number"==typeof n.selectionStart&&"number"==typeof n.selectionEnd){var r=n.selectionStart,o=n.selectionEnd,i=n.value,a=i.substring(0,r).split("\n").pop(),s=a.match(/^\s*(?:[0-9]+\.|-)\s+\S+/);if(s){t.preventDefault();var l=s.shift().match(/^\s*(?:[0-9]+\.|-)\s/).shift();if(l.search(/-/)>=0)n.value=i.substring(0,r)+"\n"+l+i.substring(o,i.length),n.selectionStart=n.selectionEnd=r+l.length+1;else{var c=l.replace(/(\d+)/,parseInt(l)+1);n.value=i.substring(0,r)+"\n"+c+i.substring(o,i.length),n.selectionStart=n.selectionEnd=r+c.length+1}}else{var u=a.match(/^\s*(?:[0-9]+\.|-)\s+$/);if(u){t.preventDefault();var p=u.shift().length;n.value=i.substring(0,r-p)+"\n"+i.substring(o,i.length),n.selectionStart=n.selectionEnd=r-p}}}else alert("Error: Browser version is too low");e.d_value=n.value,n.focus()},d=function(e,t){var n=void 0;n=e.$refs.navigationContent,n.innerHTML=e.d_render;var r=n.children;if(r.length)for(var o=0;o=0&&n.scrollHeight!==t.edit_scroll_height&&n.scrollHeight-n.offsetHeight-n.scrollTop<=30&&(t.$refs.vNoteEdit.scrollTop=n.scrollHeight-n.offsetHeight,r=1),t.edit_scroll_height=n.scrollHeight,t.$refs.vShowContent.scrollHeight>t.$refs.vShowContent.offsetHeight&&(t.$refs.vShowContent.scrollTop=(t.$refs.vShowContent.scrollHeight-t.$refs.vShowContent.offsetHeight)*r)},f=function(e){e.$el.addEventListener("fullscreenchange",(function(t){e.$toolbar_right_read_change_status()}),!1),e.$el.addEventListener("mozfullscreenchange",(function(t){e.$toolbar_right_read_change_status()}),!1),e.$el.addEventListener("webkitfullscreenchange",(function(t){e.$toolbar_right_read_change_status()}),!1),e.$el.addEventListener("msfullscreenchange",(function(t){e.$toolbar_right_read_change_status()}),!1)},m=function(e){e.$refs.vShowContent.addEventListener("click",(function(t){t=t||window.event;var n=t.srcElement?t.srcElement:t.target;"IMG"===n.tagName&&(null!=e.imageClick?e.imageClick(n):e.d_preview_imgsrc=n.src)}))}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t){e.exports={}},function(e,t,n){var r=n(46),o=n(20);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var r=n(5).f,o=n(2),i=n(7)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){var r=n(26)("keys"),o=n(14);e.exports=function(e){return r[e]||(r[e]=o(e))}},function(e,t,n){var r=n(10),o=n(1),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:r.version,mode:n(12)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(8);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){var r=n(1),o=n(10),i=n(12),a=n(30),s=n(5).f;e.exports=function(e){var t=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==e.charAt(0)||e in t||s(t,e,{value:a.f(e)})}},function(e,t,n){t.f=n(7)},function(e,t,n){"use strict";function r(){this.__rules__=[],this.__cache__=null}r.prototype.__find__=function(e){for(var t=0;t=0&&(n=this.attrs[t][1]),n},r.prototype.attrJoin=function(e,t){var n=this.attrIndex(e);n<0?this.attrPush([e,t]):this.attrs[n][1]=this.attrs[n][1]+" "+t},e.exports=r},function(e,t){e.exports=/[!-#%-\*,-/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E49\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},function(e,t,n){function r(e){o||n(194)}var o=!1,i=n(16)(n(59),n(191),r,"data-v-62b9e4d1",null);i.options.__file="C:\\Users\\LWK\\Desktop\\mavonEditor-master\\mavonEditor-master\\src\\components\\md-toolbar-left.vue",i.esModule&&Object.keys(i.esModule).some((function(e){return"default"!==e&&"__"!==e.substr(0,2)}))&&console.error("named exports are not supported in *.vue files."),i.options.functional&&console.error("[vue-loader] md-toolbar-left.vue: functional components are not supported with templates, they should use render functions."),e.exports=i.exports},function(e,t,n){var r=n(16)(n(60),n(189),null,null,null);r.options.__file="C:\\Users\\LWK\\Desktop\\mavonEditor-master\\mavonEditor-master\\src\\components\\md-toolbar-right.vue",r.esModule&&Object.keys(r.esModule).some((function(e){return"default"!==e&&"__"!==e.substr(0,2)}))&&console.error("named exports are not supported in *.vue files."),r.options.functional&&console.error("[vue-loader] md-toolbar-right.vue: functional components are not supported with templates, they should use render functions."),e.exports=r.exports},function(e,t,n){"use strict";t.a={"1c":"1c",abnf:"abnf",accesslog:"accesslog",actionscript:"actionscript",as:"actionscript",ada:"ada",apache:"apache",apacheconf:"apache",applescript:"applescript",osascript:"applescript",arduino:"arduino",armasm:"armasm",arm:"armasm",asciidoc:"asciidoc",adoc:"asciidoc",aspectj:"aspectj",autohotkey:"autohotkey",ahk:"autohotkey",autoit:"autoit",avrasm:"avrasm",awk:"awk",axapta:"axapta",bash:"bash",sh:"bash",zsh:"bash",basic:"basic",bnf:"bnf",brainfuck:"brainfuck",bf:"brainfuck",cal:"cal",capnproto:"capnproto",capnp:"capnproto",ceylon:"ceylon",clean:"clean",icl:"clean",dcl:"clean","clojure-repl":"clojure-repl",clojure:"clojure",clj:"clojure",cmake:"cmake","cmake.in":"cmake",coffeescript:"coffeescript",coffee:"coffeescript",cson:"coffeescript",iced:"coffeescript",coq:"coq",cos:"cos",cls:"cos",cpp:"cpp",c:"cpp",cc:"cpp",h:"cpp","c++":"cpp","h++":"cpp",hpp:"cpp",crmsh:"crmsh",crm:"crmsh",pcmk:"crmsh",crystal:"crystal",cr:"crystal",cs:"cs",csharp:"cs",csp:"csp",css:"css",d:"d",dart:"dart",delphi:"delphi",dpr:"delphi",dfm:"delphi",pas:"delphi",pascal:"delphi",freepascal:"delphi",lazarus:"delphi",lpr:"delphi",lfm:"delphi",diff:"diff",patch:"diff",django:"django",jinja:"django",dns:"dns",bind:"dns",zone:"dns",dockerfile:"dockerfile",docker:"dockerfile",dos:"dos",bat:"dos",cmd:"dos",dsconfig:"dsconfig",dts:"dts",dust:"dust",dst:"dust",ebnf:"ebnf",elixir:"elixir",elm:"elm",erb:"erb","erlang-repl":"erlang-repl",erlang:"erlang",erl:"erlang",excel:"excel",xlsx:"excel",xls:"excel",fix:"fix",flix:"flix",fortran:"fortran",f90:"fortran",f95:"fortran",fsharp:"fsharp",fs:"fsharp",gams:"gams",gms:"gams",gauss:"gauss",gss:"gauss",gcode:"gcode",nc:"gcode",gherkin:"gherkin",feature:"gherkin",glsl:"glsl",go:"go",golang:"go",golo:"golo",gradle:"gradle",groovy:"groovy",haml:"haml",handlebars:"handlebars",hbs:"handlebars","html.hbs":"handlebars","html.handlebars":"handlebars",haskell:"haskell",hs:"haskell",haxe:"haxe",hx:"haxe",hsp:"hsp",htmlbars:"htmlbars",http:"http",https:"http",hy:"hy",hylang:"hy",inform7:"inform7",i7:"inform7",ini:"ini",toml:"ini",irpf90:"irpf90",java:"java",jsp:"java",javascript:"javascript",js:"javascript",jsx:"javascript","jboss-cli":"jboss-cli","wildfly-cli":"jboss-cli",json:"json","julia-repl":"julia-repl",julia:"julia",kotlin:"kotlin",lasso:"lasso",ls:"livescript",lassoscript:"lasso",ldif:"ldif",leaf:"leaf",less:"less",lisp:"lisp",livecodeserver:"livecodeserver",livescript:"livescript",llvm:"llvm",lsl:"lsl",lua:"lua",makefile:"makefile",mk:"makefile",mak:"makefile",markdown:"markdown",md:"markdown",mkdown:"markdown",mkd:"markdown",mathematica:"mathematica",mma:"mathematica",matlab:"matlab",maxima:"maxima",mel:"mel",mercury:"mercury",m:"mercury",moo:"mercury",mipsasm:"mipsasm",mips:"mipsasm",mizar:"mizar",mojolicious:"mojolicious",monkey:"monkey",moonscript:"moonscript",moon:"moonscript",n1ql:"n1ql",nginx:"nginx",nginxconf:"nginx",nimrod:"nimrod",nim:"nimrod",nix:"nix",nixos:"nix",nsis:"nsis",objectivec:"objectivec",mm:"objectivec",objc:"objectivec","obj-c":"objectivec",ocaml:"ocaml",ml:"sml",openscad:"openscad",scad:"openscad",oxygene:"oxygene",parser3:"parser3",perl:"perl",pl:"perl",pm:"perl",pf:"pf","pf.conf":"pf",php:"php",php3:"php",php4:"php",php5:"php",php6:"php",pony:"pony",powershell:"powershell",ps:"powershell",processing:"processing",profile:"profile",prolog:"prolog",protobuf:"protobuf",puppet:"puppet",pp:"puppet",purebasic:"purebasic",pb:"purebasic",pbi:"purebasic",python:"python",py:"python",gyp:"python",q:"q",k:"q",kdb:"q",qml:"qml",qt:"qml",r:"r",rib:"rib",roboconf:"roboconf",graph:"roboconf",instances:"roboconf",routeros:"routeros",mikrotik:"routeros",rsl:"rsl",ruby:"ruby",rb:"ruby",gemspec:"ruby",podspec:"ruby",thor:"ruby",irb:"ruby",ruleslanguage:"ruleslanguage",rust:"rust",rs:"rust",scala:"scala",scheme:"scheme",scilab:"scilab",sci:"scilab",scss:"scss",shell:"shell",console:"shell",smali:"smali",smalltalk:"smalltalk",st:"smalltalk",sml:"sml",sqf:"sqf",sql:"sql",stan:"stan",stata:"stata",do:"stata",ado:"stata",step21:"step21",p21:"step21",step:"step21",stp:"step21",stylus:"stylus",styl:"stylus",subunit:"subunit",swift:"swift",taggerscript:"taggerscript",tap:"tap",tcl:"tcl",tk:"tcl",tex:"tex",thrift:"thrift",tp:"tp",twig:"twig",craftcms:"twig",typescript:"typescript",ts:"typescript",vala:"vala",vbnet:"vbnet",vb:"vbnet","vbscript-html":"vbscript-html",vbscript:"vbscript",vbs:"vbscript",verilog:"verilog",v:"verilog",sv:"verilog",svh:"verilog",vhdl:"vhdl",vim:"vim",x86asm:"x86asm",xl:"xl",tao:"xl",xml:"xml",html:"xml",xhtml:"xml",rss:"xml",atom:"xml",xjb:"xml",xsd:"xml",xsl:"xml",plist:"xml",xquery:"xquery",xpath:"xquery",xq:"xquery",yaml:"yaml",yml:"yaml",YAML:"yaml",zephir:"zephir",zep:"zephir"}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=n(72),i=r(o),a=n(71),s=r(a),l="function"==typeof s.default&&"symbol"==typeof i.default?function(e){return typeof e}:function(e){return e&&"function"==typeof s.default&&e.constructor===s.default&&e!==s.default.prototype?"symbol":typeof e};t.default="function"==typeof s.default&&"symbol"===l(i.default)?function(e){return void 0===e?"undefined":l(e)}:function(e){return e&&"function"==typeof s.default&&e.constructor===s.default&&e!==s.default.prototype?"symbol":void 0===e?"undefined":l(e)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r=n(8),o=n(1).document,i=r(o)&&r(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t,n){var r=n(1),o=n(10),i=n(78),a=n(4),s=n(2),l=function(e,t,n){var c,u,p,h=e&l.F,d=e&l.G,_=e&l.S,f=e&l.P,m=e&l.B,g=e&l.W,b=d?o:o[t]||(o[t]={}),v=b.prototype,k=d?r:_?r[t]:(r[t]||{}).prototype;for(c in d&&(n=t),n)(u=!h&&k&&void 0!==k[c])&&s(b,c)||(p=u?k[c]:n[c],b[c]=d&&"function"!=typeof k[c]?n[c]:m&&u?i(p,r):g&&k[c]==p?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(p):f&&"function"==typeof p?i(Function.call,p):p,f&&((b.virtual||(b.virtual={}))[c]=p,e&l.R&&v&&!v[c]&&a(v,c,p)))};l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,l.U=64,l.R=128,e.exports=l},function(e,t,n){e.exports=!n(3)&&!n(11)((function(){return 7!=Object.defineProperty(n(39)("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){"use strict";var r=n(12),o=n(40),i=n(47),a=n(4),s=n(21),l=n(83),c=n(24),u=n(89),p=n(7)("iterator"),h=!([].keys&&"next"in[].keys()),d=function(){return this};e.exports=function(e,t,n,_,f,m,g){l(n,t,_);var b,v,k,w=function(e){if(!h&&e in E)return E[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},x=t+" Iterator",y="values"==f,C=!1,E=e.prototype,D=E[p]||E["@@iterator"]||f&&E[f],T=D||w(f),A=f?y?w("entries"):T:void 0,S="Array"==t&&E.entries||D;if(S&&(k=u(S.call(new e)))!==Object.prototype&&k.next&&(c(k,x,!0),r||"function"==typeof k[p]||a(k,p,d)),y&&D&&"values"!==D.name&&(C=!0,T=function(){return D.call(this)}),r&&!g||!h&&!C&&E[p]||a(E,p,T),s[t]=T,s[x]=d,f)if(b={values:y?T:w("values"),keys:m?T:w("keys"),entries:A},g)for(v in b)v in E||i(E,v,b[v]);else o(o.P+o.F*(h||C),t,b);return b}},function(e,t,n){var r=n(9),o=n(86),i=n(20),a=n(25)("IE_PROTO"),s=function(){},l=function(){var e,t=n(39)("iframe"),r=i.length;for(t.style.display="none",n(80).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write("