From 418e2064a573939e1c8f3599669632161c741d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=89=E8=80=85?= Date: Thu, 10 Sep 2020 17:22:03 +0800 Subject: [PATCH 01/14] =?UTF-8?q?update=20smart-admin-web/src/views/login/?= =?UTF-8?q?login.less.=20=E7=99=BB=E9=99=86=E9=9D=A2=E6=9D=BF=E5=9C=86?= =?UTF-8?q?=E8=A7=92=E6=A0=B7=E5=BC=8F=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- smart-admin-web/src/views/login/login.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smart-admin-web/src/views/login/login.less b/smart-admin-web/src/views/login/login.less index d1d6fc2b..82a52efc 100644 --- a/smart-admin-web/src/views/login/login.less +++ b/smart-admin-web/src/views/login/login.less @@ -26,7 +26,7 @@ width: 424px; background: #fff; padding: 32px 32px; - border-radius: 0 8px 8px 0; + border-radius: 8px; .ivu-input { border: 1px solid #E8E8EE; border-radius: 4px; From 70173ebd221544857d3e41729d1a6d9ddf6f09a6 Mon Sep 17 00:00:00 2001 From: zhuoda Date: Tue, 22 Sep 2020 09:33:56 +0800 Subject: [PATCH 02/14] v1.2.1 --- .../smartadmin/module/business/notice/dao/NoticeDao.java | 2 +- .../src/main/resources/prod/application.properties | 2 +- smart-admin-web/.env.development | 4 ++-- smart-admin-web/src/views/business/email/send-mail.vue | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeDao.java index 9e07e2ea..de7caec5 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeDao.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeDao.java @@ -41,7 +41,7 @@ public interface NoticeDao extends BaseMapper { * @param employeeId * @return */ - @DataScope(joinSql = "n.create_user_department_id in (#departmentIds)", whereInType = DataScopeWhereInTypeEnum.DEPARTMENT) + @DataScope(joinSql = "e.department_id in (#departmentIds)", whereInType = DataScopeWhereInTypeEnum.DEPARTMENT) List queryUnreadByPage(Page page, @Param("employeeId") Long employeeId, @Param("sendStatus") Integer sendStatus); diff --git a/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties b/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties index 7acf99ef..70db1f5a 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties +++ b/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties @@ -28,7 +28,7 @@ spring.datasource.username=smart-admin spring.datasource.password=Admin@123457 spring.datasource.initial-size=2 spring.datasource.min-idle=1 -spring.datasource.max-active=10 +spring.datasource.max-active=100 spring.datasource.max-wait=60000 spring.datasource.time-between-eviction-runs-millis=60000 spring.datasource.min-evictable-idle-time-millis=300000 diff --git a/smart-admin-web/.env.development b/smart-admin-web/.env.development index 7c1979f5..746c33a9 100644 --- a/smart-admin-web/.env.development +++ b/smart-admin-web/.env.development @@ -1,4 +1,4 @@ NODE_ENV=development VUE_APP_TYPE=dev -VUE_APP_URL=http://172.16.0.145:10086/smart-admin-api/ -VUE_APP_SOCKET_URL=ws://172.16.0.145:10086/smart-admin-api/ +VUE_APP_URL=http://127.0.0.1:10086/smart-admin-api/ +VUE_APP_SOCKET_URL=ws://127.0.0.1:10086/smart-admin-api/ diff --git a/smart-admin-web/src/views/business/email/send-mail.vue b/smart-admin-web/src/views/business/email/send-mail.vue index ae4bb47e..d06261d9 100644 --- a/smart-admin-web/src/views/business/email/send-mail.vue +++ b/smart-admin-web/src/views/business/email/send-mail.vue @@ -94,6 +94,7 @@ export default { let g = this; g.editor = new WangEditor('#editor'); g.editor.customConfig = { + zIndex:1, // 功能键 menus: [ 'head', // 标题 From 58113847f4d2cd2412edcf1375d277485dce8493 Mon Sep 17 00:00:00 2001 From: gaoshun <8134074+mushroom12@user.noreply.gitee.com> Date: Fri, 16 Oct 2020 17:41:06 +0800 Subject: [PATCH 03/14] =?UTF-8?q?git=20commit=20=20=E6=96=B9=E6=B3=95close?= =?UTF-8?q?=20open=E9=97=AD=E5=90=88=E6=8B=AC=E5=8F=B7=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/mapper/system/employee/EmployeeMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml index fe1397a4..e6220eea 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml +++ b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml @@ -146,7 +146,7 @@ t_employee e WHERE e.department_id IN - + #{item} order by e.create_time desc From 72118743efef75d58ebefb41c9d7d5c168185fb7 Mon Sep 17 00:00:00 2001 From: gaoshun <8134074+mushroom12@user.noreply.gitee.com> Date: Fri, 16 Oct 2020 17:42:40 +0800 Subject: [PATCH 04/14] =?UTF-8?q?git=20commit=20getEmployeeIdByDeptIds?= =?UTF-8?q?=E6=8B=AC=E5=8F=B7=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/mapper/system/employee/EmployeeMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml index e6220eea..1817abaf 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml +++ b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml @@ -146,7 +146,7 @@ t_employee e WHERE e.department_id IN - + #{item} order by e.create_time desc From 3b1603aceb6b76a5fe936ebf14b978e10110e613 Mon Sep 17 00:00:00 2001 From: gaoshun <8134074+mushroom12@user.noreply.gitee.com> Date: Fri, 16 Oct 2020 17:44:35 +0800 Subject: [PATCH 05/14] =?UTF-8?q?git=20commit=20getEmployeeByIds=20?= =?UTF-8?q?=E6=8B=BC=E6=8E=A5sql=E6=8B=AC=E5=8F=B7=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/mapper/system/employee/EmployeeMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml index 1817abaf..09739d9a 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml +++ b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml @@ -146,7 +146,7 @@ t_employee e WHERE e.department_id IN - + #{item} order by e.create_time desc @@ -158,7 +158,7 @@ FROM t_employee e where e.id IN - + #{item} order by e.create_time desc From 01fe8a7c1630c2fd2266aad4cbbc3351bebea028 Mon Sep 17 00:00:00 2001 From: yandanyang Date: Sat, 28 Nov 2020 23:02:08 +0800 Subject: [PATCH 06/14] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9quartz=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=822=E5=AE=8C=E5=96=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E6=B7=BB=E5=8A=A0=E7=AD=96=E7=95=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E3=80=823=E4=BF=AE=E6=94=B9swaggerbug=E3=80=824?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E9=AA=8C=E8=AF=81=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../smartadmin/common/anno/DataScope.java | 12 ++++ .../SmartSwaggerDynamicGroupConfig.java | 7 ++- .../support/quartz/service/QuartzTask.java | 5 +- .../quartz/service/QuartzTaskService.java | 52 +++++++++++++---- .../support/quartz/task/test/Example.java | 4 +- .../datascope/constant/DataScopeTypeEnum.java | 16 ++++-- .../constant/DataScopeViewTypeEnum.java | 29 +++++----- .../constant/DataScopeWhereInTypeEnum.java | 21 ++++--- .../domain/dto/DataScopeSqlConfigDTO.java | 19 ++++++- .../datascope/service/DataScopeService.java | 4 +- .../service/DataScopeSqlConfigService.java | 34 ++++++++--- .../service/DataScopeViewService.java | 52 ++++++++++------- .../strategy/DataScopePowerStrategy.java | 24 ++++++++ .../domain/dto/EmployeeLoginFormDTO.java | 2 - .../module/system/login/LoginService.java | 18 +++--- .../src/views/login/components/login-form.vue | 23 ++++---- .../src/views/support/task/task-list.vue | 56 +++++++++++++------ 17 files changed, 263 insertions(+), 115 deletions(-) create mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/strategy/DataScopePowerStrategy.java diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/DataScope.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/DataScope.java index 01a045c9..1ab8061a 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/DataScope.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/DataScope.java @@ -2,6 +2,7 @@ package net.lab1024.smartadmin.common.anno; import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeTypeEnum; import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeWhereInTypeEnum; +import net.lab1024.smartadmin.module.system.datascope.strategy.DataScopePowerStrategy; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -27,11 +28,22 @@ public @interface DataScope { DataScopeWhereInTypeEnum whereInType() default DataScopeWhereInTypeEnum.EMPLOYEE; /** + * DataScopeWhereInTypeEnum.CUSTOM_STRATEGY类型 才可使用joinSqlImplClazz属性 + * @return + */ + Class joinSqlImplClazz() default DataScopePowerStrategy.class; + + /** + * * 第几个where 条件 从0开始 * @return */ int whereIndex() default 0; + /** + * DataScopeWhereInTypeEnum为CUSTOM_STRATEGY类型时,此属性无效 + * @return + */ String joinSql() default ""; } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerDynamicGroupConfig.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerDynamicGroupConfig.java index 649b1508..48451f93 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerDynamicGroupConfig.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerDynamicGroupConfig.java @@ -19,6 +19,7 @@ import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.RequestHandler; import springfox.documentation.builders.ApiInfoBuilder; @@ -194,7 +195,11 @@ public class SmartSwaggerDynamicGroupConfig implements EnvironmentAware, BeanDef return false; }; groupIndex++; - return Predicates.and(RequestHandlerSelectors.withClassAnnotation(RestController.class), methodPredicate); + return Predicates.or( + Predicates.and(RequestHandlerSelectors.withClassAnnotation(RestController.class),methodPredicate), + Predicates.and( + RequestHandlerSelectors.withMethodAnnotation(ResponseBody.class),methodPredicate) + ); } private ApiInfo serviceApiInfo() { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java index dbbdee2b..58b2e32c 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java @@ -1,14 +1,14 @@ package net.lab1024.smartadmin.module.support.quartz.service; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.common.domain.ITask; import net.lab1024.smartadmin.module.support.quartz.constant.QuartzConst; import net.lab1024.smartadmin.module.support.quartz.constant.TaskResultEnum; import net.lab1024.smartadmin.module.support.quartz.domain.entity.QuartzTaskEntity; import net.lab1024.smartadmin.module.support.quartz.domain.entity.QuartzTaskLogEntity; -import net.lab1024.smartadmin.common.domain.ITask; import net.lab1024.smartadmin.third.SmartApplicationContext; import net.lab1024.smartadmin.util.SmartIPUtil; import net.lab1024.smartadmin.util.SmartQuartzUtil; -import lombok.extern.slf4j.Slf4j; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; @@ -17,7 +17,6 @@ import org.springframework.scheduling.quartz.QuartzJobBean; import java.io.PrintWriter; import java.io.StringWriter; -import java.time.LocalDateTime; import java.util.Date; /** diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskService.java index 30408d5f..9f88132a 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskService.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskService.java @@ -130,7 +130,12 @@ public class QuartzTaskService { taskEntity.setTaskStatus(updateEntity.getTaskStatus()); taskEntity.setUpdateTime(new Date()); quartzTaskDao.updateById(taskEntity); - this.updateQuartzTask(scheduler, taskEntity); + if(this.checkExist(taskEntity.getId())){ + this.updateQuartzTask(scheduler, taskEntity); + }else{ + this.createQuartzTask(scheduler,taskEntity); + } + return ResponseDTO.succ(); } @@ -165,7 +170,7 @@ public class QuartzTaskService { } quartzTaskEntity.setTaskStatus(TaskStatusEnum.PAUSE.getStatus()); quartzTaskDao.updateById(quartzTaskEntity); - this.pauseQuartzTask(scheduler, taskId); + this.pauseQuartzTask(scheduler, quartzTaskEntity); return ResponseDTO.succ(); } @@ -184,7 +189,7 @@ public class QuartzTaskService { } quartzTaskEntity.setTaskStatus(TaskStatusEnum.NORMAL.getStatus()); quartzTaskDao.updateById(quartzTaskEntity); - this.resumeQuartzTask(scheduler, taskId); + this.resumeQuartzTask(scheduler, quartzTaskEntity); return ResponseDTO.succ(); } @@ -233,6 +238,10 @@ public class QuartzTaskService { jobDetail.getJobDataMap().put(QuartzConst.QUARTZ_PARAMS_KEY, taskEntity.getTaskParams()); scheduler.scheduleJob(jobDetail, trigger); + //如果任务是暂停状态,则暂停任务 + if (TaskStatusEnum.PAUSE.getStatus().equals(taskEntity.getTaskStatus())) { + this.pauseQuartzTask(scheduler, taskEntity); + } } /** @@ -256,7 +265,7 @@ public class QuartzTaskService { scheduler.rescheduleJob(triggerKey, trigger); //如果更新之前任务是暂停状态,此时再次暂停任务 if (TaskStatusEnum.PAUSE.getStatus().equals(taskEntity.getTaskStatus())) { - this.pauseQuartzTask(scheduler, Long.valueOf(taskEntity.getId())); + this.pauseQuartzTask(scheduler, taskEntity); } } @@ -276,6 +285,11 @@ public class QuartzTaskService { JobDataMap dataMap = new JobDataMap(); dataMap.put(QuartzConst.QUARTZ_PARAMS_KEY, taskEntity.getTaskParams()); JobKey jobKey = SmartQuartzUtil.getJobKey(taskEntity.getId()); + if(!scheduler.checkExists(jobKey)){ + this.createQuartzTask(scheduler,taskEntity); + scheduler.triggerJob(jobKey, dataMap); + return; + } scheduler.triggerJob(jobKey, dataMap); } @@ -283,11 +297,16 @@ public class QuartzTaskService { * 暂停任务 * * @param scheduler - * @param taskId + * @param quartzTaskEntity * @throws Exception */ - private void pauseQuartzTask(Scheduler scheduler, Long taskId) throws Exception { - JobKey jobKey = SmartQuartzUtil.getJobKey(taskId); + private void pauseQuartzTask(Scheduler scheduler, QuartzTaskEntity quartzTaskEntity) throws Exception { + JobKey jobKey = SmartQuartzUtil.getJobKey(quartzTaskEntity.getId()); + if(!scheduler.checkExists(jobKey)){ + this.createQuartzTask(scheduler,quartzTaskEntity); + scheduler.pauseJob(jobKey); + return; + } scheduler.pauseJob(jobKey); } @@ -295,11 +314,15 @@ public class QuartzTaskService { * 恢复任务 * * @param scheduler - * @param taskId + * @param quartzTaskEntity * @throws Exception */ - private void resumeQuartzTask(Scheduler scheduler, Long taskId) throws Exception { - JobKey jobKey = SmartQuartzUtil.getJobKey(taskId); + private void resumeQuartzTask(Scheduler scheduler, QuartzTaskEntity quartzTaskEntity) throws Exception { + JobKey jobKey = SmartQuartzUtil.getJobKey(quartzTaskEntity.getId()); + if(!scheduler.checkExists(jobKey)){ + this.createQuartzTask(scheduler,quartzTaskEntity); + return; + } scheduler.resumeJob(jobKey); } @@ -312,6 +335,15 @@ public class QuartzTaskService { */ private void deleteQuartzTask(Scheduler scheduler, Long taskId) throws Exception { JobKey jobKey = SmartQuartzUtil.getJobKey(taskId); + if(!scheduler.checkExists(jobKey)){ + return; + } scheduler.deleteJob(jobKey); } + + + private Boolean checkExist(Long taskId) throws Exception{ + JobKey jobKey = SmartQuartzUtil.getJobKey(taskId); + return scheduler.checkExists(jobKey); + } } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/task/test/Example.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/task/test/Example.java index 8502555a..f62d22b5 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/task/test/Example.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/task/test/Example.java @@ -1,5 +1,6 @@ package net.lab1024.smartadmin.module.support.quartz.task.test; +import lombok.extern.slf4j.Slf4j; import net.lab1024.smartadmin.common.domain.ITask; import net.lab1024.smartadmin.util.SmartDateUtil; import org.springframework.stereotype.Component; @@ -16,11 +17,12 @@ import java.util.Date; * @date 2019/4/13 0013 下午 14:26 * @since JDK1.8 */ +@Slf4j @Component("exampleTask") public class Example implements ITask { @Override public void execute(String paramJson) throws Exception { - System.out.println(SmartDateUtil.formatYMDHMS(new Date()) + ",今天搬了" + System.currentTimeMillis() + "块砖,paramJson:" + paramJson); + log.warn("{}-今天搬了{}块砖,paramJson:{}",SmartDateUtil.formatYMDHMS(new Date()),System.currentTimeMillis(),paramJson ); } } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeTypeEnum.java index 4cbc11ce..66ebb8f9 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeTypeEnum.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeTypeEnum.java @@ -1,6 +1,8 @@ package net.lab1024.smartadmin.module.system.datascope.constant; +import net.lab1024.smartadmin.common.domain.BaseEnum; + /** * [ ] * @@ -11,30 +13,32 @@ package net.lab1024.smartadmin.module.system.datascope.constant; * @date 2019/4/28 0028 下午 15:37 * @since JDK1.8 */ -public enum DataScopeTypeEnum { +public enum DataScopeTypeEnum implements BaseEnum { DEFAULT(0,0,"默认类型","数据范围样例"); - private Integer type; + private Integer value; private Integer sort; private String name; private String desc; - DataScopeTypeEnum(Integer type,Integer sort,String name,String desc) { - this.type = type; + DataScopeTypeEnum(Integer value,Integer sort,String name,String desc) { + this.value = value; this.sort = sort; this.name = name; this.desc = desc; } - public Integer getType() { - return type; + @Override + public Integer getValue() { + return value; } public Integer getSort() { return sort; } + @Override public String getDesc() { return desc; } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeViewTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeViewTypeEnum.java index da93f96c..75ddf0c9 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeViewTypeEnum.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeViewTypeEnum.java @@ -1,6 +1,8 @@ package net.lab1024.smartadmin.module.system.datascope.constant; +import net.lab1024.smartadmin.common.domain.BaseEnum; + import java.util.Arrays; import java.util.Optional; @@ -14,7 +16,7 @@ import java.util.Optional; * @date 2019/4/28 0028 下午 15:37 * @since JDK1.8 */ -public enum DataScopeViewTypeEnum { +public enum DataScopeViewTypeEnum implements BaseEnum { ME(0,0,"本人"), @@ -24,32 +26,29 @@ public enum DataScopeViewTypeEnum { ALL(3,15,"全部"); - private Integer type; + private Integer value; private Integer level; - private String name; + private String desc; - DataScopeViewTypeEnum(Integer type,Integer level, String name) { - this.type = type; + DataScopeViewTypeEnum(Integer value,Integer level, String desc) { + this.value = value; this.level = level; - this.name = name; + this.desc = desc; } - public Integer getType() { - return type; + @Override + public Integer getValue() { + return value; } public Integer getLevel() { return level; } - public String getName() { - return name; + @Override + public String getDesc() { + return desc; } - public static DataScopeViewTypeEnum valueOf(Integer type) { - DataScopeViewTypeEnum[] values = DataScopeViewTypeEnum.values(); - Optional first = Arrays.stream(values).filter(e -> e.getType().equals(type)).findFirst(); - return !first.isPresent() ? null : first.get(); - } } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeWhereInTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeWhereInTypeEnum.java index 5dbbdc37..e9037373 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeWhereInTypeEnum.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeWhereInTypeEnum.java @@ -1,5 +1,7 @@ package net.lab1024.smartadmin.module.system.datascope.constant; +import net.lab1024.smartadmin.common.domain.BaseEnum; + /** * [ ] * @@ -10,25 +12,28 @@ package net.lab1024.smartadmin.module.system.datascope.constant; * @date 2019/5/8 0008 下午 16:00 * @since JDK1.8 */ -public enum DataScopeWhereInTypeEnum { +public enum DataScopeWhereInTypeEnum implements BaseEnum { EMPLOYEE(0,"以员工IN"), - DEPARTMENT(1,"以部门IN"); + DEPARTMENT(1,"以部门IN"), - private Integer type; + CUSTOM_STRATEGY(2,"自定义策略"); + + private Integer value; private String desc; - DataScopeWhereInTypeEnum(Integer type, String desc) { - this.type = type; + DataScopeWhereInTypeEnum(Integer value, String desc) { + this.value = value; this.desc = desc; } - public Integer getType() { - return type; + @Override + public Integer getValue() { + return value; } - + @Override public String getDesc() { return desc; } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java index 3e79309a..422933de 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java @@ -1,6 +1,8 @@ package net.lab1024.smartadmin.module.system.datascope.domain.dto; import lombok.Data; +import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeTypeEnum; +import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeWhereInTypeEnum; /** * [ ] @@ -15,11 +17,24 @@ import lombok.Data; @Data public class DataScopeSqlConfigDTO { - private Integer dataScopeType; + /** + * 数据范围类型 + * {@link DataScopeTypeEnum} + */ + private DataScopeTypeEnum dataScopeType; + + /** + * join sql 具体实现类 + */ + private Class joinSqlImplClazz; private String joinSql; private Integer whereIndex; - private Integer dataScopeWhereInType; + /** + * whereIn类型 + * {@link DataScopeWhereInTypeEnum} + */ + private DataScopeWhereInTypeEnum dataScopeWhereInType; } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeService.java index 8a231dd7..46b80bd4 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeService.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeService.java @@ -58,7 +58,7 @@ public class DataScopeService { DataScopeViewTypeEnum[] enums = DataScopeViewTypeEnum.class.getEnumConstants(); DataScopeViewTypeVO dataScopeViewTypeDTO; for (DataScopeViewTypeEnum viewTypeEnum : enums) { - dataScopeViewTypeDTO = DataScopeViewTypeVO.builder().viewType(viewTypeEnum.getType()).viewTypeLevel(viewTypeEnum.getLevel()).viewTypeName(viewTypeEnum.getName()).build(); + dataScopeViewTypeDTO = DataScopeViewTypeVO.builder().viewType(viewTypeEnum.getValue()).viewTypeLevel(viewTypeEnum.getLevel()).viewTypeName(viewTypeEnum.getDesc()).build(); viewTypeList.add(dataScopeViewTypeDTO); } Comparator comparator = (h1, h2) -> h1.getViewTypeLevel().compareTo(h2.getViewTypeLevel()); @@ -72,7 +72,7 @@ public class DataScopeService { DataScopeDTO dataScopeDTO; for (DataScopeTypeEnum typeEnum : enums) { dataScopeDTO = - DataScopeDTO.builder().dataScopeType(typeEnum.getType()).dataScopeTypeDesc(typeEnum.getDesc()).dataScopeTypeName(typeEnum.getName()).dataScopeTypeSort(typeEnum.getSort()).build(); + DataScopeDTO.builder().dataScopeType(typeEnum.getValue()).dataScopeTypeDesc(typeEnum.getDesc()).dataScopeTypeName(typeEnum.getName()).dataScopeTypeSort(typeEnum.getSort()).build(); dataScopeTypeList.add(dataScopeDTO); } Comparator comparator = (h1, h2) -> h1.getDataScopeTypeSort().compareTo(h2.getDataScopeTypeSort()); diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeSqlConfigService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeSqlConfigService.java index b6285481..30381384 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeSqlConfigService.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeSqlConfigService.java @@ -1,9 +1,14 @@ package net.lab1024.smartadmin.module.system.datascope.service; +import lombok.extern.slf4j.Slf4j; import net.lab1024.smartadmin.common.anno.DataScope; +import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeTypeEnum; +import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeViewTypeEnum; import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeWhereInTypeEnum; import net.lab1024.smartadmin.module.system.datascope.domain.dto.DataScopeSqlConfigDTO; +import net.lab1024.smartadmin.module.system.datascope.strategy.DataScopePowerStrategy; import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; +import net.lab1024.smartadmin.third.SmartApplicationContext; import net.lab1024.smartadmin.util.SmartRequestTokenUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -32,6 +37,7 @@ import java.util.concurrent.ConcurrentHashMap; * @date 2019/4/29 0029 上午 10:12 * @since JDK1.8 */ +@Slf4j @Service public class DataScopeSqlConfigService { @@ -67,10 +73,10 @@ public class DataScopeSqlConfigService { DataScope dataScopeAnnotation = method.getAnnotation(DataScope.class); if (dataScopeAnnotation != null) { DataScopeSqlConfigDTO configDTO = new DataScopeSqlConfigDTO(); - configDTO.setDataScopeType(dataScopeAnnotation.dataScopeType().getType()); + configDTO.setDataScopeType(dataScopeAnnotation.dataScopeType()); configDTO.setJoinSql(dataScopeAnnotation.joinSql()); configDTO.setWhereIndex(dataScopeAnnotation.whereIndex()); - configDTO.setDataScopeWhereInType(dataScopeAnnotation.whereInType().getType()); + configDTO.setDataScopeWhereInType(dataScopeAnnotation.whereInType()); dataScopeMethodMap.put(method.getDeclaringClass().getSimpleName() + "." + method.getName(), configDTO); } } @@ -95,12 +101,26 @@ public class DataScopeSqlConfigService { * @return */ public String getJoinSql(DataScopeSqlConfigDTO sqlConfigDTO) { - Integer dataScopeType = sqlConfigDTO.getDataScopeType(); + DataScopeTypeEnum dataScopeTypeEnum = sqlConfigDTO.getDataScopeType(); String joinSql = sqlConfigDTO.getJoinSql(); RequestTokenBO requestToken = SmartRequestTokenUtil.getThreadLocalUser(); Long employeeId = requestToken.getRequestUserId(); - if (DataScopeWhereInTypeEnum.EMPLOYEE.getType().equals(sqlConfigDTO.getDataScopeWhereInType())) { - List canViewEmployeeIds = dataScopeViewService.getCanViewEmployeeId(dataScopeType, employeeId); + if (DataScopeWhereInTypeEnum.CUSTOM_STRATEGY == sqlConfigDTO.getDataScopeWhereInType()) { + Class strategyClass = sqlConfigDTO.getJoinSqlImplClazz(); + if(strategyClass == null){ + log.warn("data scope custom strategy class is null"); + return ""; + } + DataScopePowerStrategy powerStrategy = (DataScopePowerStrategy)SmartApplicationContext.getBean(sqlConfigDTO.getJoinSqlImplClazz()); + if (powerStrategy == null) { + log.warn("data scope custom strategy class:{} ,bean is null",sqlConfigDTO.getJoinSqlImplClazz()); + return ""; + } + DataScopeViewTypeEnum viewTypeEnum = dataScopeViewService.getEmployeeDataScopeViewType(dataScopeTypeEnum, employeeId); + return powerStrategy.getCondition(viewTypeEnum,sqlConfigDTO); + } + if (DataScopeWhereInTypeEnum.EMPLOYEE == sqlConfigDTO.getDataScopeWhereInType()) { + List canViewEmployeeIds = dataScopeViewService.getCanViewEmployeeId(dataScopeTypeEnum, employeeId); if (CollectionUtils.isEmpty(canViewEmployeeIds)) { return ""; } @@ -108,8 +128,8 @@ public class DataScopeSqlConfigService { String sql = joinSql.replaceAll(EMPLOYEE_PARAM, employeeIds); return sql; } - if (DataScopeWhereInTypeEnum.DEPARTMENT.getType().equals(sqlConfigDTO.getDataScopeWhereInType())) { - List canViewDepartmentIds = dataScopeViewService.getCanViewDepartmentId(dataScopeType, employeeId); + if (DataScopeWhereInTypeEnum.DEPARTMENT == sqlConfigDTO.getDataScopeWhereInType()) { + List canViewDepartmentIds = dataScopeViewService.getCanViewDepartmentId(dataScopeTypeEnum, employeeId); if (CollectionUtils.isEmpty(canViewDepartmentIds)) { return ""; } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeViewService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeViewService.java index 28a4cd65..11ec5bc7 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeViewService.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeViewService.java @@ -1,6 +1,8 @@ package net.lab1024.smartadmin.module.system.datascope.service; +import com.google.common.collect.Lists; import net.lab1024.smartadmin.module.system.datascope.DataScopeRoleDao; +import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeTypeEnum; import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeViewTypeEnum; import net.lab1024.smartadmin.module.system.datascope.domain.entity.DataScopeRoleEntity; import net.lab1024.smartadmin.module.system.department.DepartmentTreeService; @@ -10,7 +12,7 @@ import net.lab1024.smartadmin.module.system.employee.domain.entity.EmployeeEntit import net.lab1024.smartadmin.module.system.employee.domain.vo.EmployeeVO; import net.lab1024.smartadmin.module.system.privilege.service.PrivilegeEmployeeService; import net.lab1024.smartadmin.module.system.role.roleemployee.RoleEmployeeDao; -import com.google.common.collect.Lists; +import net.lab1024.smartadmin.util.SmartBaseEnumUtil; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -51,33 +53,40 @@ public class DataScopeViewService { /** * 获取某人可以查看的所有人员信息 * - * @param dataScopeType + * @param dataScopeTypeEnum * @param employeeId * @return */ - public List getCanViewEmployeeId(Integer dataScopeType, Long employeeId) { - Integer viewType = this.getEmployeeDataScopeViewType(dataScopeType, employeeId); - if (DataScopeViewTypeEnum.ME.getType().equals(viewType)) { + public List getCanViewEmployeeId(DataScopeTypeEnum dataScopeTypeEnum, Long employeeId) { + DataScopeViewTypeEnum viewType = this.getEmployeeDataScopeViewType(dataScopeTypeEnum, employeeId); + if (DataScopeViewTypeEnum.ME == viewType) { return this.getMeEmployeeIdList(employeeId); } - if (DataScopeViewTypeEnum.DEPARTMENT.getType().equals(viewType)) { + if (DataScopeViewTypeEnum.DEPARTMENT == viewType) { return this.getDepartmentEmployeeIdList(employeeId); } - if (DataScopeViewTypeEnum.DEPARTMENT_AND_SUB.getType().equals(viewType)) { + if (DataScopeViewTypeEnum.DEPARTMENT_AND_SUB == viewType) { return this.getDepartmentAndSubEmployeeIdList(employeeId); } return Lists.newArrayList(); } - public List getCanViewDepartmentId(Integer dataScopeType, Long employeeId) { - Integer viewType = this.getEmployeeDataScopeViewType(dataScopeType, employeeId); - if (DataScopeViewTypeEnum.ME.getType().equals(viewType)) { + /** + * 获取某人可以查看的所有部门信息 + * + * @param dataScopeTypeEnum + * @param employeeId + * @return + */ + public List getCanViewDepartmentId(DataScopeTypeEnum dataScopeTypeEnum, Long employeeId) { + DataScopeViewTypeEnum viewType = this.getEmployeeDataScopeViewType(dataScopeTypeEnum, employeeId); + if (DataScopeViewTypeEnum.ME == viewType) { return this.getMeDepartmentIdList(employeeId); } - if (DataScopeViewTypeEnum.DEPARTMENT.getType().equals(viewType)) { + if (DataScopeViewTypeEnum.DEPARTMENT == viewType) { return this.getMeDepartmentIdList(employeeId); } - if (DataScopeViewTypeEnum.DEPARTMENT_AND_SUB.getType().equals(viewType)) { + if (DataScopeViewTypeEnum.DEPARTMENT_AND_SUB == viewType) { return this.getDepartmentAndSubIdList(employeeId); } return Lists.newArrayList(); @@ -101,28 +110,28 @@ public class DataScopeViewService { * @param employeeId * @return */ - private Integer getEmployeeDataScopeViewType(Integer dataScopeType, Long employeeId) { + public DataScopeViewTypeEnum getEmployeeDataScopeViewType(DataScopeTypeEnum dataScopeTypeEnum, Long employeeId) { if (employeeId == null) { - return DataScopeViewTypeEnum.ME.getType(); + return DataScopeViewTypeEnum.ME; } if (privilegeEmployeeService.isSuperman(employeeId)) { - return DataScopeViewTypeEnum.ALL.getType(); + return DataScopeViewTypeEnum.ALL; } List roleIdList = roleEmployeeDao.selectRoleIdByEmployeeId(employeeId); //未设置角色 默认本人 if (CollectionUtils.isEmpty(roleIdList)) { - return DataScopeViewTypeEnum.ME.getType(); + return DataScopeViewTypeEnum.ME; } //未设置角色数据范围 默认本人 List dataScopeRoleList = dataScopeRoleDao.listByRoleIdList(roleIdList); if (CollectionUtils.isEmpty(dataScopeRoleList)) { - return DataScopeViewTypeEnum.ME.getType(); + return DataScopeViewTypeEnum.ME; } - Map> listMap = dataScopeRoleList.stream().collect(Collectors.groupingBy(DataScopeRoleEntity :: getDataScopeType)); - List viewLevelList = listMap.get(dataScopeType); - DataScopeRoleEntity maxLevel = viewLevelList.stream().max(Comparator.comparing(e -> DataScopeViewTypeEnum.valueOf(e.getViewType()).getLevel())).get(); - return maxLevel.getViewType(); + Map> listMap = dataScopeRoleList.stream().collect(Collectors.groupingBy(DataScopeRoleEntity::getDataScopeType)); + List viewLevelList = listMap.get(dataScopeTypeEnum.getValue()); + DataScopeRoleEntity maxLevel = viewLevelList.stream().max(Comparator.comparing(e -> SmartBaseEnumUtil.getEnumByValue(e.getViewType(), DataScopeViewTypeEnum.class).getLevel())).get(); + return SmartBaseEnumUtil.getEnumByValue(maxLevel.getViewType(), DataScopeViewTypeEnum.class); } /** @@ -134,6 +143,7 @@ public class DataScopeViewService { private List getMeEmployeeIdList(Long employeeId) { return Lists.newArrayList(employeeId); } + /** * 获取本部门相关 可查看员工id * diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/strategy/DataScopePowerStrategy.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/strategy/DataScopePowerStrategy.java new file mode 100644 index 00000000..d12cbf15 --- /dev/null +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/strategy/DataScopePowerStrategy.java @@ -0,0 +1,24 @@ +package net.lab1024.smartadmin.module.system.datascope.strategy; +import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeViewTypeEnum; +import net.lab1024.smartadmin.module.system.datascope.domain.dto.DataScopeSqlConfigDTO; + +/** + * [ 数据范围策略 ,使用DataScopeWhereInTypeEnum.CUSTOM_STRATEGY类型,DataScope注解的joinSql属性无用] + * + * @author yandanyang + * @version 1.0 + * @company 1024lab.net + * @copyright (c) 2018 1024lab.netInc. All rights reserved. + * @date 2020/11/28 0008 下午 16:00 + * @since JDK1.8 + */ +public abstract class DataScopePowerStrategy { + + /** + * 获取joinsql 字符串 + * @param viewTypeEnum 查看的类型 + * @param sqlConfigDTO + * @return + */ + public abstract String getCondition(DataScopeViewTypeEnum viewTypeEnum, DataScopeSqlConfigDTO sqlConfigDTO); +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeLoginFormDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeLoginFormDTO.java index e72d1611..0bf1f1a3 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeLoginFormDTO.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeLoginFormDTO.java @@ -22,11 +22,9 @@ public class EmployeeLoginFormDTO { @ApiModelProperty(example = "123456") private String loginPwd; - @NotNull(message = "验证码id不能为空") @ApiModelProperty(value = "验证码uuid") private String codeUuid; - @NotNull(message = "验证码不能为空") @ApiModelProperty(value = "验证码") private String code; diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginService.java index 55e6f67c..070a9ff4 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginService.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginService.java @@ -83,15 +83,15 @@ public class LoginService { * @return 登录用户基本信息 */ public ResponseDTO login(@Valid EmployeeLoginFormDTO loginForm, HttpServletRequest request) { - String redisVerificationCode = redisValueOperations.get(loginForm.getCodeUuid()); - //增加删除已使用的验证码方式 频繁登录 - redisValueOperations.getOperations().delete(loginForm.getCodeUuid()); - if (StringUtils.isEmpty(redisVerificationCode)) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.VERIFICATION_CODE_INVALID); - } - if (!redisVerificationCode.equalsIgnoreCase(loginForm.getCode())) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.VERIFICATION_CODE_INVALID); - } +// String redisVerificationCode = redisValueOperations.get(loginForm.getCodeUuid()); +// //增加删除已使用的验证码方式 频繁登录 +// redisValueOperations.getOperations().delete(loginForm.getCodeUuid()); +// if (StringUtils.isEmpty(redisVerificationCode)) { +// return ResponseDTO.wrap(EmployeeResponseCodeConst.VERIFICATION_CODE_INVALID); +// } +// if (!redisVerificationCode.equalsIgnoreCase(loginForm.getCode())) { +// return ResponseDTO.wrap(EmployeeResponseCodeConst.VERIFICATION_CODE_INVALID); +// } String loginPwd = SmartDigestUtil.encryptPassword(CommonConst.Password.SALT_FORMAT, loginForm.getLoginPwd()); EmployeeDTO employeeDTO = employeeDao.login(loginForm.getLoginName(), loginPwd); if (null == employeeDTO) { diff --git a/smart-admin-web/src/views/login/components/login-form.vue b/smart-admin-web/src/views/login/components/login-form.vue index d5cac85a..84a19a2e 100644 --- a/smart-admin-web/src/views/login/components/login-form.vue +++ b/smart-admin-web/src/views/login/components/login-form.vue @@ -7,10 +7,10 @@ - + 记住密码 @@ -47,14 +47,15 @@ export default { default: () => { return [{ required: true, message: '密码不能为空', trigger: 'blur' }]; } - }, - // 验证码规则 - codedRules: { - type: Array, - default: () => { - return [{ required: true, message: '验证码不能为空', trigger: 'blur' }]; - } } + // , + // // 验证码规则 + // codedRules: { + // type: Array, + // default: () => { + // return [{ required: true, message: '验证码不能为空', trigger: 'blur' }]; + // } + // } }, data() { return { @@ -79,7 +80,7 @@ export default { } }, mounted() { - this.verificationCode(); + // this.verificationCode(); }, methods: { // 获取验证码 @@ -125,7 +126,7 @@ export default { //TODO zhuoda sentry console.error(e); this.btnLoading = false; - this.verificationCode(); + //this.verificationCode(); } } } diff --git a/smart-admin-web/src/views/support/task/task-list.vue b/smart-admin-web/src/views/support/task/task-list.vue index 9175a359..d73e96be 100644 --- a/smart-admin-web/src/views/support/task/task-list.vue +++ b/smart-admin-web/src/views/support/task/task-list.vue @@ -365,6 +365,7 @@ export default { } catch (e) { //TODO zhuoda sentry console.error(e); + } finally { this.loading = false; } }, @@ -400,33 +401,52 @@ export default { }, // 删除任务 async deleteTask(id) { - let result = await taskApi.deleteTask(id); - this.$Message.success('删除任务成功!'); - this.getTaskList(); + this.$Spin.show(); + try{ + let result = await taskApi.deleteTask(id); + this.$Message.success('删除任务成功!'); + this.getTaskList(); + } catch (error) { + console.error(e); + } finally { + this.$Spin.hide(); + } }, // 操作任务 async controlTask(type, id) { this.$Spin.show(); - switch (type) { - case 'RUN': - await taskApi.updateTaskRun(id); - break; - case 'PAUSE': - await taskApi.updateTaskPause(id); - break; - case 'RESUME': - await taskApi.updateTaskResume(id); - break; + try{ + switch (type) { + case 'RUN': + await taskApi.updateTaskRun(id); + break; + case 'PAUSE': + await taskApi.updateTaskPause(id); + break; + case 'RESUME': + await taskApi.updateTaskResume(id); + break; + } + this.$Message.success('操作成功'); + this.getTaskList(); + } catch (error) { + console.error(e); + } finally { + this.$Spin.hide(); } - this.$Spin.hide(); - this.$Message.success('操作成功'); - this.getTaskList(); }, // 触发更新 handleUpdate() { this.$refs['updateRef'].validate(valid => { if (valid) { - this.updateTask(); + this.$Spin.show(); + try{ + this.updateTask(); + } catch (error) { + console.error(e); + } finally { + this.$Spin.hide(); + } } else { this.$Message.success('验证信息不通过'); } @@ -444,6 +464,7 @@ export default { } catch (e) { //TODO zhuoda sentry console.error(e); + } finally { this.updateLoading = false; } }, @@ -464,6 +485,7 @@ export default { } catch (e) { //TODO zhuoda sentry console.error(e); + } finally { this.saveLoading = false; } }, From fa21afa5ba5023f29a3ec542cd4373f1f7b2d892 Mon Sep 17 00:00:00 2001 From: yandanyang Date: Sat, 28 Nov 2020 23:10:34 +0800 Subject: [PATCH 07/14] =?UTF-8?q?employee=20bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/mapper/system/employee/EmployeeMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml index fe1397a4..cc49b073 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml +++ b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml @@ -146,7 +146,7 @@ t_employee e WHERE e.department_id IN - + #{item} order by e.create_time desc @@ -158,7 +158,7 @@ FROM t_employee e where e.id IN - + #{item} order by e.create_time desc From 49da08dfc128e9eadbdeea58c1a5d3f2a430e843 Mon Sep 17 00:00:00 2001 From: zhuoda Date: Sun, 29 Nov 2020 23:35:57 +0800 Subject: [PATCH 08/14] smart-admin-h5 --- smart-admin-h5/.browserslistrc | 2 + smart-admin-h5/.editorconfig | 15 + smart-admin-h5/.env.development | 4 + smart-admin-h5/.env.local | 3 + smart-admin-h5/.env.pre | 3 + smart-admin-h5/.env.prod | 3 + smart-admin-h5/.env.sit | 3 + smart-admin-h5/.eslintignore | 7 + smart-admin-h5/.eslintrc.js | 232 + smart-admin-h5/.gitignore | 22 + smart-admin-h5/.postcssrc.js | 12 + smart-admin-h5/.prettierrc.js | 31 + smart-admin-h5/.sentryclirc | 7 + smart-admin-h5/README.en.md | 36 + smart-admin-h5/README.md | 39 + smart-admin-h5/babel.config.js | 16 + smart-admin-h5/package.json | 60 + smart-admin-h5/public/favicon.ico | Bin 0 -> 16958 bytes smart-admin-h5/public/index.html | 47 + smart-admin-h5/src/App.vue | 16 + smart-admin-h5/src/api/crm-school.js | 22 + smart-admin-h5/src/api/employee.js | 43 + smart-admin-h5/src/api/file.js | 14 + smart-admin-h5/src/api/login.js | 13 + smart-admin-h5/src/api/system-config.js | 31 + smart-admin-h5/src/assets/css/index.scss | 13 + smart-admin-h5/src/assets/css/mixin.scss | 36 + smart-admin-h5/src/assets/css/variables.scss | 3 + smart-admin-h5/src/assets/logo.png | Bin 0 -> 6849 bytes smart-admin-h5/src/components/TabBar.vue | 54 + .../employee/department-employee-selector.vue | 120 + .../select-picker/SmartEnumSelectPicker.vue | 61 + .../form/select-picker/SmartSelectPicker | 59 + .../src/components/van-bar/BackNavBar.vue | 24 + .../src/components/van-bar/RouterNavBar.vue | 27 + smart-admin-h5/src/config/index.js | 44 + smart-admin-h5/src/constants/area.js | 4047 +++++++++++++++++ smart-admin-h5/src/constants/file.js | 92 + smart-admin-h5/src/constants/index.js | 5 + smart-admin-h5/src/filters/filter.js | 298 ++ smart-admin-h5/src/filters/index.js | 5 + smart-admin-h5/src/lib/cookie.js | 21 + smart-admin-h5/src/lib/http.js | 65 + smart-admin-h5/src/lib/local.js | 8 + smart-admin-h5/src/lib/menu-func.js | 276 ++ smart-admin-h5/src/lib/printPlugs.js | 133 + smart-admin-h5/src/lib/render-dom.js | 10 + smart-admin-h5/src/lib/smart-sentry.js | 18 + smart-admin-h5/src/lib/table-action.js | 84 + smart-admin-h5/src/lib/util.js | 515 +++ smart-admin-h5/src/lib/watermark.js | 49 + smart-admin-h5/src/main.js | 62 + smart-admin-h5/src/plugins/smart-sentry.js | 17 + smart-admin-h5/src/plugins/smart.js | 24 + smart-admin-h5/src/plugins/vant.js | 8 + smart-admin-h5/src/router/index.js | 131 + smart-admin-h5/src/router/other/develop.js | 15 + smart-admin-h5/src/router/other/error.js | 37 + smart-admin-h5/src/router/other/index.js | 25 + smart-admin-h5/src/router/other/school.js | 41 + smart-admin-h5/src/router/other/user.js | 15 + smart-admin-h5/src/router/router-const.js | 23 + smart-admin-h5/src/router/routers.js | 24 + smart-admin-h5/src/router/tabbar/index.js | 49 + smart-admin-h5/src/store/index.js | 21 + smart-admin-h5/src/store/module/user.js | 41 + smart-admin-h5/src/themes/index.less | 6 + smart-admin-h5/src/views/bpm/index.vue | 97 + smart-admin-h5/src/views/business/index.vue | 66 + smart-admin-h5/src/views/develop/config.vue | 46 + smart-admin-h5/src/views/error/404.vue | 23 + smart-admin-h5/src/views/home/index.vue | 68 + smart-admin-h5/src/views/login/login.vue | 80 + smart-admin-h5/src/views/main/main-mixin.js | 25 + smart-admin-h5/src/views/main/other-main.vue | 31 + smart-admin-h5/src/views/main/tabbar-main.vue | 96 + .../src/views/mine/change-password.vue | 96 + smart-admin-h5/src/views/mine/index.vue | 73 + smart-admin-h5/vue.config.js | 192 + smart-admin-web/src/main.js | 2 +- 80 files changed, 8181 insertions(+), 1 deletion(-) create mode 100644 smart-admin-h5/.browserslistrc create mode 100644 smart-admin-h5/.editorconfig create mode 100644 smart-admin-h5/.env.development create mode 100644 smart-admin-h5/.env.local create mode 100644 smart-admin-h5/.env.pre create mode 100644 smart-admin-h5/.env.prod create mode 100644 smart-admin-h5/.env.sit create mode 100644 smart-admin-h5/.eslintignore create mode 100644 smart-admin-h5/.eslintrc.js create mode 100644 smart-admin-h5/.gitignore create mode 100644 smart-admin-h5/.postcssrc.js create mode 100644 smart-admin-h5/.prettierrc.js create mode 100644 smart-admin-h5/.sentryclirc create mode 100644 smart-admin-h5/README.en.md create mode 100644 smart-admin-h5/README.md create mode 100644 smart-admin-h5/babel.config.js create mode 100644 smart-admin-h5/package.json create mode 100644 smart-admin-h5/public/favicon.ico create mode 100644 smart-admin-h5/public/index.html create mode 100644 smart-admin-h5/src/App.vue create mode 100644 smart-admin-h5/src/api/crm-school.js create mode 100644 smart-admin-h5/src/api/employee.js create mode 100644 smart-admin-h5/src/api/file.js create mode 100644 smart-admin-h5/src/api/login.js create mode 100644 smart-admin-h5/src/api/system-config.js create mode 100644 smart-admin-h5/src/assets/css/index.scss create mode 100644 smart-admin-h5/src/assets/css/mixin.scss create mode 100644 smart-admin-h5/src/assets/css/variables.scss create mode 100644 smart-admin-h5/src/assets/logo.png create mode 100644 smart-admin-h5/src/components/TabBar.vue create mode 100644 smart-admin-h5/src/components/employee/department-employee-selector.vue create mode 100644 smart-admin-h5/src/components/form/select-picker/SmartEnumSelectPicker.vue create mode 100644 smart-admin-h5/src/components/form/select-picker/SmartSelectPicker create mode 100644 smart-admin-h5/src/components/van-bar/BackNavBar.vue create mode 100644 smart-admin-h5/src/components/van-bar/RouterNavBar.vue create mode 100644 smart-admin-h5/src/config/index.js create mode 100644 smart-admin-h5/src/constants/area.js create mode 100644 smart-admin-h5/src/constants/file.js create mode 100644 smart-admin-h5/src/constants/index.js create mode 100644 smart-admin-h5/src/filters/filter.js create mode 100644 smart-admin-h5/src/filters/index.js create mode 100644 smart-admin-h5/src/lib/cookie.js create mode 100644 smart-admin-h5/src/lib/http.js create mode 100644 smart-admin-h5/src/lib/local.js create mode 100644 smart-admin-h5/src/lib/menu-func.js create mode 100644 smart-admin-h5/src/lib/printPlugs.js create mode 100644 smart-admin-h5/src/lib/render-dom.js create mode 100644 smart-admin-h5/src/lib/smart-sentry.js create mode 100644 smart-admin-h5/src/lib/table-action.js create mode 100644 smart-admin-h5/src/lib/util.js create mode 100644 smart-admin-h5/src/lib/watermark.js create mode 100644 smart-admin-h5/src/main.js create mode 100644 smart-admin-h5/src/plugins/smart-sentry.js create mode 100644 smart-admin-h5/src/plugins/smart.js create mode 100644 smart-admin-h5/src/plugins/vant.js create mode 100644 smart-admin-h5/src/router/index.js create mode 100644 smart-admin-h5/src/router/other/develop.js create mode 100644 smart-admin-h5/src/router/other/error.js create mode 100644 smart-admin-h5/src/router/other/index.js create mode 100644 smart-admin-h5/src/router/other/school.js create mode 100644 smart-admin-h5/src/router/other/user.js create mode 100644 smart-admin-h5/src/router/router-const.js create mode 100644 smart-admin-h5/src/router/routers.js create mode 100644 smart-admin-h5/src/router/tabbar/index.js create mode 100644 smart-admin-h5/src/store/index.js create mode 100644 smart-admin-h5/src/store/module/user.js create mode 100644 smart-admin-h5/src/themes/index.less create mode 100644 smart-admin-h5/src/views/bpm/index.vue create mode 100644 smart-admin-h5/src/views/business/index.vue create mode 100644 smart-admin-h5/src/views/develop/config.vue create mode 100644 smart-admin-h5/src/views/error/404.vue create mode 100644 smart-admin-h5/src/views/home/index.vue create mode 100644 smart-admin-h5/src/views/login/login.vue create mode 100644 smart-admin-h5/src/views/main/main-mixin.js create mode 100644 smart-admin-h5/src/views/main/other-main.vue create mode 100644 smart-admin-h5/src/views/main/tabbar-main.vue create mode 100644 smart-admin-h5/src/views/mine/change-password.vue create mode 100644 smart-admin-h5/src/views/mine/index.vue create mode 100644 smart-admin-h5/vue.config.js diff --git a/smart-admin-h5/.browserslistrc b/smart-admin-h5/.browserslistrc new file mode 100644 index 00000000..d6471a38 --- /dev/null +++ b/smart-admin-h5/.browserslistrc @@ -0,0 +1,2 @@ +> 1% +last 2 versions diff --git a/smart-admin-h5/.editorconfig b/smart-admin-h5/.editorconfig new file mode 100644 index 00000000..4881e66d --- /dev/null +++ b/smart-admin-h5/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +# 字符 +charset = utf-8 +# 空格 +indent_style = space +# 2个空格缩进 +indent_size = 2 +# 换行符 +end_of_line = lf +# 文件的最后插入一个空行 +insert_final_newline = true +# 删除行尾的空格 +trim_trailing_whitespace = true diff --git a/smart-admin-h5/.env.development b/smart-admin-h5/.env.development new file mode 100644 index 00000000..38de0149 --- /dev/null +++ b/smart-admin-h5/.env.development @@ -0,0 +1,4 @@ +NODE_ENV = development +VUE_APP_ENV = dev +VUE_APP_URL = http://127.0.0.1:10086/smart-admin-api/ + diff --git a/smart-admin-h5/.env.local b/smart-admin-h5/.env.local new file mode 100644 index 00000000..e1aa3c0e --- /dev/null +++ b/smart-admin-h5/.env.local @@ -0,0 +1,3 @@ +NODE_ENV = development +VUE_APP_ENV = local +VUE_APP_URL=http://127.0.0.1:10086/smart-admin-api/ diff --git a/smart-admin-h5/.env.pre b/smart-admin-h5/.env.pre new file mode 100644 index 00000000..b22ff885 --- /dev/null +++ b/smart-admin-h5/.env.pre @@ -0,0 +1,3 @@ +NODE_ENV = production +VUE_APP_ENV = pre +VUE_APP_URL = http://smartadmin.1024lab.net/api/ diff --git a/smart-admin-h5/.env.prod b/smart-admin-h5/.env.prod new file mode 100644 index 00000000..1f390bca --- /dev/null +++ b/smart-admin-h5/.env.prod @@ -0,0 +1,3 @@ +NODE_ENV = production +VUE_APP_ENV = prod +VUE_APP_URL = http://smartadmin.1024lab.net/api/ diff --git a/smart-admin-h5/.env.sit b/smart-admin-h5/.env.sit new file mode 100644 index 00000000..f0b82667 --- /dev/null +++ b/smart-admin-h5/.env.sit @@ -0,0 +1,3 @@ +NODE_ENV = production +VUE_APP_ENV = sit +VUE_APP_URL=http://127.0.0.1:10086/smart-admin-api/ diff --git a/smart-admin-h5/.eslintignore b/smart-admin-h5/.eslintignore new file mode 100644 index 00000000..7c435adc --- /dev/null +++ b/smart-admin-h5/.eslintignore @@ -0,0 +1,7 @@ + +# 忽略项目中某些文件的提交代码规范 + +build/*.js +src/assets +public +dist diff --git a/smart-admin-h5/.eslintrc.js b/smart-admin-h5/.eslintrc.js new file mode 100644 index 00000000..27350869 --- /dev/null +++ b/smart-admin-h5/.eslintrc.js @@ -0,0 +1,232 @@ +module.exports = { + root: true, + env: { + node: true + }, + extends: [ + 'plugin:vue/essential', + 'eslint:recommended' + ], + parserOptions: { + parser: 'babel-eslint' + }, + rules: { + // 具体请看 https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/max-attributes-per-line.md + 'vue/max-attributes-per-line': [ + 2, + { + singleline: 10, + multiline: { + max: 1, + allowFirstLine: false + } + } + ], + // 在单行元素的内容前后需要换行符 + 'vue/singleline-html-element-content-newline': 'off', + // 在多行元素的内容之前和之后需要换行符 + 'vue/multiline-html-element-content-newline': 'off', + // JS/JSX中的组件名应该 大写驼峰 命名法 + 'vue/name-property-casing': ['error', 'PascalCase'], + // 给v-for设置键值,与key结合使用,可以高效的更新虚拟DOM + "vue/require-v-for-key": 1, + 'vue/no-v-html': 'off', + // 在对象中强制使用getter/setter + 'accessor-pairs': 2, + // 在箭头函数之前/之后需要空格 + 'arrow-spacing': [ + 2, + { + before: true, + after: true + } + ], + // 在打开块之后和关闭块之前,禁止或强制执行块内部的空格 + 'block-spacing': [2, 'always'], + // 需要大括号样式 + 'brace-style': [ + 2, + '1tbs', + { + allowSingleLine: true + } + ], + // 需要驼峰命名 + camelcase: [ + 0, + { + properties: 'always' + } + ], + // 要求或禁止使用尾随逗号;最后一个属性是不需要逗号 + 'comma-dangle': [2, 'never'], + // 强制逗号旁边的间距: 左右一个空格 + 'comma-spacing': [ + 2, + { + before: false, + after: true + } + ], + // 逗号风格 + 'comma-style': [2, 'last'], + // 构建方法中使用super方法 + 'constructor-super': 2, + curly: [2, 'multi-line'], + // 在dot之前和之后强制换行 + 'dot-location': [2, 'property'], + // 在文件末尾要求或禁止换行 + 'eol-last': 2, + // 是否使用全等 + eqeqeq: ['error', 'always', { null: 'ignore' }], + // 在生成器函数中强制执行*周围的间距 + 'generator-star-spacing': [2, { + 'before': true, + 'after': true + }], + // 强制执行回调错误处理 + 'handle-callback-err': [1, '^(err|error)$'], + // 强制执行一致的缩进 + 'indent': [2, 2, { + 'SwitchCase': 1 + }], + // 强制在JSX文件中一致使用单引号 + 'jsx-quotes': [2, 'prefer-single'], + // 在对象属性中强制键和值之间的一致间距 + 'key-spacing': [2, { + 'beforeColon': false, + 'afterColon': true + }], + // 关键字前后强制执行一致的间距 + 'keyword-spacing': [2, { + 'before': true, + 'after': true + }], + // 要求构造函数名称以大写字母开头 + 'new-cap': [2, { + 'newIsCap': true, + 'capIsNew': false + }], + 'new-parens': 2, // 调用不带参数的函数时需要括号 + 'no-array-constructor': 2, // 禁止阵列构建器 + 'no-caller': 2, // 禁止使用来电者/被叫者 + 'no-console': 'off', // 不允许使用控制台 + 'no-class-assign': 2, // 禁止修改类声明的变量 + 'no-cond-assign': 2, // 在条件语句中禁止赋值运算符 + 'no-const-assign': 2, // 禁止修改使用const声明的变量 + 'no-control-regex': 0, // 禁止正则表达式中的控制字符 + 'no-delete-var': 2, // 禁止删除变量 + 'no-dupe-args': 2, // 在函数定义中禁止重复参数 + 'no-dupe-class-members': 2, // 禁止在类成员中重复名称 + 'no-dupe-keys': 2, // 禁止对象重复声明属性 + 'no-duplicate-case': 2, // 规则禁止重复案例标签 + 'no-empty-character-class': 2, // 禁止在正则表达式中使用空字符类 + 'no-empty-pattern': 2, // 不允许空的解构模式 + 'no-eval': 2, // 禁止使用eval() + 'no-ex-assign': 2, // 禁止在catch子句中重新分配异常 + 'no-extend-native': 2, // 禁止扩展原生对象 + 'no-extra-bind': 2, // 禁止不必要的功能绑定 + 'no-extra-boolean-cast': 2, // 禁止不必要的布尔类型转换 + 'no-extra-parens': [2, 'functions'], // 禁止不必要的括号 + 'no-fallthrough': 2, // 禁止太多陈述描述 + 'no-floating-decimal': 2, // 禁止浮动小数 + 'no-func-assign': 2, // 禁止重新分配函数声明 + 'no-implied-eval': 2, + 'no-inner-declarations': [2, 'functions'], // 禁止嵌套块中的变量或函数声明 + 'no-invalid-regexp': 2, // 禁止在RegExp中使用无效的正则表达式字符串 + 'no-irregular-whitespace': 2, // 不允许不规则的空白 + 'no-iterator': 2, // 禁止迭代器 + 'no-label-var': 2, // 禁止变量名称的标签 + 'no-labels': [2, { + 'allowLoop': false, + 'allowSwitch': false + }], + 'no-lone-blocks': 2, // 禁止不必要的嵌套块 + 'no-mixed-spaces-and-tabs': 2, // 禁止使用混合空格和制表符进行缩进 + 'no-multi-spaces': 2, // 禁止多个空格 + 'no-multi-str': 2, // 禁止多行字符串 + 'no-multiple-empty-lines': [2, { // 禁止多个空行 + 'max': 1 + }], + 'no-native-reassign': 2, + 'no-negated-in-lhs': 2, + 'no-new-object': 2, + 'no-new-require': 2, + 'no-new-symbol': 2, + 'no-new-wrappers': 2, + 'no-obj-calls': 2, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-path-concat': 2, + 'no-proto': 2, + 'no-redeclare': 2, + 'no-regex-spaces': 2, + 'no-return-assign': [2, 'except-parens'], + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 2, + 'no-shadow-restricted-names': 2, + 'no-spaced-func': 2, + 'no-sparse-arrays': 2, + 'no-this-before-super': 2, + 'no-throw-literal': 2, + 'no-trailing-spaces': 2, + 'no-undef': 0, + 'no-undef-init': 2, + 'no-unexpected-multiline': 2, + 'no-unmodified-loop-condition': 2, // 禁止未修改的循环条件 + 'no-unneeded-ternary': [2, { // 当存在更简单的替代方案时,不允许三元运算符 + 'defaultAssignment': false + }], + 'no-unreachable': 2, // 返回,抛出,继续和中断语句后禁止无法访问的代码 + 'no-unsafe-finally': 2, // 禁止finally块中的控制流语句 + 'no-unused-vars': [2, { // 禁止使用未声明的变量 + 'vars': 'all', + 'args': 'none' + }], + 'no-useless-call': 2, // 禁止不必要的call()和apply()方法 + 'no-useless-computed-key': 2, // 禁止在对象上使用不必要的计算属性键 + 'no-useless-constructor': 2, // 禁止不必要的构造方法 + 'no-useless-escape': 0, // 禁止不必要的转义用法 + 'no-whitespace-before-property': 2, // 在属性之前禁止空格 + 'no-with': 2, + 'one-var': [2, { + 'initialized': 'never' + }], + 'operator-linebreak': [2, 'after', { // 为维护强制执行一致的换行方式 + 'overrides': { + '?': 'before', + ':': 'before' + } + }], + 'padded-blocks': [2, 'never'], // 在块内要求或禁止填充 + 'quotes': [2, 'single', { + 'avoidEscape': true, + 'allowTemplateLiterals': true + }], + semi: ["error", "always"], + 'space-before-blocks': [2, 'always'], // 不要存在多余的块空间 + 'space-before-function-paren': [2, 'never'], + 'space-in-parens': [2, 'never'], + 'space-infix-ops': 2, + 'space-unary-ops': [2, { + 'words': true, + 'nonwords': false + }], + 'spaced-comment': [2, 'always', { + 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] + }], + 'template-curly-spacing': [2, 'never'], + 'use-isnan': 2, + 'valid-typeof': 2, + 'wrap-iife': [2, 'any'], + 'yield-star-spacing': [2, 'both'], + 'yoda': [2, 'never'], + 'prefer-const': 1, + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, + 'object-curly-spacing': [2, 'always', { + objectsInObjects: false + }], + 'array-bracket-spacing': [2, 'never'] + } +} diff --git a/smart-admin-h5/.gitignore b/smart-admin-h5/.gitignore new file mode 100644 index 00000000..24d694ca --- /dev/null +++ b/smart-admin-h5/.gitignore @@ -0,0 +1,22 @@ +node_modules +/dist + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.DS_Store +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +package-lock.json +yarn.lock + +build/env.js diff --git a/smart-admin-h5/.postcssrc.js b/smart-admin-h5/.postcssrc.js new file mode 100644 index 00000000..6483e7ba --- /dev/null +++ b/smart-admin-h5/.postcssrc.js @@ -0,0 +1,12 @@ +// 详情请看 https://github.com/michael-ciniawsky/postcss-load-config +module.exports = { + plugins: { + autoprefixer: { + overrideBrowserslist: ['Android 4.1', 'iOS 7.1', 'Chrome > 31', 'ff > 31', 'ie >= 8'] + }, + 'postcss-pxtorem': { + rootValue: 37.5, + propList: ['*'], + } + } +} diff --git a/smart-admin-h5/.prettierrc.js b/smart-admin-h5/.prettierrc.js new file mode 100644 index 00000000..c19422ec --- /dev/null +++ b/smart-admin-h5/.prettierrc.js @@ -0,0 +1,31 @@ +module.exports = { + // 缩进字节数 + tabWidth: 2, + // 使用单引号代替双引号 + singleQuote: true, + // 在对象或数组最后一个元素后面是否加逗号(在ES5中加尾逗号) + trailingComma: 'none', + // 句尾添加分号 + semi: true, + // 默认值。因为使用了一些折行敏感型的渲染器(如GitHub comment)而按照markdown文本样式进行折行 + proseWrap: 'always', + // (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号 + arrowParens: 'avoid', + // 在对象,数组括号与文字之间加空格 "{ foo: bar }" + bracketSpacing: true, + // 在jsx中把'>' 是否单独放一行 + jsxBracketSameLine: false, + // 缩进不使用tab,使用空格 + useTabs: false, + // 不让prettier使用eslint的代码格式进行校验 + eslintIntegration: true, + overrides: [ + { + files: '.prettierrc', + options: { + parser: 'json' + } + } + ], + endOfLine: 'auto' +} diff --git a/smart-admin-h5/.sentryclirc b/smart-admin-h5/.sentryclirc new file mode 100644 index 00000000..b676dbde --- /dev/null +++ b/smart-admin-h5/.sentryclirc @@ -0,0 +1,7 @@ +[defaults] +url = https://sentry.1024lab.net/ +org = 1024lab +project = smart-admin-h5 + +[auth] +token = 8bab45b9152d44b19d4e0a762a93dd34a1318ee8317f46a0a007c48da0e9888e diff --git a/smart-admin-h5/README.en.md b/smart-admin-h5/README.en.md new file mode 100644 index 00000000..5f55837d --- /dev/null +++ b/smart-admin-h5/README.en.md @@ -0,0 +1,36 @@ +# ren-min-yi-xue-manage-h5 + +#### Description +{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/smart-admin-h5/README.md b/smart-admin-h5/README.md new file mode 100644 index 00000000..cdc9d586 --- /dev/null +++ b/smart-admin-h5/README.md @@ -0,0 +1,39 @@ +# ren-min-yi-xue-manage-h5 + +#### 介绍 +{**以下是 Gitee 平台说明,您可以替换此简介** +Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 +无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} + +#### 软件架构 +软件架构说明 + + +#### 安装教程 + +1. xxxx +2. xxxx +3. xxxx + +#### 使用说明 + +1. xxxx +2. xxxx +3. xxxx + +#### 参与贡献 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + + +#### 特技 + +1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md +2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) +3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 +4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 +5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) +6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/smart-admin-h5/babel.config.js b/smart-admin-h5/babel.config.js new file mode 100644 index 00000000..58b18fe8 --- /dev/null +++ b/smart-admin-h5/babel.config.js @@ -0,0 +1,16 @@ + +module.exports = { + presets: [['@vue/cli-plugin-babel/preset', {useBuiltIns: 'usage', corejs: 3}]], + plugins:[ + // vant-ui 按需引入,详情:https://github.com/ElementUI/babel-plugin-component + // [ + // 'import', + // { + // libraryName: 'vant', + // libraryDirectory: 'es', + // style: true + // }, + // 'vant' + // ] + ] +}; diff --git a/smart-admin-h5/package.json b/smart-admin-h5/package.json new file mode 100644 index 00000000..9efbc94d --- /dev/null +++ b/smart-admin-h5/package.json @@ -0,0 +1,60 @@ +{ + "name": "smart-admin-h5", + "version": "1.0.0", + "description": "基于Smart-H5的SmartAdmin的H5端", + "author": "zhuoluodada@qq.com", + "private": true, + "scripts": { + "local": "vue-cli-service serve --open --mode local", + "dev": "vue-cli-service serve --open", + "build": "vue-cli-service build", + "build:sit": "vue-cli-service build --mode sit", + "build:pre": "vue-cli-service build --mode pre", + "build:prod": "vue-cli-service build --mode prod", + "stage": "vue-cli-service build --mode staging", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "@sentry/browser": "^5.13.2", + "@sentry/integrations": "^5.13.2", + "axios": "^0.19.2", + "core-js": "^3.6.5", + "fastclick": "^1.0.6", + "js-cookie": "^2.2.1", + "lib-flexible": "^0.3.2", + "lodash": "^4.17.20", + "moment": "^2.29.0", + "nprogress": "^0.2.0", + "regenerator-runtime": "^0.13.5", + "vant": "^2.10.2", + "vue": "^2.6.11", + "vue-enum": "^1.0.5", + "vue-loading-overlay": "^3.4.2", + "vue-router": "^3.2.0", + "vuex": "^3.4.0" + }, + "devDependencies": { + "@sentry/webpack-plugin": "^1.11.1", + "@vue/cli-plugin-babel": "~4.5.0", + "@vue/cli-plugin-eslint": "~4.5.0", + "@vue/cli-plugin-router": "~4.5.0", + "@vue/cli-plugin-vuex": "~4.5.0", + "@vue/cli-service": "~4.5.0", + "babel-eslint": "^10.1.0", + "babel-plugin-import": "^1.13.0", + "babel-plugin-transform-remove-console": "^6.9.4", + "compression-webpack-plugin": "^3.1.0", + "eslint": "^6.7.2", + "eslint-plugin-vue": "^6.2.2", + "less": "^3.11.2", + "less-loader": "^6.1.0", + "node-sass": "^4.14.1", + "postcss-pxtorem": "^5.1.1", + "sass-loader": "^8.0.2", + "script-ext-html-webpack-plugin": "^2.1.4", + "uglifyjs-webpack-plugin": "^2.2.0", + "vconsole": "^3.3.4", + "vue-template-compiler": "^2.6.11", + "webpack-bundle-analyzer": "^3.8.0" + } +} diff --git a/smart-admin-h5/public/favicon.ico b/smart-admin-h5/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5e59671b6e407a6a4ca45ce51e31ffa086ff3cad GIT binary patch literal 16958 zcmeI4Yitx%6oBtia8Wen{Zvb}C|HTnA3kD8D=})+D4M81}3b@15D*_6JF)pR>aCO-45(BLM4$R8SE_rLi(FJFKARX#%W-pP?R_;2a!= zH82%Q!FR2ZO9V#3GWZGV;5;0M1F#C-f;%A+=GL3)N7o5%gAp)#$HqS6PR=cDZNJ;<*ZQ^O)kAV4=3>ybJ3rHQ(}@pmT0)$zmROz8kA&S|viIubp7}bY z)&tU*Ke={?DIjY;BX5`PZkrF$Gfwl1%cjL&&4L@e`L*oV&$-!=`N2-^&x@e1Pb{fN z?i+`o#fQ)KDvosrWBpoB%p2hlwB+pB{z8v6Nyh5>i`bsk%pBy#og4c6gN-rQQ?rNa z+TC$aVK)Ifm|`{Su0YO#3t;r^(jQ^F41(t1dSWKQor~U#6X{J0l5 z+p2omVrl(pd_QgRtLu>UBF{k?F$}uz(OKt|SRLU{(DB`JKDIh$nq<6R{l6RXaE>e< z^oJ#mJEq?Ln6aI0@zKj#nGSNEgXTf*G1fUH&OA$ATd+&3TkkX8ul|26IX#2jlTd4k zr)$@8FXIO3m=<{-`V*FT-g#NhxNcrQ#CYD4Pr^G^?=#-7es5g8pSq`D+YOdjV(Qwp zl z8Z7l!Vr%R*V*8!{F+MS0u=x}{e&rofzRg?!Q|)fue#YG4=Z|A0V0<1yUz_-(WY6}^ zz1==j+gqzsv0t_MCaz!o^3E^U7}I>q+Puc*SL^XF*Q6TA$jzf`WWNHg)V3BW@0JHa za*}6;y4v|ezW!lTp9`jQ&zv;XyZN z;)wo1u+=a6Q}6~9g4GW()|d<&TfZ-cBsxh4#QY}SLGqk6{6w@vx} z@gTeii^2B3m$KVd)zje}P2L%5;5~jp)GlLQ25p}v z$wi*wvw3cG&(n5nMnT5fw#9Mlv1?8JI)7OgQxE}dXO!er z3e#W>9ENis&&qNy*as^?zB3LC@)dL(A8k>;v5uhFm%{O|{_y0 zg)E3+Fc2BXKp~SDAR`SJh!i(SoJW%+fO8HZ(N06gB#o3LEfS8aj + + + + + + + + + <% if (process.env.NODE_ENV === 'production') { %> + <% for(var css of htmlWebpackPlugin.options.cdn.css) { %> + + + <% } %> <% for(var js of htmlWebpackPlugin.options.cdn.js) { %> + + + <% } %> <% } %> + + + + <% if (process.env.NODE_ENV === 'development') { %> + + <% } %> + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + +
+ + + diff --git a/smart-admin-h5/src/App.vue b/smart-admin-h5/src/App.vue new file mode 100644 index 00000000..3f407985 --- /dev/null +++ b/smart-admin-h5/src/App.vue @@ -0,0 +1,16 @@ + + + + diff --git a/smart-admin-h5/src/api/crm-school.js b/smart-admin-h5/src/api/crm-school.js new file mode 100644 index 00000000..6a16ccbf --- /dev/null +++ b/smart-admin-h5/src/api/crm-school.js @@ -0,0 +1,22 @@ +import { getAxios, postAxios } from '@/lib/http'; + +export const crmSchoolApi = { + + // 分校列表 - 分校 by yandanyang + querySchoolList: (data) => { + return postAxios('/admin/crm/school/list', data); + }, + // 分校跟进详列表 - 分校 by yandanyang + querySchoolTrackList: data => { + return postAxios('/admin/crm/school/track/list', data); + }, + + // 分校跟进 - 分校 by yandanyang + addSchoolTrack: data => { + return postAxios('/admin/crm/school/track/add', data); + }, + // 分校跟进 - 分校 by yandanyang + getSchoolTrackDetail: schoolTrackId => { + return getAxios(`/admin/crm/school/track/detail/${schoolTrackId}`); + } +}; diff --git a/smart-admin-h5/src/api/employee.js b/smart-admin-h5/src/api/employee.js new file mode 100644 index 00000000..7f1d8001 --- /dev/null +++ b/smart-admin-h5/src/api/employee.js @@ -0,0 +1,43 @@ +import { postAxios, getAxios } from '@/lib/http'; +export const employeeApi = { + // 员工管理查询 + getEmployeeList: (data) => { + return postAxios('/employee/query', data); + }, + // 添加员工 + addEmployee: (data) => { + return postAxios('/employee/add', data); + }, + // 更新员工信息 + updateEmployee: (data) => { + return postAxios('/employee/update', data); + }, + // 禁用启用单个员工 + updateStatus: (employeeId, status) => { + return getAxios('/employee/updateStatus/' + employeeId + '/' + status); + }, + // 批量禁用 + updateStatusBatch: (data) => { + return postAxios('/employee/batchUpdateStatus', data); + }, + // 单个员工角色授权 + updateRoles: (data) => { + return postAxios('/employee/updateRoles', data); + }, + // 修改密码 + updatePwd: (data) => { + return postAxios('/employee/updatePwd', data); + }, + // 重置密码 + resetPassword: (employeeId) => { + return getAxios('/employee/resetPasswd/' + employeeId); + }, + // 通过部门id获取当前部门的人员&没有部门的人 + getListEmployeeByDeptId: (departmentId) => { + return getAxios('/employee/listEmployeeByDeptId/' + departmentId); + }, + // 删除员工 + deleteEmployee: (employeeId) => { + return postAxios('/employee/delete/' + employeeId); + } +}; diff --git a/smart-admin-h5/src/api/file.js b/smart-admin-h5/src/api/file.js new file mode 100644 index 00000000..2bc1a85a --- /dev/null +++ b/smart-admin-h5/src/api/file.js @@ -0,0 +1,14 @@ +import { postAxios, getAxios } from '@/lib/http'; +import config from '@/config'; +import Cookies from '@/lib/cookie'; +const baseUrl = config.baseUrl.apiUrl; + +export const fileApi = { + // 文件上传 + fileUpload: (folder, data) => { + const url = baseUrl + '/common/file/upload/' + folder + '?x-access-token=' + Cookies.getToken(); + return postAxios(url, data, { + headers: { 'Content-Type': 'multipart/form-data' } + }); + } +}; diff --git a/smart-admin-h5/src/api/login.js b/smart-admin-h5/src/api/login.js new file mode 100644 index 00000000..c387ec71 --- /dev/null +++ b/smart-admin-h5/src/api/login.js @@ -0,0 +1,13 @@ +import { getAxios, postAxios } from '@/lib/http'; + +export const loginApi = { + getVerificationCode: () => { + return getAxios('/verificationCode'); + }, + login: (data) => { + return postAxios('/login', data); + }, + logout: (token) => { + return getAxios(`/logout?x-access-token=${token}`); + } +}; diff --git a/smart-admin-h5/src/api/system-config.js b/smart-admin-h5/src/api/system-config.js new file mode 100644 index 00000000..a9384d21 --- /dev/null +++ b/smart-admin-h5/src/api/system-config.js @@ -0,0 +1,31 @@ +// 系统参数API +import { + postAxios, + getAxios +} from '@/lib/http'; +export const systemConfigApi = { + // 查询系统参数列表 + getSystemConfigList: (data) => { + return postAxios('/admin/systemConfig/getListPage', data); + }, + // 添加系统参数 + addSystemConfig: (data) => { + return postAxios('/admin/systemConfig/add', data); + }, + // 更新单条系统参数 + updateSystemConfig: (data) => { + return postAxios('/admin/systemConfig/update', data); + }, + // 通过key获取对应的信息 + getConfigListByKey: (key) => { + return getAxios(`/admin/systemConfig/selectByKey?configKey=${key}`); + }, + // 根据分组查询所有系统配置 + getListByGroup: (group) => { + return getAxios(`/admin/systemConfig/getListByGroup?group=${group}`); + }, + // 获取系统版本信息 + getCodeVersion: () => { + return getAxios('/admin/codeVersion'); + } +}; diff --git a/smart-admin-h5/src/assets/css/index.scss b/smart-admin-h5/src/assets/css/index.scss new file mode 100644 index 00000000..b10fc342 --- /dev/null +++ b/smart-admin-h5/src/assets/css/index.scss @@ -0,0 +1,13 @@ +@import './variables.scss'; +@import './mixin.scss'; + +html, +body .app { + color: #333333; + font-family: Arial, Helvetica, 'STHeiti STXihei', 'Microsoft YaHei', Tohoma, sans-serif; + background-color: $background-color; +} + +.app-container { + padding-bottom: 50px; +} diff --git a/smart-admin-h5/src/assets/css/mixin.scss b/smart-admin-h5/src/assets/css/mixin.scss new file mode 100644 index 00000000..327b6d4d --- /dev/null +++ b/smart-admin-h5/src/assets/css/mixin.scss @@ -0,0 +1,36 @@ +// mixin +// 清除浮动 +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +// 多行隐藏 +@mixin textoverflow($clamp:1) { + display: block; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: $clamp; + /*! autoprefixer: ignore next */ + -webkit-box-orient: vertical; +} + +//flex box +@mixin flexbox($jc:space-between, $ai:center, $fd:row, $fw:nowrap) { + display: flex; + display: -webkit-flex; + flex: 1; + justify-content: $jc; + -webkit-justify-content: $jc; + align-items: $ai; + -webkit-align-items: $ai; + flex-direction: $fd; + -webkit-flex-direction: $fd; + flex-wrap: $fw; + -webkit-flex-wrap: $fw; +} diff --git a/smart-admin-h5/src/assets/css/variables.scss b/smart-admin-h5/src/assets/css/variables.scss new file mode 100644 index 00000000..2f85e3ea --- /dev/null +++ b/smart-admin-h5/src/assets/css/variables.scss @@ -0,0 +1,3 @@ + +// variables +$background-color: #f8f8f8; diff --git a/smart-admin-h5/src/assets/logo.png b/smart-admin-h5/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 zcmaKRcUV(fvo}bjDT-7nLI_nlK}sT_69H+`qzVWDA|yaU?}j417wLi^B1KB1SLsC& zL0ag7$U(XW5YR7p&Ux?sP$d4lvMt8C^+TcQu4F zQqv!UF!I+kw)c0jhd6+g6oCr9P?7)?!qX1ui*iL{p}sKCAGuJ{{W)0z1pLF|=>h}& zt(2Lr0Z`2ig8<5i%Zk}cO5Fm=LByqGWaS`oqChZdEFmc`0hSb#gg|Aap^{+WKOYcj zHjINK)KDG%&s?Mt4CL(T=?;~U@bU2x_mLKN!#GJuK_CzbNw5SMEJorG!}_5;?R>@1 zSl)jns3WlU7^J%=(hUtfmuUCU&C3%8B5C^f5>W2Cy8jW3#{Od{lF1}|?c61##3dzA zsPlFG;l_FzBK}8>|H_Ru_H#!_7$UH4UKo3lKOA}g1(R&|e@}GINYVzX?q=_WLZCgh z)L|eJMce`D0EIwgRaNETDsr+?vQknSGAi=7H00r`QnI%oQnFxm`G2umXso9l+8*&Q z7WqF|$p49js$mdzo^BXpH#gURy=UO;=IMrYc5?@+sR4y_?d*~0^YP7d+y0{}0)zBM zIKVM(DBvICK#~7N0a+PY6)7;u=dutmNqK3AlsrUU9U`d;msiucB_|8|2kY=(7XA;G zwDA8AR)VCA#JOkxm#6oHNS^YVuOU;8p$N)2{`;oF|rQ?B~K$%rHDxXs+_G zF5|-uqHZvSzq}L;5Kcy_P+x0${33}Ofb6+TX&=y;;PkEOpz%+_bCw_{<&~ zeLV|!bP%l1qxywfVr9Z9JI+++EO^x>ZuCK);=$VIG1`kxK8F2M8AdC$iOe3cj1fo(ce4l-9 z7*zKy3={MixvUk=enQE;ED~7tv%qh&3lR<0m??@w{ILF|e#QOyPkFYK!&Up7xWNtL zOW%1QMC<3o;G9_S1;NkPB6bqbCOjeztEc6TsBM<(q9((JKiH{01+Ud=uw9B@{;(JJ z-DxI2*{pMq`q1RQc;V8@gYAY44Z!%#W~M9pRxI(R?SJ7sy7em=Z5DbuDlr@*q|25V)($-f}9c#?D%dU^RS<(wz?{P zFFHtCab*!rl(~j@0(Nadvwg8q|4!}L^>d?0al6}Rrv9$0M#^&@zjbfJy_n!%mVHK4 z6pLRIQ^Uq~dnyy$`ay51Us6WaP%&O;@49m&{G3z7xV3dLtt1VTOMYl3UW~Rm{Eq4m zF?Zl_v;?7EFx1_+#WFUXxcK78IV)FO>42@cm@}2I%pVbZqQ}3;p;sDIm&knay03a^ zn$5}Q$G!@fTwD$e(x-~aWP0h+4NRz$KlnO_H2c< z(XX#lPuW_%H#Q+c&(nRyX1-IadKR-%$4FYC0fsCmL9ky3 zKpxyjd^JFR+vg2!=HWf}2Z?@Td`0EG`kU?{8zKrvtsm)|7>pPk9nu@2^z96aU2<#` z2QhvH5w&V;wER?mopu+nqu*n8p~(%QkwSs&*0eJwa zMXR05`OSFpfyRb!Y_+H@O%Y z0=K^y6B8Gcbl?SA)qMP3Z+=C(?8zL@=74R=EVnE?vY!1BQy2@q*RUgRx4yJ$k}MnL zs!?74QciNb-LcG*&o<9=DSL>1n}ZNd)w1z3-0Pd^4ED1{qd=9|!!N?xnXjM!EuylY z5=!H>&hSofh8V?Jofyd!h`xDI1fYAuV(sZwwN~{$a}MX^=+0TH*SFp$vyxmUv7C*W zv^3Gl0+eTFgBi3FVD;$nhcp)ka*4gSskYIqQ&+M}xP9yLAkWzBI^I%zR^l1e?bW_6 zIn{mo{dD=)9@V?s^fa55jh78rP*Ze<3`tRCN4*mpO$@7a^*2B*7N_|A(Ve2VB|)_o z$=#_=aBkhe(ifX}MLT()@5?OV+~7cXC3r!%{QJxriXo9I%*3q4KT4Xxzyd{ z9;_%=W%q!Vw$Z7F3lUnY+1HZ*lO;4;VR2+i4+D(m#01OYq|L_fbnT;KN<^dkkCwtd zF7n+O7KvAw8c`JUh6LmeIrk4`F3o|AagKSMK3))_5Cv~y2Bb2!Ibg9BO7Vkz?pAYX zoI=B}+$R22&IL`NCYUYjrdhwjnMx_v=-Qcx-jmtN>!Zqf|n1^SWrHy zK|MwJ?Z#^>)rfT5YSY{qjZ&`Fjd;^vv&gF-Yj6$9-Dy$<6zeP4s+78gS2|t%Z309b z0^fp~ue_}i`U9j!<|qF92_3oB09NqgAoehQ`)<)dSfKoJl_A6Ec#*Mx9Cpd-p#$Ez z={AM*r-bQs6*z$!*VA4|QE7bf@-4vb?Q+pPKLkY2{yKsw{&udv_2v8{Dbd zm~8VAv!G~s)`O3|Q6vFUV%8%+?ZSVUa(;fhPNg#vab@J*9XE4#D%)$UU-T5`fwjz! z6&gA^`OGu6aUk{l*h9eB?opVdrHK>Q@U>&JQ_2pR%}TyOXGq_6s56_`U(WoOaAb+K zXQr#6H}>a-GYs9^bGP2Y&hSP5gEtW+GVC4=wy0wQk=~%CSXj=GH6q z-T#s!BV`xZVxm{~jr_ezYRpqqIcXC=Oq`b{lu`Rt(IYr4B91hhVC?yg{ol4WUr3v9 zOAk2LG>CIECZ-WIs0$N}F#eoIUEtZudc7DPYIjzGqDLWk_A4#(LgacooD z2K4IWs@N`Bddm-{%oy}!k0^i6Yh)uJ1S*90>|bm3TOZxcV|ywHUb(+CeX-o1|LTZM zwU>dY3R&U)T(}5#Neh?-CWT~@{6Ke@sI)uSuzoah8COy)w)B)aslJmp`WUcjdia-0 zl2Y}&L~XfA`uYQboAJ1;J{XLhYjH){cObH3FDva+^8ioOQy%Z=xyjGLmWMrzfFoH; zEi3AG`_v+%)&lDJE;iJWJDI@-X9K5O)LD~j*PBe(wu+|%ar~C+LK1+-+lK=t# z+Xc+J7qp~5q=B~rD!x78)?1+KUIbYr^5rcl&tB-cTtj+e%{gpZZ4G~6r15+d|J(ky zjg@@UzMW0k9@S#W(1H{u;Nq(7llJbq;;4t$awM;l&(2s+$l!Ay9^Ge|34CVhr7|BG z?dAR83smef^frq9V(OH+a+ki#q&-7TkWfFM=5bsGbU(8mC;>QTCWL5ydz9s6k@?+V zcjiH`VI=59P-(-DWXZ~5DH>B^_H~;4$)KUhnmGo*G!Tq8^LjfUDO)lASN*=#AY_yS zqW9UX(VOCO&p@kHdUUgsBO0KhXxn1sprK5h8}+>IhX(nSXZKwlNsjk^M|RAaqmCZB zHBolOHYBas@&{PT=R+?d8pZu zUHfyucQ`(umXSW7o?HQ3H21M`ZJal+%*)SH1B1j6rxTlG3hx1IGJN^M7{$j(9V;MZ zRKybgVuxKo#XVM+?*yTy{W+XHaU5Jbt-UG33x{u(N-2wmw;zzPH&4DE103HV@ER86 z|FZEmQb|&1s5#`$4!Cm}&`^{(4V}OP$bk`}v6q6rm;P!H)W|2i^e{7lTk2W@jo_9q z*aw|U7#+g59Fv(5qI`#O-qPj#@_P>PC#I(GSp3DLv7x-dmYK=C7lPF8a)bxb=@)B1 zUZ`EqpXV2dR}B&r`uM}N(TS99ZT0UB%IN|0H%DcVO#T%L_chrgn#m6%x4KE*IMfjX zJ%4veCEqbXZ`H`F_+fELMC@wuy_ch%t*+Z+1I}wN#C+dRrf2X{1C8=yZ_%Pt6wL_~ zZ2NN-hXOT4P4n$QFO7yYHS-4wF1Xfr-meG9Pn;uK51?hfel`d38k{W)F*|gJLT2#T z<~>spMu4(mul-8Q3*pf=N4DcI)zzjqAgbE2eOT7~&f1W3VsdD44Ffe;3mJp-V@8UC z)|qnPc12o~$X-+U@L_lWqv-RtvB~%hLF($%Ew5w>^NR82qC_0FB z)=hP1-OEx?lLi#jnLzH}a;Nvr@JDO-zQWd}#k^an$Kwml;MrD&)sC5b`s0ZkVyPkb zt}-jOq^%_9>YZe7Y}PhW{a)c39G`kg(P4@kxjcYfgB4XOOcmezdUI7j-!gs7oAo2o zx(Ph{G+YZ`a%~kzK!HTAA5NXE-7vOFRr5oqY$rH>WI6SFvWmahFav!CfRMM3%8J&c z*p+%|-fNS_@QrFr(at!JY9jCg9F-%5{nb5Bo~z@Y9m&SHYV`49GAJjA5h~h4(G!Se zZmK{Bo7ivCfvl}@A-ptkFGcWXAzj3xfl{evi-OG(TaCn1FAHxRc{}B|x+Ua1D=I6M z!C^ZIvK6aS_c&(=OQDZfm>O`Nxsw{ta&yiYPA~@e#c%N>>#rq)k6Aru-qD4(D^v)y z*>Rs;YUbD1S8^D(ps6Jbj0K3wJw>L4m)0e(6Pee3Y?gy9i0^bZO?$*sv+xKV?WBlh zAp*;v6w!a8;A7sLB*g-^<$Z4L7|5jXxxP1}hQZ<55f9<^KJ>^mKlWSGaLcO0=$jem zWyZkRwe~u{{tU63DlCaS9$Y4CP4f?+wwa(&1ou)b>72ydrFvm`Rj-0`kBJgK@nd(*Eh!(NC{F-@=FnF&Y!q`7){YsLLHf0_B6aHc# z>WIuHTyJwIH{BJ4)2RtEauC7Yq7Cytc|S)4^*t8Va3HR zg=~sN^tp9re@w=GTx$;zOWMjcg-7X3Wk^N$n;&Kf1RgVG2}2L-(0o)54C509C&77i zrjSi{X*WV=%C17((N^6R4Ya*4#6s_L99RtQ>m(%#nQ#wrRC8Y%yxkH;d!MdY+Tw@r zjpSnK`;C-U{ATcgaxoEpP0Gf+tx);buOMlK=01D|J+ROu37qc*rD(w`#O=3*O*w9?biwNoq3WN1`&Wp8TvKj3C z3HR9ssH7a&Vr<6waJrU zdLg!ieYz%U^bmpn%;(V%%ugMk92&?_XX1K@mwnVSE6!&%P%Wdi7_h`CpScvspMx?N zQUR>oadnG17#hNc$pkTp+9lW+MBKHRZ~74XWUryd)4yd zj98$%XmIL4(9OnoeO5Fnyn&fpQ9b0h4e6EHHw*l68j;>(ya`g^S&y2{O8U>1*>4zR zq*WSI_2o$CHQ?x0!wl9bpx|Cm2+kFMR)oMud1%n2=qn5nE&t@Fgr#=Zv2?}wtEz^T z9rrj=?IH*qI5{G@Rn&}^Z{+TW}mQeb9=8b<_a`&Cm#n%n~ zU47MvCBsdXFB1+adOO)03+nczfWa#vwk#r{o{dF)QWya9v2nv43Zp3%Ps}($lA02*_g25t;|T{A5snSY?3A zrRQ~(Ygh_ebltHo1VCbJb*eOAr;4cnlXLvI>*$-#AVsGg6B1r7@;g^L zFlJ_th0vxO7;-opU@WAFe;<}?!2q?RBrFK5U{*ai@NLKZ^};Ul}beukveh?TQn;$%9=R+DX07m82gP$=}Uo_%&ngV`}Hyv8g{u z3SWzTGV|cwQuFIs7ZDOqO_fGf8Q`8MwL}eUp>q?4eqCmOTcwQuXtQckPy|4F1on8l zP*h>d+cH#XQf|+6c|S{7SF(Lg>bR~l(0uY?O{OEVlaxa5@e%T&xju=o1`=OD#qc16 zSvyH*my(dcp6~VqR;o(#@m44Lug@~_qw+HA=mS#Z^4reBy8iV?H~I;{LQWk3aKK8$bLRyt$g?- +
+ + + {{ item.title }} + + +
+ + + + + diff --git a/smart-admin-h5/src/components/employee/department-employee-selector.vue b/smart-admin-h5/src/components/employee/department-employee-selector.vue new file mode 100644 index 00000000..3affe14f --- /dev/null +++ b/smart-admin-h5/src/components/employee/department-employee-selector.vue @@ -0,0 +1,120 @@ +/** +* @description:department-employee-selector +* @author: zhuoda +*/ + + + + + + diff --git a/smart-admin-h5/src/components/form/select-picker/SmartEnumSelectPicker.vue b/smart-admin-h5/src/components/form/select-picker/SmartEnumSelectPicker.vue new file mode 100644 index 00000000..976211d1 --- /dev/null +++ b/smart-admin-h5/src/components/form/select-picker/SmartEnumSelectPicker.vue @@ -0,0 +1,61 @@ + + + + diff --git a/smart-admin-h5/src/components/form/select-picker/SmartSelectPicker b/smart-admin-h5/src/components/form/select-picker/SmartSelectPicker new file mode 100644 index 00000000..c15bf200 --- /dev/null +++ b/smart-admin-h5/src/components/form/select-picker/SmartSelectPicker @@ -0,0 +1,59 @@ + + + + + diff --git a/smart-admin-h5/src/components/van-bar/BackNavBar.vue b/smart-admin-h5/src/components/van-bar/BackNavBar.vue new file mode 100644 index 00000000..bca0b99e --- /dev/null +++ b/smart-admin-h5/src/components/van-bar/BackNavBar.vue @@ -0,0 +1,24 @@ + + + diff --git a/smart-admin-h5/src/components/van-bar/RouterNavBar.vue b/smart-admin-h5/src/components/van-bar/RouterNavBar.vue new file mode 100644 index 00000000..355a57d6 --- /dev/null +++ b/smart-admin-h5/src/components/van-bar/RouterNavBar.vue @@ -0,0 +1,27 @@ + + + diff --git a/smart-admin-h5/src/config/index.js b/smart-admin-h5/src/config/index.js new file mode 100644 index 00000000..472fcc6e --- /dev/null +++ b/smart-admin-h5/src/config/index.js @@ -0,0 +1,44 @@ +console.log('project api url : ', process.env.VUE_APP_URL); + +const isProductionEnv = ['production'].includes(process.env.NODE_ENV); + +module.exports = { + // 配置显示在浏览器标签的title + title: 'Smart-Admin-H5', + // token在Cookie中存储的天数,默认7天 + cookieExpires: 7, + /** + * @description api请求基础路径 + */ + baseUrl: { + apiUrl: process.env.VUE_APP_URL, + }, + /** + * 打包后静态资源地址;如果是走cdn的话,可以配置如下: + * publicPath: isProd ? 'https://cdn.1024lab.net/static/smart-h5/' : '/' + */ + publicPath: isProductionEnv ? '/smart-admin-h5/' : '/', + + // ==================== cdn 相关 begin ==================== + cdn: { + cdnResource: { + css: [], + js: [ + 'https://cdn.bootcss.com/vue/2.6.11/vue.min.js', + 'https://cdn.bootcss.com/vue-router/3.2.0/vue-router.min.js', + 'https://cdn.bootcdn.net/ajax/libs/vuex/3.5.1/vuex.min.js', + 'https://cdn.bootcss.com/axios/0.19.2/axios.min.js', + 'https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.20/lodash.min.js' + ] + }, + // 指定资源加载cdn + externals: { + vue: 'Vue', + 'vue-router': 'VueRouter', + vuex: 'Vuex', + axios: 'axios', + lodash: '_' + } + } + // ==================== cdn 相关 end ==================== +}; diff --git a/smart-admin-h5/src/constants/area.js b/smart-admin-h5/src/constants/area.js new file mode 100644 index 00000000..26e2ca99 --- /dev/null +++ b/smart-admin-h5/src/constants/area.js @@ -0,0 +1,4047 @@ +export default { + province_list: { + 110000: '北京市', + 120000: '天津市', + 130000: '河北省', + 140000: '山西省', + 150000: '内蒙古自治区', + 210000: '辽宁省', + 220000: '吉林省', + 230000: '黑龙江省', + 310000: '上海市', + 320000: '江苏省', + 330000: '浙江省', + 340000: '安徽省', + 350000: '福建省', + 360000: '江西省', + 370000: '山东省', + 410000: '河南省', + 420000: '湖北省', + 430000: '湖南省', + 440000: '广东省', + 450000: '广西壮族自治区', + 460000: '海南省', + 500000: '重庆市', + 510000: '四川省', + 520000: '贵州省', + 530000: '云南省', + 540000: '西藏自治区', + 610000: '陕西省', + 620000: '甘肃省', + 630000: '青海省', + 640000: '宁夏回族自治区', + 650000: '新疆维吾尔自治区', + 710000: '台湾省', + 810000: '香港特别行政区', + 820000: '澳门特别行政区', + 900000: '海外' + }, + city_list: { + 110100: '北京市', + 120100: '天津市', + 130100: '石家庄市', + 130200: '唐山市', + 130300: '秦皇岛市', + 130400: '邯郸市', + 130500: '邢台市', + 130600: '保定市', + 130700: '张家口市', + 130800: '承德市', + 130900: '沧州市', + 131000: '廊坊市', + 131100: '衡水市', + 140100: '太原市', + 140200: '大同市', + 140300: '阳泉市', + 140400: '长治市', + 140500: '晋城市', + 140600: '朔州市', + 140700: '晋中市', + 140800: '运城市', + 140900: '忻州市', + 141000: '临汾市', + 141100: '吕梁市', + 150100: '呼和浩特市', + 150200: '包头市', + 150300: '乌海市', + 150400: '赤峰市', + 150500: '通辽市', + 150600: '鄂尔多斯市', + 150700: '呼伦贝尔市', + 150800: '巴彦淖尔市', + 150900: '乌兰察布市', + 152200: '兴安盟', + 152500: '锡林郭勒盟', + 152900: '阿拉善盟', + 210100: '沈阳市', + 210200: '大连市', + 210300: '鞍山市', + 210400: '抚顺市', + 210500: '本溪市', + 210600: '丹东市', + 210700: '锦州市', + 210800: '营口市', + 210900: '阜新市', + 211000: '辽阳市', + 211100: '盘锦市', + 211200: '铁岭市', + 211300: '朝阳市', + 211400: '葫芦岛市', + 220100: '长春市', + 220200: '吉林市', + 220300: '四平市', + 220400: '辽源市', + 220500: '通化市', + 220600: '白山市', + 220700: '松原市', + 220800: '白城市', + 222400: '延边朝鲜族自治州', + 230100: '哈尔滨市', + 230200: '齐齐哈尔市', + 230300: '鸡西市', + 230400: '鹤岗市', + 230500: '双鸭山市', + 230600: '大庆市', + 230700: '伊春市', + 230800: '佳木斯市', + 230900: '七台河市', + 231000: '牡丹江市', + 231100: '黑河市', + 231200: '绥化市', + 232700: '大兴安岭地区', + 310100: '上海市', + 320100: '南京市', + 320200: '无锡市', + 320300: '徐州市', + 320400: '常州市', + 320500: '苏州市', + 320600: '南通市', + 320700: '连云港市', + 320800: '淮安市', + 320900: '盐城市', + 321000: '扬州市', + 321100: '镇江市', + 321200: '泰州市', + 321300: '宿迁市', + 330100: '杭州市', + 330200: '宁波市', + 330300: '温州市', + 330400: '嘉兴市', + 330500: '湖州市', + 330600: '绍兴市', + 330700: '金华市', + 330800: '衢州市', + 330900: '舟山市', + 331000: '台州市', + 331100: '丽水市', + 340100: '合肥市', + 340200: '芜湖市', + 340300: '蚌埠市', + 340400: '淮南市', + 340500: '马鞍山市', + 340600: '淮北市', + 340700: '铜陵市', + 340800: '安庆市', + 341000: '黄山市', + 341100: '滁州市', + 341200: '阜阳市', + 341300: '宿州市', + 341500: '六安市', + 341600: '亳州市', + 341700: '池州市', + 341800: '宣城市', + 350100: '福州市', + 350200: '厦门市', + 350300: '莆田市', + 350400: '三明市', + 350500: '泉州市', + 350600: '漳州市', + 350700: '南平市', + 350800: '龙岩市', + 350900: '宁德市', + 360100: '南昌市', + 360200: '景德镇市', + 360300: '萍乡市', + 360400: '九江市', + 360500: '新余市', + 360600: '鹰潭市', + 360700: '赣州市', + 360800: '吉安市', + 360900: '宜春市', + 361000: '抚州市', + 361100: '上饶市', + 370100: '济南市', + 370200: '青岛市', + 370300: '淄博市', + 370400: '枣庄市', + 370500: '东营市', + 370600: '烟台市', + 370700: '潍坊市', + 370800: '济宁市', + 370900: '泰安市', + 371000: '威海市', + 371100: '日照市', + 371300: '临沂市', + 371400: '德州市', + 371500: '聊城市', + 371600: '滨州市', + 371700: '菏泽市', + 410100: '郑州市', + 410200: '开封市', + 410300: '洛阳市', + 410400: '平顶山市', + 410500: '安阳市', + 410600: '鹤壁市', + 410700: '新乡市', + 410800: '焦作市', + 410900: '濮阳市', + 411000: '许昌市', + 411100: '漯河市', + 411200: '三门峡市', + 411300: '南阳市', + 411400: '商丘市', + 411500: '信阳市', + 411600: '周口市', + 411700: '驻马店市', + 419000: '省直辖县', + 420100: '武汉市', + 420200: '黄石市', + 420300: '十堰市', + 420500: '宜昌市', + 420600: '襄阳市', + 420700: '鄂州市', + 420800: '荆门市', + 420900: '孝感市', + 421000: '荆州市', + 421100: '黄冈市', + 421200: '咸宁市', + 421300: '随州市', + 422800: '恩施土家族苗族自治州', + 429000: '省直辖县', + 430100: '长沙市', + 430200: '株洲市', + 430300: '湘潭市', + 430400: '衡阳市', + 430500: '邵阳市', + 430600: '岳阳市', + 430700: '常德市', + 430800: '张家界市', + 430900: '益阳市', + 431000: '郴州市', + 431100: '永州市', + 431200: '怀化市', + 431300: '娄底市', + 433100: '湘西土家族苗族自治州', + 440100: '广州市', + 440200: '韶关市', + 440300: '深圳市', + 440400: '珠海市', + 440500: '汕头市', + 440600: '佛山市', + 440700: '江门市', + 440800: '湛江市', + 440900: '茂名市', + 441200: '肇庆市', + 441300: '惠州市', + 441400: '梅州市', + 441500: '汕尾市', + 441600: '河源市', + 441700: '阳江市', + 441800: '清远市', + 441900: '东莞市', + 442000: '中山市', + 445100: '潮州市', + 445200: '揭阳市', + 445300: '云浮市', + 450100: '南宁市', + 450200: '柳州市', + 450300: '桂林市', + 450400: '梧州市', + 450500: '北海市', + 450600: '防城港市', + 450700: '钦州市', + 450800: '贵港市', + 450900: '玉林市', + 451000: '百色市', + 451100: '贺州市', + 451200: '河池市', + 451300: '来宾市', + 451400: '崇左市', + 460100: '海口市', + 460200: '三亚市', + 460300: '三沙市', + 460400: '儋州市', + 469000: '省直辖县', + 500100: '重庆市', + 500200: '县', + 510100: '成都市', + 510300: '自贡市', + 510400: '攀枝花市', + 510500: '泸州市', + 510600: '德阳市', + 510700: '绵阳市', + 510800: '广元市', + 510900: '遂宁市', + 511000: '内江市', + 511100: '乐山市', + 511300: '南充市', + 511400: '眉山市', + 511500: '宜宾市', + 511600: '广安市', + 511700: '达州市', + 511800: '雅安市', + 511900: '巴中市', + 512000: '资阳市', + 513200: '阿坝藏族羌族自治州', + 513300: '甘孜藏族自治州', + 513400: '凉山彝族自治州', + 520100: '贵阳市', + 520200: '六盘水市', + 520300: '遵义市', + 520400: '安顺市', + 520500: '毕节市', + 520600: '铜仁市', + 522300: '黔西南布依族苗族自治州', + 522600: '黔东南苗族侗族自治州', + 522700: '黔南布依族苗族自治州', + 530100: '昆明市', + 530300: '曲靖市', + 530400: '玉溪市', + 530500: '保山市', + 530600: '昭通市', + 530700: '丽江市', + 530800: '普洱市', + 530900: '临沧市', + 532300: '楚雄彝族自治州', + 532500: '红河哈尼族彝族自治州', + 532600: '文山壮族苗族自治州', + 532800: '西双版纳傣族自治州', + 532900: '大理白族自治州', + 533100: '德宏傣族景颇族自治州', + 533300: '怒江傈僳族自治州', + 533400: '迪庆藏族自治州', + 540100: '拉萨市', + 540200: '日喀则市', + 540300: '昌都市', + 540400: '林芝市', + 540500: '山南市', + 540600: '那曲市', + 542500: '阿里地区', + 610100: '西安市', + 610200: '铜川市', + 610300: '宝鸡市', + 610400: '咸阳市', + 610500: '渭南市', + 610600: '延安市', + 610700: '汉中市', + 610800: '榆林市', + 610900: '安康市', + 611000: '商洛市', + 620100: '兰州市', + 620200: '嘉峪关市', + 620300: '金昌市', + 620400: '白银市', + 620500: '天水市', + 620600: '武威市', + 620700: '张掖市', + 620800: '平凉市', + 620900: '酒泉市', + 621000: '庆阳市', + 621100: '定西市', + 621200: '陇南市', + 622900: '临夏回族自治州', + 623000: '甘南藏族自治州', + 630100: '西宁市', + 630200: '海东市', + 632200: '海北藏族自治州', + 632300: '黄南藏族自治州', + 632500: '海南藏族自治州', + 632600: '果洛藏族自治州', + 632700: '玉树藏族自治州', + 632800: '海西蒙古族藏族自治州', + 640100: '银川市', + 640200: '石嘴山市', + 640300: '吴忠市', + 640400: '固原市', + 640500: '中卫市', + 650100: '乌鲁木齐市', + 650200: '克拉玛依市', + 650400: '吐鲁番市', + 650500: '哈密市', + 652300: '昌吉回族自治州', + 652700: '博尔塔拉蒙古自治州', + 652800: '巴音郭楞蒙古自治州', + 652900: '阿克苏地区', + 653000: '克孜勒苏柯尔克孜自治州', + 653100: '喀什地区', + 653200: '和田地区', + 654000: '伊犁哈萨克自治州', + 654200: '塔城地区', + 654300: '阿勒泰地区', + 659000: '自治区直辖县级行政区划', + 710100: '台北市', + 710200: '高雄市', + 710300: '台南市', + 710400: '台中市', + 710500: '金门县', + 710600: '南投县', + 710700: '基隆市', + 710800: '新竹市', + 710900: '嘉义市', + 711100: '新北市', + 711200: '宜兰县', + 711300: '新竹县', + 711400: '桃园县', + 711500: '苗栗县', + 711700: '彰化县', + 711900: '嘉义县', + 712100: '云林县', + 712400: '屏东县', + 712500: '台东县', + 712600: '花莲县', + 712700: '澎湖县', + 712800: '连江县', + 810100: '香港岛', + 810200: '九龙', + 810300: '新界', + 820100: '澳门半岛', + 820200: '离岛', + 900400: '阿富汗', + 900800: '阿尔巴尼亚', + 901000: '南极洲', + 901200: '阿尔及利亚', + 901600: '美属萨摩亚', + 902000: '安道尔', + 902400: '安哥拉', + 902800: '安提瓜和巴布达', + 903100: '阿塞拜疆', + 903200: '阿根廷', + 903600: '澳大利亚', + 904000: '奥地利', + 904400: '巴哈马', + 904800: '巴林', + 905000: '孟加拉', + 905100: '亚美尼亚', + 905200: '巴巴多斯', + 905600: '比利时', + 906000: '百慕大', + 906400: '不丹', + 906800: '玻利维亚', + 907000: '波黑', + 907200: '博茨瓦纳', + 907400: '布韦岛', + 907600: '巴西', + 908400: '伯利兹', + 908600: '英属印度洋领地', + 909000: '所罗门群岛', + 909200: '英属维尔京群岛', + 909600: '文莱', + 910000: '保加利亚', + 910400: '缅甸', + 910800: '布隆迪', + 911200: '白俄罗斯', + 911600: '柬埔寨', + 912000: '喀麦隆', + 912400: '加拿大', + 913200: '佛得角', + 913600: '开曼群岛', + 914000: '中非', + 914400: '斯里兰卡', + 914800: '乍得', + 915200: '智利', + 916200: '圣诞岛', + 916600: '科科斯群岛', + 917000: '哥伦比亚', + 917400: '科摩罗', + 917500: '马约特', + 917800: '刚果(布)', + 918000: '刚果(金)', + 918400: '库克群岛', + 918800: '哥斯达黎加', + 919100: '克罗地亚', + 919200: '古巴', + 919600: '塞浦路斯', + 920300: '捷克', + 920400: '贝宁', + 920800: '丹麦', + 921200: '多米尼克', + 921400: '多米尼加', + 921800: '厄瓜多尔', + 922200: '萨尔瓦多', + 922600: '赤道几内亚', + 923100: '埃塞俄比亚', + 923200: '厄立特里亚', + 923300: '爱沙尼亚', + 923400: '法罗群岛', + 923800: '马尔维纳斯群岛( 福克兰)', + 923900: '南乔治亚岛和南桑威奇群岛', + 924200: '斐济群岛', + 924600: '芬兰', + 924800: '奥兰群岛', + 925000: '法国', + 925400: '法属圭亚那', + 925800: '法属波利尼西亚', + 926000: '法属南部领地', + 926200: '吉布提', + 926600: '加蓬', + 926800: '格鲁吉亚', + 927000: '冈比亚', + 927500: '巴勒斯坦', + 927600: '德国', + 928800: '加纳', + 929200: '直布罗陀', + 929600: '基里巴斯', + 930000: '希腊', + 930400: '格陵兰', + 930800: '格林纳达', + 931200: '瓜德罗普', + 931600: '关岛', + 932000: '危地马拉', + 932400: '几内亚', + 932800: '圭亚那', + 933200: '海地', + 933400: '赫德岛和麦克唐纳群岛', + 933600: '梵蒂冈', + 934000: '洪都拉斯', + 934800: '匈牙利', + 935200: '冰岛', + 935600: '印度', + 936000: '印尼', + 936400: '伊朗', + 936800: '伊拉克', + 937200: '爱尔兰', + 937600: '以色列', + 938000: '意大利', + 938400: '科特迪瓦', + 938800: '牙买加', + 939200: '日本', + 939800: '哈萨克斯坦', + 940000: '约旦', + 940400: '肯尼亚', + 940800: '朝鲜 北朝鲜', + 941000: '韩国', + 941400: '科威特', + 941700: '吉尔吉斯斯坦', + 941800: '老挝', + 942200: '黎巴嫩', + 942600: '莱索托', + 942800: '拉脱维亚', + 943000: '利比里亚', + 943400: '利比亚', + 943800: '列支敦士登', + 944000: '立陶宛', + 944200: '卢森堡', + 945000: '马达加斯加', + 945400: '马拉维', + 945800: '马来西亚', + 946200: '马尔代夫', + 946600: '马里', + 947000: '马耳他', + 947400: '马提尼克', + 947800: '毛里塔尼亚', + 948000: '毛里求斯', + 948400: '墨西哥', + 949200: '摩纳哥', + 949600: '蒙古国', + 949800: '摩尔多瓦', + 949900: '黑山', + 950000: '蒙塞拉特岛', + 950400: '摩洛哥', + 950800: '莫桑比克', + 951200: '阿曼', + 951600: '纳米比亚', + 952000: '瑙鲁', + 952400: '尼泊尔', + 952800: '荷兰', + 953300: '阿鲁巴', + 953500: '荷兰加勒比区', + 954000: '新喀里多尼亚', + 954800: '瓦努阿图', + 955400: '新西兰', + 955800: '尼加拉瓜', + 956200: '尼日尔', + 956600: '尼日利亚', + 957000: '纽埃', + 957400: '诺福克岛', + 957800: '挪威', + 958000: '北马里亚纳群岛', + 958100: '美国本土外小岛屿', + 958300: '密克罗尼西亚联邦', + 958400: '马绍尔群岛', + 958500: '帕劳', + 958600: '巴基斯坦', + 959100: '巴拿马', + 959800: '巴布亚新几内亚', + 960000: '巴拉圭', + 960400: '秘鲁', + 960800: '菲律宾', + 961200: '皮特凯恩群岛', + 961600: '波兰', + 962000: '葡萄牙', + 962400: '几内亚比绍', + 962600: '东帝汶', + 963000: '波多黎各', + 963400: '卡塔尔', + 963800: '留尼汪', + 964200: '罗马尼亚', + 964300: '俄罗斯', + 964600: '卢旺达', + 965200: '圣巴泰勒米岛', + 965400: '圣赫勒拿', + 965900: '圣基茨和尼维斯', + 966000: '安圭拉', + 966200: '圣卢西亚', + 966300: '法属圣马丁', + 966600: '圣皮埃尔和密克隆', + 967000: '圣文森特和格林纳丁斯', + 967400: '圣马力诺', + 967800: '圣多美和普林西比', + 968200: '沙特阿拉伯', + 968600: '塞内加尔', + 968800: '塞尔维亚', + 969000: '塞舌尔', + 969400: '塞拉利昂', + 970200: '新加坡', + 970300: '斯洛伐克', + 970400: '越南', + 970500: '斯洛文尼亚', + 970600: '索马里', + 971000: '南非', + 971600: '津巴布韦', + 972400: '西班牙', + 972800: '南苏丹', + 972900: '苏丹', + 973200: '西撒哈拉', + 974000: '苏里南', + 974400: '斯瓦尔巴群岛和 扬马延岛', + 974800: '斯威士兰', + 975200: '瑞典', + 975600: '瑞士', + 976000: '叙利亚', + 976200: '塔吉克斯坦', + 976400: '泰国', + 976800: '多哥', + 977200: '托克劳', + 977600: '汤加', + 978000: '特立尼达和多巴哥', + 978400: '阿联酋', + 978800: '突尼斯', + 979200: '土耳其', + 979500: '土库曼斯坦', + 979600: '特克斯和凯科斯群岛', + 979800: '图瓦卢', + 980000: '乌干达', + 980400: '乌克兰', + 980700: '马其顿', + 981800: '埃及', + 982600: '英国', + 983100: '根西岛', + 983200: '泽西岛', + 983300: '马恩岛', + 983400: '坦桑尼亚', + 984000: '美国', + 985000: '美属维尔京群岛', + 985400: '布基纳法索', + 985800: '乌拉圭', + 986000: '乌兹别克斯坦', + 986200: '委内瑞拉', + 987600: '瓦利斯和富图纳', + 988200: '萨摩亚', + 988700: '也门', + 989400: '赞比亚' + }, + county_list: { + 110101: '东城区', + 110102: '西城区', + 110105: '朝阳区', + 110106: '丰台区', + 110107: '石景山区', + 110108: '海淀区', + 110109: '门头沟区', + 110111: '房山区', + 110112: '通州区', + 110113: '顺义区', + 110114: '昌平区', + 110115: '大兴区', + 110116: '怀柔区', + 110117: '平谷区', + 110118: '密云区', + 110119: '延庆区', + 120101: '和平区', + 120102: '河东区', + 120103: '河西区', + 120104: '南开区', + 120105: '河北区', + 120106: '红桥区', + 120110: '东丽区', + 120111: '西青区', + 120112: '津南区', + 120113: '北辰区', + 120114: '武清区', + 120115: '宝坻区', + 120116: '滨海新区', + 120117: '宁河区', + 120118: '静海区', + 120119: '蓟州区', + 130102: '长安区', + 130104: '桥西区', + 130105: '新华区', + 130107: '井陉矿区', + 130108: '裕华区', + 130109: '藁城区', + 130110: '鹿泉区', + 130111: '栾城区', + 130121: '井陉县', + 130123: '正定县', + 130125: '行唐县', + 130126: '灵寿县', + 130127: '高邑县', + 130128: '深泽县', + 130129: '赞皇县', + 130130: '无极县', + 130131: '平山县', + 130132: '元氏县', + 130133: '赵县', + 130181: '辛集市', + 130183: '晋州市', + 130184: '新乐市', + 130202: '路南区', + 130203: '路北区', + 130204: '古冶区', + 130205: '开平区', + 130207: '丰南区', + 130208: '丰润区', + 130209: '曹妃甸区', + 130224: '滦南县', + 130225: '乐亭县', + 130227: '迁西县', + 130229: '玉田县', + 130281: '遵化市', + 130283: '迁安市', + 130284: '滦州市', + 130302: '海港区', + 130303: '山海关区', + 130304: '北戴河区', + 130306: '抚宁区', + 130321: '青龙满族自治县', + 130322: '昌黎县', + 130324: '卢龙县', + 130390: '经济技术开发区', + 130402: '邯山区', + 130403: '丛台区', + 130404: '复兴区', + 130406: '峰峰矿区', + 130407: '肥乡区', + 130408: '永年区', + 130423: '临漳县', + 130424: '成安县', + 130425: '大名县', + 130426: '涉县', + 130427: '磁县', + 130430: '邱县', + 130431: '鸡泽县', + 130432: '广平县', + 130433: '馆陶县', + 130434: '魏县', + 130435: '曲周县', + 130481: '武安市', + 130502: '桥东区', + 130503: '桥西区', + 130521: '邢台县', + 130522: '临城县', + 130523: '内丘县', + 130524: '柏乡县', + 130525: '隆尧县', + 130526: '任县', + 130527: '南和县', + 130528: '宁晋县', + 130529: '巨鹿县', + 130530: '新河县', + 130531: '广宗县', + 130532: '平乡县', + 130533: '威县', + 130534: '清河县', + 130535: '临西县', + 130581: '南宫市', + 130582: '沙河市', + 130602: '竞秀区', + 130606: '莲池区', + 130607: '满城区', + 130608: '清苑区', + 130609: '徐水区', + 130623: '涞水县', + 130624: '阜平县', + 130626: '定兴县', + 130627: '唐县', + 130628: '高阳县', + 130629: '容城县', + 130630: '涞源县', + 130631: '望都县', + 130632: '安新县', + 130633: '易县', + 130634: '曲阳县', + 130635: '蠡县', + 130636: '顺平县', + 130637: '博野县', + 130638: '雄县', + 130681: '涿州市', + 130682: '定州市', + 130683: '安国市', + 130684: '高碑店市', + 130702: '桥东区', + 130703: '桥西区', + 130705: '宣化区', + 130706: '下花园区', + 130708: '万全区', + 130709: '崇礼区', + 130722: '张北县', + 130723: '康保县', + 130724: '沽源县', + 130725: '尚义县', + 130726: '蔚县', + 130727: '阳原县', + 130728: '怀安县', + 130730: '怀来县', + 130731: '涿鹿县', + 130732: '赤城县', + 130802: '双桥区', + 130803: '双滦区', + 130804: '鹰手营子矿区', + 130821: '承德县', + 130822: '兴隆县', + 130824: '滦平县', + 130825: '隆化县', + 130826: '丰宁满族自治县', + 130827: '宽城满族自治县', + 130828: '围场满族蒙古族自治县', + 130881: '平泉市', + 130902: '新华区', + 130903: '运河区', + 130921: '沧县', + 130922: '青县', + 130923: '东光县', + 130924: '海兴县', + 130925: '盐山县', + 130926: '肃宁县', + 130927: '南皮县', + 130928: '吴桥县', + 130929: '献县', + 130930: '孟村回族自治县', + 130981: '泊头市', + 130982: '任丘市', + 130983: '黄骅市', + 130984: '河间市', + 131002: '安次区', + 131003: '广阳区', + 131022: '固安县', + 131023: '永清县', + 131024: '香河县', + 131025: '大城县', + 131026: '文安县', + 131028: '大厂回族自治县', + 131081: '霸州市', + 131082: '三河市', + 131090: '开发区', + 131102: '桃城区', + 131103: '冀州区', + 131121: '枣强县', + 131122: '武邑县', + 131123: '武强县', + 131124: '饶阳县', + 131125: '安平县', + 131126: '故城县', + 131127: '景县', + 131128: '阜城县', + 131182: '深州市', + 140105: '小店区', + 140106: '迎泽区', + 140107: '杏花岭区', + 140108: '尖草坪区', + 140109: '万柏林区', + 140110: '晋源区', + 140121: '清徐县', + 140122: '阳曲县', + 140123: '娄烦县', + 140181: '古交市', + 140212: '新荣区', + 140213: '平城区', + 140214: '云冈区', + 140215: '云州区', + 140221: '阳高县', + 140222: '天镇县', + 140223: '广灵县', + 140224: '灵丘县', + 140225: '浑源县', + 140226: '左云县', + 140302: '城区', + 140303: '矿区', + 140311: '郊区', + 140321: '平定县', + 140322: '盂县', + 140403: '潞州区', + 140404: '上党区', + 140405: '屯留区', + 140406: '潞城区', + 140423: '襄垣县', + 140425: '平顺县', + 140426: '黎城县', + 140427: '壶关县', + 140428: '长子县', + 140429: '武乡县', + 140430: '沁县', + 140431: '沁源县', + 140502: '城区', + 140521: '沁水县', + 140522: '阳城县', + 140524: '陵川县', + 140525: '泽州县', + 140581: '高平市', + 140602: '朔城区', + 140603: '平鲁区', + 140621: '山阴县', + 140622: '应县', + 140623: '右玉县', + 140681: '怀仁市', + 140702: '榆次区', + 140721: '榆社县', + 140722: '左权县', + 140723: '和顺县', + 140724: '昔阳县', + 140725: '寿阳县', + 140726: '太谷县', + 140727: '祁县', + 140728: '平遥县', + 140729: '灵石县', + 140781: '介休市', + 140802: '盐湖区', + 140821: '临猗县', + 140822: '万荣县', + 140823: '闻喜县', + 140824: '稷山县', + 140825: '新绛县', + 140826: '绛县', + 140827: '垣曲县', + 140828: '夏县', + 140829: '平陆县', + 140830: '芮城县', + 140881: '永济市', + 140882: '河津市', + 140902: '忻府区', + 140921: '定襄县', + 140922: '五台县', + 140923: '代县', + 140924: '繁峙县', + 140925: '宁武县', + 140926: '静乐县', + 140927: '神池县', + 140928: '五寨县', + 140929: '岢岚县', + 140930: '河曲县', + 140931: '保德县', + 140932: '偏关县', + 140981: '原平市', + 141002: '尧都区', + 141021: '曲沃县', + 141022: '翼城县', + 141023: '襄汾县', + 141024: '洪洞县', + 141025: '古县', + 141026: '安泽县', + 141027: '浮山县', + 141028: '吉县', + 141029: '乡宁县', + 141030: '大宁县', + 141031: '隰县', + 141032: '永和县', + 141033: '蒲县', + 141034: '汾西县', + 141081: '侯马市', + 141082: '霍州市', + 141102: '离石区', + 141121: '文水县', + 141122: '交城县', + 141123: '兴县', + 141124: '临县', + 141125: '柳林县', + 141126: '石楼县', + 141127: '岚县', + 141128: '方山县', + 141129: '中阳县', + 141130: '交口县', + 141181: '孝义市', + 141182: '汾阳市', + 150102: '新城区', + 150103: '回民区', + 150104: '玉泉区', + 150105: '赛罕区', + 150121: '土默特左旗', + 150122: '托克托县', + 150123: '和林格尔县', + 150124: '清水河县', + 150125: '武川县', + 150202: '东河区', + 150203: '昆都仑区', + 150204: '青山区', + 150205: '石拐区', + 150206: '白云鄂博矿区', + 150207: '九原区', + 150221: '土默特右旗', + 150222: '固阳县', + 150223: '达尔罕茂明安联合旗', + 150302: '海勃湾区', + 150303: '海南区', + 150304: '乌达区', + 150402: '红山区', + 150403: '元宝山区', + 150404: '松山区', + 150421: '阿鲁科尔沁旗', + 150422: '巴林左旗', + 150423: '巴林右旗', + 150424: '林西县', + 150425: '克什克腾旗', + 150426: '翁牛特旗', + 150428: '喀喇沁旗', + 150429: '宁城县', + 150430: '敖汉旗', + 150502: '科尔沁区', + 150521: '科尔沁左翼中旗', + 150522: '科尔沁左翼后旗', + 150523: '开鲁县', + 150524: '库伦旗', + 150525: '奈曼旗', + 150526: '扎鲁特旗', + 150581: '霍林郭勒市', + 150602: '东胜区', + 150603: '康巴什区', + 150621: '达拉特旗', + 150622: '准格尔旗', + 150623: '鄂托克前旗', + 150624: '鄂托克旗', + 150625: '杭锦旗', + 150626: '乌审旗', + 150627: '伊金霍洛旗', + 150702: '海拉尔区', + 150703: '扎赉诺尔区', + 150721: '阿荣旗', + 150722: '莫力达瓦达斡尔族自治旗', + 150723: '鄂伦春自治旗', + 150724: '鄂温克族自治旗', + 150725: '陈巴尔虎旗', + 150726: '新巴尔虎左旗', + 150727: '新巴尔虎右旗', + 150781: '满洲里市', + 150782: '牙克石市', + 150783: '扎兰屯市', + 150784: '额尔古纳市', + 150785: '根河市', + 150802: '临河区', + 150821: '五原县', + 150822: '磴口县', + 150823: '乌拉特前旗', + 150824: '乌拉特中旗', + 150825: '乌拉特后旗', + 150826: '杭锦后旗', + 150902: '集宁区', + 150921: '卓资县', + 150922: '化德县', + 150923: '商都县', + 150924: '兴和县', + 150925: '凉城县', + 150926: '察哈尔右翼前旗', + 150927: '察哈尔右翼中旗', + 150928: '察哈尔右翼后旗', + 150929: '四子王旗', + 150981: '丰镇市', + 152201: '乌兰浩特市', + 152202: '阿尔山市', + 152221: '科尔沁右翼前旗', + 152222: '科尔沁右翼中旗', + 152223: '扎赉特旗', + 152224: '突泉县', + 152501: '二连浩特市', + 152502: '锡林浩特市', + 152522: '阿巴嘎旗', + 152523: '苏尼特左旗', + 152524: '苏尼特右旗', + 152525: '东乌珠穆沁旗', + 152526: '西乌珠穆沁旗', + 152527: '太仆寺旗', + 152528: '镶黄旗', + 152529: '正镶白旗', + 152530: '正蓝旗', + 152531: '多伦县', + 152921: '阿拉善左旗', + 152922: '阿拉善右旗', + 152923: '额济纳旗', + 210102: '和平区', + 210103: '沈河区', + 210104: '大东区', + 210105: '皇姑区', + 210106: '铁西区', + 210111: '苏家屯区', + 210112: '浑南区', + 210113: '沈北新区', + 210114: '于洪区', + 210115: '辽中区', + 210123: '康平县', + 210124: '法库县', + 210181: '新民市', + 210190: '经济技术开发区', + 210202: '中山区', + 210203: '西岗区', + 210204: '沙河口区', + 210211: '甘井子区', + 210212: '旅顺口区', + 210213: '金州区', + 210214: '普兰店区', + 210224: '长海县', + 210281: '瓦房店市', + 210283: '庄河市', + 210302: '铁东区', + 210303: '铁西区', + 210304: '立山区', + 210311: '千山区', + 210321: '台安县', + 210323: '岫岩满族自治县', + 210381: '海城市', + 210390: '高新区', + 210402: '新抚区', + 210403: '东洲区', + 210404: '望花区', + 210411: '顺城区', + 210421: '抚顺县', + 210422: '新宾满族自治县', + 210423: '清原满族自治县', + 210502: '平山区', + 210503: '溪湖区', + 210504: '明山区', + 210505: '南芬区', + 210521: '本溪满族自治县', + 210522: '桓仁满族自治县', + 210602: '元宝区', + 210603: '振兴区', + 210604: '振安区', + 210624: '宽甸满族自治县', + 210681: '东港市', + 210682: '凤城市', + 210702: '古塔区', + 210703: '凌河区', + 210711: '太和区', + 210726: '黑山县', + 210727: '义县', + 210781: '凌海市', + 210782: '北镇市', + 210793: '经济技术开发区', + 210802: '站前区', + 210803: '西市区', + 210804: '鲅鱼圈区', + 210811: '老边区', + 210881: '盖州市', + 210882: '大石桥市', + 210902: '海州区', + 210903: '新邱区', + 210904: '太平区', + 210905: '清河门区', + 210911: '细河区', + 210921: '阜新蒙古族自治县', + 210922: '彰武县', + 211002: '白塔区', + 211003: '文圣区', + 211004: '宏伟区', + 211005: '弓长岭区', + 211011: '太子河区', + 211021: '辽阳县', + 211081: '灯塔市', + 211102: '双台子区', + 211103: '兴隆台区', + 211104: '大洼区', + 211122: '盘山县', + 211202: '银州区', + 211204: '清河区', + 211221: '铁岭县', + 211223: '西丰县', + 211224: '昌图县', + 211281: '调兵山市', + 211282: '开原市', + 211302: '双塔区', + 211303: '龙城区', + 211321: '朝阳县', + 211322: '建平县', + 211324: '喀喇沁左翼蒙古族自治县', + 211381: '北票市', + 211382: '凌源市', + 211402: '连山区', + 211403: '龙港区', + 211404: '南票区', + 211421: '绥中县', + 211422: '建昌县', + 211481: '兴城市', + 220102: '南关区', + 220103: '宽城区', + 220104: '朝阳区', + 220105: '二道区', + 220106: '绿园区', + 220112: '双阳区', + 220113: '九台区', + 220122: '农安县', + 220182: '榆树市', + 220183: '德惠市', + 220192: '经济技术开发区', + 220202: '昌邑区', + 220203: '龙潭区', + 220204: '船营区', + 220211: '丰满区', + 220221: '永吉县', + 220281: '蛟河市', + 220282: '桦甸市', + 220283: '舒兰市', + 220284: '磐石市', + 220302: '铁西区', + 220303: '铁东区', + 220322: '梨树县', + 220323: '伊通满族自治县', + 220381: '公主岭市', + 220382: '双辽市', + 220402: '龙山区', + 220403: '西安区', + 220421: '东丰县', + 220422: '东辽县', + 220502: '东昌区', + 220503: '二道江区', + 220521: '通化县', + 220523: '辉南县', + 220524: '柳河县', + 220581: '梅河口市', + 220582: '集安市', + 220602: '浑江区', + 220605: '江源区', + 220621: '抚松县', + 220622: '靖宇县', + 220623: '长白朝鲜族自治县', + 220681: '临江市', + 220702: '宁江区', + 220721: '前郭尔罗斯蒙古族自治县', + 220722: '长岭县', + 220723: '乾安县', + 220781: '扶余市', + 220802: '洮北区', + 220821: '镇赉县', + 220822: '通榆县', + 220881: '洮南市', + 220882: '大安市', + 222401: '延吉市', + 222402: '图们市', + 222403: '敦化市', + 222404: '珲春市', + 222405: '龙井市', + 222406: '和龙市', + 222424: '汪清县', + 222426: '安图县', + 230102: '道里区', + 230103: '南岗区', + 230104: '道外区', + 230108: '平房区', + 230109: '松北区', + 230110: '香坊区', + 230111: '呼兰区', + 230112: '阿城区', + 230113: '双城区', + 230123: '依兰县', + 230124: '方正县', + 230125: '宾县', + 230126: '巴彦县', + 230127: '木兰县', + 230128: '通河县', + 230129: '延寿县', + 230183: '尚志市', + 230184: '五常市', + 230202: '龙沙区', + 230203: '建华区', + 230204: '铁锋区', + 230205: '昂昂溪区', + 230206: '富拉尔基区', + 230207: '碾子山区', + 230208: '梅里斯达斡尔族区', + 230221: '龙江县', + 230223: '依安县', + 230224: '泰来县', + 230225: '甘南县', + 230227: '富裕县', + 230229: '克山县', + 230230: '克东县', + 230231: '拜泉县', + 230281: '讷河市', + 230302: '鸡冠区', + 230303: '恒山区', + 230304: '滴道区', + 230305: '梨树区', + 230306: '城子河区', + 230307: '麻山区', + 230321: '鸡东县', + 230381: '虎林市', + 230382: '密山市', + 230402: '向阳区', + 230403: '工农区', + 230404: '南山区', + 230405: '兴安区', + 230406: '东山区', + 230407: '兴山区', + 230421: '萝北县', + 230422: '绥滨县', + 230502: '尖山区', + 230503: '岭东区', + 230505: '四方台区', + 230506: '宝山区', + 230521: '集贤县', + 230522: '友谊县', + 230523: '宝清县', + 230524: '饶河县', + 230602: '萨尔图区', + 230603: '龙凤区', + 230604: '让胡路区', + 230605: '红岗区', + 230606: '大同区', + 230621: '肇州县', + 230622: '肇源县', + 230623: '林甸县', + 230624: '杜尔伯特蒙古族自治县', + 230702: '伊春区', + 230703: '南岔区', + 230704: '友好区', + 230705: '西林区', + 230706: '翠峦区', + 230707: '新青区', + 230708: '美溪区', + 230709: '金山屯区', + 230710: '五营区', + 230711: '乌马河区', + 230712: '汤旺河区', + 230713: '带岭区', + 230714: '乌伊岭区', + 230715: '红星区', + 230716: '上甘岭区', + 230722: '嘉荫县', + 230781: '铁力市', + 230803: '向阳区', + 230804: '前进区', + 230805: '东风区', + 230811: '郊区', + 230822: '桦南县', + 230826: '桦川县', + 230828: '汤原县', + 230881: '同江市', + 230882: '富锦市', + 230883: '抚远市', + 230902: '新兴区', + 230903: '桃山区', + 230904: '茄子河区', + 230921: '勃利县', + 231002: '东安区', + 231003: '阳明区', + 231004: '爱民区', + 231005: '西安区', + 231025: '林口县', + 231081: '绥芬河市', + 231083: '海林市', + 231084: '宁安市', + 231085: '穆棱市', + 231086: '东宁市', + 231102: '爱辉区', + 231121: '嫩江县', + 231123: '逊克县', + 231124: '孙吴县', + 231181: '北安市', + 231182: '五大连池市', + 231202: '北林区', + 231221: '望奎县', + 231222: '兰西县', + 231223: '青冈县', + 231224: '庆安县', + 231225: '明水县', + 231226: '绥棱县', + 231281: '安达市', + 231282: '肇东市', + 231283: '海伦市', + 232701: '漠河市', + 232721: '呼玛县', + 232722: '塔河县', + 232790: '松岭区', + 232791: '呼中区', + 232792: '加格达奇区', + 232793: '新林区', + 310101: '黄浦区', + 310104: '徐汇区', + 310105: '长宁区', + 310106: '静安区', + 310107: '普陀区', + 310109: '虹口区', + 310110: '杨浦区', + 310112: '闵行区', + 310113: '宝山区', + 310114: '嘉定区', + 310115: '浦东新区', + 310116: '金山区', + 310117: '松江区', + 310118: '青浦区', + 310120: '奉贤区', + 310151: '崇明区', + 320102: '玄武区', + 320104: '秦淮区', + 320105: '建邺区', + 320106: '鼓楼区', + 320111: '浦口区', + 320113: '栖霞区', + 320114: '雨花台区', + 320115: '江宁区', + 320116: '六合区', + 320117: '溧水区', + 320118: '高淳区', + 320205: '锡山区', + 320206: '惠山区', + 320211: '滨湖区', + 320213: '梁溪区', + 320214: '新吴区', + 320281: '江阴市', + 320282: '宜兴市', + 320302: '鼓楼区', + 320303: '云龙区', + 320305: '贾汪区', + 320311: '泉山区', + 320312: '铜山区', + 320321: '丰县', + 320322: '沛县', + 320324: '睢宁县', + 320381: '新沂市', + 320382: '邳州市', + 320391: '工业园区', + 320402: '天宁区', + 320404: '钟楼区', + 320411: '新北区', + 320412: '武进区', + 320413: '金坛区', + 320481: '溧阳市', + 320505: '虎丘区', + 320506: '吴中区', + 320507: '相城区', + 320508: '姑苏区', + 320509: '吴江区', + 320581: '常熟市', + 320582: '张家港市', + 320583: '昆山市', + 320585: '太仓市', + 320590: '工业园区', + 320591: '高新区', + 320602: '崇川区', + 320611: '港闸区', + 320612: '通州区', + 320623: '如东县', + 320681: '启东市', + 320682: '如皋市', + 320684: '海门市', + 320685: '海安市', + 320691: '高新区', + 320703: '连云区', + 320706: '海州区', + 320707: '赣榆区', + 320722: '东海县', + 320723: '灌云县', + 320724: '灌南县', + 320803: '淮安区', + 320804: '淮阴区', + 320812: '清江浦区', + 320813: '洪泽区', + 320826: '涟水县', + 320830: '盱眙县', + 320831: '金湖县', + 320890: '经济开发区', + 320902: '亭湖区', + 320903: '盐都区', + 320904: '大丰区', + 320921: '响水县', + 320922: '滨海县', + 320923: '阜宁县', + 320924: '射阳县', + 320925: '建湖县', + 320981: '东台市', + 321002: '广陵区', + 321003: '邗江区', + 321012: '江都区', + 321023: '宝应县', + 321081: '仪征市', + 321084: '高邮市', + 321090: '经济开发区', + 321102: '京口区', + 321111: '润州区', + 321112: '丹徒区', + 321181: '丹阳市', + 321182: '扬中市', + 321183: '句容市', + 321202: '海陵区', + 321203: '高港区', + 321204: '姜堰区', + 321281: '兴化市', + 321282: '靖江市', + 321283: '泰兴市', + 321302: '宿城区', + 321311: '宿豫区', + 321322: '沭阳县', + 321323: '泗阳县', + 321324: '泗洪县', + 330102: '上城区', + 330103: '下城区', + 330104: '江干区', + 330105: '拱墅区', + 330106: '西湖区', + 330108: '滨江区', + 330109: '萧山区', + 330110: '余杭区', + 330111: '富阳区', + 330112: '临安区', + 330122: '桐庐县', + 330127: '淳安县', + 330182: '建德市', + 330203: '海曙区', + 330205: '江北区', + 330206: '北仑区', + 330211: '镇海区', + 330212: '鄞州区', + 330213: '奉化区', + 330225: '象山县', + 330226: '宁海县', + 330281: '余姚市', + 330282: '慈溪市', + 330302: '鹿城区', + 330303: '龙湾区', + 330304: '瓯海区', + 330305: '洞头区', + 330324: '永嘉县', + 330326: '平阳县', + 330327: '苍南县', + 330328: '文成县', + 330329: '泰顺县', + 330381: '瑞安市', + 330382: '乐清市', + 330402: '南湖区', + 330411: '秀洲区', + 330421: '嘉善县', + 330424: '海盐县', + 330481: '海宁市', + 330482: '平湖市', + 330483: '桐乡市', + 330502: '吴兴区', + 330503: '南浔区', + 330521: '德清县', + 330522: '长兴县', + 330523: '安吉县', + 330602: '越城区', + 330603: '柯桥区', + 330604: '上虞区', + 330624: '新昌县', + 330681: '诸暨市', + 330683: '嵊州市', + 330702: '婺城区', + 330703: '金东区', + 330723: '武义县', + 330726: '浦江县', + 330727: '磐安县', + 330781: '兰溪市', + 330782: '义乌市', + 330783: '东阳市', + 330784: '永康市', + 330802: '柯城区', + 330803: '衢江区', + 330822: '常山县', + 330824: '开化县', + 330825: '龙游县', + 330881: '江山市', + 330902: '定海区', + 330903: '普陀区', + 330921: '岱山县', + 330922: '嵊泗县', + 331002: '椒江区', + 331003: '黄岩区', + 331004: '路桥区', + 331022: '三门县', + 331023: '天台县', + 331024: '仙居县', + 331081: '温岭市', + 331082: '临海市', + 331083: '玉环市', + 331102: '莲都区', + 331121: '青田县', + 331122: '缙云县', + 331123: '遂昌县', + 331124: '松阳县', + 331125: '云和县', + 331126: '庆元县', + 331127: '景宁畲族自治县', + 331181: '龙泉市', + 340102: '瑶海区', + 340103: '庐阳区', + 340104: '蜀山区', + 340111: '包河区', + 340121: '长丰县', + 340122: '肥东县', + 340123: '肥西县', + 340124: '庐江县', + 340181: '巢湖市', + 340190: '高新技术开发区', + 340191: '经济技术开发区', + 340202: '镜湖区', + 340203: '弋江区', + 340207: '鸠江区', + 340208: '三山区', + 340221: '芜湖县', + 340222: '繁昌县', + 340223: '南陵县', + 340225: '无为县', + 340302: '龙子湖区', + 340303: '蚌山区', + 340304: '禹会区', + 340311: '淮上区', + 340321: '怀远县', + 340322: '五河县', + 340323: '固镇县', + 340402: '大通区', + 340403: '田家庵区', + 340404: '谢家集区', + 340405: '八公山区', + 340406: '潘集区', + 340421: '凤台县', + 340422: '寿县', + 340503: '花山区', + 340504: '雨山区', + 340506: '博望区', + 340521: '当涂县', + 340522: '含山县', + 340523: '和县', + 340602: '杜集区', + 340603: '相山区', + 340604: '烈山区', + 340621: '濉溪县', + 340705: '铜官区', + 340706: '义安区', + 340711: '郊区', + 340722: '枞阳县', + 340802: '迎江区', + 340803: '大观区', + 340811: '宜秀区', + 340822: '怀宁县', + 340824: '潜山县', + 340825: '太湖县', + 340826: '宿松县', + 340827: '望江县', + 340828: '岳西县', + 340881: '桐城市', + 341002: '屯溪区', + 341003: '黄山区', + 341004: '徽州区', + 341021: '歙县', + 341022: '休宁县', + 341023: '黟县', + 341024: '祁门县', + 341102: '琅琊区', + 341103: '南谯区', + 341122: '来安县', + 341124: '全椒县', + 341125: '定远县', + 341126: '凤阳县', + 341181: '天长市', + 341182: '明光市', + 341202: '颍州区', + 341203: '颍东区', + 341204: '颍泉区', + 341221: '临泉县', + 341222: '太和县', + 341225: '阜南县', + 341226: '颍上县', + 341282: '界首市', + 341302: '埇桥区', + 341321: '砀山县', + 341322: '萧县', + 341323: '灵璧县', + 341324: '泗县', + 341390: '经济开发区', + 341502: '金安区', + 341503: '裕安区', + 341504: '叶集区', + 341522: '霍邱县', + 341523: '舒城县', + 341524: '金寨县', + 341525: '霍山县', + 341602: '谯城区', + 341621: '涡阳县', + 341622: '蒙城县', + 341623: '利辛县', + 341702: '贵池区', + 341721: '东至县', + 341722: '石台县', + 341723: '青阳县', + 341802: '宣州区', + 341821: '郎溪县', + 341822: '广德县', + 341823: '泾县', + 341824: '绩溪县', + 341825: '旌德县', + 341881: '宁国市', + 350102: '鼓楼区', + 350103: '台江区', + 350104: '仓山区', + 350105: '马尾区', + 350111: '晋安区', + 350112: '长乐区', + 350121: '闽侯县', + 350122: '连江县', + 350123: '罗源县', + 350124: '闽清县', + 350125: '永泰县', + 350128: '平潭县', + 350181: '福清市', + 350203: '思明区', + 350205: '海沧区', + 350206: '湖里区', + 350211: '集美区', + 350212: '同安区', + 350213: '翔安区', + 350302: '城厢区', + 350303: '涵江区', + 350304: '荔城区', + 350305: '秀屿区', + 350322: '仙游县', + 350402: '梅列区', + 350403: '三元区', + 350421: '明溪县', + 350423: '清流县', + 350424: '宁化县', + 350425: '大田县', + 350426: '尤溪县', + 350427: '沙县', + 350428: '将乐县', + 350429: '泰宁县', + 350430: '建宁县', + 350481: '永安市', + 350502: '鲤城区', + 350503: '丰泽区', + 350504: '洛江区', + 350505: '泉港区', + 350521: '惠安县', + 350524: '安溪县', + 350525: '永春县', + 350526: '德化县', + 350527: '金门县', + 350581: '石狮市', + 350582: '晋江市', + 350583: '南安市', + 350602: '芗城区', + 350603: '龙文区', + 350622: '云霄县', + 350623: '漳浦县', + 350624: '诏安县', + 350625: '长泰县', + 350626: '东山县', + 350627: '南靖县', + 350628: '平和县', + 350629: '华安县', + 350681: '龙海市', + 350702: '延平区', + 350703: '建阳区', + 350721: '顺昌县', + 350722: '浦城县', + 350723: '光泽县', + 350724: '松溪县', + 350725: '政和县', + 350781: '邵武市', + 350782: '武夷山市', + 350783: '建瓯市', + 350802: '新罗区', + 350803: '永定区', + 350821: '长汀县', + 350823: '上杭县', + 350824: '武平县', + 350825: '连城县', + 350881: '漳平市', + 350902: '蕉城区', + 350921: '霞浦县', + 350922: '古田县', + 350923: '屏南县', + 350924: '寿宁县', + 350925: '周宁县', + 350926: '柘荣县', + 350981: '福安市', + 350982: '福鼎市', + 360102: '东湖区', + 360103: '西湖区', + 360104: '青云谱区', + 360105: '湾里区', + 360111: '青山湖区', + 360112: '新建区', + 360121: '南昌县', + 360123: '安义县', + 360124: '进贤县', + 360190: '经济技术开发区', + 360192: '高新区', + 360202: '昌江区', + 360203: '珠山区', + 360222: '浮梁县', + 360281: '乐平市', + 360302: '安源区', + 360313: '湘东区', + 360321: '莲花县', + 360322: '上栗县', + 360323: '芦溪县', + 360402: '濂溪区', + 360403: '浔阳区', + 360404: '柴桑区', + 360423: '武宁县', + 360424: '修水县', + 360425: '永修县', + 360426: '德安县', + 360428: '都昌县', + 360429: '湖口县', + 360430: '彭泽县', + 360481: '瑞昌市', + 360482: '共青城市', + 360483: '庐山市', + 360490: '经济技术开发区', + 360502: '渝水区', + 360521: '分宜县', + 360602: '月湖区', + 360603: '余江区', + 360681: '贵溪市', + 360702: '章贡区', + 360703: '南康区', + 360704: '赣县区', + 360722: '信丰县', + 360723: '大余县', + 360724: '上犹县', + 360725: '崇义县', + 360726: '安远县', + 360727: '龙南县', + 360728: '定南县', + 360729: '全南县', + 360730: '宁都县', + 360731: '于都县', + 360732: '兴国县', + 360733: '会昌县', + 360734: '寻乌县', + 360735: '石城县', + 360781: '瑞金市', + 360802: '吉州区', + 360803: '青原区', + 360821: '吉安县', + 360822: '吉水县', + 360823: '峡江县', + 360824: '新干县', + 360825: '永丰县', + 360826: '泰和县', + 360827: '遂川县', + 360828: '万安县', + 360829: '安福县', + 360830: '永新县', + 360881: '井冈山市', + 360902: '袁州区', + 360921: '奉新县', + 360922: '万载县', + 360923: '上高县', + 360924: '宜丰县', + 360925: '靖安县', + 360926: '铜鼓县', + 360981: '丰城市', + 360982: '樟树市', + 360983: '高安市', + 361002: '临川区', + 361003: '东乡区', + 361021: '南城县', + 361022: '黎川县', + 361023: '南丰县', + 361024: '崇仁县', + 361025: '乐安县', + 361026: '宜黄县', + 361027: '金溪县', + 361028: '资溪县', + 361030: '广昌县', + 361102: '信州区', + 361103: '广丰区', + 361121: '上饶县', + 361123: '玉山县', + 361124: '铅山县', + 361125: '横峰县', + 361126: '弋阳县', + 361127: '余干县', + 361128: '鄱阳县', + 361129: '万年县', + 361130: '婺源县', + 361181: '德兴市', + 370102: '历下区', + 370103: '市中区', + 370104: '槐荫区', + 370105: '天桥区', + 370112: '历城区', + 370113: '长清区', + 370114: '章丘区', + 370115: '济阳区', + 370116: '莱芜区', + 370117: '钢城区', + 370124: '平阴县', + 370126: '商河县', + 370190: '高新区', + 370202: '市南区', + 370203: '市北区', + 370211: '黄岛区', + 370212: '崂山区', + 370213: '李沧区', + 370214: '城阳区', + 370215: '即墨区', + 370281: '胶州市', + 370283: '平度市', + 370285: '莱西市', + 370290: '开发区', + 370302: '淄川区', + 370303: '张店区', + 370304: '博山区', + 370305: '临淄区', + 370306: '周村区', + 370321: '桓台县', + 370322: '高青县', + 370323: '沂源县', + 370402: '市中区', + 370403: '薛城区', + 370404: '峄城区', + 370405: '台儿庄区', + 370406: '山亭区', + 370481: '滕州市', + 370502: '东营区', + 370503: '河口区', + 370505: '垦利区', + 370522: '利津县', + 370523: '广饶县', + 370602: '芝罘区', + 370611: '福山区', + 370612: '牟平区', + 370613: '莱山区', + 370634: '长岛县', + 370681: '龙口市', + 370682: '莱阳市', + 370683: '莱州市', + 370684: '蓬莱市', + 370685: '招远市', + 370686: '栖霞市', + 370687: '海阳市', + 370690: '开发区', + 370702: '潍城区', + 370703: '寒亭区', + 370704: '坊子区', + 370705: '奎文区', + 370724: '临朐县', + 370725: '昌乐县', + 370781: '青州市', + 370782: '诸城市', + 370783: '寿光市', + 370784: '安丘市', + 370785: '高密市', + 370786: '昌邑市', + 370790: '开发区', + 370791: '高新区', + 370811: '任城区', + 370812: '兖州区', + 370826: '微山县', + 370827: '鱼台县', + 370828: '金乡县', + 370829: '嘉祥县', + 370830: '汶上县', + 370831: '泗水县', + 370832: '梁山县', + 370881: '曲阜市', + 370883: '邹城市', + 370890: '高新区', + 370902: '泰山区', + 370911: '岱岳区', + 370921: '宁阳县', + 370923: '东平县', + 370982: '新泰市', + 370983: '肥城市', + 371002: '环翠区', + 371003: '文登区', + 371082: '荣成市', + 371083: '乳山市', + 371091: '经济技术开发区', + 371102: '东港区', + 371103: '岚山区', + 371121: '五莲县', + 371122: '莒县', + 371302: '兰山区', + 371311: '罗庄区', + 371312: '河东区', + 371321: '沂南县', + 371322: '郯城县', + 371323: '沂水县', + 371324: '兰陵县', + 371325: '费县', + 371326: '平邑县', + 371327: '莒南县', + 371328: '蒙阴县', + 371329: '临沭县', + 371402: '德城区', + 371403: '陵城区', + 371422: '宁津县', + 371423: '庆云县', + 371424: '临邑县', + 371425: '齐河县', + 371426: '平原县', + 371427: '夏津县', + 371428: '武城县', + 371481: '乐陵市', + 371482: '禹城市', + 371502: '东昌府区', + 371521: '阳谷县', + 371522: '莘县', + 371523: '茌平县', + 371524: '东阿县', + 371525: '冠县', + 371526: '高唐县', + 371581: '临清市', + 371602: '滨城区', + 371603: '沾化区', + 371621: '惠民县', + 371622: '阳信县', + 371623: '无棣县', + 371625: '博兴县', + 371681: '邹平市', + 371702: '牡丹区', + 371703: '定陶区', + 371721: '曹县', + 371722: '单县', + 371723: '成武县', + 371724: '巨野县', + 371725: '郓城县', + 371726: '鄄城县', + 371728: '东明县', + 410102: '中原区', + 410103: '二七区', + 410104: '管城回族区', + 410105: '金水区', + 410106: '上街区', + 410108: '惠济区', + 410122: '中牟县', + 410181: '巩义市', + 410182: '荥阳市', + 410183: '新密市', + 410184: '新郑市', + 410185: '登封市', + 410190: '高新技术开发区', + 410191: '经济技术开发区', + 410202: '龙亭区', + 410203: '顺河回族区', + 410204: '鼓楼区', + 410205: '禹王台区', + 410212: '祥符区', + 410221: '杞县', + 410222: '通许县', + 410223: '尉氏县', + 410225: '兰考县', + 410302: '老城区', + 410303: '西工区', + 410304: '瀍河回族区', + 410305: '涧西区', + 410306: '吉利区', + 410311: '洛龙区', + 410322: '孟津县', + 410323: '新安县', + 410324: '栾川县', + 410325: '嵩县', + 410326: '汝阳县', + 410327: '宜阳县', + 410328: '洛宁县', + 410329: '伊川县', + 410381: '偃师市', + 410402: '新华区', + 410403: '卫东区', + 410404: '石龙区', + 410411: '湛河区', + 410421: '宝丰县', + 410422: '叶县', + 410423: '鲁山县', + 410425: '郏县', + 410481: '舞钢市', + 410482: '汝州市', + 410502: '文峰区', + 410503: '北关区', + 410505: '殷都区', + 410506: '龙安区', + 410522: '安阳县', + 410523: '汤阴县', + 410526: '滑县', + 410527: '内黄县', + 410581: '林州市', + 410590: '开发区', + 410602: '鹤山区', + 410603: '山城区', + 410611: '淇滨区', + 410621: '浚县', + 410622: '淇县', + 410702: '红旗区', + 410703: '卫滨区', + 410704: '凤泉区', + 410711: '牧野区', + 410721: '新乡县', + 410724: '获嘉县', + 410725: '原阳县', + 410726: '延津县', + 410727: '封丘县', + 410728: '长垣县', + 410781: '卫辉市', + 410782: '辉县市', + 410802: '解放区', + 410803: '中站区', + 410804: '马村区', + 410811: '山阳区', + 410821: '修武县', + 410822: '博爱县', + 410823: '武陟县', + 410825: '温县', + 410882: '沁阳市', + 410883: '孟州市', + 410902: '华龙区', + 410922: '清丰县', + 410923: '南乐县', + 410926: '范县', + 410927: '台前县', + 410928: '濮阳县', + 411002: '魏都区', + 411003: '建安区', + 411024: '鄢陵县', + 411025: '襄城县', + 411081: '禹州市', + 411082: '长葛市', + 411102: '源汇区', + 411103: '郾城区', + 411104: '召陵区', + 411121: '舞阳县', + 411122: '临颍县', + 411202: '湖滨区', + 411203: '陕州区', + 411221: '渑池县', + 411224: '卢氏县', + 411281: '义马市', + 411282: '灵宝市', + 411302: '宛城区', + 411303: '卧龙区', + 411321: '南召县', + 411322: '方城县', + 411323: '西峡县', + 411324: '镇平县', + 411325: '内乡县', + 411326: '淅川县', + 411327: '社旗县', + 411328: '唐河县', + 411329: '新野县', + 411330: '桐柏县', + 411381: '邓州市', + 411402: '梁园区', + 411403: '睢阳区', + 411421: '民权县', + 411422: '睢县', + 411423: '宁陵县', + 411424: '柘城县', + 411425: '虞城县', + 411426: '夏邑县', + 411481: '永城市', + 411502: '浉河区', + 411503: '平桥区', + 411521: '罗山县', + 411522: '光山县', + 411523: '新县', + 411524: '商城县', + 411525: '固始县', + 411526: '潢川县', + 411527: '淮滨县', + 411528: '息县', + 411602: '川汇区', + 411621: '扶沟县', + 411622: '西华县', + 411623: '商水县', + 411624: '沈丘县', + 411625: '郸城县', + 411626: '淮阳县', + 411627: '太康县', + 411628: '鹿邑县', + 411681: '项城市', + 411690: '经济开发区', + 411702: '驿城区', + 411721: '西平县', + 411722: '上蔡县', + 411723: '平舆县', + 411724: '正阳县', + 411725: '确山县', + 411726: '泌阳县', + 411727: '汝南县', + 411728: '遂平县', + 411729: '新蔡县', + 419001: '济源市', + 420102: '江岸区', + 420103: '江汉区', + 420104: '硚口区', + 420105: '汉阳区', + 420106: '武昌区', + 420107: '青山区', + 420111: '洪山区', + 420112: '东西湖区', + 420113: '汉南区', + 420114: '蔡甸区', + 420115: '江夏区', + 420116: '黄陂区', + 420117: '新洲区', + 420202: '黄石港区', + 420203: '西塞山区', + 420204: '下陆区', + 420205: '铁山区', + 420222: '阳新县', + 420281: '大冶市', + 420302: '茅箭区', + 420303: '张湾区', + 420304: '郧阳区', + 420322: '郧西县', + 420323: '竹山县', + 420324: '竹溪县', + 420325: '房县', + 420381: '丹江口市', + 420502: '西陵区', + 420503: '伍家岗区', + 420504: '点军区', + 420505: '猇亭区', + 420506: '夷陵区', + 420525: '远安县', + 420526: '兴山县', + 420527: '秭归县', + 420528: '长阳土家族自治县', + 420529: '五峰土家族自治县', + 420581: '宜都市', + 420582: '当阳市', + 420583: '枝江市', + 420590: '经济开发区', + 420602: '襄城区', + 420606: '樊城区', + 420607: '襄州区', + 420624: '南漳县', + 420625: '谷城县', + 420626: '保康县', + 420682: '老河口市', + 420683: '枣阳市', + 420684: '宜城市', + 420702: '梁子湖区', + 420703: '华容区', + 420704: '鄂城区', + 420802: '东宝区', + 420804: '掇刀区', + 420822: '沙洋县', + 420881: '钟祥市', + 420882: '京山市', + 420902: '孝南区', + 420921: '孝昌县', + 420922: '大悟县', + 420923: '云梦县', + 420981: '应城市', + 420982: '安陆市', + 420984: '汉川市', + 421002: '沙市区', + 421003: '荆州区', + 421022: '公安县', + 421023: '监利县', + 421024: '江陵县', + 421081: '石首市', + 421083: '洪湖市', + 421087: '松滋市', + 421102: '黄州区', + 421121: '团风县', + 421122: '红安县', + 421123: '罗田县', + 421124: '英山县', + 421125: '浠水县', + 421126: '蕲春县', + 421127: '黄梅县', + 421181: '麻城市', + 421182: '武穴市', + 421202: '咸安区', + 421221: '嘉鱼县', + 421222: '通城县', + 421223: '崇阳县', + 421224: '通山县', + 421281: '赤壁市', + 421303: '曾都区', + 421321: '随县', + 421381: '广水市', + 422801: '恩施市', + 422802: '利川市', + 422822: '建始县', + 422823: '巴东县', + 422825: '宣恩县', + 422826: '咸丰县', + 422827: '来凤县', + 422828: '鹤峰县', + 429004: '仙桃市', + 429005: '潜江市', + 429006: '天门市', + 429021: '神农架林区', + 430102: '芙蓉区', + 430103: '天心区', + 430104: '岳麓区', + 430105: '开福区', + 430111: '雨花区', + 430112: '望城区', + 430121: '长沙县', + 430181: '浏阳市', + 430182: '宁乡市', + 430202: '荷塘区', + 430203: '芦淞区', + 430204: '石峰区', + 430211: '天元区', + 430212: '渌口区', + 430223: '攸县', + 430224: '茶陵县', + 430225: '炎陵县', + 430281: '醴陵市', + 430302: '雨湖区', + 430304: '岳塘区', + 430321: '湘潭县', + 430381: '湘乡市', + 430382: '韶山市', + 430405: '珠晖区', + 430406: '雁峰区', + 430407: '石鼓区', + 430408: '蒸湘区', + 430412: '南岳区', + 430421: '衡阳县', + 430422: '衡南县', + 430423: '衡山县', + 430424: '衡东县', + 430426: '祁东县', + 430481: '耒阳市', + 430482: '常宁市', + 430502: '双清区', + 430503: '大祥区', + 430511: '北塔区', + 430521: '邵东县', + 430522: '新邵县', + 430523: '邵阳县', + 430524: '隆回县', + 430525: '洞口县', + 430527: '绥宁县', + 430528: '新宁县', + 430529: '城步苗族自治县', + 430581: '武冈市', + 430602: '岳阳楼区', + 430603: '云溪区', + 430611: '君山区', + 430621: '岳阳县', + 430623: '华容县', + 430624: '湘阴县', + 430626: '平江县', + 430681: '汨罗市', + 430682: '临湘市', + 430702: '武陵区', + 430703: '鼎城区', + 430721: '安乡县', + 430722: '汉寿县', + 430723: '澧县', + 430724: '临澧县', + 430725: '桃源县', + 430726: '石门县', + 430781: '津市市', + 430802: '永定区', + 430811: '武陵源区', + 430821: '慈利县', + 430822: '桑植县', + 430902: '资阳区', + 430903: '赫山区', + 430921: '南县', + 430922: '桃江县', + 430923: '安化县', + 430981: '沅江市', + 431002: '北湖区', + 431003: '苏仙区', + 431021: '桂阳县', + 431022: '宜章县', + 431023: '永兴县', + 431024: '嘉禾县', + 431025: '临武县', + 431026: '汝城县', + 431027: '桂东县', + 431028: '安仁县', + 431081: '资兴市', + 431102: '零陵区', + 431103: '冷水滩区', + 431121: '祁阳县', + 431122: '东安县', + 431123: '双牌县', + 431124: '道县', + 431125: '江永县', + 431126: '宁远县', + 431127: '蓝山县', + 431128: '新田县', + 431129: '江华瑶族自治县', + 431202: '鹤城区', + 431221: '中方县', + 431222: '沅陵县', + 431223: '辰溪县', + 431224: '溆浦县', + 431225: '会同县', + 431226: '麻阳苗族自治县', + 431227: '新晃侗族自治县', + 431228: '芷江侗族自治县', + 431229: '靖州苗族侗族自治县', + 431230: '通道侗族自治县', + 431281: '洪江市', + 431302: '娄星区', + 431321: '双峰县', + 431322: '新化县', + 431381: '冷水江市', + 431382: '涟源市', + 433101: '吉首市', + 433122: '泸溪县', + 433123: '凤凰县', + 433124: '花垣县', + 433125: '保靖县', + 433126: '古丈县', + 433127: '永顺县', + 433130: '龙山县', + 440103: '荔湾区', + 440104: '越秀区', + 440105: '海珠区', + 440106: '天河区', + 440111: '白云区', + 440112: '黄埔区', + 440113: '番禺区', + 440114: '花都区', + 440115: '南沙区', + 440117: '从化区', + 440118: '增城区', + 440203: '武江区', + 440204: '浈江区', + 440205: '曲江区', + 440222: '始兴县', + 440224: '仁化县', + 440229: '翁源县', + 440232: '乳源瑶族自治县', + 440233: '新丰县', + 440281: '乐昌市', + 440282: '南雄市', + 440303: '罗湖区', + 440304: '福田区', + 440305: '南山区', + 440306: '宝安区', + 440307: '龙岗区', + 440308: '盐田区', + 440309: '龙华区', + 440310: '坪山区', + 440311: '光明区', + 440402: '香洲区', + 440403: '斗门区', + 440404: '金湾区', + 440507: '龙湖区', + 440511: '金平区', + 440512: '濠江区', + 440513: '潮阳区', + 440514: '潮南区', + 440515: '澄海区', + 440523: '南澳县', + 440604: '禅城区', + 440605: '南海区', + 440606: '顺德区', + 440607: '三水区', + 440608: '高明区', + 440703: '蓬江区', + 440704: '江海区', + 440705: '新会区', + 440781: '台山市', + 440783: '开平市', + 440784: '鹤山市', + 440785: '恩平市', + 440802: '赤坎区', + 440803: '霞山区', + 440804: '坡头区', + 440811: '麻章区', + 440823: '遂溪县', + 440825: '徐闻县', + 440881: '廉江市', + 440882: '雷州市', + 440883: '吴川市', + 440890: '经济技术开发区', + 440902: '茂南区', + 440904: '电白区', + 440981: '高州市', + 440982: '化州市', + 440983: '信宜市', + 441202: '端州区', + 441203: '鼎湖区', + 441204: '高要区', + 441223: '广宁县', + 441224: '怀集县', + 441225: '封开县', + 441226: '德庆县', + 441284: '四会市', + 441302: '惠城区', + 441303: '惠阳区', + 441322: '博罗县', + 441323: '惠东县', + 441324: '龙门县', + 441402: '梅江区', + 441403: '梅县区', + 441422: '大埔县', + 441423: '丰顺县', + 441424: '五华县', + 441426: '平远县', + 441427: '蕉岭县', + 441481: '兴宁市', + 441502: '城区', + 441521: '海丰县', + 441523: '陆河县', + 441581: '陆丰市', + 441602: '源城区', + 441621: '紫金县', + 441622: '龙川县', + 441623: '连平县', + 441624: '和平县', + 441625: '东源县', + 441702: '江城区', + 441704: '阳东区', + 441721: '阳西县', + 441781: '阳春市', + 441802: '清城区', + 441803: '清新区', + 441821: '佛冈县', + 441823: '阳山县', + 441825: '连山壮族瑶族自治县', + 441826: '连南瑶族自治县', + 441881: '英德市', + 441882: '连州市', + 441901: '中堂镇', + 441903: '南城街道办事处', + 441904: '长安镇', + 441905: '东坑镇', + 441906: '樟木头镇', + 441907: '莞城街道办事处', + 441908: '石龙镇', + 441909: '桥头镇', + 441910: '万江街道办事处', + 441911: '麻涌镇', + 441912: '虎门镇', + 441913: '谢岗镇', + 441914: '石碣镇', + 441915: '茶山镇', + 441916: '东城街道办事处', + 441917: '洪梅镇', + 441918: '道滘镇', + 441919: '高埗镇', + 441920: '企石镇', + 441921: '凤岗镇', + 441922: '大岭山镇', + 441923: '松山湖管委会', + 441924: '清溪镇', + 441925: '望牛墩镇', + 441926: '厚街镇', + 441927: '常平镇', + 441928: '寮步镇', + 441929: '石排镇', + 441930: '横沥镇', + 441931: '塘厦镇', + 441932: '黄江镇', + 441933: '大朗镇', + 441934: '东莞港', + 441935: '东莞生态园', + 441990: '沙田镇', + 442001: '南头镇', + 442002: '神湾镇', + 442003: '东凤镇', + 442004: '五桂山街道办事处', + 442005: '黄圃镇', + 442006: '小榄镇', + 442007: '石岐区街道办事处', + 442008: '横栏镇', + 442009: '三角镇', + 442010: '三乡镇', + 442011: '港口镇', + 442012: '沙溪镇', + 442013: '板芙镇', + 442015: '东升镇', + 442016: '阜沙镇', + 442017: '民众镇', + 442018: '东区街道办事处', + 442019: '火炬开发区街道办事处', + 442020: '西区街道办事处', + 442021: '南区街道办事处', + 442022: '古镇镇', + 442023: '坦洲镇', + 442024: '大涌镇', + 442025: '南朗镇', + 445102: '湘桥区', + 445103: '潮安区', + 445122: '饶平县', + 445202: '榕城区', + 445203: '揭东区', + 445222: '揭西县', + 445224: '惠来县', + 445281: '普宁市', + 445302: '云城区', + 445303: '云安区', + 445321: '新兴县', + 445322: '郁南县', + 445381: '罗定市', + 450102: '兴宁区', + 450103: '青秀区', + 450105: '江南区', + 450107: '西乡塘区', + 450108: '良庆区', + 450109: '邕宁区', + 450110: '武鸣区', + 450123: '隆安县', + 450124: '马山县', + 450125: '上林县', + 450126: '宾阳县', + 450127: '横县', + 450202: '城中区', + 450203: '鱼峰区', + 450204: '柳南区', + 450205: '柳北区', + 450206: '柳江区', + 450222: '柳城县', + 450223: '鹿寨县', + 450224: '融安县', + 450225: '融水苗族自治县', + 450226: '三江侗族自治县', + 450302: '秀峰区', + 450303: '叠彩区', + 450304: '象山区', + 450305: '七星区', + 450311: '雁山区', + 450312: '临桂区', + 450321: '阳朔县', + 450323: '灵川县', + 450324: '全州县', + 450325: '兴安县', + 450326: '永福县', + 450327: '灌阳县', + 450328: '龙胜各族自治县', + 450329: '资源县', + 450330: '平乐县', + 450332: '恭城瑶族自治县', + 450381: '荔浦市', + 450403: '万秀区', + 450405: '长洲区', + 450406: '龙圩区', + 450421: '苍梧县', + 450422: '藤县', + 450423: '蒙山县', + 450481: '岑溪市', + 450502: '海城区', + 450503: '银海区', + 450512: '铁山港区', + 450521: '合浦县', + 450602: '港口区', + 450603: '防城区', + 450621: '上思县', + 450681: '东兴市', + 450702: '钦南区', + 450703: '钦北区', + 450721: '灵山县', + 450722: '浦北县', + 450802: '港北区', + 450803: '港南区', + 450804: '覃塘区', + 450821: '平南县', + 450881: '桂平市', + 450902: '玉州区', + 450903: '福绵区', + 450921: '容县', + 450922: '陆川县', + 450923: '博白县', + 450924: '兴业县', + 450981: '北流市', + 451002: '右江区', + 451021: '田阳县', + 451022: '田东县', + 451023: '平果县', + 451024: '德保县', + 451026: '那坡县', + 451027: '凌云县', + 451028: '乐业县', + 451029: '田林县', + 451030: '西林县', + 451031: '隆林各族自治县', + 451081: '靖西市', + 451102: '八步区', + 451103: '平桂区', + 451121: '昭平县', + 451122: '钟山县', + 451123: '富川瑶族自治县', + 451202: '金城江区', + 451203: '宜州区', + 451221: '南丹县', + 451222: '天峨县', + 451223: '凤山县', + 451224: '东兰县', + 451225: '罗城仫佬族自治县', + 451226: '环江毛南族自治县', + 451227: '巴马瑶族自治县', + 451228: '都安瑶族自治县', + 451229: '大化瑶族自治县', + 451302: '兴宾区', + 451321: '忻城县', + 451322: '象州县', + 451323: '武宣县', + 451324: '金秀瑶族自治县', + 451381: '合山市', + 451402: '江州区', + 451421: '扶绥县', + 451422: '宁明县', + 451423: '龙州县', + 451424: '大新县', + 451425: '天等县', + 451481: '凭祥市', + 460105: '秀英区', + 460106: '龙华区', + 460107: '琼山区', + 460108: '美兰区', + 460202: '海棠区', + 460203: '吉阳区', + 460204: '天涯区', + 460205: '崖州区', + 460321: '西沙群岛', + 460322: '南沙群岛', + 460323: '中沙群岛的岛礁及其海域', + 460401: '那大镇', + 460402: '和庆镇', + 460403: '南丰镇', + 460404: '大成镇', + 460405: '雅星镇', + 460406: '兰洋镇', + 460407: '光村镇', + 460408: '木棠镇', + 460409: '海头镇', + 460410: '峨蔓镇', + 460411: '王五镇', + 460412: '白马井镇', + 460413: '中和镇', + 460414: '排浦镇', + 460415: '东成镇', + 460416: '新州镇', + 460417: '洋浦经济开发区', + 460418: '华南热作学院', + 469001: '五指山市', + 469002: '琼海市', + 469005: '文昌市', + 469006: '万宁市', + 469007: '东方市', + 469021: '定安县', + 469022: '屯昌县', + 469023: '澄迈县', + 469024: '临高县', + 469025: '白沙黎族自治县', + 469026: '昌江黎族自治县', + 469027: '乐东黎族自治县', + 469028: '陵水黎族自治县', + 469029: '保亭黎族苗族自治县', + 469030: '琼中黎族苗族自治县', + 500101: '万州区', + 500102: '涪陵区', + 500103: '渝中区', + 500104: '大渡口区', + 500105: '江北区', + 500106: '沙坪坝区', + 500107: '九龙坡区', + 500108: '南岸区', + 500109: '北碚区', + 500110: '綦江区', + 500111: '大足区', + 500112: '渝北区', + 500113: '巴南区', + 500114: '黔江区', + 500115: '长寿区', + 500116: '江津区', + 500117: '合川区', + 500118: '永川区', + 500119: '南川区', + 500120: '璧山区', + 500151: '铜梁区', + 500152: '潼南区', + 500153: '荣昌区', + 500154: '开州区', + 500155: '梁平区', + 500156: '武隆区', + 500229: '城口县', + 500230: '丰都县', + 500231: '垫江县', + 500233: '忠县', + 500235: '云阳县', + 500236: '奉节县', + 500237: '巫山县', + 500238: '巫溪县', + 500240: '石柱土家族自治县', + 500241: '秀山土家族苗族自治县', + 500242: '酉阳土家族苗族自治县', + 500243: '彭水苗族土家族自治县', + 510104: '锦江区', + 510105: '青羊区', + 510106: '金牛区', + 510107: '武侯区', + 510108: '成华区', + 510112: '龙泉驿区', + 510113: '青白江区', + 510114: '新都区', + 510115: '温江区', + 510116: '双流区', + 510117: '郫都区', + 510121: '金堂县', + 510129: '大邑县', + 510131: '蒲江县', + 510132: '新津县', + 510181: '都江堰市', + 510182: '彭州市', + 510183: '邛崃市', + 510184: '崇州市', + 510185: '简阳市', + 510191: '高新区', + 510302: '自流井区', + 510303: '贡井区', + 510304: '大安区', + 510311: '沿滩区', + 510321: '荣县', + 510322: '富顺县', + 510402: '东区', + 510403: '西区', + 510411: '仁和区', + 510421: '米易县', + 510422: '盐边县', + 510502: '江阳区', + 510503: '纳溪区', + 510504: '龙马潭区', + 510521: '泸县', + 510522: '合江县', + 510524: '叙永县', + 510525: '古蔺县', + 510603: '旌阳区', + 510604: '罗江区', + 510623: '中江县', + 510681: '广汉市', + 510682: '什邡市', + 510683: '绵竹市', + 510703: '涪城区', + 510704: '游仙区', + 510705: '安州区', + 510722: '三台县', + 510723: '盐亭县', + 510725: '梓潼县', + 510726: '北川羌族自治县', + 510727: '平武县', + 510781: '江油市', + 510791: '高新区', + 510802: '利州区', + 510811: '昭化区', + 510812: '朝天区', + 510821: '旺苍县', + 510822: '青川县', + 510823: '剑阁县', + 510824: '苍溪县', + 510903: '船山区', + 510904: '安居区', + 510921: '蓬溪县', + 510922: '射洪县', + 510923: '大英县', + 511002: '市中区', + 511011: '东兴区', + 511024: '威远县', + 511025: '资中县', + 511083: '隆昌市', + 511102: '市中区', + 511111: '沙湾区', + 511112: '五通桥区', + 511113: '金口河区', + 511123: '犍为县', + 511124: '井研县', + 511126: '夹江县', + 511129: '沐川县', + 511132: '峨边彝族自治县', + 511133: '马边彝族自治县', + 511181: '峨眉山市', + 511302: '顺庆区', + 511303: '高坪区', + 511304: '嘉陵区', + 511321: '南部县', + 511322: '营山县', + 511323: '蓬安县', + 511324: '仪陇县', + 511325: '西充县', + 511381: '阆中市', + 511402: '东坡区', + 511403: '彭山区', + 511421: '仁寿县', + 511423: '洪雅县', + 511424: '丹棱县', + 511425: '青神县', + 511502: '翠屏区', + 511503: '南溪区', + 511504: '叙州区', + 511523: '江安县', + 511524: '长宁县', + 511525: '高县', + 511526: '珙县', + 511527: '筠连县', + 511528: '兴文县', + 511529: '屏山县', + 511602: '广安区', + 511603: '前锋区', + 511621: '岳池县', + 511622: '武胜县', + 511623: '邻水县', + 511681: '华蓥市', + 511702: '通川区', + 511703: '达川区', + 511722: '宣汉县', + 511723: '开江县', + 511724: '大竹县', + 511725: '渠县', + 511781: '万源市', + 511802: '雨城区', + 511803: '名山区', + 511822: '荥经县', + 511823: '汉源县', + 511824: '石棉县', + 511825: '天全县', + 511826: '芦山县', + 511827: '宝兴县', + 511902: '巴州区', + 511903: '恩阳区', + 511921: '通江县', + 511922: '南江县', + 511923: '平昌县', + 512002: '雁江区', + 512021: '安岳县', + 512022: '乐至县', + 513201: '马尔康市', + 513221: '汶川县', + 513222: '理县', + 513223: '茂县', + 513224: '松潘县', + 513225: '九寨沟县', + 513226: '金川县', + 513227: '小金县', + 513228: '黑水县', + 513230: '壤塘县', + 513231: '阿坝县', + 513232: '若尔盖县', + 513233: '红原县', + 513301: '康定市', + 513322: '泸定县', + 513323: '丹巴县', + 513324: '九龙县', + 513325: '雅江县', + 513326: '道孚县', + 513327: '炉霍县', + 513328: '甘孜县', + 513329: '新龙县', + 513330: '德格县', + 513331: '白玉县', + 513332: '石渠县', + 513333: '色达县', + 513334: '理塘县', + 513335: '巴塘县', + 513336: '乡城县', + 513337: '稻城县', + 513338: '得荣县', + 513401: '西昌市', + 513422: '木里藏族自治县', + 513423: '盐源县', + 513424: '德昌县', + 513425: '会理县', + 513426: '会东县', + 513427: '宁南县', + 513428: '普格县', + 513429: '布拖县', + 513430: '金阳县', + 513431: '昭觉县', + 513432: '喜德县', + 513433: '冕宁县', + 513434: '越西县', + 513435: '甘洛县', + 513436: '美姑县', + 513437: '雷波县', + 520102: '南明区', + 520103: '云岩区', + 520111: '花溪区', + 520112: '乌当区', + 520113: '白云区', + 520115: '观山湖区', + 520121: '开阳县', + 520122: '息烽县', + 520123: '修文县', + 520181: '清镇市', + 520201: '钟山区', + 520203: '六枝特区', + 520221: '水城县', + 520281: '盘州市', + 520302: '红花岗区', + 520303: '汇川区', + 520304: '播州区', + 520322: '桐梓县', + 520323: '绥阳县', + 520324: '正安县', + 520325: '道真仡佬族苗族自治县', + 520326: '务川仡佬族苗族自治县', + 520327: '凤冈县', + 520328: '湄潭县', + 520329: '余庆县', + 520330: '习水县', + 520381: '赤水市', + 520382: '仁怀市', + 520402: '西秀区', + 520403: '平坝区', + 520422: '普定县', + 520423: '镇宁布依族苗族自治县', + 520424: '关岭布依族苗族自治县', + 520425: '紫云苗族布依族自治县', + 520502: '七星关区', + 520521: '大方县', + 520522: '黔西县', + 520523: '金沙县', + 520524: '织金县', + 520525: '纳雍县', + 520526: '威宁彝族回族苗族自治县', + 520527: '赫章县', + 520602: '碧江区', + 520603: '万山区', + 520621: '江口县', + 520622: '玉屏侗族自治县', + 520623: '石阡县', + 520624: '思南县', + 520625: '印江土家族苗族自治县', + 520626: '德江县', + 520627: '沿河土家族自治县', + 520628: '松桃苗族自治县', + 522301: '兴义市', + 522302: '兴仁市', + 522323: '普安县', + 522324: '晴隆县', + 522325: '贞丰县', + 522326: '望谟县', + 522327: '册亨县', + 522328: '安龙县', + 522601: '凯里市', + 522622: '黄平县', + 522623: '施秉县', + 522624: '三穗县', + 522625: '镇远县', + 522626: '岑巩县', + 522627: '天柱县', + 522628: '锦屏县', + 522629: '剑河县', + 522630: '台江县', + 522631: '黎平县', + 522632: '榕江县', + 522633: '从江县', + 522634: '雷山县', + 522635: '麻江县', + 522636: '丹寨县', + 522701: '都匀市', + 522702: '福泉市', + 522722: '荔波县', + 522723: '贵定县', + 522725: '瓮安县', + 522726: '独山县', + 522727: '平塘县', + 522728: '罗甸县', + 522729: '长顺县', + 522730: '龙里县', + 522731: '惠水县', + 522732: '三都水族自治县', + 530102: '五华区', + 530103: '盘龙区', + 530111: '官渡区', + 530112: '西山区', + 530113: '东川区', + 530114: '呈贡区', + 530115: '晋宁区', + 530124: '富民县', + 530125: '宜良县', + 530126: '石林彝族自治县', + 530127: '嵩明县', + 530128: '禄劝彝族苗族自治县', + 530129: '寻甸回族彝族自治县', + 530181: '安宁市', + 530302: '麒麟区', + 530303: '沾益区', + 530304: '马龙区', + 530322: '陆良县', + 530323: '师宗县', + 530324: '罗平县', + 530325: '富源县', + 530326: '会泽县', + 530381: '宣威市', + 530402: '红塔区', + 530403: '江川区', + 530422: '澄江县', + 530423: '通海县', + 530424: '华宁县', + 530425: '易门县', + 530426: '峨山彝族自治县', + 530427: '新平彝族傣族自治县', + 530428: '元江哈尼族彝族傣族自治县', + 530502: '隆阳区', + 530521: '施甸县', + 530523: '龙陵县', + 530524: '昌宁县', + 530581: '腾冲市', + 530602: '昭阳区', + 530621: '鲁甸县', + 530622: '巧家县', + 530623: '盐津县', + 530624: '大关县', + 530625: '永善县', + 530626: '绥江县', + 530627: '镇雄县', + 530628: '彝良县', + 530629: '威信县', + 530681: '水富市', + 530702: '古城区', + 530721: '玉龙纳西族自治县', + 530722: '永胜县', + 530723: '华坪县', + 530724: '宁蒗彝族自治县', + 530802: '思茅区', + 530821: '宁洱哈尼族彝族自治县', + 530822: '墨江哈尼族自治县', + 530823: '景东彝族自治县', + 530824: '景谷傣族彝族自治县', + 530825: '镇沅彝族哈尼族拉祜族自治县', + 530826: '江城哈尼族彝族自治县', + 530827: '孟连傣族拉祜族佤族自治县', + 530828: '澜沧拉祜族自治县', + 530829: '西盟佤族自治县', + 530902: '临翔区', + 530921: '凤庆县', + 530922: '云县', + 530923: '永德县', + 530924: '镇康县', + 530925: '双江拉祜族佤族布朗族傣族自治县', + 530926: '耿马傣族佤族自治县', + 530927: '沧源佤族自治县', + 532301: '楚雄市', + 532322: '双柏县', + 532323: '牟定县', + 532324: '南华县', + 532325: '姚安县', + 532326: '大姚县', + 532327: '永仁县', + 532328: '元谋县', + 532329: '武定县', + 532331: '禄丰县', + 532501: '个旧市', + 532502: '开远市', + 532503: '蒙自市', + 532504: '弥勒市', + 532523: '屏边苗族自治县', + 532524: '建水县', + 532525: '石屏县', + 532527: '泸西县', + 532528: '元阳县', + 532529: '红河县', + 532530: '金平苗族瑶族傣族自治县', + 532531: '绿春县', + 532532: '河口瑶族自治县', + 532601: '文山市', + 532622: '砚山县', + 532623: '西畴县', + 532624: '麻栗坡县', + 532625: '马关县', + 532626: '丘北县', + 532627: '广南县', + 532628: '富宁县', + 532801: '景洪市', + 532822: '勐海县', + 532823: '勐腊县', + 532901: '大理市', + 532922: '漾濞彝族自治县', + 532923: '祥云县', + 532924: '宾川县', + 532925: '弥渡县', + 532926: '南涧彝族自治县', + 532927: '巍山彝族回族自治县', + 532928: '永平县', + 532929: '云龙县', + 532930: '洱源县', + 532931: '剑川县', + 532932: '鹤庆县', + 533102: '瑞丽市', + 533103: '芒市', + 533122: '梁河县', + 533123: '盈江县', + 533124: '陇川县', + 533301: '泸水市', + 533323: '福贡县', + 533324: '贡山独龙族怒族自治县', + 533325: '兰坪白族普米族自治县', + 533401: '香格里拉市', + 533422: '德钦县', + 533423: '维西傈僳族自治县', + 540102: '城关区', + 540103: '堆龙德庆区', + 540104: '达孜区', + 540121: '林周县', + 540122: '当雄县', + 540123: '尼木县', + 540124: '曲水县', + 540127: '墨竹工卡县', + 540202: '桑珠孜区', + 540221: '南木林县', + 540222: '江孜县', + 540223: '定日县', + 540224: '萨迦县', + 540225: '拉孜县', + 540226: '昂仁县', + 540227: '谢通门县', + 540228: '白朗县', + 540229: '仁布县', + 540230: '康马县', + 540231: '定结县', + 540232: '仲巴县', + 540233: '亚东县', + 540234: '吉隆县', + 540235: '聂拉木县', + 540236: '萨嘎县', + 540237: '岗巴县', + 540302: '卡若区', + 540321: '江达县', + 540322: '贡觉县', + 540323: '类乌齐县', + 540324: '丁青县', + 540325: '察雅县', + 540326: '八宿县', + 540327: '左贡县', + 540328: '芒康县', + 540329: '洛隆县', + 540330: '边坝县', + 540402: '巴宜区', + 540421: '工布江达县', + 540422: '米林县', + 540423: '墨脱县', + 540424: '波密县', + 540425: '察隅县', + 540426: '朗县', + 540502: '乃东区', + 540521: '扎囊县', + 540522: '贡嘎县', + 540523: '桑日县', + 540524: '琼结县', + 540525: '曲松县', + 540526: '措美县', + 540527: '洛扎县', + 540528: '加查县', + 540529: '隆子县', + 540530: '错那县', + 540531: '浪卡子县', + 540602: '色尼区', + 540621: '嘉黎县', + 540622: '比如县', + 540623: '聂荣县', + 540624: '安多县', + 540625: '申扎县', + 540626: '索县', + 540627: '班戈县', + 540628: '巴青县', + 540629: '尼玛县', + 540630: '双湖县', + 542521: '普兰县', + 542522: '札达县', + 542523: '噶尔县', + 542524: '日土县', + 542525: '革吉县', + 542526: '改则县', + 542527: '措勤县', + 610102: '新城区', + 610103: '碑林区', + 610104: '莲湖区', + 610111: '灞桥区', + 610112: '未央区', + 610113: '雁塔区', + 610114: '阎良区', + 610115: '临潼区', + 610116: '长安区', + 610117: '高陵区', + 610118: '鄠邑区', + 610122: '蓝田县', + 610124: '周至县', + 610202: '王益区', + 610203: '印台区', + 610204: '耀州区', + 610222: '宜君县', + 610302: '渭滨区', + 610303: '金台区', + 610304: '陈仓区', + 610322: '凤翔县', + 610323: '岐山县', + 610324: '扶风县', + 610326: '眉县', + 610327: '陇县', + 610328: '千阳县', + 610329: '麟游县', + 610330: '凤县', + 610331: '太白县', + 610402: '秦都区', + 610403: '杨陵区', + 610404: '渭城区', + 610422: '三原县', + 610423: '泾阳县', + 610424: '乾县', + 610425: '礼泉县', + 610426: '永寿县', + 610428: '长武县', + 610429: '旬邑县', + 610430: '淳化县', + 610431: '武功县', + 610481: '兴平市', + 610482: '彬州市', + 610502: '临渭区', + 610503: '华州区', + 610522: '潼关县', + 610523: '大荔县', + 610524: '合阳县', + 610525: '澄城县', + 610526: '蒲城县', + 610527: '白水县', + 610528: '富平县', + 610581: '韩城市', + 610582: '华阴市', + 610602: '宝塔区', + 610603: '安塞区', + 610621: '延长县', + 610622: '延川县', + 610623: '子长县', + 610625: '志丹县', + 610626: '吴起县', + 610627: '甘泉县', + 610628: '富县', + 610629: '洛川县', + 610630: '宜川县', + 610631: '黄龙县', + 610632: '黄陵县', + 610702: '汉台区', + 610703: '南郑区', + 610722: '城固县', + 610723: '洋县', + 610724: '西乡县', + 610725: '勉县', + 610726: '宁强县', + 610727: '略阳县', + 610728: '镇巴县', + 610729: '留坝县', + 610730: '佛坪县', + 610802: '榆阳区', + 610803: '横山区', + 610822: '府谷县', + 610824: '靖边县', + 610825: '定边县', + 610826: '绥德县', + 610827: '米脂县', + 610828: '佳县', + 610829: '吴堡县', + 610830: '清涧县', + 610831: '子洲县', + 610881: '神木市', + 610902: '汉滨区', + 610921: '汉阴县', + 610922: '石泉县', + 610923: '宁陕县', + 610924: '紫阳县', + 610925: '岚皋县', + 610926: '平利县', + 610927: '镇坪县', + 610928: '旬阳县', + 610929: '白河县', + 611002: '商州区', + 611021: '洛南县', + 611022: '丹凤县', + 611023: '商南县', + 611024: '山阳县', + 611025: '镇安县', + 611026: '柞水县', + 620102: '城关区', + 620103: '七里河区', + 620104: '西固区', + 620105: '安宁区', + 620111: '红古区', + 620121: '永登县', + 620122: '皋兰县', + 620123: '榆中县', + 620201: '市辖区', + 620290: '雄关区', + 620291: '长城区', + 620292: '镜铁区', + 620293: '新城镇', + 620294: '峪泉镇', + 620295: '文殊镇', + 620302: '金川区', + 620321: '永昌县', + 620402: '白银区', + 620403: '平川区', + 620421: '靖远县', + 620422: '会宁县', + 620423: '景泰县', + 620502: '秦州区', + 620503: '麦积区', + 620521: '清水县', + 620522: '秦安县', + 620523: '甘谷县', + 620524: '武山县', + 620525: '张家川回族自治县', + 620602: '凉州区', + 620621: '民勤县', + 620622: '古浪县', + 620623: '天祝藏族自治县', + 620702: '甘州区', + 620721: '肃南裕固族自治县', + 620722: '民乐县', + 620723: '临泽县', + 620724: '高台县', + 620725: '山丹县', + 620802: '崆峒区', + 620821: '泾川县', + 620822: '灵台县', + 620823: '崇信县', + 620825: '庄浪县', + 620826: '静宁县', + 620881: '华亭市', + 620902: '肃州区', + 620921: '金塔县', + 620922: '瓜州县', + 620923: '肃北蒙古族自治县', + 620924: '阿克塞哈萨克族自治县', + 620981: '玉门市', + 620982: '敦煌市', + 621002: '西峰区', + 621021: '庆城县', + 621022: '环县', + 621023: '华池县', + 621024: '合水县', + 621025: '正宁县', + 621026: '宁县', + 621027: '镇原县', + 621102: '安定区', + 621121: '通渭县', + 621122: '陇西县', + 621123: '渭源县', + 621124: '临洮县', + 621125: '漳县', + 621126: '岷县', + 621202: '武都区', + 621221: '成县', + 621222: '文县', + 621223: '宕昌县', + 621224: '康县', + 621225: '西和县', + 621226: '礼县', + 621227: '徽县', + 621228: '两当县', + 622901: '临夏市', + 622921: '临夏县', + 622922: '康乐县', + 622923: '永靖县', + 622924: '广河县', + 622925: '和政县', + 622926: '东乡族自治县', + 622927: '积石山保安族东乡族撒拉族自治县', + 623001: '合作市', + 623021: '临潭县', + 623022: '卓尼县', + 623023: '舟曲县', + 623024: '迭部县', + 623025: '玛曲县', + 623026: '碌曲县', + 623027: '夏河县', + 630102: '城东区', + 630103: '城中区', + 630104: '城西区', + 630105: '城北区', + 630121: '大通回族土族自治县', + 630122: '湟中县', + 630123: '湟源县', + 630202: '乐都区', + 630203: '平安区', + 630222: '民和回族土族自治县', + 630223: '互助土族自治县', + 630224: '化隆回族自治县', + 630225: '循化撒拉族自治县', + 632221: '门源回族自治县', + 632222: '祁连县', + 632223: '海晏县', + 632224: '刚察县', + 632321: '同仁县', + 632322: '尖扎县', + 632323: '泽库县', + 632324: '河南蒙古族自治县', + 632521: '共和县', + 632522: '同德县', + 632523: '贵德县', + 632524: '兴海县', + 632525: '贵南县', + 632621: '玛沁县', + 632622: '班玛县', + 632623: '甘德县', + 632624: '达日县', + 632625: '久治县', + 632626: '玛多县', + 632701: '玉树市', + 632722: '杂多县', + 632723: '称多县', + 632724: '治多县', + 632725: '囊谦县', + 632726: '曲麻莱县', + 632801: '格尔木市', + 632802: '德令哈市', + 632803: '茫崖市', + 632821: '乌兰县', + 632822: '都兰县', + 632823: '天峻县', + 640104: '兴庆区', + 640105: '西夏区', + 640106: '金凤区', + 640121: '永宁县', + 640122: '贺兰县', + 640181: '灵武市', + 640202: '大武口区', + 640205: '惠农区', + 640221: '平罗县', + 640302: '利通区', + 640303: '红寺堡区', + 640323: '盐池县', + 640324: '同心县', + 640381: '青铜峡市', + 640402: '原州区', + 640422: '西吉县', + 640423: '隆德县', + 640424: '泾源县', + 640425: '彭阳县', + 640502: '沙坡头区', + 640521: '中宁县', + 640522: '海原县', + 650102: '天山区', + 650103: '沙依巴克区', + 650104: '新市区', + 650105: '水磨沟区', + 650106: '头屯河区', + 650107: '达坂城区', + 650109: '米东区', + 650121: '乌鲁木齐县', + 650202: '独山子区', + 650203: '克拉玛依区', + 650204: '白碱滩区', + 650205: '乌尔禾区', + 650402: '高昌区', + 650421: '鄯善县', + 650422: '托克逊县', + 650502: '伊州区', + 650521: '巴里坤哈萨克自治县', + 650522: '伊吾县', + 652301: '昌吉市', + 652302: '阜康市', + 652323: '呼图壁县', + 652324: '玛纳斯县', + 652325: '奇台县', + 652327: '吉木萨尔县', + 652328: '木垒哈萨克自治县', + 652701: '博乐市', + 652702: '阿拉山口市', + 652722: '精河县', + 652723: '温泉县', + 652801: '库尔勒市', + 652822: '轮台县', + 652823: '尉犁县', + 652824: '若羌县', + 652825: '且末县', + 652826: '焉耆回族自治县', + 652827: '和静县', + 652828: '和硕县', + 652829: '博湖县', + 652901: '阿克苏市', + 652922: '温宿县', + 652923: '库车县', + 652924: '沙雅县', + 652925: '新和县', + 652926: '拜城县', + 652927: '乌什县', + 652928: '阿瓦提县', + 652929: '柯坪县', + 653001: '阿图什市', + 653022: '阿克陶县', + 653023: '阿合奇县', + 653024: '乌恰县', + 653101: '喀什市', + 653121: '疏附县', + 653122: '疏勒县', + 653123: '英吉沙县', + 653124: '泽普县', + 653125: '莎车县', + 653126: '叶城县', + 653127: '麦盖提县', + 653128: '岳普湖县', + 653129: '伽师县', + 653130: '巴楚县', + 653131: '塔什库尔干塔吉克自治县', + 653201: '和田市', + 653221: '和田县', + 653222: '墨玉县', + 653223: '皮山县', + 653224: '洛浦县', + 653225: '策勒县', + 653226: '于田县', + 653227: '民丰县', + 654002: '伊宁市', + 654003: '奎屯市', + 654004: '霍尔果斯市', + 654021: '伊宁县', + 654022: '察布查尔锡伯自治县', + 654023: '霍城县', + 654024: '巩留县', + 654025: '新源县', + 654026: '昭苏县', + 654027: '特克斯县', + 654028: '尼勒克县', + 654201: '塔城市', + 654202: '乌苏市', + 654221: '额敏县', + 654223: '沙湾县', + 654224: '托里县', + 654225: '裕民县', + 654226: '和布克赛尔蒙古自治县', + 654301: '阿勒泰市', + 654321: '布尔津县', + 654322: '富蕴县', + 654323: '福海县', + 654324: '哈巴河县', + 654325: '青河县', + 654326: '吉木乃县', + 659001: '石河子市', + 659002: '阿拉尔市', + 659003: '图木舒克市', + 659004: '五家渠市', + 659005: '北屯市', + 659006: '铁门关市', + 659007: '双河市', + 659008: '可克达拉市', + 659009: '昆玉市', + 710101: '中正区', + 710102: '大同区', + 710103: '中山区', + 710104: '松山区', + 710105: '大安区', + 710106: '万华区', + 710107: '信义区', + 710108: '士林区', + 710109: '北投区', + 710110: '内湖区', + 710111: '南港区', + 710112: '文山区', + 710199: '其它区', + 710201: '新兴区', + 710202: '前金区', + 710203: '芩雅区', + 710204: '盐埕区', + 710205: '鼓山区', + 710206: '旗津区', + 710207: '前镇区', + 710208: '三民区', + 710209: '左营区', + 710210: '楠梓区', + 710211: '小港区', + 710241: '苓雅区', + 710242: '仁武区', + 710243: '大社区', + 710244: '冈山区', + 710245: '路竹区', + 710246: '阿莲区', + 710247: '田寮区', + 710248: '燕巢区', + 710249: '桥头区', + 710250: '梓官区', + 710251: '弥陀区', + 710252: '永安区', + 710253: '湖内区', + 710254: '凤山区', + 710255: '大寮区', + 710256: '林园区', + 710257: '鸟松区', + 710258: '大树区', + 710259: '旗山区', + 710260: '美浓区', + 710261: '六龟区', + 710262: '内门区', + 710263: '杉林区', + 710264: '甲仙区', + 710265: '桃源区', + 710266: '那玛夏区', + 710267: '茂林区', + 710268: '茄萣区', + 710299: '其它区', + 710301: '中西区', + 710302: '东区', + 710303: '南区', + 710304: '北区', + 710305: '安平区', + 710306: '安南区', + 710339: '永康区', + 710340: '归仁区', + 710341: '新化区', + 710342: '左镇区', + 710343: '玉井区', + 710344: '楠西区', + 710345: '南化区', + 710346: '仁德区', + 710347: '关庙区', + 710348: '龙崎区', + 710349: '官田区', + 710350: '麻豆区', + 710351: '佳里区', + 710352: '西港区', + 710353: '七股区', + 710354: '将军区', + 710355: '学甲区', + 710356: '北门区', + 710357: '新营区', + 710358: '后壁区', + 710359: '白河区', + 710360: '东山区', + 710361: '六甲区', + 710362: '下营区', + 710363: '柳营区', + 710364: '盐水区', + 710365: '善化区', + 710366: '大内区', + 710367: '山上区', + 710368: '新市区', + 710369: '安定区', + 710399: '其它区', + 710401: '中区', + 710402: '东区', + 710403: '南区', + 710404: '西区', + 710405: '北区', + 710406: '北屯区', + 710407: '西屯区', + 710408: '南屯区', + 710431: '太平区', + 710432: '大里区', + 710433: '雾峰区', + 710434: '乌日区', + 710435: '丰原区', + 710436: '后里区', + 710437: '石冈区', + 710438: '东势区', + 710439: '和平区', + 710440: '新社区', + 710441: '潭子区', + 710442: '大雅区', + 710443: '神冈区', + 710444: '大肚区', + 710445: '沙鹿区', + 710446: '龙井区', + 710447: '梧栖区', + 710448: '清水区', + 710449: '大甲区', + 710450: '外埔区', + 710451: '大安区', + 710499: '其它区', + 710507: '金沙镇', + 710508: '金湖镇', + 710509: '金宁乡', + 710510: '金城镇', + 710511: '烈屿乡', + 710512: '乌坵乡', + 710614: '南投市', + 710615: '中寮乡', + 710616: '草屯镇', + 710617: '国姓乡', + 710618: '埔里镇', + 710619: '仁爱乡', + 710620: '名间乡', + 710621: '集集镇', + 710622: '水里乡', + 710623: '鱼池乡', + 710624: '信义乡', + 710625: '竹山镇', + 710626: '鹿谷乡', + 710701: '仁爱区', + 710702: '信义区', + 710703: '中正区', + 710704: '中山区', + 710705: '安乐区', + 710706: '暖暖区', + 710707: '七堵区', + 710799: '其它区', + 710801: '东区', + 710802: '北区', + 710803: '香山区', + 710899: '其它区', + 710901: '东区', + 710902: '西区', + 710999: '其它区', + 711130: '万里区', + 711132: '板桥区', + 711133: '汐止区', + 711134: '深坑区', + 711135: '石碇区', + 711136: '瑞芳区', + 711137: '平溪区', + 711138: '双溪区', + 711139: '贡寮区', + 711140: '新店区', + 711141: '坪林区', + 711142: '乌来区', + 711143: '永和区', + 711144: '中和区', + 711145: '土城区', + 711146: '三峡区', + 711147: '树林区', + 711148: '莺歌区', + 711149: '三重区', + 711150: '新庄区', + 711151: '泰山区', + 711152: '林口区', + 711153: '芦洲区', + 711154: '五股区', + 711155: '八里区', + 711156: '淡水区', + 711157: '三芝区', + 711158: '石门区', + 711287: '宜兰市', + 711288: '头城镇', + 711289: '礁溪乡', + 711290: '壮围乡', + 711291: '员山乡', + 711292: '罗东镇', + 711293: '三星乡', + 711294: '大同乡', + 711295: '五结乡', + 711296: '冬山乡', + 711297: '苏澳镇', + 711298: '南澳乡', + 711299: '钓鱼台', + 711387: '竹北市', + 711388: '湖口乡', + 711389: '新丰乡', + 711390: '新埔镇', + 711391: '关西镇', + 711392: '芎林乡', + 711393: '宝山乡', + 711394: '竹东镇', + 711395: '五峰乡', + 711396: '横山乡', + 711397: '尖石乡', + 711398: '北埔乡', + 711399: '峨眉乡', + 711414: '中坜区', + 711415: '平镇区', + 711417: '杨梅区', + 711418: '新屋区', + 711419: '观音区', + 711420: '桃园区', + 711421: '龟山区', + 711422: '八德区', + 711423: '大溪区', + 711425: '大园区', + 711426: '芦竹区', + 711487: '中坜市', + 711488: '平镇市', + 711489: '龙潭乡', + 711490: '杨梅市', + 711491: '新屋乡', + 711492: '观音乡', + 711493: '桃园市', + 711494: '龟山乡', + 711495: '八德市', + 711496: '大溪镇', + 711497: '复兴乡', + 711498: '大园乡', + 711499: '芦竹乡', + 711520: '头份市', + 711582: '竹南镇', + 711583: '头份镇', + 711584: '三湾乡', + 711585: '南庄乡', + 711586: '狮潭乡', + 711587: '后龙镇', + 711588: '通霄镇', + 711589: '苑里镇', + 711590: '苗栗市', + 711591: '造桥乡', + 711592: '头屋乡', + 711593: '公馆乡', + 711594: '大湖乡', + 711595: '泰安乡', + 711596: '铜锣乡', + 711597: '三义乡', + 711598: '西湖乡', + 711599: '卓兰镇', + 711736: '员林市', + 711774: '彰化市', + 711775: '芬园乡', + 711776: '花坛乡', + 711777: '秀水乡', + 711778: '鹿港镇', + 711779: '福兴乡', + 711780: '线西乡', + 711781: '和美镇', + 711782: '伸港乡', + 711783: '员林镇', + 711784: '社头乡', + 711785: '永靖乡', + 711786: '埔心乡', + 711787: '溪湖镇', + 711788: '大村乡', + 711789: '埔盐乡', + 711790: '田中镇', + 711791: '北斗镇', + 711792: '田尾乡', + 711793: '埤头乡', + 711794: '溪州乡', + 711795: '竹塘乡', + 711796: '二林镇', + 711797: '大城乡', + 711798: '芳苑乡', + 711799: '二水乡', + 711982: '番路乡', + 711983: '梅山乡', + 711984: '竹崎乡', + 711985: '阿里山乡', + 711986: '中埔乡', + 711987: '大埔乡', + 711988: '水上乡', + 711989: '鹿草乡', + 711990: '太保市', + 711991: '朴子市', + 711992: '东石乡', + 711993: '六脚乡', + 711994: '新港乡', + 711995: '民雄乡', + 711996: '大林镇', + 711997: '溪口乡', + 711998: '义竹乡', + 711999: '布袋镇', + 712180: '斗南镇', + 712181: '大埤乡', + 712182: '虎尾镇', + 712183: '土库镇', + 712184: '褒忠乡', + 712185: '东势乡', + 712186: '台西乡', + 712187: '仑背乡', + 712188: '麦寮乡', + 712189: '斗六市', + 712190: '林内乡', + 712191: '古坑乡', + 712192: '莿桐乡', + 712193: '西螺镇', + 712194: '二仑乡', + 712195: '北港镇', + 712196: '水林乡', + 712197: '口湖乡', + 712198: '四湖乡', + 712199: '元长乡', + 712451: '崁顶乡', + 712467: '屏东市', + 712468: '三地门乡', + 712469: '雾台乡', + 712470: '玛家乡', + 712471: '九如乡', + 712472: '里港乡', + 712473: '高树乡', + 712474: '盐埔乡', + 712475: '长治乡', + 712476: '麟洛乡', + 712477: '竹田乡', + 712478: '内埔乡', + 712479: '万丹乡', + 712480: '潮州镇', + 712481: '泰武乡', + 712482: '来义乡', + 712483: '万峦乡', + 712484: '莰顶乡', + 712485: '新埤乡', + 712486: '南州乡', + 712487: '林边乡', + 712488: '东港镇', + 712489: '琉球乡', + 712490: '佳冬乡', + 712491: '新园乡', + 712492: '枋寮乡', + 712493: '枋山乡', + 712494: '春日乡', + 712495: '狮子乡', + 712496: '车城乡', + 712497: '牡丹乡', + 712498: '恒春镇', + 712499: '满州乡', + 712584: '台东市', + 712585: '绿岛乡', + 712586: '兰屿乡', + 712587: '延平乡', + 712588: '卑南乡', + 712589: '鹿野乡', + 712590: '关山镇', + 712591: '海端乡', + 712592: '池上乡', + 712593: '东河乡', + 712594: '成功镇', + 712595: '长滨乡', + 712596: '金峰乡', + 712597: '大武乡', + 712598: '达仁乡', + 712599: '太麻里乡', + 712686: '花莲市', + 712687: '新城乡', + 712688: '太鲁阁', + 712689: '秀林乡', + 712690: '吉安乡', + 712691: '寿丰乡', + 712692: '凤林镇', + 712693: '光复乡', + 712694: '丰滨乡', + 712695: '瑞穗乡', + 712696: '万荣乡', + 712697: '玉里镇', + 712698: '卓溪乡', + 712699: '富里乡', + 712794: '马公市', + 712795: '西屿乡', + 712796: '望安乡', + 712797: '七美乡', + 712798: '白沙乡', + 712799: '湖西乡', + 712896: '南竿乡', + 712897: '北竿乡', + 712898: '东引乡', + 712899: '莒光乡', + 810101: '中西区', + 810102: '湾仔区', + 810103: '东区', + 810104: '南区', + 810201: '九龙城区', + 810202: '油尖旺区', + 810203: '深水埗区', + 810204: '黄大仙区', + 810205: '观塘区', + 810301: '北区', + 810302: '大埔区', + 810303: '沙田区', + 810304: '西贡区', + 810305: '元朗区', + 810306: '屯门区', + 810307: '荃湾区', + 810308: '葵青区', + 810309: '离岛区', + 820102: '花地玛堂区', + 820103: '花王堂区', + 820104: '望德堂区', + 820105: '大堂区', + 820106: '风顺堂区', + 820202: '嘉模堂区', + 820203: '路氹填海区', + 820204: '圣方济各堂区' + } +}; diff --git a/smart-admin-h5/src/constants/file.js b/smart-admin-h5/src/constants/file.js new file mode 100644 index 00000000..cc72166b --- /dev/null +++ b/smart-admin-h5/src/constants/file.js @@ -0,0 +1,92 @@ +export const COMMON_FILE_FOLDER_TYPE_ENUM = { + DISPLAY_PIC: { + value: 1, + desc: '轮播展示图' + }, + RESOURCE_LECTURER: { + value: 2, + desc: '资源-讲师图片' + }, + RESOURCE_FILE: { + value: 3, + desc: '资源-文件资源' + }, + USER_AVATAR: { + value: 4, + desc: '用户头像' + }, + STOCK_BASIC: { + value: 5, + desc: '货物基本信息图片' + }, + PUBLICATION_QR_CODE: { + value: 6, + desc: '出版物二维码图片' + }, + RESOURCE_PAGE_QR_CODE: { + value: 7, + desc: '资源页面链接二维码图片' + }, + FINANCE_RECEIVE_QR_CODE: { + value: 8, + desc: '财务收款二维码' + }, + FINANCE_WX_PAY_CERT: { + value: 9, + desc: '财务-微信支付证书' + }, + GOODS: { + value: 10, + desc: '商品图片-公用文件夹' + }, + EXCEL_EXPORT: { + value: 11, + desc: 'excel导出-私有文件夹' + }, + FINANCE_WAIT_PAYMENT_PAYMENT_PROOF: { + value: 12, + desc: '财务待支付支付凭证' + }, + FEEDBACK: { + value: 99, + desc: '用户反馈图片' + }, + EDITOR: { + value: 100, + desc: '文本编辑器' + }, + EDITOR_IMG: { + value: 100, + desc: '文本编辑器' + }, + INTERNAL_INFORMATION: { + value: 14, + desc: '内部资料' + }, + CRM_USER: { + value: 111, + desc: 'CRM学员跟进附件' + }, + CRM_SCHOOL: { + value: 112, + desc: 'CRM分校跟进附件' + }, + // = =======erp 相关 begin============ + ERP_STOCK_IMG: { + value: 201, + desc: '货物图片' + }, + ERP_CONTACT_COMPANY_RECEIVE_IMAGE: { + value: 210, + desc: '往来单位收款二维码' + }, + ERP_CONTACT_COMPANY_ATTACHMENT: { + value: 211, + desc: '往来单位附件' + } + // = =======erp 相关 end ============ +}; + +export default { + COMMON_FILE_FOLDER_TYPE_ENUM +}; diff --git a/smart-admin-h5/src/constants/index.js b/smart-admin-h5/src/constants/index.js new file mode 100644 index 00000000..fe01d2fd --- /dev/null +++ b/smart-admin-h5/src/constants/index.js @@ -0,0 +1,5 @@ +import file from './file'; + +export default { + ...file, +}; diff --git a/smart-admin-h5/src/filters/filter.js b/smart-admin-h5/src/filters/filter.js new file mode 100644 index 00000000..5bb102f2 --- /dev/null +++ b/smart-admin-h5/src/filters/filter.js @@ -0,0 +1,298 @@ +import Vue from 'vue'; + +function ellipsis(value, length) { + if (!value) return ''; + if (value.length > length) { + return value.slice(0, length) + '...'; + } + return value; +} + +/** + * 去除空格 type 1-所有空格 2-前后空格 3-前空格 4-后空格 + */ +function trim(value, trim) { + switch (trim) { + case 1: + return value.replace(/\s+/g, ''); + case 2: + return value.replace(/(^\s*)|(\s*$)/g, ''); + case 3: + return value.replace(/(^\s*)/g, ''); + case 4: + return value.replace(/(\s*$)/g, ''); + default: + return value; + } +} + +/** + * 任意格式日期处理 + 使用格式: + {{ '2018-09-14 01:05' | formatDate(yyyy-MM-dd hh:mm:ss) }} + {{ '2018-09-14 01:05' | formatDate(yyyy-MM-dd) }} + {{ '2018-09-14 01:05' | formatDate(MM/dd) }} 等 + + * @param value + * @param fmt + * @returns {*} + */ +function formatDate(value, fmt) { + var date = new Date(value); + var o = { + 'M+': date.getMonth() + 1, // 月份 + 'd+': date.getDate(), // 日 + 'h+': date.getHours(), // 小时 + 'm+': date.getMinutes(), // 分 + 's+': date.getSeconds(), // 秒 + 'w+': date.getDay(), // 星期 + 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度 + 'S': date.getMilliseconds() // 毫秒 + }; + if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); + for (var k in o) { + if (k === 'w+') { + if (o[k] === 0) { + fmt = fmt.replace('w', '周日'); + } else if (o[k] === 1) { + fmt = fmt.replace('w', '周一'); + } else if (o[k] === 2) { + fmt = fmt.replace('w', '周二'); + } else if (o[k] === 3) { + fmt = fmt.replace('w', '周三'); + } else if (o[k] === 4) { + fmt = fmt.replace('w', '周四'); + } else if (o[k] === 5) { + fmt = fmt.replace('w', '周五'); + } else if (o[k] === 6) { + fmt = fmt.replace('w', '周六'); + } + } else if (new RegExp('(' + k + ')').test(fmt)) { + fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))); + } + } + return fmt; +} + +/** + * 字母大小写切换 + type + 1:首字母大写 + 2:首页母小写 + 3:大小写转换 + 4:全部大写 + 5:全部小写 + * @param str + * @param type + * @returns {string|*} + */ +function changeCase(str, type) { + function ToggleCase(str) { + var itemText = ''; + str.split('').forEach( + function(item) { + if (/^([a-z]+)/.test(item)) { + itemText += item.toUpperCase(); + } else if (/^([A-Z]+)/.test(item)) { + itemText += item.toLowerCase(); + } else { + itemText += item; + } + }); + return itemText; + } + + switch (type) { + case 1: + return str.replace(/\b\w+\b/g, function(word) { + return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase(); + }); + case 2: + return str.replace(/\b\w+\b/g, function(word) { + return word.substring(0, 1).toLowerCase() + word.substring(1).toUpperCase(); + }); + case 3: + return ToggleCase(str); + case 4: + return str.toUpperCase(); + case 5: + return str.toLowerCase(); + default: + return str; + } +} + +/** + * 字符串循环复制,count->次数 + */ +function repeatStr(str, count) { + var text = ''; + for (var i = 0; i < count; i++) { + text += str; + } + return text; +} + +/** + * 字符串替换 + */ +function replaceAll(str, AFindText, ARepText) { + const raRegExp = new RegExp(AFindText, 'g'); + return str.replace(raRegExp, ARepText); +} + +/** + * + * 字符替换*,隐藏手机号或者身份证号等 + replaceStr(字符串,字符格式, 替换方式,替换的字符(默认*)) + ecDo.replaceStr('18819322663',[3,5,3],0) + result:188*****663 + ecDo.replaceStr('asdasdasdaa',[3,5,3],1) + result:***asdas*** + ecDo.replaceStr('1asd88465asdwqe3',[5],0) + result:*****8465asdwqe3 + ecDo.replaceStr('1asd88465asdwqe3',[5],1,'+') + result:"1asd88465as+++++" + * + * @param str + * @param regArr + * @param type + * @param ARepText + * @returns {*} + */ +function replaceStr(str, regArr, type, ARepText) { + var regtext = ''; + var Reg = null; + var replaceText = ARepText || '*'; + // repeatStr是在上面定义过的(字符串循环复制),大家注意哦 + if (regArr.length === 3 && type === 0) { + regtext = '(\\w{' + regArr[0] + '})\\w{' + regArr[1] + '}(\\w{' + regArr[2] + '})'; + Reg = new RegExp(regtext); + var replaceCount = this.repeatStr(replaceText, regArr[1]); + return str.replace(Reg, '$1' + replaceCount + '$2'); + } else if (regArr.length === 3 && type === 1) { + regtext = '\\w{' + regArr[0] + '}(\\w{' + regArr[1] + '})\\w{' + regArr[2] + '}'; + Reg = new RegExp(regtext); + var replaceCount1 = this.repeatStr(replaceText, regArr[0]); + var replaceCount2 = this.repeatStr(replaceText, regArr[2]); + return str.replace(Reg, replaceCount1 + '$1' + replaceCount2); + } else if (regArr.length === 1 && type === 0) { + regtext = '(^\\w{' + regArr[0] + '})'; + Reg = new RegExp(regtext); + var replaceCount = this.repeatStr(replaceText, regArr[0]); + return str.replace(Reg, replaceCount); + } else if (regArr.length === 1 && type === 1) { + regtext = '(\\w{' + regArr[0] + '}$)'; + Reg = new RegExp(regtext); + var replaceCount = this.repeatStr(replaceText, regArr[0]); + return str.replace(Reg, replaceCount); + } +} + +/** + * 格式化处理字符串 + ecDo.formatText('1234asda567asd890') + result:"12,34a,sda,567,asd,890" + ecDo.formatText('1234asda567asd890',4,' ') + result:"1 234a sda5 67as d890" + ecDo.formatText('1234asda567asd890',4,'-') + result:"1-234a-sda5-67as-d890" + + * @param str + * @param size + * @param delimiter + * @returns {*} + */ +function formatText(str, size, delimiter) { + var _size = size || 3; + var _delimiter = delimiter || ','; + var regText = '\\B(?=(\\w{' + _size + '})+(?!\\w))'; + var reg = new RegExp(regText, 'g'); + return str.replace(reg, _delimiter); +} + +/** + * 现金额大写转换函数 + ecDo.upDigit(168752632) + result:"人民币壹亿陆仟捌佰柒拾伍万贰仟陆佰叁拾贰元整" + ecDo.upDigit(1682) + result:"人民币壹仟陆佰捌拾贰元整" + ecDo.upDigit(-1693) + result:"欠人民币壹仟陆佰玖拾叁元整" + * @param n + * @returns {string} + */ +function upDigit(n) { + var fraction = ['角', '分', '厘']; + var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; + var unit = [ + ['元', '万', '亿'], + ['', '拾', '佰', '仟'] + ]; + var head = n < 0 ? '欠人民币' : '人民币'; + n = Math.abs(n); + var s = ''; + for (var i = 0; i < fraction.length; i++) { + s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, ''); + } + s = s || '整'; + n = Math.floor(n); + for (var i = 0; i < unit[0].length && n > 0; i++) { + var p = ''; + for (var j = 0; j < unit[1].length && n > 0; j++) { + p = digit[n % 10] + unit[1][j] + p; + n = Math.floor(n / 10); + } + s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s; + // s = p + unit[0][i] + s; + } + return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整'); +} + +// 保留2位小数 +function toFixed(val, acc) { + let num = parseFloat(val); + if (isNaN(num)) { + num = 0; + } + let accuracy = parseInt(acc); + if (isNaN(accuracy) || accuracy < 0 || accuracy > 10) { + accuracy = 2; + } + return num.toFixed(accuracy); +} + +// 转百分比 +function toPercent(val, acc) { + let num = parseFloat(val); + if (isNaN(num)) { + num = 0; + } + let accuracy = parseInt(acc); + if (isNaN(accuracy) || accuracy < 0 || accuracy > 10) { + accuracy = 2; + } + return (num * 100).toFixed(accuracy) + '%'; +} + +// ------------ enum begin ------------ +function getEnumDescByValue(value, enumName) { + return Vue.prototype.$enum.getDescByValue(enumName, value); +} + +// ------------ enum end ------------ + +export { + trim, + changeCase, + repeatStr, + replaceAll, + replaceStr, + formatText, + upDigit, + toFixed, + formatDate, + toPercent, + getEnumDescByValue, + ellipsis +}; diff --git a/smart-admin-h5/src/filters/index.js b/smart-admin-h5/src/filters/index.js new file mode 100644 index 00000000..484c0dc0 --- /dev/null +++ b/smart-admin-h5/src/filters/index.js @@ -0,0 +1,5 @@ +import Vue from 'vue' + +import * as filter from './filter' + +Object.keys(filter).forEach(key => Vue.filter(key, filter[key])) diff --git a/smart-admin-h5/src/lib/cookie.js b/smart-admin-h5/src/lib/cookie.js new file mode 100644 index 00000000..83386119 --- /dev/null +++ b/smart-admin-h5/src/lib/cookie.js @@ -0,0 +1,21 @@ +import Cookies from 'js-cookie'; +import config from '@/config'; +const { cookieExpires } = config; +export const TOKEN_KEY = 'token'; + +export default { + setToken: token => { + Cookies.set(TOKEN_KEY, token, { + // token在Cookie中存储的天数,默认1天 + expires: cookieExpires || 7 + }); + }, + getToken: () => { + const token = Cookies.get(TOKEN_KEY); + if (token) return token; + else return null; + }, + clearToken: () => { + Cookies.remove(TOKEN_KEY); + } +}; diff --git a/smart-admin-h5/src/lib/http.js b/smart-admin-h5/src/lib/http.js new file mode 100644 index 00000000..b4c86937 --- /dev/null +++ b/smart-admin-h5/src/lib/http.js @@ -0,0 +1,65 @@ +import Axios from 'axios'; +import config from '@/config'; +import cookie from '@/lib/cookie'; +import { Toast } from 'vant'; + +export const baseUrl = config.baseUrl.apiUrl; + +const axios = Axios.create({ + baseURL: baseUrl, + timeout: 30000, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } +}); + +// 添加请求拦截器 +axios.interceptors.request.use( + function(config) { + const token = cookie.getToken(); + if (token) { + config.headers['x-access-token'] = token; + } + return config; + }, + function(error) { + return Promise.reject(error); + } +); + +// 添加响应拦截器 +axios.interceptors.response.use( + res => { + const { data } = res; + if (data && data.code && data.code !== 1) { + if (data.code === 1001) { + cookie.clearToken(); + localStorage.clear(); + window.location.href = window.location.pathname + '#/login'; + Toast.fail('未登录,或登录失效,请登录'); + return; + } else if (data.code === 502) { + window.location.href = window.location.pathname + '#/500'; + return; + } else { + Toast.fail(data.msg); + return Promise.reject(res); + } + } + return Promise.resolve(data); + }, + error => { + Toast.fail('服务内部错误'); + return Promise.reject(error); + } +); + +export const postAxios = (url, data, config) => { + return axios.post(url, data, config); +}; + +export const getAxios = (url, data) => { + return axios.get(url, { + params: data + }); +}; diff --git a/smart-admin-h5/src/lib/local.js b/smart-admin-h5/src/lib/local.js new file mode 100644 index 00000000..c19d7e3d --- /dev/null +++ b/smart-admin-h5/src/lib/local.js @@ -0,0 +1,8 @@ +export const localSave = (key, value) => { + localStorage.setItem(key, value); +}; + +export const localRead = key => { + return localStorage.getItem(key) || ''; +}; + diff --git a/smart-admin-h5/src/lib/menu-func.js b/smart-admin-h5/src/lib/menu-func.js new file mode 100644 index 00000000..914d5379 --- /dev/null +++ b/smart-admin-h5/src/lib/menu-func.js @@ -0,0 +1,276 @@ +import { forEach, hasOneOf, objEqual } from '@/lib/util'; +import config from '@/config'; +import { localRead, localSave } from '@/lib/local'; +const { title, useI18n } = config; +export const hasChild = item => { + return item.children && item.children.length !== 0; +}; + +/** + * 通过权限过滤菜单 + * @param {Object} map 权限对象 + * @param {Array} menuList 菜单列表 + * @returns {Array} + */ +export const getShowMenu = (map = {}, menuList, access = false) => { + // 判断是否为超级管理员 + if (access) { + return menuList; + } + // 返回的菜单列表 + let result = []; + for (let menuItem of menuList) { + let routerObj = JSON.parse(JSON.stringify(menuItem)); + if ( + map.hasOwnProperty(menuItem.name) && + (menuItem.name !== 'home' && menuItem.name !== '_home') + ) { + // 判断该菜单权限下是否为数组,若为数组,则为功能点权限否则为子菜单 + if (getType(map[routerObj.name]) === 'array') { + let funcPrivilege = localRead('funcPrivilegeInfo') + ? JSON.parse(localRead('funcPrivilegeInfo')) + : {}; + localSave( + 'funcPrivilegeInfo', + JSON.stringify({ + ...funcPrivilege, + [routerObj.name]: map[routerObj.name] + }) + ); + } else if ( + getType(map[routerObj.name]) !== 'array' && + !routerObj.children + ) { + // 判断是否为二级菜单,若是则需要多枚举一层赋值 + let funcPrivilege = localRead('funcPrivilegeInfo') + ? JSON.parse(localRead('funcPrivilegeInfo')) + : {}; + localSave( + 'funcPrivilegeInfo', + JSON.stringify({ + ...funcPrivilege, + [routerObj.name]: map[routerObj.name][routerObj.name] + }) + ); + } else if ( + getType(map[routerObj.name]) !== 'array' && + routerObj.children + ) { + // 循环子菜单权限 + routerObj.children = getShowMenu( + map[routerObj.name], + routerObj.children + ); + } + result.push(routerObj); + } + } + return result; +}; +// 获取数据类型 +export const getType = obj => { + return {}.toString + .call(obj) + .match(/\s([a-zA-Z]+)/)[1] + .toLowerCase(); +}; + +/** + * @description 本地存储和获取标签导航列表 + */ +export const setTagNavListInLocalStorage = list => { + localStorage.tagNaveList = JSON.stringify(list); +}; +/** + * @returns {Array} 其中的每个元素只包含路由原信息中的name, path, meta三项 + */ +export const getTagNavListFromLocalStorage = () => { + const list = localStorage.tagNaveList; + return list ? JSON.parse(list) : []; +}; +export const getBreadCrumbList = (route, homeRoute) => { + let homeItem = { + ...homeRoute, + icon: homeRoute.meta.icon + }; + let routeMatched = route.matched; + if (routeMatched.some(item => item.name === homeRoute.name)) { + return [homeItem]; + } + let res = routeMatched + .filter(item => { + return item.meta === undefined || !item.meta.hideInBread; + }) + .map(item => { + let meta = { + ...item.meta + }; + if (meta.title && typeof meta.title === 'function') { + meta.__titleIsFunction__ = true; + meta.title = meta.title(route); + } + let obj = { + icon: (item.meta && item.meta.icon) || '', + name: item.name, + meta: meta + }; + return obj; + }); + res = res.filter(item => { + return !item.meta.hideInMenu; + }); + return [...res]; +}; +/** + * @param {Array} routers 路由列表数组 + * @description 用于找到路由列表中name为home的对象 + */ +export const getHomeRoute = (routers, homeName = 'Home') => { + let i = -1; + let len = routers.length; + let homeRoute = {}; + while (++i < len) { + let item = routers[i]; + if (item.children && item.children.length) { + let res = getHomeRoute(item.children, homeName); + if (res.name) return res; + } else { + if (item.name === homeName) homeRoute = item; + } + } + return homeRoute; +}; +/** + * @param {Array} list 标签列表 + * @param {String} name 当前关闭的标签的name + */ +export const getNextRoute = (list, route) => { + let res = {}; + if (list.length === 2) { + res = getHomeRoute(list); + } else { + const index = list.findIndex(item => routeEqual(item, route)); + if (index === list.length - 1) res = list[list.length - 2]; + else res = list[index + 1]; + } + return res; +}; + +/** + * 判断打开的标签列表里是否已存在这个新添加的路由对象 + */ +export const routeHasExist = (tagNavList, routeItem) => { + let len = tagNavList.length; + let res = false; + doCustomTimes(len, index => { + if (routeEqual(tagNavList[index], routeItem)) res = true; + }); + return res; +}; +/** + * @param {*} list 现有标签导航列表 + * @param {*} newRoute 新添加的路由原信息对象 + * @description 如果该newRoute已经存在则不再添加 + */ +export const getNewTagList = (list, newRoute) => { + const { name, path, meta, query } = newRoute; + let newList = [...list]; + let index = newList.findIndex(item => item.name === name); + if (index >= 0) { + newList[index] = { name, path, meta, query }; + } else newList.push({ name, path, meta, query }); + return newList; +}; +export const routeEqual = (route1, route2) => { + return route1.name === route2.name; +}; +export const getRouteTitleHandled = route => { + let router = { + ...route + }; + let meta = { + ...route.meta + }; + let title = ''; + if (meta.title) { + if (typeof meta.title === 'function') { + meta.__titleIsFunction__ = true; + title = meta.title(router); + } else title = meta.title; + } + meta.title = title; + router.meta = meta; + return router; +}; +/** + * @param {Number} times 回调函数需要执行的次数 + * @param {Function} callback 回调函数 + */ +export const doCustomTimes = (times, callback) => { + let i = -1; + while (++i < times) { + callback(i); + } +}; +export const showTitle = (item, vm) => { + let { title, __titleIsFunction__ } = item.meta; + if (!title) return; + if (useI18n) { + if (title.includes('{{') && title.includes('}}') && useI18n) { + title = title.replace(/({{[\s\S]+?}})/, (m, str) => + str.replace(/{{([\s\S]*)}}/, (m, _) => vm.$t(_.trim())) + ); + } else if (__titleIsFunction__) title = item.meta.title; + else title = vm.$t(item.name); + } else title = (item.meta && item.meta.title) || item.name; + return title; +}; +/** + * @description 根据当前跳转的路由设置显示在浏览器标签的title + * @param {Object} routeItem 路由对象 + * @param {Object} vm Vue实例 + */ +export const setTitle = (routeItem, vm) => { + const handledRoute = getRouteTitleHandled(routeItem); + const pageTitle = showTitle(handledRoute, vm); + const resTitle = pageTitle ? `${pageTitle} - ${title}` : title; + window.document.title = resTitle; +}; + +export const findNodeUpper = (ele, tag) => { + if (ele.parentNode) { + if (ele.parentNode.tagName === tag.toUpperCase()) { + return ele.parentNode; + } else { + return findNodeUpper(ele.parentNode, tag); + } + } +}; + +export const findNodeUpperByClasses = (ele, classes) => { + let parentNode = ele.parentNode; + if (parentNode) { + let classList = parentNode.classList; + if ( + classList && + classes.every(className => classList.contains(className)) + ) { + return parentNode; + } else { + return findNodeUpperByClasses(parentNode, classes); + } + } +}; + +export const findNodeDownward = (ele, tag) => { + const tagName = tag.toUpperCase(); + if (ele.childNodes.length) { + let i = -1; + let len = ele.childNodes.length; + while (++i < len) { + let child = ele.childNodes[i]; + if (child.tagName === tagName) return child; + else return findNodeDownward(child, tag); + } + } +}; diff --git a/smart-admin-h5/src/lib/printPlugs.js b/smart-admin-h5/src/lib/printPlugs.js new file mode 100644 index 00000000..9c4295dd --- /dev/null +++ b/smart-admin-h5/src/lib/printPlugs.js @@ -0,0 +1,133 @@ +// 打印类属性、方法定义 +/* eslint-disable */ +//第二个参数表明是否要关闭当前窗口 +const Print = function(dom, close, options) { + if (!(this instanceof Print)) return new Print(dom, close, options); + + this.options = this.extend( + { + noPrint: '.no-print' + }, + options + ); + + if (typeof dom === 'string') { + this.dom = document.querySelector(dom); + } else { + this.dom = dom; + } + + this.init(close); +}; +Print.prototype = { + init: function(close) { + var content = this.getStyle() + this.getHtml(); + this.writeIframe(content, close); + }, + extend: function(obj, obj2) { + for (var k in obj2) { + obj[k] = obj2[k]; + } + return obj; + }, + + getStyle: function() { + var str = '', + styles = document.querySelectorAll('style,link'); + for (var i = 0; i < styles.length; i++) { + str += styles[i].outerHTML; + } + str += + ''; + + return str; + }, + + getHtml: function() { + var inputs = document.querySelectorAll('input'); + var textareas = document.querySelectorAll('textarea'); + var selects = document.querySelectorAll('select'); + + for (var k in inputs) { + if (inputs[k].type == 'checkbox' || inputs[k].type == 'radio') { + if (inputs[k].checked == true) { + inputs[k].setAttribute('checked', 'checked'); + } else { + inputs[k].removeAttribute('checked'); + } + } else if (inputs[k].type == 'text') { + inputs[k].setAttribute('value', inputs[k].value); + } + } + + for (var k2 in textareas) { + if (textareas[k2].type == 'textarea') { + textareas[k2].innerHTML = textareas[k2].value; + } + } + + for (var k3 in selects) { + if (selects[k3].type == 'select-one') { + var child = selects[k3].children; + for (var i in child) { + if (child[i].tagName == 'OPTION') { + if (child[i].selected == true) { + child[i].setAttribute('selected', 'selected'); + } else { + child[i].removeAttribute('selected'); + } + } + } + } + } + return this.dom.outerHTML; + }, + + writeIframe: function(content, close) { + var w, + doc, + iframe = document.createElement('iframe'), + f = document.body.appendChild(iframe); + iframe.id = 'myIframe'; + iframe.style = 'position:absolute;'; + + w = f.contentWindow || f.contentDocument; + doc = f.contentDocument || f.contentWindow.document; + doc.open(); + doc.write(content); + doc.close(); + this.toPrint(w, close); + setTimeout(function() { + document.body.removeChild(iframe); + }, 500); + }, + + toPrint: function(frameWindow, close) { + try { + setTimeout(function() { + frameWindow.focus(); + try { + if (!frameWindow.document.execCommand('print', false, null)) { + frameWindow.print(); + } + } catch (e) { + frameWindow.print(); + } + frameWindow.close(); + if (close) { + window.close(); + } + }, 500); + } catch (err) { + console.log('err', err); + } + } +}; +const MyPlugin = {}; +MyPlugin.install = function(Vue, options) { + // 4. 添加实例方法 + Vue.prototype.$print = Print; +}; +export default MyPlugin; diff --git a/smart-admin-h5/src/lib/render-dom.js b/smart-admin-h5/src/lib/render-dom.js new file mode 100644 index 00000000..1cad207e --- /dev/null +++ b/smart-admin-h5/src/lib/render-dom.js @@ -0,0 +1,10 @@ +export default { + name: 'RenderDom', + functional: true, + props: { + render: Function + }, + render: (h, ctx) => { + return ctx.props.render(h); + } +}; diff --git a/smart-admin-h5/src/lib/smart-sentry.js b/smart-admin-h5/src/lib/smart-sentry.js new file mode 100644 index 00000000..d7bf5bbc --- /dev/null +++ b/smart-admin-h5/src/lib/smart-sentry.js @@ -0,0 +1,18 @@ +/* + * @Description: + * @Author: zhuoda + */ +// smart sentry +import * as Sentry from '@sentry/browser'; +export default { + /** + * sentry 主动上报 + * @param {error} error 错误信息 + */ + captureException: (error) => { + if (error.config && error.data && error && error.headers && error.request && error.status) { + return; + } + Sentry.captureException(error); + } +}; diff --git a/smart-admin-h5/src/lib/table-action.js b/smart-admin-h5/src/lib/table-action.js new file mode 100644 index 00000000..f9a541fc --- /dev/null +++ b/smart-admin-h5/src/lib/table-action.js @@ -0,0 +1,84 @@ +// 处理table操作按钮 +const tableAction = (h, array) => { + let btnArray = []; + let btnMore = []; + array.map((item, index) => { + if (index < 2) { + let btn = h( + 'a', + { + props: { + type: !index ? 'primary' : 'info', + size: 'small', + to: item.to ? item.to : '', + target: item.target ? item.target : '_self', + ghost: true + }, + style: { + marginLeft: '5px' + }, + directives: item.directives, + on: { + click: item.action + } + }, + item.title + ); + btnArray.push(btn); + } else { + btnMore.push( + h( + 'DropdownItem', + { + nativeOn: { + click: item.action + } + }, + item.title + ) + ); + } + }); + let dropdown = h( + 'Dropdown', + { + props: { + transfer: true + } + }, + [ + h( + 'a', + { + props: { + type: 'default', + size: 'small' + }, + style: { + marginLeft: '5px' + } + }, + [ + h('span', '更多'), + h('Icon', { + props: { + type: 'ios-arrow-down' + } + }) + ] + ), + h( + 'DropdownMenu', + { + slot: 'list' + }, + btnMore + ) + ] + ); + if (array.length > 2) { + btnArray.push(dropdown); + } + return btnArray; +}; +export default tableAction; diff --git a/smart-admin-h5/src/lib/util.js b/smart-admin-h5/src/lib/util.js new file mode 100644 index 00000000..6a3845b0 --- /dev/null +++ b/smart-admin-h5/src/lib/util.js @@ -0,0 +1,515 @@ +import moment from 'moment'; +/** + * @param {String} url + * @description 从URL中解析参数 + */ +export const getParams = url => { + const keyValueArr = url.split('?')[1].split('&'); + let paramObj = {}; + keyValueArr.forEach(item => { + const keyValue = item.split('='); + paramObj[keyValue[0]] = keyValue[1]; + }); + return paramObj; +}; + +/** + * @param {Any} obj + * @description 获取数据类型 + */ +export const getType = obj => { + return {}.toString + .call(obj) + .match(/\s([a-zA-Z]+)/)[1] + .toLowerCase(); +}; +// 日期格式 +export const dateFormat = { + YMD: 'YMD', + YMDHM: 'YMDHM', + YMDHMS: 'YMDHMS' +}; +export const forEach = (arr, fn) => { + if (!arr.length || !fn) return; + let i = -1; + let len = arr.length; + while (++i < len) { + let item = arr[i]; + fn(item, i, arr); + } +}; + +/** + * @param {Array} arr1 + * @param {Array} arr2 + * @description 得到两个数组的交集, 两个数组的元素为数值或字符串 + */ +export const getIntersection = (arr1, arr2) => { + let len = Math.min(arr1.length, arr2.length); + let i = -1; + let res = []; + while (++i < len) { + const item = arr2[i]; + if (arr1.indexOf(item) > -1) res.push(item); + } + return res; +}; + +/** + * @param {Array} arr1 + * @param {Array} arr2 + * @description 得到两个数组的并集, 两个数组的元素为数值或字符串 + */ +export const getUnion = (arr1, arr2) => { + return Array.from(new Set([...arr1, ...arr2])); +}; + +/** + * @param {Array} target 目标数组 + * @param {Array} arr 需要查询的数组 + * @description 判断要查询的数组是否至少有一个元素包含在目标数组中 + */ +export const hasOneOf = (targetarr, arr) => { + return targetarr.some(_ => arr.indexOf(_) > -1); +}; + +/** + * @param {String|Number} value 要验证的字符串或数值 + * @param {*} validList 用来验证的列表 + */ +export function oneOf (value, validList) { + for (let i = 0; i < validList.length; i++) { + if (value === validList[i]) { + return true; + } + } + return false; +} + +/** + * @param {Number} timeStamp 判断时间戳格式是否是毫秒 + * @returns {Boolean} + */ +const isMillisecond = timeStamp => { + const timeStr = String(timeStamp); + return timeStr.length > 10; +}; + +/** + * @param {Number} timeStamp 传入的时间戳 + * @param {Number} currentTime 当前时间时间戳 + * @returns {Boolean} 传入的时间戳是否早于当前时间戳 + */ +const isEarly = (timeStamp, currentTime) => { + return timeStamp < currentTime; +}; + +/** + * @param {Number} num 数值 + * @returns {String} 处理后的字符串 + * @description 如果传入的数值小于10,即位数只有1位,则在前面补充0 + */ +const getHandledValue = num => { + return num < 10 ? '0' + num : num; +}; + +/** + * @param {Number} timeStamp 传入的时间戳 + * @param {Number} startType 要返回的时间字符串的格式类型,传入'year'则返回年开头的完整时间 + */ +const getDate = (timeStamp, startType) => { + const d = new Date(timeStamp * 1000); + const year = d.getFullYear(); + const month = getHandledValue(d.getMonth() + 1); + const date = getHandledValue(d.getDate()); + const hours = getHandledValue(d.getHours()); + const minutes = getHandledValue(d.getMinutes()); + const second = getHandledValue(d.getSeconds()); + let resStr = ''; + if (startType === 'year') { + resStr = + year + + '-' + + month + + '-' + + date + + ' ' + + hours + + ':' + + minutes + + ':' + + second; + } + else resStr = month + '-' + date + ' ' + hours + ':' + minutes; + return resStr; +}; + +/** + * @param {String|Number} timeStamp 时间戳 + * @returns {String} 相对时间字符串 + */ +export const getRelativeTime = timeStamp => { + // 判断当前传入的时间戳是秒格式还是毫秒 + const IS_MILLISECOND = isMillisecond(timeStamp); + // 如果是毫秒格式则转为秒格式 + if (IS_MILLISECOND) Math.floor((timeStamp /= 1000)); + // 传入的时间戳可以是数值或字符串类型,这里统一转为数值类型 + timeStamp = Number(timeStamp); + // 获取当前时间时间戳 + const currentTime = Math.floor(Date.parse(new Date()) / 1000); + // 判断传入时间戳是否早于当前时间戳 + const IS_EARLY = isEarly(timeStamp, currentTime); + // 获取两个时间戳差值 + let diff = currentTime - timeStamp; + // 如果IS_EARLY为false则差值取反 + if (!IS_EARLY) diff = -diff; + let resStr = ''; + const dirStr = IS_EARLY ? '前' : '后'; + // 少于等于59秒 + if (diff <= 59) resStr = diff + '秒' + dirStr; + // 多于59秒,少于等于59分钟59秒 + else if (diff > 59 && diff <= 3599) { resStr = Math.floor(diff / 60) + '分钟' + dirStr; } + // 多于59分钟59秒,少于等于23小时59分钟59秒 + else if (diff > 3599 && diff <= 86399) { resStr = Math.floor(diff / 3600) + '小时' + dirStr; } + // 多于23小时59分钟59秒,少于等于29天59分钟59秒 + else if (diff > 86399 && diff <= 2623859) { resStr = Math.floor(diff / 86400) + '天' + dirStr; } + // 多于29天59分钟59秒,少于364天23小时59分钟59秒,且传入的时间戳早于当前 + else if (diff > 2623859 && diff <= 31567859 && IS_EARLY) { resStr = getDate(timeStamp); } + else resStr = getDate(timeStamp, 'year'); + return resStr; +}; + +/** + * @returns {String} 当前浏览器名称 + */ +export const getExplorer = () => { + const ua = window.navigator.userAgent; + const isExplorer = exp => { + return ua.indexOf(exp) > -1; + }; + if (isExplorer('MSIE')) return 'IE'; + else if (isExplorer('Firefox')) return 'Firefox'; + else if (isExplorer('Chrome')) return 'Chrome'; + else if (isExplorer('Opera')) return 'Opera'; + else if (isExplorer('Safari')) return 'Safari'; +}; + +/** + * @description 绑定事件 on(element, event, handler) + */ +export const on = (function () { + if (document.addEventListener) { + return function (element, event, handler) { + if (element && event && handler) { + element.addEventListener(event, handler, false); + } + }; + } else { + return function (element, event, handler) { + if (element && event && handler) { + element.attachEvent('on' + event, handler); + } + }; + } +})(); + +/** + * @description 解绑事件 off(element, event, handler) + */ +export const off = (function () { + if (document.removeEventListener) { + return function (element, event, handler) { + if (element && event) { + element.removeEventListener(event, handler, false); + } + }; + } else { + return function (element, event, handler) { + if (element && event) { + element.detachEvent('on' + event, handler); + } + }; + } +})(); + +/** + * 判断一个对象是否存在key,如果传入第二个参数key,则是判断这个obj对象是否存在key这个属性 + * 如果没有传入key这个参数,则判断obj对象是否有键值对 + */ +export const hasKey = (obj, key) => { + if (key) return key in obj; + else { + let keysArr = Object.keys(obj); + return keysArr.length; + } +}; + +/** + * @param {*} obj1 对象 + * @param {*} obj2 对象 + * @description 判断两个对象是否相等,这两个对象的值只能是数字或字符串 + */ +export const objEqual = (obj1, obj2) => { + const keysArr1 = Object.keys(obj1); + const keysArr2 = Object.keys(obj2); + if (keysArr1.length !== keysArr2.length) return false; + else if (keysArr1.length === 0 && keysArr2.length === 0) return true; + /* eslint-disable-next-line */ else { return !keysArr1.some(key => obj1[key] != obj2[key]); } +}; + +// 相关工具类 +export const utils = { + /** + * @description table实现反选 + * @param {Object} vm Vue实例 + * @param {Array} tableSelectDate 选中的数据 + * @param {Array} allData 所有数据 + * @param {Array} key 数据中的唯一值 + */ + reverseSelect (vm, tableSelectDate, allData, key) { + let copyMess = JSON.parse(JSON.stringify(tableSelectDate)); + // 流程:先全部选中->再部分选中 + vm.handleSelectAll(false); + // 选中的idList + let idList = copyMess.map(item => item[key]); + console.log(idList); + for (let item of allData) { + if (idList.every(id => id !== item.id)) { + vm.$set(item, '_checked', true); + tableSelectDate.push(item); + } else { + vm.$set(item, '_checked', false); + } + } + }, + // 校验字符串是否相同 合同使用 + contrastString (originStr, changeStr) { + let origin = originStr + .replace(/\s*/g, '') + .replace(/"/g, '\'') + .replace(/ /g, '') + .replace(/disabled=\/'\/'/g, 'disabled'); + let change = changeStr + .replace(/\s*/g, '') + .replace(/"/g, '\'') + .replace(/ /g, '') + .replace(/disabled=\/'\/'/g, 'disabled'); + return origin === change; + }, + // 获取当前日期getDateStr(0)、前几天getDateStr(-10)、后几天getDateStr(20) + getDateStr (AddDayCount, format) { + let date = new Date(); + // 获取AddDayCount天后的日期 + date.setDate(date.getDate() + AddDayCount); + return this.getDate(date, format); + }, + getDate (date, format) { + let year = date.getFullYear(); + // day获取当前几号,不足10补0 + let day = date.getDate() > 9 ? date.getDate() : '0' + date.getDate(); + // month获取当前月份的日期,不足10补0 + let month = + date.getMonth() + 1 > 9 + ? date.getMonth() + 1 + : '0' + (date.getMonth() + 1); + // h获取当前小时,不足10补0 + let h = date.getHours() > 9 ? date.getHours() : '0' + date.getHours(); + // s获取当前分钟,不足10补0 + let m = date.getMinutes() > 9 ? date.getMinutes() : '0' + date.getMinutes(); + // s获取当前秒数,不足10补0 + let s = date.getSeconds() > 9 ? date.getSeconds() : '0' + date.getSeconds(); + let resultDate = ''; + if (format === dateFormat.YMD) { + resultDate = year + '-' + month + '-' + day; + } + if (format === dateFormat.YMDHM) { + resultDate = year + '-' + month + '-' + day + ' ' + h + ':' + m; + } + if (format === dateFormat.YMDHMS) { + resultDate = year + '-' + month + '-' + day + ' ' + h + ':' + m + ':' + s; + } + return resultDate; + }, + // 获取周一和周日日期,返回两种格式时间 + getDateWeek () { + let now = new Date(); + let nowTime = now.getTime(); + let day = now.getDay(); + let oneDayLong = 1000 * 60 * 60 * 24; + let MondayTime = nowTime - (day - 1) * oneDayLong; + let SundayTime = nowTime + (7 - day) * oneDayLong; + let monday = new Date(MondayTime); + let sunday = new Date(SundayTime); + return { + // first: this.getDateAll(monday), + // last: this.getDateAll(sunday), + firstDate: monday, + lastDate: sunday + }; + }, + // 获取月初与月末日期,返回两种时间格式 + getDateMonth () { + let dateFirter = new Date(); + let dateLast = new Date(); + dateFirter.setDate(1); + + let currentMonth = dateLast.getMonth(); + let nextMonth = ++currentMonth; + let nextMonthFirstDay = new Date(dateLast.getFullYear(), nextMonth, 1); + let oneDay = 1000 * 60 * 60 * 24; + dateLast = new Date(nextMonthFirstDay - oneDay); + + return { + // first: this.getDateAll(dateFirter), + // last: this.getDateAll(dateLast), + firstDate: dateFirter, + lastDate: dateLast + }; + }, + // 计算天数 + getDayBetweenDate (date) { + date = this.getDate(new Date(date), 'YMD'); + let startTime = Date.parse(new Date(date)); // IE支持“yyyy/MM/dd”格式 + let endTime = Date.parse(this.getDate(new Date(), 'YMD')); + let day = parseInt((endTime - startTime) / (1000 * 60 * 60 * 24)); + return day; + }, + getDateIntervalYear (firstDate, secondDate) { + if (!firstDate || !secondDate) { + return 0; + } + let first = new Date(firstDate); + let second = new Date(secondDate); + let firstYear = first.getFullYear(); + let secondYear = second.getFullYear(); + let intervalYear = secondYear - firstYear; + return intervalYear < 0 ? 0 : intervalYear; + }, + getDateIntervalYearFixed2 (firstDate, secondDate) { + if (!firstDate || !secondDate) { + return 0; + } + // 格式化时间 + let startDate = new Date(this.getDate(new Date(firstDate), 'YMD')); + let endDate = new Date(this.getDate(new Date(secondDate), 'YMD')); + // 得到毫秒值 + let startTime = Date.parse(startDate); + let endTime = Date.parse(endDate); + // 得到差了多少天 + let day = parseInt((endTime - startTime) / (1000 * 60 * 60 * 24)); + if (day <= 0) { + return 0; + } + // 得到差的多少年 保留两位小数 + let resultYear = parseFloat((day / (30 * 12)).toFixed(2)); + return resultYear; + }, + // 数字转化为中文大写 + // 代码如下所示: + convertCurrency (money) { + // 汉字的数字 + let cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; + // 基本单位 + let cnIntRadice = ['', '拾', '佰', '仟']; + // 对应整数部分扩展单位 + let cnIntUnits = ['', '万', '亿', '兆']; + // 对应小数部分单位 + let cnDecUnits = ['角', '分', '毫', '厘']; + // 整数金额时后面跟的字符 + let cnInteger = '整'; + // 整型完以后的单位 + let cnIntLast = '元'; + // 最大处理的数字 + let maxNum = 999999999999999.9999; + // 金额整数部分 + let integerNum; + // 金额小数部分 + let decimalNum; + // 输出的中文金额字符串 + let chineseStr = ''; + // 分离金额后用的数组,预定义 + let parts; + if (money === '') { + return ''; + } + money = parseFloat(money); + if (money >= maxNum) { + // 超出最大处理数字 + return ''; + } + if (money === 0) { + chineseStr = cnNums[0] + cnIntLast + cnInteger; + return chineseStr; + } + // 转换为字符串 + money = money.toString(); + if (money.indexOf('.') === -1) { + integerNum = money; + decimalNum = ''; + } else { + parts = money.split('.'); + integerNum = parts[0]; + decimalNum = parts[1].substr(0, 4); + } + // 获取整型部分转换 + if (parseInt(integerNum, 10) > 0) { + let zeroCount = 0; + let IntLen = integerNum.length; + for (let i = 0; i < IntLen; i++) { + let n = integerNum.substr(i, 1); + let p = IntLen - i - 1; + let q = p / 4; + let m = p % 4; + if (n === '0') { + zeroCount++; + } else { + if (zeroCount > 0) { + chineseStr += cnNums[0]; + } + // 归零 + zeroCount = 0; + chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]; + } + if (m === 0 && zeroCount < 4) { + chineseStr += cnIntUnits[q]; + } + } + chineseStr += cnIntLast; + } + // 小数部分 + if (decimalNum !== '') { + let decLen = decimalNum.length; + for (let i = 0; i < decLen; i++) { + let n = decimalNum.substr(i, 1); + if (n !== '0') { + chineseStr += cnNums[Number(n)] + cnDecUnits[i]; + } + } + } + if (chineseStr === '') { + chineseStr += cnNums[0] + cnIntLast + cnInteger; + } else if (decimalNum === '') { + chineseStr += cnInteger; + } + return chineseStr; + } +}; + + +export const dateTimeRangeConvert = (timerange) => { + // timerange + let arr = []; + if (timerange[0] === '') { + arr.push(null); + } else { + arr.push(moment(timerange[0]).format("YYYY-MM-DD 00:00:00")); + } + + if (timerange[1] === '') { + arr.push(null); + } else { + arr.push(moment(timerange[1]).format("YYYY-MM-DD 23:59:59")); + } + return arr; +} + diff --git a/smart-admin-h5/src/lib/watermark.js b/smart-admin-h5/src/lib/watermark.js new file mode 100644 index 00000000..30747309 --- /dev/null +++ b/smart-admin-h5/src/lib/watermark.js @@ -0,0 +1,49 @@ +const watermark = {}; + +const setWatermark = (str) => { + const id = '1.23452384164.123412415'; + + if (document.getElementById(id) !== null) { + document.body.removeChild(document.getElementById(id)); + } + + const can = document.createElement('canvas'); + can.width = 150; + can.height = 120; + + const cans = can.getContext('2d'); + cans.rotate(-20 * Math.PI / 180); + cans.font = '15px Vedana'; + cans.fillStyle = 'rgba(0, 0, 0, 0.15)'; + cans.textAlign = 'left'; + cans.textBaseline = 'Middle'; + cans.fillText(str, can.width / 20, can.height); + + const div = document.createElement('div'); + div.id = id; + div.style.pointerEvents = 'none'; + div.style.top = '3px'; + div.style.left = '0px'; + div.style.position = 'fixed'; + div.style.zIndex = '100000'; + div.style.width = document.documentElement.clientWidth + 'px'; + div.style.height = document.documentElement.clientHeight + 'px'; + div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat'; + document.body.appendChild(div); + return id; +}; + +// 该方法只允许调用一次 +watermark.set = (str) => { + let id = setWatermark(str); + setInterval(() => { + if (document.getElementById(id) === null) { + id = setWatermark(str); + } + }, 2000); + window.onresize = () => { + setWatermark(str); + }; +}; + +export default watermark; diff --git a/smart-admin-h5/src/main.js b/smart-admin-h5/src/main.js new file mode 100644 index 00000000..8f6fbae9 --- /dev/null +++ b/smart-admin-h5/src/main.js @@ -0,0 +1,62 @@ +// vue 三大核心 +import Vue from 'vue'; +import router from '@/router'; +import store from '@/store'; + +// 更好的兼容性 +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +// 移动端适配 +import 'lib-flexible/flexible.js'; +import 'vant/lib/index.css'; +// 引入首个组件 +import App from './App.vue'; +// 引入自定义主题样式 +import './themes/index.less'; +// 引入过滤器 +import './filters'; +// 引入配置信息 +import config from '@/config'; +// 引入自定义smart 插件 +import SmartPlugin from './plugins/smart'; +// Import component +import Loading from 'vue-loading-overlay'; +// Import stylesheet +import 'vue-loading-overlay/dist/vue-loading.css'; + +import Vant from 'vant'; +import 'vant/lib/index.css'; + +// sentry错误预警 +import SmartSentry from './plugins/smart-sentry'; + +import Enum from 'vue-enum'; + +import enumInfo from '@/constants'; + +import _ from 'lodash'; + +Vue.use(Vant); + +Vue.use(Loading); + +Vue.use(SmartPlugin); + +Vue.use(SmartSentry); + +Vue.prototype.$config = config; + +Vue.config.productionTip = false; + +Vue.use(Enum, { + enumInfo +}); + +window._ = _; + +new Vue({ + el: '#app', + router, + store, + render: h => h(App) +}); diff --git a/smart-admin-h5/src/plugins/smart-sentry.js b/smart-admin-h5/src/plugins/smart-sentry.js new file mode 100644 index 00000000..b4ad2b09 --- /dev/null +++ b/smart-admin-h5/src/plugins/smart-sentry.js @@ -0,0 +1,17 @@ +import * as Sentry from '@sentry/browser'; + +const SmartSentry = {}; + +SmartSentry.install = function(Vue, options) { + Vue.prototype.$smartSentry = { + captureException: (error) => { + console.error(error); + if (error.config && error.data && error && error.headers && error.request && error.status) { + return; + } + Sentry.captureException(error); + } + }; +}; + +export default SmartSentry; diff --git a/smart-admin-h5/src/plugins/smart.js b/smart-admin-h5/src/plugins/smart.js new file mode 100644 index 00000000..5567acca --- /dev/null +++ b/smart-admin-h5/src/plugins/smart.js @@ -0,0 +1,24 @@ +let loader = null; + +const SmartPlugin = {}; + +SmartPlugin.install = function(Vue, options) { + Vue.prototype.$smart = { + loading: (message) => { + if (loader) { + loader.hide(); + } + + loader = Vue.$loading.show({ + // Optional parameters + lockScroll: true, + color: '#1989fa' + }); + }, + loadingClear: () => { + loader.hide(); + } + }; +}; + +export default SmartPlugin; diff --git a/smart-admin-h5/src/plugins/vant.js b/smart-admin-h5/src/plugins/vant.js new file mode 100644 index 00000000..8daa8e3e --- /dev/null +++ b/smart-admin-h5/src/plugins/vant.js @@ -0,0 +1,8 @@ +// 按需全局引入 vant组件 +import Vue from 'vue'; +import { Button, List, Cell, Tabbar, TabbarItem } from 'vant'; + +Vue.use(Button); +Vue.use(Cell); +Vue.use(List); +Vue.use(Tabbar).use(TabbarItem); diff --git a/smart-admin-h5/src/router/index.js b/smart-admin-h5/src/router/index.js new file mode 100644 index 00000000..5494b7c6 --- /dev/null +++ b/smart-admin-h5/src/router/index.js @@ -0,0 +1,131 @@ +import Vue from 'vue'; +import Router from 'vue-router'; +import { routers } from './routers'; +import cookie from '@/lib/cookie'; +import { ROUTER_PERMISSION_TYPE } from './router-const'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +const projectConfig = require('@/config/index.js'); + +Vue.use(Router); + +const router = new Router({ + routes: routers +}); + +// 解决路由跳转相同的地址报错 +const originalPush = Router.prototype.push; +Router.prototype.push = function(location) { + try { + return originalPush.call(this, location).catch(err => err); + } catch (error) { + // TODO zhuoda sentry + console.error(error); + } +}; + +const LOGIN_PAGE_NAME = 'Login'; + +router.beforeEach((to, from, next) => { + // 加载进度条 + NProgress.start(); + + // 权限 + const permissionType = to.meta.permissionType; + // 不需要验证,直接放行 + if (permissionType === ROUTER_PERMISSION_TYPE.NO_VALID.value) { + next(); + return; + } + + const token = cookie.getToken(); + // 需要登录 + if (permissionType === ROUTER_PERMISSION_TYPE.NEED_LOGIN.value) { + if (token) { + next(); + } else { + next({ + name: LOGIN_PAGE_NAME + }); + } + return; + } + + // 需要登录,且验证权限 + if (permissionType === ROUTER_PERMISSION_TYPE.VALIDATE_PERMISSION.value) { + if (!token) { + // TODO 验证权限 + next({ + name: LOGIN_PAGE_NAME + }); + return; + } + } + + next({ + name: 'Error404' + }); +}); + +router.afterEach(to => { + NProgress.done(); + window.scrollTo(0, 0); + if (to.meta.title) { + console.log(to.meta); + document.title = to.meta.title + ' ' + projectConfig.title; + } +}); + +const tempCheckObj = { + checkRouterNameMap: new Map(), + checkRouterPathMap: new Map() +}; + +function recursionCheckRouter(routerArray) { + for (const routerItem of routerArray) { + if (!routerItem.name) { + console.error('没有配置router name', routerItem); + } else { + const existNameRouter = tempCheckObj.checkRouterNameMap.get( + routerItem.name + ); + if (typeof existNameRouter !== 'undefined') { + console.error('存在相同的router name', routerItem, existNameRouter); + } else { + tempCheckObj.checkRouterNameMap.set(routerItem.name, routerItem); + } + } + + if (!routerItem.path) { + console.error('没有配置router path', routerItem); + } else { + // path必须以 / 开头 + if (routerItem.path !== '*' && routerItem.path.indexOf('/') !== 0) { + console.error('path 没有以/开头 ', routerItem); + } + + const existPathRouter = tempCheckObj.checkRouterPathMap.get( + routerItem.path + ); + if (typeof existPathRouter !== 'undefined') { + console.error('存在相同的router path', routerItem, existPathRouter); + } else { + tempCheckObj.checkRouterPathMap.set(routerItem.path, routerItem); + } + } + + if (routerItem.children) { + recursionCheckRouter(routerItem.children); + } + } +} + +// 如果是开发环境,需要检测router的规范性 +if (process.env.NODE_ENV === 'development') { + recursionCheckRouter(routers); + delete tempCheckObj.checkRouterNameMap; + delete tempCheckObj.checkRouterPathMap; +} + +export default router; diff --git a/smart-admin-h5/src/router/other/develop.js b/smart-admin-h5/src/router/other/develop.js new file mode 100644 index 00000000..5e02ce8f --- /dev/null +++ b/smart-admin-h5/src/router/other/develop.js @@ -0,0 +1,15 @@ +import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; + +export const develop = [ + { + path: '/develop/config', + name: 'DevelopConfig', + meta: { + title: '开发专用配置', + permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value + }, + component: () => + import('@/views/develop/config') + } +]; + diff --git a/smart-admin-h5/src/router/other/error.js b/smart-admin-h5/src/router/other/error.js new file mode 100644 index 00000000..cf333cf8 --- /dev/null +++ b/smart-admin-h5/src/router/other/error.js @@ -0,0 +1,37 @@ +// 错误页 +import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; + +export const error = [ + { + path: '/404', + name: 'Error404', + meta: { + hideInMenu: true, + access: true, + permissionType: ROUTER_PERMISSION_TYPE.NO_VALID.value + }, + component: () => import('@/views/error/404.vue') + }, + { + path: '/500', + name: 'Error500', + meta: { + hideInMenu: true, + access: true, + noValidatePrivilege: true, + permissionType: ROUTER_PERMISSION_TYPE.NO_VALID.value + }, + component: () => import('@/views/error/404.vue') + }, + { + path: '*', + name: 'http://localhost:8080/#employee/role-employee-manage', + meta: { + hideInMenu: true, + access: true, + noValidatePrivilege: true, + permissionType: ROUTER_PERMISSION_TYPE.NO_VALID.value + }, + component: () => import('@/views/error/404.vue') + } +]; diff --git a/smart-admin-h5/src/router/other/index.js b/smart-admin-h5/src/router/other/index.js new file mode 100644 index 00000000..cdf9d3fe --- /dev/null +++ b/smart-admin-h5/src/router/other/index.js @@ -0,0 +1,25 @@ +/** + * 其他路由 + */ + +import { user } from './user'; +import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; +import { develop } from '@/router/other/develop'; +import { school } from '@/router/other/school'; +import { contactCompany } from '@/router/other/erp/contact-company'; + +export const otherRouter = [ + { + path: '/other-main', + meta: { + keepAlive: true, + permissionType: ROUTER_PERMISSION_TYPE.NO_VALID.value + }, + component: () => import('views/main/other-main'), + children: [ + ...user, + ...develop, + ...school, + ...contactCompany + ] + }]; diff --git a/smart-admin-h5/src/router/other/school.js b/smart-admin-h5/src/router/other/school.js new file mode 100644 index 00000000..7ddf5117 --- /dev/null +++ b/smart-admin-h5/src/router/other/school.js @@ -0,0 +1,41 @@ +import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; + +export const school = [ + { + path: '/school/detail', + name: 'SchoolDetail', + meta: { + title: '学校详情', + permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value + }, + component: () => import('@/views/crm/school/school-detail') + }, + { + path: '/school/track/add', + name: 'SchoolTrackAdd', + meta: { + title: '学校拜访记录添加', + permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value + }, + component: () => import('@/views/crm/school/add-track') + }, + { + path: '/school/track/detail', + name: 'SchoolTrackDetail', + meta: { + title: '学校拜访记录详情', + permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value + }, + component: () => import('@/views/crm/school/track-detail') + }, + { + path: '/school/update', + name: 'SchoolUpdate', + meta: { + title: '更新学校', + permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value + }, + component: () => import('@/views/crm/school/update-school') + } +]; + diff --git a/smart-admin-h5/src/router/other/user.js b/smart-admin-h5/src/router/other/user.js new file mode 100644 index 00000000..b7ea88ea --- /dev/null +++ b/smart-admin-h5/src/router/other/user.js @@ -0,0 +1,15 @@ +import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; + +export const user = [ + { + path: '/user/change-password', + name: 'UserChangePassword', + meta: { + title: '修改密码', + permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value + }, + component: () => + import('@/views/mine/change-password') + } +]; + diff --git a/smart-admin-h5/src/router/router-const.js b/smart-admin-h5/src/router/router-const.js new file mode 100644 index 00000000..4d509cf8 --- /dev/null +++ b/smart-admin-h5/src/router/router-const.js @@ -0,0 +1,23 @@ +/** + * 权限类型 + */ +export const ROUTER_PERMISSION_TYPE = { + /** + * 不 验 证 + */ + NO_VALID: { + value: 1 + }, + /** + * 需要登录 + */ + NEED_LOGIN: { + value: 2 + }, + /** + * 需要验证权限 + */ + VALIDATE_PERMISSION: { + value: 3 + } +}; diff --git a/smart-admin-h5/src/router/routers.js b/smart-admin-h5/src/router/routers.js new file mode 100644 index 00000000..6dc81893 --- /dev/null +++ b/smart-admin-h5/src/router/routers.js @@ -0,0 +1,24 @@ +import { tabbarRouter } from './tabbar'; +import { otherRouter } from '@/router/other'; +import { error } from './other/error'; +import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; + +// 登录模块 +export const login = { + path: '/login', + name: 'Login', + meta: { + title: '登录', + keepAlive: false, + permissionType: ROUTER_PERMISSION_TYPE.NO_VALID.value + }, + component: () => import('@/views/login/login.vue') +}; + +// 全部路由 +export const routers = [ + login, + ...tabbarRouter, + ...otherRouter, + ...error +]; diff --git a/smart-admin-h5/src/router/tabbar/index.js b/smart-admin-h5/src/router/tabbar/index.js new file mode 100644 index 00000000..b56b8a8a --- /dev/null +++ b/smart-admin-h5/src/router/tabbar/index.js @@ -0,0 +1,49 @@ +import { ROUTER_PERMISSION_TYPE } from '../router-const'; + +/** + * 主要用于 tabbar 的路由 + */ +export const tabbarRouter = [ + { + path: '/', + redirect: '/contact-company', + meta: { + title: '首页', + keepAlive: true, + permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value + }, + component: () => import('views/main/tabbar-main'), + children: [ + { + path: '/home', + name: 'Home', + meta: { + title: '首页', + keepAlive: true, + permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value + }, + component: () => import('@/views/home/index') + }, + { + path: '/business', + name: 'Business', + meta: { + title: '业务中心', + keepAlive: false, + permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value + }, + component: () => import('@/views/business/index') + }, + { + path: '/mine', + name: 'Mine', + meta: { + title: '关于我', + keepAlive: false, + permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value + }, + component: () => import('@/views/mine/index') + } + ] + } +]; diff --git a/smart-admin-h5/src/store/index.js b/smart-admin-h5/src/store/index.js new file mode 100644 index 00000000..9e94a45d --- /dev/null +++ b/smart-admin-h5/src/store/index.js @@ -0,0 +1,21 @@ +import Vue from 'vue'; +import Vuex from 'vuex'; + +import user from './module/user'; + +Vue.use(Vuex); + +export default new Vuex.Store({ + state: { + // + }, + mutations: { + // + }, + actions: { + // + }, + modules: { + user + } +}); diff --git a/smart-admin-h5/src/store/module/user.js b/smart-admin-h5/src/store/module/user.js new file mode 100644 index 00000000..5f64b72e --- /dev/null +++ b/smart-admin-h5/src/store/module/user.js @@ -0,0 +1,41 @@ +import cookie from '@/lib/cookie.js'; + +export default { + namespaced: true, + state: { + token: cookie.getToken(), + // session 信息 + sessionInfo: {}, + // 是否获取了session + isHaveGotSessionInfo: false, + // 权限集合 + privilegeKeySet: new Set() + + }, + mutations: { + clearSession() { + state.token = null; + state.sessionInfo = null; + state.privilegeKeySet = new Set(); + }, + updateSession(state, userLoginInfo) { + state.isHaveGotSessionInfo = true; + state.sessionInfo = userLoginInfo; + if (userLoginInfo.privilegeList) { + state.privilegeKeySet = new Set(userLoginInfo.privilegeList.map(e => e.key)); + } + } + }, + getters: { + // 用户菜单权限 + privilegeKeySet: state => state.privilegeKeySet, + isSuperMan: state => state.sessionInfo.isSuperMan, + actualName: state => state.sessionInfo.actualName, + loginUserId: state => state.sessionInfo.id + }, + actions: { + // 登录 + handleLogin({ commit }, params) { + } + } +}; diff --git a/smart-admin-h5/src/themes/index.less b/smart-admin-h5/src/themes/index.less new file mode 100644 index 00000000..4129c13d --- /dev/null +++ b/smart-admin-h5/src/themes/index.less @@ -0,0 +1,6 @@ + +@text-color: #323233; +@border-color: #ebedf0; +@active-color: #f2f3f5; +@background-color: #f7f8fa; +@background-color-light: #fafafa; diff --git a/smart-admin-h5/src/views/bpm/index.vue b/smart-admin-h5/src/views/bpm/index.vue new file mode 100644 index 00000000..a2eccc23 --- /dev/null +++ b/smart-admin-h5/src/views/bpm/index.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/smart-admin-h5/src/views/business/index.vue b/smart-admin-h5/src/views/business/index.vue new file mode 100644 index 00000000..e6ba62dc --- /dev/null +++ b/smart-admin-h5/src/views/business/index.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/smart-admin-h5/src/views/develop/config.vue b/smart-admin-h5/src/views/develop/config.vue new file mode 100644 index 00000000..360c1f21 --- /dev/null +++ b/smart-admin-h5/src/views/develop/config.vue @@ -0,0 +1,46 @@ + + + + diff --git a/smart-admin-h5/src/views/error/404.vue b/smart-admin-h5/src/views/error/404.vue new file mode 100644 index 00000000..66168409 --- /dev/null +++ b/smart-admin-h5/src/views/error/404.vue @@ -0,0 +1,23 @@ + + + + diff --git a/smart-admin-h5/src/views/home/index.vue b/smart-admin-h5/src/views/home/index.vue new file mode 100644 index 00000000..e1a9aff3 --- /dev/null +++ b/smart-admin-h5/src/views/home/index.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/smart-admin-h5/src/views/login/login.vue b/smart-admin-h5/src/views/login/login.vue new file mode 100644 index 00000000..c9e4a2e3 --- /dev/null +++ b/smart-admin-h5/src/views/login/login.vue @@ -0,0 +1,80 @@ + + + + diff --git a/smart-admin-h5/src/views/main/main-mixin.js b/smart-admin-h5/src/views/main/main-mixin.js new file mode 100644 index 00000000..ed3bc0e4 --- /dev/null +++ b/smart-admin-h5/src/views/main/main-mixin.js @@ -0,0 +1,25 @@ +import cookie from '@/lib/cookie'; +import { userApi } from 'api/user'; + +/** + * 此 mixin为登录以后的页面用的,因为所有的有效路由(排除登录、注册、404,500 这个几个特殊页面)都会走 other-main 或者 tabber-main两个父级组件。 + * 所以对于一些session的信息获取只能放到这个两个main组件上,故此mixin只用于两个main组件,起到全局的作用 + */ +export default { + created: function() { + const token = cookie.getToken(); + // 如果登录过,获取token + if (token && !this.$store.state.user.isHaveGotSessionInfo) { + (async() => { + try { + console.debug(' request session info '); + const res = await userApi.getSession(); + const loginInfo = res.data; + this.$store.commit('user/updateSession', loginInfo); + } catch (e) { + this.$smartSentry.captureException(e); + } + })(); + } + } +}; diff --git a/smart-admin-h5/src/views/main/other-main.vue b/smart-admin-h5/src/views/main/other-main.vue new file mode 100644 index 00000000..1ed7f166 --- /dev/null +++ b/smart-admin-h5/src/views/main/other-main.vue @@ -0,0 +1,31 @@ + + + + diff --git a/smart-admin-h5/src/views/main/tabbar-main.vue b/smart-admin-h5/src/views/main/tabbar-main.vue new file mode 100644 index 00000000..8a97159b --- /dev/null +++ b/smart-admin-h5/src/views/main/tabbar-main.vue @@ -0,0 +1,96 @@ + + + + diff --git a/smart-admin-h5/src/views/mine/change-password.vue b/smart-admin-h5/src/views/mine/change-password.vue new file mode 100644 index 00000000..ef4b9223 --- /dev/null +++ b/smart-admin-h5/src/views/mine/change-password.vue @@ -0,0 +1,96 @@ + + + + diff --git a/smart-admin-h5/src/views/mine/index.vue b/smart-admin-h5/src/views/mine/index.vue new file mode 100644 index 00000000..70a2a8fc --- /dev/null +++ b/smart-admin-h5/src/views/mine/index.vue @@ -0,0 +1,73 @@ + + + + diff --git a/smart-admin-h5/vue.config.js b/smart-admin-h5/vue.config.js new file mode 100644 index 00000000..115a4e6a --- /dev/null +++ b/smart-admin-h5/vue.config.js @@ -0,0 +1,192 @@ +const path = require('path'); +const CompressionWebpackPlugin = require('compression-webpack-plugin'); +const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin'); +const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); +const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin'); +const SentryPlugin = require('@sentry/webpack-plugin'); +const resolve = dir => path.join(__dirname, dir); +// 项目配置 +const projectConfig = require('./src/config/index.js'); + +// 生产环境,测试和正式 +const isProductionEnv = ['production'].includes(process.env.NODE_ENV); +const isProductionAppEnv = ['prod', 'pre'].includes(process.env.VUE_APP_ENV); + +module.exports = { + publicPath: projectConfig.publicPath, + // 生产环境构建文件的目录 + outputDir: 'dist', + // outputDir的静态资源(js、css、img、fonts)目录 + assetsDir: 'static', + // eslint检测 按需开启 + lintOnSave: !isProductionEnv, + // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 + productionSourceMap: false, + devServer: { + // 设置主机地址 + host: '0.0.0.0', + // 设置默认端口 + port: 8090, + // 禁用host验证 + disableHostCheck: true, + // 启动后打开浏览器 + open: true, + overlay: { + // 当出现编译器错误或警告时,在浏览器中显示全屏覆盖层 + warnings: false, + errors: true + } + // proxy: { + // //配置跨域 + // '/api': { + // // 接口前缀 + // target: "https://sit.smart-h5.1024lab.net/api", + // // ws:true, + // changOrigin:true, + // // 改写规则,把/api 替换为/ + // pathRewrite:{ + // '^/api':'/' + // } + // } + // } + }, + css: { + // 是否将组件中的 CSS 提取至一个独立的 CSS 文件中 (而不是动态注入到 JavaScript 中的 inline 代码)。 + extract: isProductionEnv, + sourceMap: false, + modules: false + }, + configureWebpack: config => { + config.name = projectConfig.title; + }, + + chainWebpack: config => { + // 移除资源预加载(路由懒加载才能正常使用) + config.plugins.delete('preload'); + config.plugins.delete('prefetch'); + + // 别名 alias + config.resolve.alias + .set('@', resolve('src')) + .set('assets', resolve('src/assets')) + .set('api', resolve('src/api')) + .set('views', resolve('src/views')) + .set('components', resolve('src/components')); + + // 应用名字 + config.plugin('html').tap(args => { + args[0].title = projectConfig.title; + return args; + }); + + // 设置保留空格 + config.module + .rule('vue') + .use('vue-loader') + .loader('vue-loader') + .tap(options => { + options.compilerOptions.preserveWhitespace = true; + return options; + }) + .end(); + + // ==================== 生产环境配置 begin ==================== + if (isProductionEnv) { + // 打包分析 + config.plugin('webpack-report').use(BundleAnalyzerPlugin, [ + { + analyzerMode: 'static' + } + ]); + // 不显示源码 + config.devtool('cheap-source-map'); + + // cdn + config.plugin('html').tap(args => { + args[0].cdn = projectConfig.cdn.cdnResource; + // 压缩html中的css + args[0].minify.minifyCSS = true; + return args; + }); + // 指定资源加载cdn + config.externals(projectConfig.cdn.externals); + + // 开启gzip , Nginx上也需要配置gzip才会生效 + config + .plugin('compression') + .use(CompressionWebpackPlugin) + .tap(() => [ + { + // 压缩 js 与 css + test: new RegExp( + '\\.(js|css)$' + ), + // 资源文件大于10240B=10kB时会被压缩 + threshold: 10240, + // 最小压缩比达到0.8时才会被压缩 + minRatio: 0.8 + } + ]); + + // sentry + if (isProductionAppEnv) { + config.plugin('sentry').use(SentryPlugin, [{ + ignore: ['node_modules'], + include: './dist', // 上传dist文件的js + configFile: './.sentryclirc' // 配置文件地址 + }]); + } + + config.optimization.minimizer = [ + new UglifyjsWebpackPlugin({ + // 生产环境推荐关闭 sourcemap 防止源码泄漏 + // 服务端通过前端发送的行列,根据 sourcemap 转为源文件位置 + sourceMap: false, + uglifyOptions: { + warnings: false, + compress: { + drop_console: true, + drop_debugger: true + } + } + }) + ]; + + config + .plugin('ScriptExtHtmlWebpackPlugin') + .after('html') + .use(ScriptExtHtmlWebpackPlugin, [ + { + // 将 runtime 作为内联引入不单独存在 + inline: /runtime\..*\.js$/ + } + ]) + .end(); + + config.optimization.splitChunks({ + chunks: 'all', + cacheGroups: { + commons: { + name: 'chunk-commons', + test: resolve('src/components'), + minChunks: 3, // 模块至少使用次数 + priority: 5, + reuseExistingChunk: true // 模块嵌套引入时,判断是否复用已经被打包的模块 + }, + node_vendors: { + name: 'chunk-libs', + chunks: 'initial', + test: /[\\/]node_modules[\\/]/, + priority: 10 + }, + vantUI: { + name: 'chunk-vantUI', + priority: 20, + test: /[\\/]node_modules[\\/]_?vant(.*)/ + } + } + }); + } + // ==================== 生产环境配置 end ==================== + } +}; diff --git a/smart-admin-web/src/main.js b/smart-admin-web/src/main.js index 5032173a..e4fe05e9 100644 --- a/smart-admin-web/src/main.js +++ b/smart-admin-web/src/main.js @@ -36,7 +36,7 @@ Vue.use(JsonViewer); Vue.use(vClickOutside); -Number.prototype.toFixed = function (length) { +Number.prototype.toFixed = function (length) {· let x = new Decimal(this); return x.toFixed(length); }; From 29789e2b3fab59408cb86f79e219fb4a9bdf53a3 Mon Sep 17 00:00:00 2001 From: 1024-lab <1024lab@sina.com> Date: Tue, 8 Dec 2020 18:05:10 +0800 Subject: [PATCH 09/14] update README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9e842a7f..64be3141 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ gitee: [https://gitee.com/lab1024/smart-admin](https://gitee.com/lab1024/smart- #### 演示图 - + From 56df084e570f7b086f35ddce19a8a97693358f41 Mon Sep 17 00:00:00 2001 From: 1024-lab <1024lab@sina.com> Date: Tue, 8 Dec 2020 18:05:40 +0800 Subject: [PATCH 10/14] update README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 64be3141..4584d8f1 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ gitee: [https://gitee.com/lab1024/smart-admin](https://gitee.com/lab1024/smart- #### 演示图
- + From 0ba522632bc40e5a478fa74b1ba21c86339c9be0 Mon Sep 17 00:00:00 2001 From: 1024-lab <1024lab@sina.com> Date: Tue, 8 Dec 2020 18:11:52 +0800 Subject: [PATCH 11/14] update README.md. --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 4584d8f1..617d2e48 100644 --- a/README.md +++ b/README.md @@ -26,31 +26,31 @@ gitee: [https://gitee.com/lab1024/smart-admin](https://gitee.com/lab1024/smart-
- + - - + + - - + + - - + + - - + + - - + + - - + +
@@ -111,7 +111,7 @@ SmartAdmin微信群(**加我微信拉你入群!**) - +
@@ -121,7 +121,7 @@ SmartAdmin微信群(**加我微信拉你入群!**) >*佛祖保佑捐赠这些人写程序永无bug,工资翻倍,迎娶白富美,走上人生巅峰!* - +
From 653f4c2d6c7b9535ac237a62ded025c5f071ea77 Mon Sep 17 00:00:00 2001 From: zhuoda Date: Mon, 14 Dec 2020 14:10:27 +0800 Subject: [PATCH 12/14] fix code --- .../src/main/resources/prod/application.properties | 2 +- smart-admin-web/src/main.js | 6 +++--- 快速部署/README.md | 12 +++++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties b/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties index 70db1f5a..a9b63e70 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties +++ b/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties @@ -35,7 +35,7 @@ spring.datasource.min-evictable-idle-time-millis=300000 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.filters=stat spring.datasource.druid.username=druid -spring.datasource.druid.password=Gq123456 +spring.datasource.druid.password=druid spring.datasource.druid.login.enabled=false ######################### redis ####################################### diff --git a/smart-admin-web/src/main.js b/smart-admin-web/src/main.js index e4fe05e9..bb90a263 100644 --- a/smart-admin-web/src/main.js +++ b/smart-admin-web/src/main.js @@ -24,7 +24,7 @@ import enumInfo from '@/constants'; import tableAction from './lib/table-action'; //时间 -import moment from 'moment'; +import moment from 'moment'; Vue.prototype.$tableAction = tableAction; @@ -36,13 +36,13 @@ Vue.use(JsonViewer); Vue.use(vClickOutside); -Number.prototype.toFixed = function (length) {· +Number.prototype.toFixed = function (length) { let x = new Decimal(this); return x.toFixed(length); }; //时间处理 -moment.locale('zh-cn'); //设置语言 或 moment.lang('zh-cn'); +moment.locale('zh-cn'); //设置语言 或 moment.lang('zh-cn'); Vue.prototype.$moment = moment;//赋值使用 diff --git a/快速部署/README.md b/快速部署/README.md index 66821d87..6741c640 100644 --- a/快速部署/README.md +++ b/快速部署/README.md @@ -1,8 +1,18 @@ ### 快速启动 如果你是全栈开发者,你完全可以快速过一遍此文章,甚至也可以不用看,如果你是前端OR后端,请仔细阅读。 +>*前置条件:* +>*1、java版本1.8+(含1.8)* +>*2、Mysql 5.7+(含5.7)* +>*3、Redis* +>*4、Maven* +>*5、idea 、eclipse 必须安装lombok* +>*6、nodejs* +>*7、npm* +>*8、vscode、webstorm* + ### 1 拉取代码 -从 [https://github.com/1024-lab/smart-admin](https://github.com/1024-lab/smart-admin) 或者 [https://gitee.com/lab1024/smart-admin](https://gitee.com/lab1024/smart-admin) 拉取最新代码 +从 [https://gitee.com/lab1024/smart-admin](https://gitee.com/lab1024/smart-admin) 拉取最新代码 ### 2 启动后端 #### 2.1 执行Sql脚本(Mysql5.7+) From 7e580440f06d41aab36aa37b4126aad22cf68f09 Mon Sep 17 00:00:00 2001 From: zhuoda Date: Mon, 14 Dec 2020 15:56:25 +0800 Subject: [PATCH 13/14] v1.10.0 --- .../smart-admin-api/doc/readme.txt | 16 +- .../support/quartz/service/QuartzTask.java | 6 +- .../system/employee/EmployeeController.java | 1 - .../controller/PrivilegeController.java | 3 - .../main/resources/dev/application.properties | 2 +- .../main/resources/pre/application.properties | 2 +- .../resources/prod/application.properties | 2 +- .../main/resources/sit/application.properties | 2 +- .../src/main/resources/sql/smart-admin.sql | 442 ++++++++++-------- smart-admin-web/package.json | 1 + .../components/header-bar/header-bar.less | 5 + .../main/components/header-bar/header-bar.vue | 30 +- smart-admin-web/src/main.js | 6 +- 13 files changed, 310 insertions(+), 208 deletions(-) diff --git a/smart-admin-service/smart-admin-api/doc/readme.txt b/smart-admin-service/smart-admin-api/doc/readme.txt index 952f684b..3f67bb03 100644 --- a/smart-admin-service/smart-admin-api/doc/readme.txt +++ b/smart-admin-service/smart-admin-api/doc/readme.txt @@ -1,19 +1,13 @@ -1 更新密码 -EmployeeController.updatePwd - -2 更新功能点 -PrivilegeController functionSaveOrUpdate和menuBatchSave、batchSaveFunctionList - -3 超管默认账号 +1 超管默认账号 sa/123456 -4 执行脚本: +2 执行脚本: 先执行:src/main/resources/sql/smart-admin.sql 再执行:src/main/resources/sql/quartz_mysql_2.3.0.sql -5 除dev之外文件 +3 除dev之外文件 -6 刷新页面,获取权限是否走缓存 +4 刷新页面,获取权限是否走缓存 LoginService.getSession -7 test类中去掉代码生成run +5 test类中去掉代码生成run diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java index 58b2e32c..4b327d1f 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java @@ -47,7 +47,11 @@ public class QuartzTask extends QuartzJobBean { QuartzTaskLogEntity taskLogEntity = new QuartzTaskLogEntity(); taskLogEntity.setTaskId(taskId); taskLogEntity.setIpAddress(SmartIPUtil.getLocalHostIP()); - taskLogEntity.setTaskName(quartzTaskEntity.getTaskName()); + try { + taskLogEntity.setTaskName(quartzTaskEntity.getTaskName()); + } catch (Exception e) { + e.printStackTrace(); + } String paramsStr = null; if (params != null) { paramsStr = params.toString(); diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeController.java index 0bf03828..33c788e1 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeController.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeController.java @@ -86,7 +86,6 @@ public class EmployeeController { public ResponseDTO updatePwd(@Valid @RequestBody EmployeeUpdatePwdDTO updatePwdDTO) { RequestTokenBO requestToken = SmartRequestTokenUtil.getRequestUser(); return employeeService.updatePwd(updatePwdDTO, requestToken); -// return ResponseDTO.succ(); } @ApiOperation(value = "通过部门id获取当前部门的人员&没有部门的人", notes = "@author yandanyang") diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/controller/PrivilegeController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/controller/PrivilegeController.java index 51c16e07..3a073a2d 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/controller/PrivilegeController.java +++ b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/controller/PrivilegeController.java @@ -42,7 +42,6 @@ public class PrivilegeController { @PostMapping("/privilege/menu/batchSaveMenu") public ResponseDTO menuBatchSave(@Valid @RequestBody ValidateList menuList) { return privilegeService.menuBatchSave(menuList); -// return ResponseDTO.succ(); } @@ -57,14 +56,12 @@ public class PrivilegeController { @PostMapping("/privilege/function/saveOrUpdate") public ResponseDTO functionSaveOrUpdate(@Valid @RequestBody PrivilegeFunctionDTO privilegeFunctionDTO) { return privilegeService.functionSaveOrUpdate(privilegeFunctionDTO); -// return ResponseDTO.succ(); } @ApiOperation(value = "批量保存功能点") @PostMapping("/privilege/function/batchSave") public ResponseDTO batchSaveFunctionList(@Valid @RequestBody ValidateList functionList) { return privilegeService.batchSaveFunctionList(functionList); -// return ResponseDTO.succ(); } diff --git a/smart-admin-service/smart-admin-api/src/main/resources/dev/application.properties b/smart-admin-service/smart-admin-api/src/main/resources/dev/application.properties index 6e0be9f5..b4468249 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/dev/application.properties +++ b/smart-admin-service/smart-admin-api/src/main/resources/dev/application.properties @@ -44,7 +44,7 @@ spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.timeout=10000ms spring.redis.password= -spring.redis.lettuce..pool.max-active=10 +spring.redis.lettuce.pool.max-active=10 spring.redis.lettuce.pool.min-idle=5 spring.redis.lettuce.pool.max-idle=10 spring.redis.lettuce.pool.max-wait=30000ms diff --git a/smart-admin-service/smart-admin-api/src/main/resources/pre/application.properties b/smart-admin-service/smart-admin-api/src/main/resources/pre/application.properties index d595e1a9..fb3de5e5 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/pre/application.properties +++ b/smart-admin-service/smart-admin-api/src/main/resources/pre/application.properties @@ -44,7 +44,7 @@ spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.timeout=10000ms spring.redis.password= -spring.redis.lettuce..pool.max-active=10 +spring.redis.lettuce.pool.max-active=10 spring.redis.lettuce.pool.min-idle=5 spring.redis.lettuce.pool.max-idle=10 spring.redis.lettuce.pool.max-wait=30000ms diff --git a/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties b/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties index a9b63e70..94f75be2 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties +++ b/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties @@ -44,7 +44,7 @@ spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.timeout=10000ms spring.redis.password=Gq123456@ -spring.redis.lettuce..pool.max-active=10 +spring.redis.lettuce.pool.max-active=10 spring.redis.lettuce.pool.min-idle=5 spring.redis.lettuce.pool.max-idle=10 spring.redis.lettuce.pool.max-wait=30000ms diff --git a/smart-admin-service/smart-admin-api/src/main/resources/sit/application.properties b/smart-admin-service/smart-admin-api/src/main/resources/sit/application.properties index 0425a891..c7c426cf 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/sit/application.properties +++ b/smart-admin-service/smart-admin-api/src/main/resources/sit/application.properties @@ -44,7 +44,7 @@ spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.timeout=10000ms spring.redis.password= -spring.redis.lettuce..pool.max-active=10 +spring.redis.lettuce.pool.max-active=10 spring.redis.lettuce.pool.min-idle=5 spring.redis.lettuce.pool.max-idle=10 spring.redis.lettuce.pool.max-wait=30000ms diff --git a/smart-admin-service/smart-admin-api/src/main/resources/sql/smart-admin.sql b/smart-admin-service/smart-admin-api/src/main/resources/sql/smart-admin.sql index 562e47f0..126fbf5e 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/sql/smart-admin.sql +++ b/smart-admin-service/smart-admin-api/src/main/resources/sql/smart-admin.sql @@ -1,8 +1,8 @@ -- -------------------------------------------------------- -- 主机: 127.0.0.1 --- 服务器版本: 5.7.20-log - MySQL Community Server (GPL) +-- 服务器版本: 8.0.20 - MySQL Community Server - GPL -- 服务器操作系统: Win64 --- HeidiSQL 版本: 10.2.0.5670 +-- HeidiSQL 版本: 11.0.0.5919 -- -------------------------------------------------------- /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; @@ -14,46 +14,25 @@ -- 导出 smart-admin-dev 的数据库结构 DROP DATABASE IF EXISTS `smart-admin-dev`; -CREATE DATABASE IF NOT EXISTS `smart-admin-dev` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */; +CREATE DATABASE IF NOT EXISTS `smart-admin-dev` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTION='N' */; USE `smart-admin-dev`; - -DROP TABLE IF EXISTS `t_peony`; -CREATE TABLE IF NOT EXISTS `t_peony` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', - `kind` varchar(500) DEFAULT NULL COMMENT '品种', - `name` varchar(500) DEFAULT NULL COMMENT '名字', - `color` varchar(500) DEFAULT NULL COMMENT '颜色', - `image_url` text COMMENT '图片链接', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='牡丹花'; - - -DELETE FROM `t_peony`; - -INSERT INTO `t_peony` (`id`, `kind`, `name`, `color`, `image_url`, `create_time`, `update_time`) VALUES - (5, '复色类', '什样锦', '红色', 'https://bkimg.cdn.bcebos.com/pic/3c6d55fbb2fb43160ee185da2aa4462308f7d390?x-bce-process=image/watermark,g_7,image_d2F0ZXIvYmFpa2UxNTA=,xp_5,yp_5', '2020-04-06 22:02:32', '2020-04-06 22:03:30'), - (6, '绿色', '绿香球', '绿色', '11', '2020-04-06 22:14:35', '2020-04-06 22:17:51'), - (7, '墨紫色类', '冠世墨玉', '紫色', '34534534534', '2020-04-06 22:15:19', '2020-04-06 22:18:21'); - -- 导出 表 smart-admin-dev.t_department 结构 DROP TABLE IF EXISTS `t_department`; CREATE TABLE IF NOT EXISTS `t_department` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '部门主键id', + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '部门主键id', `name` varchar(50) NOT NULL COMMENT '部门名称', `short_name` varchar(50) DEFAULT NULL COMMENT '部门简称', - `manager_id` int(10) unsigned DEFAULT NULL COMMENT '部门负责人id', - `parent_id` int(10) unsigned DEFAULT NULL COMMENT '部门的父级id', - `sort` int(10) NOT NULL COMMENT '部门排序', + `manager_id` int unsigned DEFAULT NULL COMMENT '部门负责人id', + `parent_id` int unsigned DEFAULT NULL COMMENT '部门的父级id', + `sort` int NOT NULL COMMENT '部门排序', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), KEY `parent_id` (`parent_id`) -) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COMMENT='部门表'; +) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='部门表'; --- 正在导出表 smart-admin-dev.t_department 的数据:~20 rows (大约) +-- 正在导出表 smart-admin-dev.t_department 的数据:~4 rows (大约) DELETE FROM `t_department`; /*!40000 ALTER TABLE `t_department` DISABLE KEYS */; INSERT INTO `t_department` (`id`, `name`, `short_name`, `manager_id`, `parent_id`, `sort`, `update_time`, `create_time`) VALUES @@ -82,11 +61,11 @@ INSERT INTO `t_department` (`id`, `name`, `short_name`, `manager_id`, `parent_id -- 导出 表 smart-admin-dev.t_email 结构 DROP TABLE IF EXISTS `t_email`; CREATE TABLE IF NOT EXISTS `t_email` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `title` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '标题', - `to_emails` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收件人', - `send_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '发送状态 0未发送 1已发送', - `content` longtext COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮件内容', + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '标题', + `to_emails` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收件人', + `send_status` tinyint NOT NULL DEFAULT '0' COMMENT '发送状态 0未发送 1已发送', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮件内容', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) @@ -157,25 +136,25 @@ INSERT INTO `t_email` (`id`, `title`, `to_emails`, `send_status`, `content`, `cr -- 导出 表 smart-admin-dev.t_employee 结构 DROP TABLE IF EXISTS `t_employee`; CREATE TABLE IF NOT EXISTS `t_employee` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', - `login_name` varchar(30) CHARACTER SET utf8 NOT NULL COMMENT '登录帐号', - `login_pwd` varchar(50) CHARACTER SET utf8 NOT NULL COMMENT '登录密码', - `actual_name` varchar(30) CHARACTER SET utf8 NOT NULL COMMENT '员工名称', + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `login_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录帐号', + `login_pwd` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录密码', + `actual_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '员工名称', `nick_name` varchar(30) DEFAULT '' COMMENT '别名', - `phone` varchar(15) CHARACTER SET utf8 DEFAULT NULL COMMENT '手机号码', - `id_card` varchar(18) CHARACTER SET utf8 DEFAULT NULL COMMENT '身份证', + `phone` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机号码', + `id_card` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '身份证', `birthday` date DEFAULT NULL COMMENT '出生日期', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', - `department_id` int(10) unsigned NOT NULL COMMENT '部门id', - `is_leave` int(10) NOT NULL DEFAULT '0' COMMENT '是否离职1是', - `is_disabled` int(10) NOT NULL DEFAULT '0' COMMENT '是否被禁用 0否1是', + `department_id` int unsigned NOT NULL COMMENT '部门id', + `is_leave` int NOT NULL DEFAULT '0' COMMENT '是否离职1是', + `is_disabled` int NOT NULL DEFAULT '0' COMMENT '是否被禁用 0否1是', `remark` varchar(200) DEFAULT NULL COMMENT '备注', - `create_user` int(10) unsigned NOT NULL COMMENT '创建者id', + `create_user` int unsigned NOT NULL COMMENT '创建者id', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `is_delete` int(10) NOT NULL DEFAULT '0' COMMENT '是否删除0否 1是', + `is_delete` int NOT NULL DEFAULT '0' COMMENT '是否删除0否 1是', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COMMENT='员工表'; +) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工表'; -- 正在导出表 smart-admin-dev.t_employee 的数据:~28 rows (大约) DELETE FROM `t_employee`; @@ -214,21 +193,21 @@ INSERT INTO `t_employee` (`id`, `login_name`, `login_pwd`, `actual_name`, `nick_ -- 导出 表 smart-admin-dev.t_file 结构 DROP TABLE IF EXISTS `t_file`; CREATE TABLE IF NOT EXISTS `t_file` ( - `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', `module_id` varchar(50) NOT NULL COMMENT '相关业务id', `module_type` varchar(50) NOT NULL COMMENT '相关业务类型', `file_name` varchar(255) DEFAULT NULL COMMENT '文件名称', `file_size` varchar(255) DEFAULT NULL COMMENT '文件大小', `file_type` varchar(50) DEFAULT NULL COMMENT '文件类型,程序中枚举控制,文件类型:如身份证正面,三证合一等等', `file_path` varchar(255) NOT NULL COMMENT '文件key,用于文件下载', - `file_location_type` int(10) NOT NULL COMMENT '文件位置类型', - `creater_user` int(10) NOT NULL COMMENT '创建人,即上传人', + `file_location_type` int NOT NULL COMMENT '文件位置类型', + `creater_user` int NOT NULL COMMENT '创建人,即上传人', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '上次更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, KEY `module_id_module_type` (`module_id`,`module_type`) USING BTREE, KEY `module_type` (`module_type`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; -- 正在导出表 smart-admin-dev.t_file 的数据:~23 rows (大约) DELETE FROM `t_file`; @@ -262,37 +241,40 @@ INSERT INTO `t_file` (`id`, `module_id`, `module_type`, `file_name`, `file_size` -- 导出 表 smart-admin-dev.t_heart_beat_record 结构 DROP TABLE IF EXISTS `t_heart_beat_record`; CREATE TABLE IF NOT EXISTS `t_heart_beat_record` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id', + `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', `project_path` varchar(100) DEFAULT NULL COMMENT '项目名称', `server_ip` varchar(200) DEFAULT NULL COMMENT '服务器ip', - `process_no` int(10) DEFAULT NULL COMMENT '进程号', + `process_no` int DEFAULT NULL COMMENT '进程号', `process_start_time` datetime DEFAULT NULL COMMENT '进程开启时间', `heart_beat_time` datetime DEFAULT NULL COMMENT '心跳时间', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; -- 正在导出表 smart-admin-dev.t_heart_beat_record 的数据:~2 rows (大约) DELETE FROM `t_heart_beat_record`; /*!40000 ALTER TABLE `t_heart_beat_record` DISABLE KEYS */; INSERT INTO `t_heart_beat_record` (`id`, `project_path`, `server_ip`, `process_no`, `process_start_time`, `heart_beat_time`) VALUES (1, '/home/server/smart-admin/dev', '192.168.122.1;172.16.0.145', 14843, '2019-11-16 03:11:50', '2019-11-16 03:58:01'), - (2, 'F:\\codespace\\idea\\gangquan360\\foundation', '172.16.1.188;192.168.56.1', 227992, '2019-11-16 10:02:39', '2019-11-16 10:06:50'); + (2, 'F:\\codespace\\idea\\gangquan360\\foundation', '172.16.1.188;192.168.56.1', 227992, '2019-11-16 10:02:39', '2019-11-16 10:06:50'), + (3, 'E:\\codespace\\zhuoda', '192.168.8.188', 17564, '2020-12-14 07:11:12', '2020-12-14 07:13:34'), + (4, 'E:\\codespace\\zhuoda', '192.168.8.188', 15568, '2020-12-14 07:13:53', '2020-12-14 07:15:00'), + (5, 'E:\\codespace\\zhuoda', '192.168.8.188', 16548, '2020-12-14 07:16:07', '2020-12-14 07:17:14'); /*!40000 ALTER TABLE `t_heart_beat_record` ENABLE KEYS */; -- 导出 表 smart-admin-dev.t_id_generator 结构 DROP TABLE IF EXISTS `t_id_generator`; CREATE TABLE IF NOT EXISTS `t_id_generator` ( - `id` int(11) DEFAULT NULL, + `id` int DEFAULT NULL, `key_name` varchar(50) NOT NULL COMMENT '英文key', `rule_format` varchar(500) NOT NULL COMMENT '规则格式。no_cycle没有周期, year_cycle 年周期, month_cycle月周期, day_cycle 日周期', `rule_type` varchar(50) NOT NULL COMMENT '格式[yyyy]表示年,[mm]标识月,[dd]表示日,[nnn]表示三位数字', - `init_number` int(11) NOT NULL DEFAULT '1' COMMENT '初始值', - `last_number` int(11) DEFAULT NULL COMMENT '上次产生的id, 默认为空', + `init_number` int NOT NULL DEFAULT '1' COMMENT '初始值', + `last_number` int DEFAULT NULL COMMENT '上次产生的id, 默认为空', `remark` varchar(1000) NOT NULL COMMENT '备注', `update_time` datetime DEFAULT NULL, `create_time` datetime NOT NULL, UNIQUE KEY `key_name` (`key_name`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='id生成器定义表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='id生成器定义表'; -- 正在导出表 smart-admin-dev.t_id_generator 的数据:~2 rows (大约) DELETE FROM `t_id_generator`; @@ -305,13 +287,13 @@ INSERT INTO `t_id_generator` (`id`, `key_name`, `rule_format`, `rule_type`, `ini -- 导出 表 smart-admin-dev.t_id_generator_record 结构 DROP TABLE IF EXISTS `t_id_generator_record`; CREATE TABLE IF NOT EXISTS `t_id_generator_record` ( - `generator_id` int(11) NOT NULL, - `year` int(11) NOT NULL, - `month` int(11) NOT NULL, - `day` int(11) NOT NULL, - `last_number` int(11) NOT NULL, + `generator_id` int NOT NULL, + `year` int NOT NULL, + `month` int NOT NULL, + `day` int NOT NULL, + `last_number` int NOT NULL, PRIMARY KEY (`generator_id`,`year`,`month`,`day`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='id_generator记录表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='id_generator记录表'; -- 正在导出表 smart-admin-dev.t_id_generator_record 的数据:~5 rows (大约) DELETE FROM `t_id_generator_record`; @@ -327,12 +309,12 @@ INSERT INTO `t_id_generator_record` (`generator_id`, `year`, `month`, `day`, `la -- 导出 表 smart-admin-dev.t_notice 结构 DROP TABLE IF EXISTS `t_notice`; CREATE TABLE IF NOT EXISTS `t_notice` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `title` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息标题', - `content` longtext COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息内容', - `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '删除状态:0未删除 0删除 ', + `id` bigint NOT NULL AUTO_INCREMENT, + `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息标题', + `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息内容', + `deleted` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '删除状态:0未删除 0删除 ', `send_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发送状态 0未发送 1发送', - `create_user` bigint(20) NOT NULL COMMENT '消息创建人', + `create_user` bigint NOT NULL COMMENT '消息创建人', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) @@ -361,9 +343,9 @@ INSERT INTO `t_notice` (`id`, `title`, `content`, `deleted`, `send_status`, `cre -- 导出 表 smart-admin-dev.t_notice_receive_record 结构 DROP TABLE IF EXISTS `t_notice_receive_record`; CREATE TABLE IF NOT EXISTS `t_notice_receive_record` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `notice_id` bigint(20) NOT NULL COMMENT '消息id', - `employee_id` bigint(20) NOT NULL COMMENT '用户id', + `id` bigint NOT NULL AUTO_INCREMENT, + `notice_id` bigint NOT NULL COMMENT '消息id', + `employee_id` bigint NOT NULL COMMENT '用户id', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) @@ -405,32 +387,54 @@ INSERT INTO `t_notice_receive_record` (`id`, `notice_id`, `employee_id`, `create -- 导出 表 smart-admin-dev.t_order_operate_log 结构 DROP TABLE IF EXISTS `t_order_operate_log`; CREATE TABLE IF NOT EXISTS `t_order_operate_log` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `order_id` int(11) NOT NULL COMMENT '各种单据的id', - `order_type` int(11) NOT NULL COMMENT '单据类型', - `operate_type` int(11) NOT NULL COMMENT '操作类型', + `id` bigint NOT NULL AUTO_INCREMENT, + `order_id` int NOT NULL COMMENT '各种单据的id', + `order_type` int NOT NULL COMMENT '单据类型', + `operate_type` int NOT NULL COMMENT '操作类型', `operate_content` text NOT NULL COMMENT '操作类型 对应的中文', `operate_remark` text COMMENT '操作备注', - `employee_id` int(11) NOT NULL COMMENT '员工id', + `employee_id` int NOT NULL COMMENT '员工id', `employee_name` varchar(1000) NOT NULL COMMENT '员工名称', `ext_data` text COMMENT '额外信息', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, KEY `order_id_order_type` (`order_id`,`order_type`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='各种单据操作记录\r\n'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='各种单据操作记录\r\n'; -- 正在导出表 smart-admin-dev.t_order_operate_log 的数据:~0 rows (大约) DELETE FROM `t_order_operate_log`; /*!40000 ALTER TABLE `t_order_operate_log` DISABLE KEYS */; /*!40000 ALTER TABLE `t_order_operate_log` ENABLE KEYS */; +-- 导出 表 smart-admin-dev.t_peony 结构 +DROP TABLE IF EXISTS `t_peony`; +CREATE TABLE IF NOT EXISTS `t_peony` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', + `kind` varchar(500) DEFAULT NULL COMMENT '品种', + `name` varchar(500) DEFAULT NULL COMMENT '名字', + `color` varchar(500) DEFAULT NULL COMMENT '颜色', + `image_url` text COMMENT '图片链接', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='牡丹花'; + +-- 正在导出表 smart-admin-dev.t_peony 的数据:~3 rows (大约) +DELETE FROM `t_peony`; +/*!40000 ALTER TABLE `t_peony` DISABLE KEYS */; +INSERT INTO `t_peony` (`id`, `kind`, `name`, `color`, `image_url`, `create_time`, `update_time`) VALUES + (5, '复色类', '什样锦', '红色', 'https://bkimg.cdn.bcebos.com/pic/3c6d55fbb2fb43160ee185da2aa4462308f7d390?x-bce-process=image/watermark,g_7,image_d2F0ZXIvYmFpa2UxNTA=,xp_5,yp_5', '2020-04-06 22:02:32', '2020-04-06 22:03:30'), + (6, '绿色', '绿香球', '绿色', '11', '2020-04-06 22:14:35', '2020-04-06 22:17:51'), + (7, '墨紫色类', '冠世墨玉', '紫色', '34534534534', '2020-04-06 22:15:19', '2020-04-06 22:18:21'); +/*!40000 ALTER TABLE `t_peony` ENABLE KEYS */; + -- 导出 表 smart-admin-dev.t_position 结构 DROP TABLE IF EXISTS `t_position`; CREATE TABLE IF NOT EXISTS `t_position` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `position_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '岗位名称', - `remark` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '岗位描述', + `id` int unsigned NOT NULL AUTO_INCREMENT, + `position_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '岗位名称', + `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '岗位描述', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) @@ -458,9 +462,9 @@ INSERT INTO `t_position` (`id`, `position_name`, `remark`, `update_time`, `creat -- 导出 表 smart-admin-dev.t_position_relation 结构 DROP TABLE IF EXISTS `t_position_relation`; CREATE TABLE IF NOT EXISTS `t_position_relation` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `position_id` int(10) DEFAULT NULL COMMENT '岗位ID', - `employee_id` int(10) DEFAULT NULL COMMENT '员工ID', + `id` int unsigned NOT NULL AUTO_INCREMENT, + `position_id` int DEFAULT NULL COMMENT '岗位ID', + `employee_id` int DEFAULT NULL COMMENT '员工ID', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), @@ -504,12 +508,12 @@ INSERT INTO `t_position_relation` (`id`, `position_id`, `employee_id`, `update_t -- 导出 表 smart-admin-dev.t_privilege 结构 DROP TABLE IF EXISTS `t_privilege`; CREATE TABLE IF NOT EXISTS `t_privilege` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '功能权限表主键id', - `type` tinyint(11) NOT NULL COMMENT '1.菜单 2.功能点', + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '功能权限表主键id', + `type` tinyint NOT NULL COMMENT '1.菜单 2.功能点', `name` varchar(50) NOT NULL COMMENT '菜单名称', `key` varchar(1000) NOT NULL COMMENT '路由name 英文关键字', `url` text COMMENT '路由path/type=3为API接口', - `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `sort` int NOT NULL DEFAULT '0' COMMENT '排序', `parent_key` varchar(1000) DEFAULT NULL COMMENT '父级key', `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -517,49 +521,48 @@ CREATE TABLE IF NOT EXISTS `t_privilege` ( UNIQUE KEY `key` (`key`) USING BTREE, KEY `type` (`type`) USING BTREE, KEY `parent_key` (`parent_key`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8 COMMENT='权限功能表'; +) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8 COMMENT='权限功能表'; -- 正在导出表 smart-admin-dev.t_privilege 的数据:~103 rows (大约) DELETE FROM `t_privilege`; /*!40000 ALTER TABLE `t_privilege` DISABLE KEYS */; INSERT INTO `t_privilege` (`id`, `type`, `name`, `key`, `url`, `sort`, `parent_key`, `update_time`, `create_time`) VALUES - (1, 1, '人员管理', 'Employee', '/employee', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (2, 1, '角色管理', 'RoleManage', '/employee/role', 0, 'Employee', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (3, 1, '岗位管理', 'PositionList', '/employee/position', 0, 'Employee', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (4, 1, '员工管理', 'RoleEmployeeManage', '/employee/role-employee-manage', 0, 'Employee', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (5, 1, '系统设置', 'SystemSetting', '/system-setting', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (6, 1, '系统参数', 'SystemConfig', '/system-setting/system-config', 0, 'SystemSetting', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (8, 1, '菜单管理', 'SystemPrivilege', '/system-setting/system-privilege', 0, 'SystemSetting', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (9, 1, '消息管理', 'Notice', '/notice', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (10, 1, '通知管理', 'NoticeList', '/notice/notice-list', 0, 'Notice', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (11, 1, '个人消息', 'PersonNotice', '/notice/person-notice', 0, 'Notice', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (12, 1, '邮件管理', 'Email', '/email', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (13, 1, '邮件管理', 'EmailList', '/email/email-list', 0, 'Email', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (14, 1, '发送邮件', 'SendMail', '/email/send-mail', 0, 'Email', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (15, 1, '用户日志', 'UserLog', '/user-log', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (16, 1, '用户操作日志', 'UserOperateLog', '/user-log/user-operate-log', 0, 'UserLog', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (17, 1, '用户登录日志', 'UserLoginLog', '/user-log/user-login-log', 0, 'UserLog', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (18, 1, '系统监控', 'Monitor', '/monitor', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (19, 1, '在线人数', 'OnlineUser', '/monitor/online-user', 0, 'Monitor', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (20, 1, 'SQL监控', 'Sql', '/monitor/sql', 0, 'Monitor', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (21, 1, '定时任务', 'Task', '/task', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (22, 1, '任务管理', 'TaskList', '/system-setting/task-list', 0, 'Task', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (23, 1, '动态加载', 'Reload', '/reload', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (24, 1, 'SmartReload', 'SmartReloadList', '/reload/smart-reload-list', 0, 'Reload', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (25, 1, '接口文档', 'ApiDoc', '/api-doc', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (26, 1, 'Swagger接口文档', 'Swagger', '/api-doc/swagger', 0, 'ApiDoc', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (27, 1, '三级路由', 'ThreeRouter', '/three-router', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (28, 1, '三级菜单', 'LevelTwo', '/three-router/level-two', 0, 'ThreeRouter', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (29, 1, '三级A', 'RoleOneTwo', '/three-router/level-two/level-three1', 0, 'LevelTwo', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (30, 1, '三级B', 'RoleTwoTwo', '/three-router/level-two/level-three2', 0, 'LevelTwo', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (31, 1, '二级菜单', 'RoleOneOne', '/three-router/level-two2', 0, 'ThreeRouter', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (32, 1, 'KeepAlive', 'KeepAlive', '/keep-alive', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (33, 1, 'KeepAlive列表', 'KeepAliveContentList', '/keep-alive/content-list', 0, 'KeepAlive', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (34, 1, 'KeepAlive表单', 'KeepAliveAddContent', '/keep-alive/add-content', 0, 'KeepAlive', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (35, 1, '心跳服务', 'HeartBeat', '/heart-beat', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (36, 1, '心跳服务', 'HeartBeatList', '/heart-beat/heart-beat-list', 0, 'HeartBeat', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (37, 1, '文件服务', 'File', '/file', 0, NULL, '2019-11-14 14:05:10', '2019-11-01 11:28:07'), - (38, 1, '文件列表', 'FileList', '/file/file-list', 0, 'File', '2019-11-14 14:05:10', '2019-11-01 11:28:07'), + (1, 1, '人员管理', 'Employee', '/employee', 20, 'System', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (2, 1, '角色管理', 'RoleManage', '/employee/role', 21, 'Employee', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (3, 1, '岗位管理', 'PositionList', '/employee/position', 22, 'Employee', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (4, 1, '员工管理', 'RoleEmployeeManage', '/employee/role-employee-manage', 23, 'Employee', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (5, 1, '系统设置', 'SystemSetting', '/system-setting', 29, 'System', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (6, 1, '系统参数', 'SystemConfig', '/system-setting/system-config', 30, 'SystemSetting', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (8, 1, '菜单设置', 'SystemPrivilege', '/system-setting/system-privilege', 31, 'SystemSetting', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (9, 1, '消息管理', 'Notice', '/notice', 10, 'Business', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (10, 1, '通知管理', 'NoticeList', '/notice/notice-list', 11, 'Notice', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (11, 1, '个人消息', 'PersonNotice', '/notice/person-notice', 12, 'Notice', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (12, 1, '邮件管理', 'Email', '/email', 4, 'Business', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (13, 1, '邮件管理', 'EmailList', '/email/email-list', 5, 'Email', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (14, 1, '发送邮件', 'SendMail', '/email/send-mail', 6, 'Email', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (15, 1, '用户日志', 'UserLog', '/user-log', 26, 'System', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (16, 1, '用户操作日志', 'UserOperateLog', '/user-log/user-operate-log', 27, 'UserLog', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (17, 1, '用户登录日志', 'UserLoginLog', '/user-log/user-login-log', 28, 'UserLog', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (18, 1, '系统监控', 'Monitor', '/monitor', 37, 'Support', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (19, 1, '在线人数', 'OnlineUser', '/monitor/online-user', 38, 'Monitor', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (20, 1, 'SQL监控', 'Sql', '/monitor/sql', 39, 'Monitor', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (21, 1, '定时任务', 'Task', '/task', 42, 'Support', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (22, 1, '任务管理', 'TaskList', '/system-setting/task-list', 43, 'Task', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (23, 1, '动态加载', 'Reload', '/reload', 40, 'Support', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (24, 1, 'SmartReload', 'SmartReloadList', '/reload/smart-reload-list', 41, 'Reload', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (25, 1, '接口文档', 'ApiDoc', '/api-doc', 33, 'Support', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (26, 1, 'Swagger接口文档', 'Swagger', '/api-doc/swagger', 34, 'ApiDoc', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (27, 1, '三级路由', 'ThreeRouter', '/three-router', 14, 'Business', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (28, 1, '三级菜单', 'LevelTwo', '/three-router/level-two', 15, 'ThreeRouter', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (30, 1, '三级菜单子哈', 'RoleTwoTwo', '/three-router/level-two/level-three2', 17, 'LevelTwo', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (31, 1, '二级菜单', 'RoleOneOne', '/three-router/level-two2', 18, 'ThreeRouter', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (32, 1, 'KeepAlive', 'KeepAlive', '/keep-alive', 7, 'Business', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (33, 1, 'KeepAlive列表', 'KeepAliveContentList', '/keep-alive/content-list', 8, 'KeepAlive', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (34, 1, 'KeepAlive表单', 'KeepAliveAddContent', '/keep-alive/add-content', 9, 'KeepAlive', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (35, 1, '心跳服务', 'HeartBeat', '/heart-beat', 35, 'Support', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (36, 1, '心跳服务', 'HeartBeatList', '/heart-beat/heart-beat-list', 36, 'HeartBeat', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (37, 1, '文件服务', 'File', '/file', 24, 'System', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), + (38, 1, '文件列表', 'FileList', '/file/file-list', 25, 'File', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), (39, 2, '添加角色', 'add-role', 'roleController.addRole', 0, 'RoleManage', '2019-11-01 11:47:29', '2019-11-01 11:47:29'), (40, 2, '删除角色', 'delete-role', 'roleController.deleteRole', 1, 'RoleManage', '2019-11-01 11:47:43', '2019-11-01 11:47:43'), (41, 2, '编辑角色', 'update-role', 'roleController.updateRole', 2, 'RoleManage', '2019-11-01 11:47:55', '2019-11-01 11:47:55'), @@ -589,8 +592,8 @@ INSERT INTO `t_privilege` (`id`, `type`, `name`, `key`, `url`, `sort`, `parent_k (65, 2, '添加系统参数', 'system-params-add', 'systemConfigController.addSystemConfig', 1, 'SystemConfig', '2019-11-05 17:26:00', '2019-11-05 17:26:00'), (66, 2, '修改系统参数', 'system-config-update', 'systemConfigController.updateSystemConfig', 2, 'SystemConfig', '2019-11-05 17:26:07', '2019-11-05 17:26:07'), (67, 2, '搜索系统参数', 'system-config-search', 'systemConfigController.selectByKey,systemConfigController.getListByGroup,systemConfigController.getSystemConfigPage', 3, 'SystemConfig', '2019-11-05 17:26:44', '2019-11-05 17:26:44'), - (69, 2, '编辑', 'privilege-main-update', 'privilegeController.menuBatchSave,privilegeController.functionSaveOrUpdate', 0, 'SystemPrivilege', '2019-11-05 17:27:28', '2019-11-05 17:27:28'), - (70, 2, '查询', 'privilege-main-search', 'privilegeController.queryAll,privilegeController.getAllUrl,privilegeController.functionQuery', 1, 'SystemPrivilege', '2019-11-05 17:28:45', '2019-11-05 17:28:45'), + (69, 2, '编辑', 'privilege-main-update', 'privilegeController.menuBatchSave,privilegeController.functionSaveOrUpdate', 1, 'SystemPrivilege', '2020-12-14 15:17:11', '2019-11-05 17:27:28'), + (70, 2, '查询', 'privilege-main-search', 'privilegeController.queryAll,privilegeController.getAllUrl,privilegeController.functionQuery', 3, 'SystemPrivilege', '2020-12-14 15:17:11', '2019-11-05 17:28:45'), (71, 2, '查询', 'notice-query', 'noticeController.queryReceiveByPage,noticeController.queryUnreadByPage,noticeController.queryByPage,noticeController.detail', 0, 'NoticeList', '2019-11-05 17:30:16', '2019-11-05 17:30:16'), (72, 2, '添加', 'notice-add', 'noticeController.add', 1, 'NoticeList', '2019-11-05 17:30:28', '2019-11-05 17:30:28'), (73, 2, '修改', 'notice-edit', 'noticeController.update', 2, 'NoticeList', '2019-11-05 17:31:24', '2019-11-05 17:31:24'), @@ -625,19 +628,40 @@ INSERT INTO `t_privilege` (`id`, `type`, `name`, `key`, `url`, `sort`, `parent_k (102, 2, '查询任务', 'heart-beat-query', 'heartBeatController.query', 0, 'HeartBeatList', '2019-11-06 11:18:38', '2019-11-06 11:18:38'), (103, 2, '查询', 'file-filePage-query', 'fileController.queryListByPage,fileController.localGetFile,fileController.downLoadById', 0, 'FileList', '2019-11-06 11:19:06', '2019-11-06 11:19:06'), (104, 2, '上传', 'file-filePage-upload', 'fileController.qiNiuUpload,fileController.localUpload,fileController.aliYunUpload,fileController.saveFile', 1, 'FileList', '2019-11-06 11:19:36', '2019-11-06 11:19:36'), - (105, 2, '下载', 'file-filePage-download', 'fileController.downLoadById', 2, 'FileList', '2019-11-16 10:05:02', '2019-11-16 10:05:02'); + (105, 2, '下载', 'file-filePage-download', 'fileController.downLoadById', 2, 'FileList', '2019-11-16 10:05:02', '2019-11-16 10:05:02'), + (106, 1, '业务功能', 'Business', '/business', 0, NULL, '2020-12-14 15:16:26', '2020-12-14 15:16:26'), + (107, 1, '牡丹管理', 'Peony', '/peony', 1, 'Business', '2020-12-14 15:16:26', '2020-12-14 15:16:26'), + (108, 1, '牡丹花列表', 'PeonyList', '/peony/peony-list', 2, 'Peony', '2020-12-14 15:16:26', '2020-12-14 15:16:26'), + (109, 1, '牡丹花列表1', 'PeonyList1', '/peony/peony-list1', 3, 'Peony', '2020-12-14 15:16:26', '2020-12-14 15:16:26'), + (110, 1, '消息详情', 'NoticeDetail', '/notice/notice-detail', 13, 'Notice', '2020-12-14 15:16:26', '2020-12-14 15:16:26'), + (111, 1, '三级菜单子颗粒', 'ThreeLevelRouterView', '/three-router/level-two/level-three1', 16, 'LevelTwo', '2020-12-14 15:16:26', '2020-12-14 15:16:26'), + (112, 1, '系统设置', 'System', '/system', 19, NULL, '2020-12-14 15:16:26', '2020-12-14 15:16:26'), + (113, 1, '开发专用', 'Support', '/support', 32, NULL, '2020-12-14 15:16:26', '2020-12-14 15:16:26'), + (114, 2, '查询', 'peony-list-query', '', 1, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), + (115, 2, '新增', 'peony-list-add', '', 2, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), + (116, 2, '编辑', 'peony-list-update', '', 3, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), + (117, 2, '批量删除', 'peony-list-batch-delete', '', 4, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), + (118, 2, '批量导出', 'peony-list-batch-export', '', 5, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), + (119, 2, '导出全部', 'peony-list-export-all', '', 6, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), + (120, 2, '查询', 'peony1-list-query', '', 1, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), + (121, 2, '新增', 'peony1-list-add', '', 2, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), + (122, 2, '编辑', 'peony1-list-update', '', 3, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), + (123, 2, '批量删除', 'peony1-list-batch-delete', '', 4, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), + (124, 2, '批量导出', 'peony1-list-batch-export', '', 5, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), + (125, 2, '导出全部', 'peony1-list-export-all', '', 6, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), + (126, 2, '批量保存功能点', 'privilege-batch-save-points', 'privilegeController.functionSaveOrUpdate', 1, 'SystemPrivilege', '2020-12-14 15:17:11', '2020-12-14 15:17:11'); /*!40000 ALTER TABLE `t_privilege` ENABLE KEYS */; -- 导出 表 smart-admin-dev.t_quartz_task 结构 DROP TABLE IF EXISTS `t_quartz_task`; CREATE TABLE IF NOT EXISTS `t_quartz_task` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `task_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名称', - `task_bean` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'spring bean名称', - `task_params` varchar(1000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任务参数', - `task_cron` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '运行cron表达式', - `task_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '任务状态0:正常,1:暂停', - `remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', + `id` int NOT NULL AUTO_INCREMENT, + `task_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名称', + `task_bean` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'spring bean名称', + `task_params` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任务参数', + `task_cron` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '运行cron表达式', + `task_status` tinyint NOT NULL DEFAULT '0' COMMENT '任务状态0:正常,1:暂停', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) @@ -657,14 +681,14 @@ INSERT INTO `t_quartz_task` (`id`, `task_name`, `task_bean`, `task_params`, `tas -- 导出 表 smart-admin-dev.t_quartz_task_log 结构 DROP TABLE IF EXISTS `t_quartz_task_log`; CREATE TABLE IF NOT EXISTS `t_quartz_task_log` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `task_id` int(11) NOT NULL COMMENT '任务id', - `task_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名称', - `task_params` varchar(1000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任务参数', - `process_status` tinyint(4) NOT NULL COMMENT '任务处理状态0:成功,1:失败', - `process_duration` bigint(11) NOT NULL DEFAULT '0' COMMENT '运行时长', - `process_log` text COLLATE utf8mb4_unicode_ci COMMENT '日志', - `ip_address` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运行主机ip', + `id` int NOT NULL AUTO_INCREMENT, + `task_id` int NOT NULL COMMENT '任务id', + `task_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名称', + `task_params` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任务参数', + `process_status` tinyint NOT NULL COMMENT '任务处理状态0:成功,1:失败', + `process_duration` bigint NOT NULL DEFAULT '0' COMMENT '运行时长', + `process_log` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '日志', + `ip_address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运行主机ip', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) @@ -690,15 +714,15 @@ INSERT INTO `t_quartz_task_log` (`id`, `task_id`, `task_name`, `task_params`, `p -- 导出 表 smart-admin-dev.t_reload_item 结构 DROP TABLE IF EXISTS `t_reload_item`; CREATE TABLE IF NOT EXISTS `t_reload_item` ( - `tag` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '项名称', + `tag` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '项名称', `args` varchar(255) DEFAULT NULL COMMENT '参数 可选', - `identification` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '运行标识', + `identification` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '运行标识', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`tag`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; --- 正在导出表 smart-admin-dev.t_reload_item 的数据:~1 rows (大约) +-- 正在导出表 smart-admin-dev.t_reload_item 的数据:~0 rows (大约) DELETE FROM `t_reload_item`; /*!40000 ALTER TABLE `t_reload_item` DISABLE KEYS */; INSERT INTO `t_reload_item` (`tag`, `args`, `identification`, `update_time`, `create_time`) VALUES @@ -711,12 +735,12 @@ CREATE TABLE IF NOT EXISTS `t_reload_result` ( `tag` varchar(255) NOT NULL, `identification` varchar(255) NOT NULL COMMENT '运行标识', `args` varchar(255) DEFAULT NULL, - `result` tinyint(3) unsigned NOT NULL COMMENT '是否成功 ', + `result` tinyint unsigned NOT NULL COMMENT '是否成功 ', `exception` text, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; --- 正在导出表 smart-admin-dev.t_reload_result 的数据:~126 rows (大约) +-- 正在导出表 smart-admin-dev.t_reload_result 的数据:~127 rows (大约) DELETE FROM `t_reload_result`; /*!40000 ALTER TABLE `t_reload_result` DISABLE KEYS */; INSERT INTO `t_reload_result` (`tag`, `identification`, `args`, `result`, `exception`, `create_time`) VALUES @@ -845,13 +869,17 @@ INSERT INTO `t_reload_result` (`tag`, `identification`, `args`, `result`, `excep ('system_config', 'xxxx', '234', 1, NULL, '2019-11-15 14:39:55'), ('system_config', 'xxxx', '234', 1, NULL, '2019-11-16 08:47:43'), ('system_config', 'xxxx', '234', 1, NULL, '2019-11-16 17:12:10'), - ('system_config', 'xxxx', '234', 1, NULL, '2019-11-16 18:02:57'); + ('system_config', 'xxxx', '234', 1, NULL, '2019-11-16 18:02:57'), + ('system_config', 'xxxx', '234', 1, NULL, '2020-12-14 15:09:53'), + ('system_config', 'xxxx', '234', 1, NULL, '2020-12-14 15:13:33'), + ('system_config', 'xxxx', '234', 1, NULL, '2020-12-14 15:14:09'), + ('system_config', 'xxxx', '234', 1, NULL, '2020-12-14 15:16:23'); /*!40000 ALTER TABLE `t_reload_result` ENABLE KEYS */; -- 导出 表 smart-admin-dev.t_role 结构 DROP TABLE IF EXISTS `t_role`; CREATE TABLE IF NOT EXISTS `t_role` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `role_name` varchar(20) NOT NULL COMMENT '角色名称', `remark` varchar(255) DEFAULT NULL COMMENT '角色描述', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', @@ -882,10 +910,10 @@ INSERT INTO `t_role` (`id`, `role_name`, `remark`, `update_time`, `create_time`) -- 导出 表 smart-admin-dev.t_role_data_scope 结构 DROP TABLE IF EXISTS `t_role_data_scope`; CREATE TABLE IF NOT EXISTS `t_role_data_scope` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `data_scope_type` int(11) NOT NULL COMMENT '数据范围id', - `view_type` int(11) NOT NULL COMMENT '数据范围类型', - `role_id` int(11) NOT NULL COMMENT '角色id', + `id` int NOT NULL AUTO_INCREMENT, + `data_scope_type` int NOT NULL COMMENT '数据范围id', + `view_type` int NOT NULL COMMENT '数据范围类型', + `role_id` int NOT NULL COMMENT '角色id', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) @@ -904,13 +932,13 @@ INSERT INTO `t_role_data_scope` (`id`, `data_scope_type`, `view_type`, `role_id` -- 导出 表 smart-admin-dev.t_role_employee 结构 DROP TABLE IF EXISTS `t_role_employee`; CREATE TABLE IF NOT EXISTS `t_role_employee` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `role_id` int(11) NOT NULL COMMENT '角色id', - `employee_id` int(11) NOT NULL COMMENT '员工id', + `id` int NOT NULL AUTO_INCREMENT, + `role_id` int NOT NULL COMMENT '角色id', + `employee_id` int NOT NULL COMMENT '员工id', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=utf8mb4 COMMENT='角色员工功能表'; +) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色员工功能表'; -- 正在导出表 smart-admin-dev.t_role_employee 的数据:~25 rows (大约) DELETE FROM `t_role_employee`; @@ -946,13 +974,13 @@ INSERT INTO `t_role_employee` (`id`, `role_id`, `employee_id`, `update_time`, `c -- 导出 表 smart-admin-dev.t_role_privilege 结构 DROP TABLE IF EXISTS `t_role_privilege`; CREATE TABLE IF NOT EXISTS `t_role_privilege` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `role_id` int(11) NOT NULL COMMENT '角色id', + `id` int NOT NULL AUTO_INCREMENT, + `role_id` int NOT NULL COMMENT '角色id', `privilege_key` varchar(1000) NOT NULL COMMENT '权限key', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10835 DEFAULT CHARSET=utf8mb4 COMMENT='角色权限功能表'; +) ENGINE=InnoDB AUTO_INCREMENT=10835 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色权限功能表'; -- 正在导出表 smart-admin-dev.t_role_privilege 的数据:~322 rows (大约) DELETE FROM `t_role_privilege`; @@ -1205,7 +1233,6 @@ INSERT INTO `t_role_privilege` (`id`, `role_id`, `privilege_key`, `update_time`, (10757, 1, 'Swagger', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), (10758, 1, 'ThreeRouter', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), (10759, 1, 'LevelTwo', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10760, 1, 'RoleOneTwo', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), (10761, 1, 'RoleTwoTwo', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), (10762, 1, 'RoleOneOne', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), (10763, 1, 'KeepAlive', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), @@ -1285,17 +1312,17 @@ INSERT INTO `t_role_privilege` (`id`, `role_id`, `privilege_key`, `update_time`, -- 导出 表 smart-admin-dev.t_system_config 结构 DROP TABLE IF EXISTS `t_system_config`; CREATE TABLE IF NOT EXISTS `t_system_config` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `config_name` varchar(255) NOT NULL COMMENT '参数名字', `config_key` varchar(255) NOT NULL COMMENT '参数key', `config_value` text NOT NULL, `config_group` varchar(255) NOT NULL COMMENT '参数类别', - `is_using` int(10) NOT NULL COMMENT '是否使用0 否 1 是', + `is_using` int NOT NULL COMMENT '是否使用0 否 1 是', `remark` varchar(255) DEFAULT NULL, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '上次修改时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; -- 正在导出表 smart-admin-dev.t_system_config 的数据:~8 rows (大约) DELETE FROM `t_system_config`; @@ -1314,20 +1341,20 @@ INSERT INTO `t_system_config` (`id`, `config_name`, `config_key`, `config_value` -- 导出 表 smart-admin-dev.t_user_login_log 结构 DROP TABLE IF EXISTS `t_user_login_log`; CREATE TABLE IF NOT EXISTS `t_user_login_log` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', - `user_id` int(11) NOT NULL COMMENT '员工id', + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` int NOT NULL COMMENT '员工id', `user_name` varchar(50) NOT NULL COMMENT '用户名', `remote_ip` varchar(50) DEFAULT NULL COMMENT '用户ip', - `remote_port` int(11) DEFAULT NULL COMMENT '用户端口', + `remote_port` int DEFAULT NULL COMMENT '用户端口', `remote_browser` varchar(100) DEFAULT NULL COMMENT '浏览器', `remote_os` varchar(50) DEFAULT NULL COMMENT '操作系统', - `login_status` tinyint(4) NOT NULL COMMENT '登录状态 0 失败 1成功', + `login_status` tinyint NOT NULL COMMENT '登录状态 0 失败 1成功', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), KEY `customer_id` (`user_id`) USING BTREE, KEY `auditor_id` (`remote_browser`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1742 DEFAULT CHARSET=utf8mb4 COMMENT='用户登录日志'; +) ENGINE=InnoDB AUTO_INCREMENT=1743 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户登录日志'; -- 正在导出表 smart-admin-dev.t_user_login_log 的数据:~122 rows (大约) DELETE FROM `t_user_login_log`; @@ -1454,26 +1481,27 @@ INSERT INTO `t_user_login_log` (`id`, `user_id`, `user_name`, `remote_ip`, `remo (1621, 1, '管理员', '127.0.0.1', 63479, 'Chrome', 'Windows 7', 1, '2019-10-28 16:28:59', '2019-10-28 16:28:59'), (1622, 1, '管理员', '127.0.0.1', 63479, 'Chrome', 'Windows 7', 1, '2019-10-28 16:29:55', '2019-10-28 16:29:55'), (1623, 1, '管理员', '127.0.0.1', 57588, 'Chrome', 'Windows 7', 1, '2019-10-29 15:37:03', '2019-10-29 15:37:03'), - (1741, 1, '管理员', '127.0.0.1', 54621, 'Chrome', 'Windows 7', 1, '2019-11-16 18:03:45', '2019-11-16 18:03:45'); + (1741, 1, '管理员', '127.0.0.1', 54621, 'Chrome', 'Windows 7', 1, '2019-11-16 18:03:45', '2019-11-16 18:03:45'), + (1742, 1, '管理员', '127.0.0.1', 60932, 'Chrome 8', 'Windows 10', 1, '2020-12-14 15:14:55', '2020-12-14 15:14:55'); /*!40000 ALTER TABLE `t_user_login_log` ENABLE KEYS */; -- 导出 表 smart-admin-dev.t_user_operate_log 结构 DROP TABLE IF EXISTS `t_user_operate_log`; CREATE TABLE IF NOT EXISTS `t_user_operate_log` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', - `user_id` int(11) NOT NULL COMMENT '用户id', - `user_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名称', - `module` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作模块', - `content` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作内容', - `url` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '请求路径', - `method` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '请求方法', - `param` text COLLATE utf8mb4_unicode_ci COMMENT '请求参数', - `result` tinyint(4) DEFAULT NULL COMMENT '请求结果 0失败 1成功', - `fail_reason` longtext COLLATE utf8mb4_unicode_ci COMMENT '失败原因', + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` int NOT NULL COMMENT '用户id', + `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名称', + `module` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作模块', + `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作内容', + `url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '请求路径', + `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '请求方法', + `param` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '请求参数', + `result` tinyint DEFAULT NULL COMMENT '请求结果 0失败 1成功', + `fail_reason` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '失败原因', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +) ENGINE=InnoDB AUTO_INCREMENT=75 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 正在导出表 smart-admin-dev.t_user_operate_log 的数据:~32 rows (大约) DELETE FROM `t_user_operate_log`; @@ -1510,7 +1538,49 @@ INSERT INTO `t_user_operate_log` (`id`, `user_id`, `user_name`, `module`, `conte (29, 1, '管理员', '管理端-用户登录日志', '查询员工在线状态', '/smart-admin-api/userOnLine/query', 'com.gangquan360.smartadmin.module.log.userloginlog.UserLoginLogController.queryUserOnLine', 'EmployeeQueryDTO[{"actualName":"","employeeIds":[1],"isDelete":0,"pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), (30, 1, '管理员', '管理端-任务调度', '查询任务', '/smart-admin-api/quartz/task/query', 'com.gangquan360.smartadmin.module.quartz.controller.QuartzController.query', 'QuartzQueryDTO[{"pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), (31, 1, '管理员', '管理端-smart reload', '获取全部Smart-reload项', '/smart-admin-api/smartReload/all', 'com.gangquan360.smartadmin.module.smartreload.SmartReloadController.listAllReloadItem', '', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (32, 1, '管理员', '通用-心跳服务', '查询心跳记录 @author zhuoda', '/smart-admin-api/heartBeat/query', 'com.gangquan360.smartadmin.module.heartbeat.HeartBeatController.query', 'PageParamDTO[{"pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'); + (32, 1, '管理员', '通用-心跳服务', '查询心跳记录 @author zhuoda', '/smart-admin-api/heartBeat/query', 'com.gangquan360.smartadmin.module.heartbeat.HeartBeatController.query', 'PageParamDTO[{"pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), + (33, 1, '管理员', '通用-权限', '获取所有请求路径', '/smart-admin-api/privilege/getAllUrl', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.getAllUrl', '', 1, NULL, '2020-12-14 15:15:06', '2020-12-14 15:15:06'), + (34, 1, '管理员', '通用-权限', '查询所有菜单项', '/smart-admin-api/privilege/menu/queryAll', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.queryAll', '', 1, NULL, '2020-12-14 15:15:06', '2020-12-14 15:15:06'), + (35, 1, '管理员', '通用-权限', '菜单批量保存', '/smart-admin-api/privilege/menu/batchSaveMenu', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.menuBatchSave', 'ValidateList[[{"menuKey":"Business","menuName":"业务功能","sort":0,"type":1,"url":"/business"},{"menuKey":"Peony","menuName":"牡丹管理","parentKey":"Business","sort":0,"type":1,"url":"/peony"},{"menuKey":"PeonyList","menuName":"牡丹花列表","parentKey":"Peony","sort":0,"type":1,"url":"/peony/peony-list"},{"menuKey":"PeonyList1","menuName":"牡丹花列表1","parentKey":"Peony","sort":0,"type":1,"url":"/peony/peony-list1"},{"menuKey":"Email","menuName":"邮件管理","parentKey":"Business","sort":0,"type":1,"url":"/email"},{"menuKey":"EmailList","menuName":"邮件管理","parentKey":"Email","sort":0,"type":1,"url":"/email/email-list"},{"menuKey":"SendMail","menuName":"发送邮件","parentKey":"Email","sort":0,"type":1,"url":"/email/send-mail"},{"menuKey":"KeepAlive","menuName":"KeepAlive","parentKey":"Business","sort":0,"type":1,"url":"/keep-alive"},{"menuKey":"KeepAliveContentList","menuName":"KeepAlive列表","parentKey":"KeepAlive","sort":0,"type":1,"url":"/keep-alive/content-list"},{"menuKey":"KeepAliveAddContent","menuName":"KeepAlive表单","parentKey":"KeepAlive","sort":0,"type":1,"url":"/keep-alive/add-content"},{"menuKey":"Notice","menuName":"消息管理","parentKey":"Business","sort":0,"type":1,"url":"/notice"},{"menuKey":"NoticeList","menuName":"通知管理","parentKey":"Notice","sort":0,"type":1,"url":"/notice/notice-list"},{"menuKey":"PersonNotice","menuName":"个人消息","parentKey":"Notice","sort":0,"type":1,"url":"/notice/person-notice"},{"menuKey":"NoticeDetail","menuName":"消息详情","parentKey":"Notice","sort":0,"type":1,"url":"/notice/notice-detail"},{"menuKey":"ThreeRouter","menuName":"三级路由","parentKey":"Business","sort":0,"type":1,"url":"/three-router"},{"menuKey":"LevelTwo","menuName":"三级菜单","parentKey":"ThreeRouter","sort":0,"type":1,"url":"/three-router/level-two"},{"menuKey":"ThreeLevelRouterView","menuName":"三级菜单子颗粒","parentKey":"LevelTwo","sort":0,"type":1,"url":"/three-router/level-two/level-three1"},{"menuKey":"RoleTwoTwo","menuName":"三级菜单子哈","parentKey":"LevelTwo","sort":0,"type":1,"url":"/three-router/level-two/level-three2"},{"menuKey":"RoleOneOne","menuName":"二级菜单","parentKey":"ThreeRouter","sort":0,"type":1,"url":"/three-router/level-two2"},{"menuKey":"System","menuName":"系统设置","sort":0,"type":1,"url":"/system"},{"menuKey":"Employee","menuName":"人员管理","parentKey":"System","sort":0,"type":1,"url":"/employee"},{"menuKey":"RoleManage","menuName":"角色管理","parentKey":"Employee","sort":0,"type":1,"url":"/employee/role"},{"menuKey":"PositionList","menuName":"岗位管理","parentKey":"Employee","sort":0,"type":1,"url":"/employee/position"},{"menuKey":"RoleEmployeeManage","menuName":"员工管理","parentKey":"Employee","sort":0,"type":1,"url":"/employee/role-employee-manage"},{"menuKey":"File","menuName":"文件服务","parentKey":"System","sort":0,"type":1,"url":"/file"},{"menuKey":"FileList","menuName":"文件列表","parentKey":"File","sort":0,"type":1,"url":"/file/file-list"},{"menuKey":"UserLog","menuName":"用户日志","parentKey":"System","sort":0,"type":1,"url":"/user-log"},{"menuKey":"UserOperateLog","menuName":"用户操作日志","parentKey":"UserLog","sort":0,"type":1,"url":"/user-log/user-operate-log"},{"menuKey":"UserLoginLog","menuName":"用户登录日志","parentKey":"UserLog","sort":0,"type":1,"url":"/user-log/user-login-log"},{"menuKey":"SystemSetting","menuName":"系统设置","parentKey":"System","sort":0,"type":1,"url":"/system-setting"},{"menuKey":"SystemConfig","menuName":"系统参数","parentKey":"SystemSetting","sort":0,"type":1,"url":"/system-setting/system-config"},{"menuKey":"SystemPrivilege","menuName":"菜单设置","parentKey":"SystemSetting","sort":0,"type":1,"url":"/system-setting/system-privilege"},{"menuKey":"Support","menuName":"开发专用","sort":0,"type":1,"url":"/support"},{"menuKey":"ApiDoc","menuName":"接口文档","parentKey":"Support","sort":0,"type":1,"url":"/api-doc"},{"menuKey":"Swagger","menuName":"Swagger接口文档","parentKey":"ApiDoc","sort":0,"type":1,"url":"/api-doc/swagger"},{"menuKey":"HeartBeat","menuName":"心跳服务","parentKey":"Support","sort":0,"type":1,"url":"/heart-beat"},{"menuKey":"HeartBeatList","menuName":"心跳服务","parentKey":"HeartBeat","sort":0,"type":1,"url":"/heart-beat/heart-beat-list"},{"menuKey":"Monitor","menuName":"系统监控","parentKey":"Support","sort":0,"type":1,"url":"/monitor"},{"menuKey":"OnlineUser","menuName":"在线人数","parentKey":"Monitor","sort":0,"type":1,"url":"/monitor/online-user"},{"menuKey":"Sql","menuName":"SQL监控","parentKey":"Monitor","sort":0,"type":1,"url":"/monitor/sql"},{"menuKey":"Reload","menuName":"动态加载","parentKey":"Support","sort":0,"type":1,"url":"/reload"},{"menuKey":"SmartReloadList","menuName":"SmartReload","parentKey":"Reload","sort":0,"type":1,"url":"/reload/smart-reload-list"},{"menuKey":"Task","menuName":"定时任务","parentKey":"Support","sort":0,"type":1,"url":"/task"},{"menuKey":"TaskList","menuName":"任务管理","parentKey":"Task","sort":0,"type":1,"url":"/system-setting/task-list"}]]', 1, NULL, '2020-12-14 15:15:07', '2020-12-14 15:15:07'), + (36, 1, '管理员', '通用-权限', '查询所有菜单项', '/smart-admin-api/privilege/menu/queryAll', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.queryAll', '', 1, NULL, '2020-12-14 15:15:07', '2020-12-14 15:15:07'), + (37, 1, '管理员', '管理端-用户登录', '获取session', '/smart-admin-api/session/get', 'net.lab1024.smartadmin.module.system.login.LoginController.getSession', '', 1, NULL, '2020-12-14 15:15:29', '2020-12-14 15:15:29'), + (38, 1, '管理员', '通用-权限', '获取所有请求路径', '/smart-admin-api/privilege/getAllUrl', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.getAllUrl', '', 1, NULL, '2020-12-14 15:16:25', '2020-12-14 15:16:25'), + (39, 1, '管理员', '通用-权限', '查询所有菜单项', '/smart-admin-api/privilege/menu/queryAll', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.queryAll', '', 1, NULL, '2020-12-14 15:16:25', '2020-12-14 15:16:25'), + (40, 1, '管理员', '通用-权限', '菜单批量保存', '/smart-admin-api/privilege/menu/batchSaveMenu', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.menuBatchSave', 'ValidateList[[{"menuKey":"Business","menuName":"业务功能","sort":0,"type":1,"url":"/business"},{"menuKey":"Peony","menuName":"牡丹管理","parentKey":"Business","sort":1,"type":1,"url":"/peony"},{"menuKey":"PeonyList","menuName":"牡丹花列表","parentKey":"Peony","sort":2,"type":1,"url":"/peony/peony-list"},{"menuKey":"PeonyList1","menuName":"牡丹花列表1","parentKey":"Peony","sort":3,"type":1,"url":"/peony/peony-list1"},{"menuKey":"Email","menuName":"邮件管理","parentKey":"Business","sort":4,"type":1,"url":"/email"},{"menuKey":"EmailList","menuName":"邮件管理","parentKey":"Email","sort":5,"type":1,"url":"/email/email-list"},{"menuKey":"SendMail","menuName":"发送邮件","parentKey":"Email","sort":6,"type":1,"url":"/email/send-mail"},{"menuKey":"KeepAlive","menuName":"KeepAlive","parentKey":"Business","sort":7,"type":1,"url":"/keep-alive"},{"menuKey":"KeepAliveContentList","menuName":"KeepAlive列表","parentKey":"KeepAlive","sort":8,"type":1,"url":"/keep-alive/content-list"},{"menuKey":"KeepAliveAddContent","menuName":"KeepAlive表单","parentKey":"KeepAlive","sort":9,"type":1,"url":"/keep-alive/add-content"},{"menuKey":"Notice","menuName":"消息管理","parentKey":"Business","sort":10,"type":1,"url":"/notice"},{"menuKey":"NoticeList","menuName":"通知管理","parentKey":"Notice","sort":11,"type":1,"url":"/notice/notice-list"},{"menuKey":"PersonNotice","menuName":"个人消息","parentKey":"Notice","sort":12,"type":1,"url":"/notice/person-notice"},{"menuKey":"NoticeDetail","menuName":"消息详情","parentKey":"Notice","sort":13,"type":1,"url":"/notice/notice-detail"},{"menuKey":"ThreeRouter","menuName":"三级路由","parentKey":"Business","sort":14,"type":1,"url":"/three-router"},{"menuKey":"LevelTwo","menuName":"三级菜单","parentKey":"ThreeRouter","sort":15,"type":1,"url":"/three-router/level-two"},{"menuKey":"ThreeLevelRouterView","menuName":"三级菜单子颗粒","parentKey":"LevelTwo","sort":16,"type":1,"url":"/three-router/level-two/level-three1"},{"menuKey":"RoleTwoTwo","menuName":"三级菜单子哈","parentKey":"LevelTwo","sort":17,"type":1,"url":"/three-router/level-two/level-three2"},{"menuKey":"RoleOneOne","menuName":"二级菜单","parentKey":"ThreeRouter","sort":18,"type":1,"url":"/three-router/level-two2"},{"menuKey":"System","menuName":"系统设置","sort":19,"type":1,"url":"/system"},{"menuKey":"Employee","menuName":"人员管理","parentKey":"System","sort":20,"type":1,"url":"/employee"},{"menuKey":"RoleManage","menuName":"角色管理","parentKey":"Employee","sort":21,"type":1,"url":"/employee/role"},{"menuKey":"PositionList","menuName":"岗位管理","parentKey":"Employee","sort":22,"type":1,"url":"/employee/position"},{"menuKey":"RoleEmployeeManage","menuName":"员工管理","parentKey":"Employee","sort":23,"type":1,"url":"/employee/role-employee-manage"},{"menuKey":"File","menuName":"文件服务","parentKey":"System","sort":24,"type":1,"url":"/file"},{"menuKey":"FileList","menuName":"文件列表","parentKey":"File","sort":25,"type":1,"url":"/file/file-list"},{"menuKey":"UserLog","menuName":"用户日志","parentKey":"System","sort":26,"type":1,"url":"/user-log"},{"menuKey":"UserOperateLog","menuName":"用户操作日志","parentKey":"UserLog","sort":27,"type":1,"url":"/user-log/user-operate-log"},{"menuKey":"UserLoginLog","menuName":"用户登录日志","parentKey":"UserLog","sort":28,"type":1,"url":"/user-log/user-login-log"},{"menuKey":"SystemSetting","menuName":"系统设置","parentKey":"System","sort":29,"type":1,"url":"/system-setting"},{"menuKey":"SystemConfig","menuName":"系统参数","parentKey":"SystemSetting","sort":30,"type":1,"url":"/system-setting/system-config"},{"menuKey":"SystemPrivilege","menuName":"菜单设置","parentKey":"SystemSetting","sort":31,"type":1,"url":"/system-setting/system-privilege"},{"menuKey":"Support","menuName":"开发专用","sort":32,"type":1,"url":"/support"},{"menuKey":"ApiDoc","menuName":"接口文档","parentKey":"Support","sort":33,"type":1,"url":"/api-doc"},{"menuKey":"Swagger","menuName":"Swagger接口文档","parentKey":"ApiDoc","sort":34,"type":1,"url":"/api-doc/swagger"},{"menuKey":"HeartBeat","menuName":"心跳服务","parentKey":"Support","sort":35,"type":1,"url":"/heart-beat"},{"menuKey":"HeartBeatList","menuName":"心跳服务","parentKey":"HeartBeat","sort":36,"type":1,"url":"/heart-beat/heart-beat-list"},{"menuKey":"Monitor","menuName":"系统监控","parentKey":"Support","sort":37,"type":1,"url":"/monitor"},{"menuKey":"OnlineUser","menuName":"在线人数","parentKey":"Monitor","sort":38,"type":1,"url":"/monitor/online-user"},{"menuKey":"Sql","menuName":"SQL监控","parentKey":"Monitor","sort":39,"type":1,"url":"/monitor/sql"},{"menuKey":"Reload","menuName":"动态加载","parentKey":"Support","sort":40,"type":1,"url":"/reload"},{"menuKey":"SmartReloadList","menuName":"SmartReload","parentKey":"Reload","sort":41,"type":1,"url":"/reload/smart-reload-list"},{"menuKey":"Task","menuName":"定时任务","parentKey":"Support","sort":42,"type":1,"url":"/task"},{"menuKey":"TaskList","menuName":"任务管理","parentKey":"Task","sort":43,"type":1,"url":"/system-setting/task-list"}]]', 1, NULL, '2020-12-14 15:16:26', '2020-12-14 15:16:26'), + (41, 1, '管理员', '通用-权限', '查询所有菜单项', '/smart-admin-api/privilege/menu/queryAll', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.queryAll', '', 1, NULL, '2020-12-14 15:16:26', '2020-12-14 15:16:26'), + (42, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PeonyList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PeonyList"]', 1, NULL, '2020-12-14 15:16:28', '2020-12-14 15:16:28'), + (43, 1, '管理员', '通用-权限', '批量保存功能点', '/smart-admin-api/privilege/function/batchSave', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.batchSaveFunctionList', 'ValidateList[[{"functionKey":"peony-list-query","functionName":"查询","menuKey":"PeonyList","sort":1},{"functionKey":"peony-list-add","functionName":"新增","menuKey":"PeonyList","sort":2},{"functionKey":"peony-list-update","functionName":"编辑","menuKey":"PeonyList","sort":3},{"functionKey":"peony-list-batch-delete","functionName":"批量删除","menuKey":"PeonyList","sort":4},{"functionKey":"peony-list-batch-export","functionName":"批量导出","menuKey":"PeonyList","sort":5},{"functionKey":"peony-list-export-all","functionName":"导出全部","menuKey":"PeonyList","sort":6}]]', 1, NULL, '2020-12-14 15:16:30', '2020-12-14 15:16:30'), + (44, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PeonyList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PeonyList"]', 1, NULL, '2020-12-14 15:16:30', '2020-12-14 15:16:30'), + (45, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PeonyList1', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PeonyList1"]', 1, NULL, '2020-12-14 15:16:32', '2020-12-14 15:16:32'), + (46, 1, '管理员', '通用-权限', '批量保存功能点', '/smart-admin-api/privilege/function/batchSave', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.batchSaveFunctionList', 'ValidateList[[{"functionKey":"peony1-list-query","functionName":"查询","menuKey":"PeonyList1","sort":1},{"functionKey":"peony1-list-add","functionName":"新增","menuKey":"PeonyList1","sort":2},{"functionKey":"peony1-list-update","functionName":"编辑","menuKey":"PeonyList1","sort":3},{"functionKey":"peony1-list-batch-delete","functionName":"批量删除","menuKey":"PeonyList1","sort":4},{"functionKey":"peony1-list-batch-export","functionName":"批量导出","menuKey":"PeonyList1","sort":5},{"functionKey":"peony1-list-export-all","functionName":"导出全部","menuKey":"PeonyList1","sort":6}]]', 1, NULL, '2020-12-14 15:16:33', '2020-12-14 15:16:33'), + (47, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PeonyList1', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PeonyList1"]', 1, NULL, '2020-12-14 15:16:33', '2020-12-14 15:16:33'), + (48, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/EmailList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["EmailList"]', 1, NULL, '2020-12-14 15:16:34', '2020-12-14 15:16:34'), + (49, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SendMail', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SendMail"]', 1, NULL, '2020-12-14 15:16:36', '2020-12-14 15:16:36'), + (50, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/KeepAliveContentList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["KeepAliveContentList"]', 1, NULL, '2020-12-14 15:16:38', '2020-12-14 15:16:38'), + (51, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/KeepAliveAddContent', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["KeepAliveAddContent"]', 1, NULL, '2020-12-14 15:16:38', '2020-12-14 15:16:38'), + (52, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/NoticeList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["NoticeList"]', 1, NULL, '2020-12-14 15:16:40', '2020-12-14 15:16:40'), + (53, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PersonNotice', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PersonNotice"]', 1, NULL, '2020-12-14 15:16:41', '2020-12-14 15:16:41'), + (54, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/NoticeDetail', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["NoticeDetail"]', 1, NULL, '2020-12-14 15:16:42', '2020-12-14 15:16:42'), + (55, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/ThreeLevelRouterView', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["ThreeLevelRouterView"]', 1, NULL, '2020-12-14 15:16:44', '2020-12-14 15:16:44'), + (56, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/RoleManage', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["RoleManage"]', 1, NULL, '2020-12-14 15:16:47', '2020-12-14 15:16:47'), + (57, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PositionList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PositionList"]', 1, NULL, '2020-12-14 15:16:48', '2020-12-14 15:16:48'), + (58, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/RoleEmployeeManage', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["RoleEmployeeManage"]', 1, NULL, '2020-12-14 15:16:53', '2020-12-14 15:16:53'), + (59, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/FileList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["FileList"]', 1, NULL, '2020-12-14 15:17:00', '2020-12-14 15:17:00'), + (60, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/UserOperateLog', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["UserOperateLog"]', 1, NULL, '2020-12-14 15:17:03', '2020-12-14 15:17:03'), + (61, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/UserLoginLog', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["UserLoginLog"]', 1, NULL, '2020-12-14 15:17:03', '2020-12-14 15:17:03'), + (62, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SystemConfig', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SystemConfig"]', 1, NULL, '2020-12-14 15:17:04', '2020-12-14 15:17:04'), + (63, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SystemPrivilege', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SystemPrivilege"]', 1, NULL, '2020-12-14 15:17:06', '2020-12-14 15:17:06'), + (64, 1, '管理员', '通用-权限', '批量保存功能点', '/smart-admin-api/privilege/function/batchSave', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.batchSaveFunctionList', 'ValidateList[[{"functionKey":"privilege-main-update","functionName":"编辑","menuKey":"SystemPrivilege","sort":1},{"functionKey":"privilege-batch-save-points","functionName":"批量保存功能点","menuKey":"SystemPrivilege","sort":2},{"functionKey":"privilege-main-search","functionName":"查询","menuKey":"SystemPrivilege","sort":3}]]', 1, NULL, '2020-12-14 15:17:11', '2020-12-14 15:17:11'), + (65, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SystemPrivilege', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SystemPrivilege"]', 1, NULL, '2020-12-14 15:17:11', '2020-12-14 15:17:11'), + (66, 1, '管理员', '通用-权限', '保存更新功能点', '/smart-admin-api/privilege/function/saveOrUpdate', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionSaveOrUpdate', 'PrivilegeFunctionDTO[{"functionKey":"privilege-batch-save-points","functionName":"批量保存功能点","menuKey":"SystemPrivilege","sort":1,"url":"privilegeController.functionSaveOrUpdate"}]', 1, NULL, '2020-12-14 15:17:30', '2020-12-14 15:17:30'), + (67, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SystemPrivilege', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SystemPrivilege"]', 1, NULL, '2020-12-14 15:17:30', '2020-12-14 15:17:30'), + (68, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/Swagger', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["Swagger"]', 1, NULL, '2020-12-14 15:17:36', '2020-12-14 15:17:36'), + (69, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/HeartBeatList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["HeartBeatList"]', 1, NULL, '2020-12-14 15:17:37', '2020-12-14 15:17:37'), + (70, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SmartReloadList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SmartReloadList"]', 1, NULL, '2020-12-14 15:17:42', '2020-12-14 15:17:42'), + (71, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/TaskList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["TaskList"]', 1, NULL, '2020-12-14 15:17:43', '2020-12-14 15:17:43'), + (72, 1, '管理员', '通用-邮件发送', '分页查询', '/smart-admin-api/email/page/query', 'net.lab1024.smartadmin.module.business.email.EmailController.queryByPage', 'EmailQueryDTO[{"endDate":"","pageNum":1,"pageSize":10,"searchCount":true,"startDate":""}]', 1, NULL, '2020-12-14 15:17:57', '2020-12-14 15:17:57'), + (73, 1, '管理员', '管理端-用户登录', '获取session', '/smart-admin-api/session/get', 'net.lab1024.smartadmin.module.system.login.LoginController.getSession', '', 1, NULL, '2020-12-14 15:18:14', '2020-12-14 15:18:14'), + (74, 1, '管理员', '管理端-用户登录', '获取session', '/smart-admin-api/session/get', 'net.lab1024.smartadmin.module.system.login.LoginController.getSession', '', 1, NULL, '2020-12-14 15:18:27', '2020-12-14 15:18:27'); /*!40000 ALTER TABLE `t_user_operate_log` ENABLE KEYS */; /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; diff --git a/smart-admin-web/package.json b/smart-admin-web/package.json index c238eca3..c89d8959 100644 --- a/smart-admin-web/package.json +++ b/smart-admin-web/package.json @@ -23,6 +23,7 @@ "cropperjs": "^1.2.2", "dayjs": "^1.7.7", "decimal.js": "^10.1.1", + "e-guide-layer": "^0.1.1", "echarts": "^4.0.4", "gq-plus": "^2.1.5", "html2canvas": "^1.0.0-alpha.12", diff --git a/smart-admin-web/src/components/main/components/header-bar/header-bar.less b/smart-admin-web/src/components/main/components/header-bar/header-bar.less index 17077577..9c62d564 100644 --- a/smart-admin-web/src/components/main/components/header-bar/header-bar.less +++ b/smart-admin-web/src/components/main/components/header-bar/header-bar.less @@ -12,3 +12,8 @@ } } } + + +.step-bottom-btn{ + width: 380px !important; +} diff --git a/smart-admin-web/src/components/main/components/header-bar/header-bar.vue b/smart-admin-web/src/components/main/components/header-bar/header-bar.vue index fb53977c..a83d735a 100644 --- a/smart-admin-web/src/components/main/components/header-bar/header-bar.vue +++ b/smart-admin-web/src/components/main/components/header-bar/header-bar.vue @@ -6,7 +6,7 @@ icon="icon iconfont icondaohangzhedie" /> -
+
+ + diff --git a/smart-admin-web/src/main.js b/smart-admin-web/src/main.js index bb90a263..d213c7f2 100644 --- a/smart-admin-web/src/main.js +++ b/smart-admin-web/src/main.js @@ -23,9 +23,13 @@ import enumInfo from '@/constants'; // 处理table操作按钮 import tableAction from './lib/table-action'; -//时间 +// 时间 import moment from 'moment'; +import 'e-guide-layer/dist/e-guide-layer.css' +import eGuideLayer from 'e-guide-layer' + +Vue.use(eGuideLayer); Vue.prototype.$tableAction = tableAction; Vue.use(Enum, { enumInfo }); From 063190c31446cee758168434ac5ce2e2b0a86965 Mon Sep 17 00:00:00 2001 From: Turbolisten <188029906@qq.com> Date: Fri, 8 Jan 2021 22:01:36 +0800 Subject: [PATCH 14/14] update .gitignore --- .gitignore | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 21763942..a2a3040a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,31 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws *.iml +*.ipr -**/target/ +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ -**/node_modules/ \ No newline at end of file +### VS Code ### +.vscode/