From ca5445257b1fdeceddf3fcc2dea18c442023aeb7 Mon Sep 17 00:00:00 2001
From: kongzy <kongzy>
Date: 星期五, 08 十二月 2023 09:30:36 +0800
Subject: [PATCH] 新街口
---
assess-common/src/main/java/com/gkhy/assess/common/filter/RepeatableFilter.java | 47
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertInfoServiceImpl.java | 86
assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java | 6
assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.java | 6
assess-admin/src/main/resources/db/migration/V20231130002_risk_estimate.sql | 33
assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java | 2
assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java | 9
assess-system/src/main/resources/mapper/system/SysNoticeMapper.xml | 4
assess-admin/src/main/resources/db/migration/V20231204001_device.sql | 38
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java | 29
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java | 76
assess-admin/src/main/resources/db/migration/V20231205003_accessory_file.sql | 21
assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java | 5
assess-admin/src/main/resources/db/migration/V20231123006_notice.sql | 8
assess-common/src/main/java/com/gkhy/assess/common/domain/PageDomain.java | 8
assess-admin/src/main/resources/db/migration/V20231123004_config.sql | 6
assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java | 52
assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.java | 2
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java | 2
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java | 13
assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertInfoMapper.java | 39
assess-common/src/main/java/com/gkhy/assess/common/constant/CacheConstant.java | 9
assess-admin/src/main/resources/db/migration/V20231130003_contract.sql | 22
assess-admin/src/main/resources/db/migration/V20231124002_attach.sql | 4
assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertClassifyMapper.java | 18
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertClassifyController.java | 47
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java | 27
assess-system/src/main/resources/mapper/system/SysAgencyMapper.xml | 60
assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysPasswordService.java | 26
assess-admin/src/main/resources/db/migration/V20231124001_region.sql | 521 ++
assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java | 33
assess-admin/src/main/resources/db/migration/V20231204004_plan_person.sql | 30
assess-common/src/main/java/com/gkhy/assess/common/enums/ExpertTypeEnum.java | 29
assess-admin/src/main/resources/db/migration/V20231204005_plan_expert.sql | 25
assess-admin/src/main/resources/db/migration/V20231205002_investigation.sql | 21
assess-admin/src/main/resources/db/migration/V20231123007_law.sql | 10
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java | 188
assess-system/src/main/resources/mapper/system/SysAttachMapper.xml | 2
assess-common/pom.xml | 5
assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java | 35
pom.xml | 8
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertInfoController.java | 66
assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql | 6
assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertClassify.java | 60
assess-admin/src/main/resources/db/migration/V20231205005_audit.sql | 41
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java | 10
assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.java | 4
assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/RepeatSubmitInterceptor.java | 51
assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertClassifyService.java | 44
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java | 6
assess-system/src/main/resources/mapper/system/SysUserMapper.xml | 46
assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql | 32
assess-admin/src/main/resources/db/migration/V20231130001_project.sql | 36
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java | 11
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertClassifyServiceImpl.java | 84
assess-system/src/main/resources/mapper/system/SysRegionMapper.xml | 2
assess-common/src/main/java/com/gkhy/assess/common/enums/ApproveStatusEnum.java | 2
assess-common/src/main/java/com/gkhy/assess/common/utils/StringUtils.java | 49
assess-admin/src/main/resources/db/migration/V20231204003_estimate_schedule.sql | 21
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/CaptchaController.java | 2
assess-admin/src/main/resources/db/migration/V20231205004_face_record.sql | 19
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java | 11
assess-admin/src/main/resources/db/migration/V20231206002_project_material.sql | 20
assess-common/src/main/java/com/gkhy/assess/common/filter/XssHttpServletRequestWrapper.java | 111
assess-common/src/main/java/com/gkhy/assess/common/utils/http/HttpHelper.java | 55
assess-common/src/main/java/com/gkhy/assess/common/validate/AgencyGroup.java | 4
assess-admin/src/main/resources/db/migration/V20231123005_agency.sql | 17
assess-common/src/main/java/com/gkhy/assess/common/utils/ConvertUtil.java | 31
assess-admin/src/main/resources/db/migration/V20231127001_expert_classify.sql | 17
assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.java | 2
assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java | 2
assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java | 2
assess-system/src/main/resources/mapper/system/SysExpertClassifyMapper.xml | 5
assess-common/src/main/java/com/gkhy/assess/common/validate/MonitorGroup.java | 9
assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/LogInterceptor.java | 1
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/NoticeController.java | 44
assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java | 3
assess-system/src/main/java/com/gkhy/assess/system/service/SysNoticeService.java | 7
assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java | 2
assess-common/src/main/java/com/gkhy/assess/common/validate/ExpertGroup.java | 4
assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java | 24
assess-framework/src/main/java/com/gkhy/assess/framework/config/FilterConfig.java | 58
assess-system/src/main/java/com/gkhy/assess/system/mapper/SysRegionMapper.java | 2
assess-admin/src/main/resources/db/migration/V20231205001_work_notification.sql | 22
assess-admin/src/main/resources/application.yml | 28
assess-admin/src/main/resources/db/migration/V20231127002_expert_info.sql | 45
assess-common/src/main/java/com/gkhy/assess/common/filter/RepeatedlyRequestWrapper.java | 77
assess-admin/src/main/resources/db/migration/V20231130004_estimate_task.sql | 23
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/LawController.java | 42
assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertInfoService.java | 50
assess-common/src/main/java/com/gkhy/assess/common/utils/JSONUtil.java | 182
assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java | 11
assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java | 6
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java | 20
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java | 58
assess-common/src/main/java/com/gkhy/assess/common/utils/SqlUtil.java | 12
assess-admin/src/main/resources/db/migration/V20231206001_process_audit.sql | 48
assess-admin/src/test/java/com/gkhy/admin/RegionTest.java | 116
assess-common/src/main/java/com/gkhy/assess/common/utils/html/EscapeUtil.java | 167
assess-common/src/main/java/com/gkhy/assess/common/enums/AccessoryFileTypeEnum.java | 38
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java | 19
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java | 11
assess-system/src/main/resources/mapper/system/SysExpertInfoMapper.xml | 50
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java | 11
assess-common/src/main/java/com/gkhy/assess/common/filter/XssFilter.java | 70
assess-admin/src/main/resources/db/migration/V20231204002_estimate_plan.sql | 21
assess-common/src/main/java/com/gkhy/assess/common/utils/html/HTMLFilter.java | 566 ++
assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/SameUrlDataInterceptor.java | 106
assess-admin/src/main/resources/db/migration/V20231205006_conclusion.sql | 19
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java | 19
assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java | 15
assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java | 23
assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java | 6
assess-common/src/main/java/com/gkhy/assess/common/enums/RegionTypeEnum.java | 29
assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql | 14
assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java | 1
assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java | 29
assess-common/src/main/java/com/gkhy/assess/common/utils/http/HttpUtils.java | 265 +
assess-system/src/main/java/com/gkhy/assess/system/service/SysLawService.java | 7
assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java | 180
assess-system/src/main/resources/mapper/system/SysLawMapper.xml | 2
assess-admin/src/main/resources/region.json | 8528 +++++++++++++++++++++++++++++++++++++
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java | 2
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java | 22
124 files changed, 13,283 insertions(+), 312 deletions(-)
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java b/assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java
index d7acabe..b901f3e 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java
@@ -1,5 +1,6 @@
package com.gkhy.assess.admin;
+import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@@ -7,6 +8,7 @@
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@ComponentScan("com.gkhy.assess")
+//@MapperScan("com.gkhy.**.mapper")
public class GkhyAdminApplication {
public static void main(String[] args) {
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/CaptchaController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/CaptchaController.java
similarity index 94%
rename from assess-admin/src/main/java/com/gkhy/assess/admin/controller/CaptchaController.java
rename to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/CaptchaController.java
index 18b4e2e..5ec1154 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/CaptchaController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/CaptchaController.java
@@ -1,4 +1,4 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web;
import com.gkhy.assess.common.api.CommonResult;
import com.gkhy.assess.system.service.CaptchaService;
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertClassifyController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertClassifyController.java
new file mode 100644
index 0000000..bb19588
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertClassifyController.java
@@ -0,0 +1,47 @@
+package com.gkhy.assess.admin.controller.web;
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.domain.SysExpertClassify;
+import com.gkhy.assess.system.service.SysExpertClassifyService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "专家库-专家分类前端控制器")
+@RestController
+@RequestMapping("/system/expert_classify")
+public class ExpertClassifyController {
+ @Autowired
+ private SysExpertClassifyService expertClassifyService;
+
+ @ApiOperation(value = "专家分类列表(树形)")
+ @GetMapping("/tree")
+ public CommonResult classifyTree(SysExpertClassify expertClassify){
+ return CommonResult.success(expertClassifyService.classifyTree(expertClassify));
+ }
+
+ @RepeatSubmit
+ @ApiOperation(value = "修改专家分类")
+ @PutMapping("/mod")
+ public CommonResult modClassify(@RequestBody SysExpertClassify expertClassify){
+ return CommonResult.success(expertClassifyService.modClassify(expertClassify));
+ }
+
+ @RepeatSubmit
+ @ApiOperation(value = "删除专家分类")
+ @DeleteMapping("/del/{classifyId}")
+ public CommonResult delClassify(@PathVariable(value = "classifyId") Long classifyId){
+ return CommonResult.success(expertClassifyService.delClassify(classifyId));
+ }
+
+
+ @RepeatSubmit
+ @ApiOperation(value = "新增专家分类")
+ @PostMapping("/add")
+ public CommonResult addClassify(@RequestBody SysExpertClassify expertClassify){
+ return CommonResult.success(expertClassifyService.addClassify(expertClassify));
+ }
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertInfoController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertInfoController.java
new file mode 100644
index 0000000..8a87e30
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertInfoController.java
@@ -0,0 +1,66 @@
+package com.gkhy.assess.admin.controller.web;
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.domain.SysAgency;
+import com.gkhy.assess.system.domain.SysExpertClassify;
+import com.gkhy.assess.system.domain.SysExpertInfo;
+import com.gkhy.assess.system.service.SysExpertInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "专家库-专家信息前端控制器")
+@RestController
+@RequestMapping("/system/expert_info")
+public class ExpertInfoController {
+ @Autowired
+ private SysExpertInfoService expertInfoService;
+
+ @ApiOperation(value = "专家列表(分页)")
+ @ApiImplicitParams({
+ @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+ @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10")
+ })
+ @GetMapping("/list")
+ public CommonResult exportInfoList(SysExpertInfo expertInfo){
+ return CommonResult.success(expertInfoService.exportInfoList(expertInfo));
+ }
+
+ @RepeatSubmit
+ @ApiOperation(value = "新增专家信息")
+ @PostMapping("/add")
+ public CommonResult addExpertInfo(@RequestBody SysExpertInfo expertInfo){
+ return CommonResult.success(expertInfoService.addExpertInfo(expertInfo));
+ }
+
+ @RepeatSubmit
+ @ApiOperation(value = "修改专家信息")
+ @PutMapping("/mod")
+ public CommonResult modExpertInfo(@RequestBody SysExpertInfo expertInfo){
+ return CommonResult.success(expertInfoService.modExpertInfo(expertInfo));
+ }
+
+
+ @RepeatSubmit
+ @ApiOperation(value = "删除专家信息")
+ @DeleteMapping("/del/{expertId}")
+ public CommonResult delExpertInfo(@PathVariable(value = "expertId") Long expertId){
+ return CommonResult.success(expertInfoService.delExpertInfo(expertId));
+ }
+
+
+ @RepeatSubmit
+ @ApiOperation(value = "批量删除专家信息")
+ @DeleteMapping("/del/batch/{expertIds}")
+ public CommonResult delExpertInfo(@PathVariable(value = "expertIds") Long[] expertIds){
+ return CommonResult.success(expertInfoService.delExpertInfoBatch(expertIds));
+ }
+
+
+
+
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysAgencyController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java
similarity index 69%
copy from assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysAgencyController.java
copy to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java
index d7f343f..892fdd1 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysAgencyController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java
@@ -1,12 +1,16 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web;
+import com.gkhy.assess.common.annotation.RepeatSubmit;
import com.gkhy.assess.common.api.CommonResult;
import com.gkhy.assess.system.domain.SysAgency;
+import com.gkhy.assess.system.domain.SysUser;
import com.gkhy.assess.system.service.SysAgencyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -39,9 +43,18 @@
@ApiOperation(value = "校验机构名称")
@PostMapping("/checkAgencyNameUnique")
- public boolean checkAgencyNameUnique(SysAgency agency)
+ public CommonResult checkAgencyNameUnique(@RequestBody SysAgency agency)
{
- return agencyService.checkAgencyNameUnique(agency);
+ return CommonResult.success(agencyService.checkAgencyNameUnique(agency));
+ }
+
+ @RepeatSubmit
+ @RequiresPermissions(value={"system:assess:monitor"})
+ @ApiOperation(value = "公示状态修改,公示/不公示")
+ @PostMapping("/changePublic")
+ public CommonResult changePublic(@RequestBody SysAgency agency)
+ {
+ return CommonResult.success(agencyService.changePublic(agency));
}
}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysCommonController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java
similarity index 96%
rename from assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysCommonController.java
rename to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java
index fbfc141..b3e22f6 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysCommonController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java
@@ -1,4 +1,4 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web;
import com.gkhy.assess.common.api.CommonResult;
import com.gkhy.assess.system.domain.SysAgency;
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysDictDataController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java
similarity index 90%
rename from assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysDictDataController.java
rename to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java
index 9ae185f..0b2067a 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysDictDataController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java
@@ -1,5 +1,6 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web;
+import com.gkhy.assess.common.annotation.RepeatSubmit;
import com.gkhy.assess.common.api.CommonResult;
import com.gkhy.assess.system.domain.SysDictData;
import com.gkhy.assess.system.domain.SysDictType;
@@ -38,6 +39,7 @@
return CommonResult.success(dictDataService.getDictDataById(dictId));
}
+ @RepeatSubmit
@ApiOperation(value = "新增字典数据")
@PostMapping("/addDictData")
public CommonResult addDictData(@Validated @RequestBody SysDictData dictData){
@@ -45,6 +47,7 @@
}
+ @RepeatSubmit
@ApiOperation(value = "编辑字典数据")
@PutMapping("/editDictData")
public CommonResult editDictData(@Validated @RequestBody SysDictData dictData){
@@ -52,16 +55,18 @@
}
+ @RepeatSubmit
@ApiOperation(value = "删除字典数据")
- @PutMapping("/remove/{dictId}")
+ @DeleteMapping("/remove/{dictId}")
public CommonResult removeDictData(@PathVariable(name = "dictId")Long dictId){
return CommonResult.success(dictDataService.deleteDictDataById(dictId));
}
+ @RepeatSubmit
@ApiOperation(value = "字典数据状态修改,停用/启用")
@PostMapping("/changeStatus")
- public CommonResult changeStatus(SysDictData SysDictData)
+ public CommonResult changeStatus(@RequestBody SysDictData SysDictData)
{
return CommonResult.success(dictDataService.changeDictDataStatus(SysDictData));
}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysDictTypeController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java
similarity index 90%
rename from assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysDictTypeController.java
rename to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java
index 6390ecc..7a98a2d 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysDictTypeController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java
@@ -1,5 +1,6 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web;
+import com.gkhy.assess.common.annotation.RepeatSubmit;
import com.gkhy.assess.common.api.CommonResult;
import com.gkhy.assess.system.domain.SysDictType;
import com.gkhy.assess.system.domain.SysLaw;
@@ -52,6 +53,7 @@
+ @RepeatSubmit
@ApiOperation(value = "新增字典类型")
@PostMapping("/addDictType")
public CommonResult addDictType(@Validated @RequestBody SysDictType dictType){
@@ -59,6 +61,7 @@
}
+ @RepeatSubmit
@ApiOperation(value = "编辑字典类型")
@PutMapping("/editDictType")
public CommonResult editDictType(@Validated @RequestBody SysDictType dictType){
@@ -66,6 +69,7 @@
}
+ @RepeatSubmit
@ApiOperation(value = "删除字典类型")
@DeleteMapping("/remove/{dictId}")
public CommonResult removeDictType(@PathVariable(name = "dictId")Long dictId){
@@ -73,9 +77,10 @@
}
+ @RepeatSubmit
@ApiOperation(value = "字典类型状态修改,停用/启用")
@PostMapping("/changeStatus")
- public CommonResult changeStatus(SysDictType SysDictType)
+ public CommonResult changeStatus(@RequestBody SysDictType SysDictType)
{
return CommonResult.success(dictTypeService.changeDictTypeStatus(SysDictType));
}
@@ -85,7 +90,7 @@
* 校验字典类型
*/
@PostMapping("/checkDictTypeUnique")
- public CommonResult checkDictTypeUnique(SysDictType dictType)
+ public CommonResult checkDictTypeUnique(@RequestBody SysDictType dictType)
{
return CommonResult.success(dictTypeService.checkDictTypeUnique(dictType));
}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysLawController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java
similarity index 90%
rename from assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysLawController.java
rename to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java
index ef50867..b913ea0 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysLawController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java
@@ -1,5 +1,6 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web;
+import com.gkhy.assess.common.annotation.RepeatSubmit;
import com.gkhy.assess.common.api.CommonResult;
import com.gkhy.assess.system.domain.SysLaw;
import com.gkhy.assess.system.service.SysLawService;
@@ -39,6 +40,7 @@
return CommonResult.success(lawService.getLawById(lawId));
}
+ @RepeatSubmit
@RequiresPermissions("system:assess:monitor")
@ApiOperation(value = "新增法律法规")
@PostMapping("/addLaw")
@@ -47,6 +49,7 @@
}
+ @RepeatSubmit
@RequiresPermissions("system:assess:monitor")
@ApiOperation(value = "编辑法律法规")
@PutMapping("/editLaw")
@@ -55,18 +58,20 @@
}
+ @RepeatSubmit
@RequiresPermissions("system:assess:monitor")
@ApiOperation(value = "删除法律法规")
- @PutMapping("/remove/{lawId}")
+ @DeleteMapping("/remove/{lawId}")
public CommonResult removeLaw(@PathVariable(name = "lawId")Long lawId){
return CommonResult.success(lawService.deleteLawById(lawId));
}
+ @RepeatSubmit
@RequiresPermissions("system:assess:monitor")
@ApiOperation(value = "法律法规状态修改,停用/启用")
@PostMapping("/changeStatus")
- public CommonResult changeStatus(SysLaw law)
+ public CommonResult changeStatus(@RequestBody SysLaw law)
{
return CommonResult.success(lawService.changeLawStatus(law));
}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysLoginController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java
similarity index 96%
rename from assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysLoginController.java
rename to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java
index 9850ac2..64e5a75 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysLoginController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java
@@ -1,4 +1,4 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web;
import com.gkhy.assess.common.api.CommonResult;
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysNoticeController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java
similarity index 90%
rename from assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysNoticeController.java
rename to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java
index 29a2757..8964a06 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysNoticeController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java
@@ -1,5 +1,6 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web;
+import com.gkhy.assess.common.annotation.RepeatSubmit;
import com.gkhy.assess.common.api.CommonResult;
import com.gkhy.assess.system.domain.SysNotice;
import com.gkhy.assess.system.service.SysNoticeService;
@@ -39,6 +40,7 @@
return CommonResult.success(noticeService.getNoticeById(noticeId));
}
+ @RepeatSubmit
@RequiresPermissions("system:assess:monitor")
@ApiOperation(value = "新增通知")
@PostMapping("/addNotice")
@@ -47,6 +49,7 @@
}
+ @RepeatSubmit
@RequiresPermissions("system:assess:monitor")
@ApiOperation(value = "编辑通知")
@PutMapping("/editNotice")
@@ -55,17 +58,19 @@
}
+ @RepeatSubmit
@RequiresPermissions("system:assess:monitor")
@ApiOperation(value = "删除通知")
- @PutMapping("/remove/{noticeId}")
+ @DeleteMapping("/remove/{noticeId}")
public CommonResult removeNotice(@PathVariable(name = "noticeId")Long noticeId){
return CommonResult.success(noticeService.deleteNoticeById(noticeId));
}
+ @RepeatSubmit
@RequiresPermissions("system:assess:monitor")
@ApiOperation(value = "通知状态修改,停用/启用")
@PostMapping("/changeStatus")
- public CommonResult changeStatus(SysNotice notice)
+ public CommonResult changeStatus(@RequestBody SysNotice notice)
{
return CommonResult.success(noticeService.changeNoticeStatus(notice));
}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysRegionController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java
similarity index 87%
rename from assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysRegionController.java
rename to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java
index 0a12f77..44d11d0 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysRegionController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java
@@ -1,5 +1,6 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web;
+import com.gkhy.assess.common.annotation.RepeatSubmit;
import com.gkhy.assess.common.api.CommonResult;
import com.gkhy.assess.system.domain.SysRegion;
import com.gkhy.assess.system.service.SysRegionService;
@@ -18,7 +19,7 @@
@Autowired
private SysRegionService regionService;
- @ApiOperation(value = "地区列表(树形结构)")
+ @ApiOperation(value = "地区列表(树形结构),默认返回疆内数据")
@GetMapping("/regionTree")
public CommonResult regionTree(SysRegion region){
return CommonResult.success(regionService.regionTree(region));
@@ -35,6 +36,7 @@
}
+ @RepeatSubmit
@ApiOperation(value = "新增地区")
@PostMapping("/addRegion")
public CommonResult addLaw(@Validated @RequestBody SysRegion region){
@@ -42,6 +44,7 @@
}
+ @RepeatSubmit
@ApiOperation(value = "编辑地区")
@PutMapping("/editRegion")
public CommonResult editLaw(@Validated @RequestBody SysRegion region){
@@ -49,8 +52,9 @@
}
+ @RepeatSubmit
@ApiOperation(value = "删除地区")
- @PutMapping("/remove/{regionId}")
+ @DeleteMapping("/remove/{regionId}")
public CommonResult removeRegion(@PathVariable(name = "regionId")Long regionId){
return CommonResult.success(regionService.deleteRegionById(regionId));
}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysUserController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java
similarity index 64%
rename from assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysUserController.java
rename to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java
index 871800b..fe343cb 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysUserController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java
@@ -1,8 +1,10 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web;
+import com.gkhy.assess.common.annotation.RepeatSubmit;
import com.gkhy.assess.common.api.CommonResult;
import com.gkhy.assess.common.validate.AgencyGroup;
import com.gkhy.assess.common.validate.ExpertGroup;
+import com.gkhy.assess.common.validate.MonitorGroup;
import com.gkhy.assess.system.domain.SysUser;
import com.gkhy.assess.system.service.SysUserService;
import io.swagger.annotations.Api;
@@ -55,13 +57,22 @@
return CommonResult.success(sysUserService.expertList(user));
}
-
- @ApiOperation(value = "机构注册")
- @PostMapping("/agencyRegister")
- public CommonResult agencyRegister(@Validated(AgencyGroup.class) @RequestBody SysUser user){
- return CommonResult.success(sysUserService.agencyRegister(user));
+ @RepeatSubmit
+ @ApiOperation(value = "创建监管用户")
+ @PostMapping("/addMonitor")
+ public CommonResult addMonitor(@Validated(MonitorGroup.class) @RequestBody SysUser user){
+ return CommonResult.success(sysUserService.addMonitor(user));
}
+
+ @RepeatSubmit
+ @ApiOperation(value = "机构注册")
+ @PostMapping("/addAgency")
+ public CommonResult addAgency(@Validated(AgencyGroup.class) @RequestBody SysUser user){
+ return CommonResult.success(sysUserService.addAgency(user));
+ }
+
+ @RepeatSubmit
@RequiresPermissions(value={"system:assess:monitor","system:assess:agency"},logical = Logical.OR)
@ApiOperation(value = "创建专家")
@PostMapping("/addExpert")
@@ -69,58 +80,84 @@
return CommonResult.success(sysUserService.addExpert(user));
}
+ @RepeatSubmit
+ @RequiresPermissions("system:assess:monitor")
+ @ApiOperation(value = "编辑监管用户")
+ @PutMapping("/editMonitor")
+ public CommonResult editMonitor(@RequestBody SysUser user){
+ return CommonResult.success(sysUserService.editMonitor(user));
+ }
+
+ @RepeatSubmit
@RequiresPermissions("system:assess:monitor")
@ApiOperation(value = "编辑机构")
@PutMapping("/editAgency")
- public CommonResult editAgency(@Validated(ExpertGroup.class) @RequestBody SysUser user){
+ public CommonResult editAgency(@RequestBody SysUser user){
return CommonResult.success(sysUserService.editAgency(user));
}
+ @RepeatSubmit
@RequiresPermissions(value={"system:assess:monitor","system:assess:agency"},logical = Logical.OR)
@ApiOperation(value = "编辑专家")
@PutMapping("/editExpert")
- public CommonResult editExpert(@Validated(ExpertGroup.class) @RequestBody SysUser user){
+ public CommonResult editExpert(@RequestBody SysUser user){
return CommonResult.success(sysUserService.editExpert(user));
+ }
+
+ @ApiOperation(value = "根据id获取用户详情")
+ @ApiImplicitParams({
+ @ApiImplicitParam(paramType = "query", name = "userId", dataType = "int", required = true, value = "用户id")
+ })
+ @GetMapping("/getUserById")
+ public CommonResult getUserById(@RequestParam(required = true) Long userId){
+ return CommonResult.success(sysUserService.getUserInfoById(userId));
}
@ApiOperation(value = "校验用户名")
@PostMapping("/checkUserNameUnique")
- public boolean checkLoginNameUnique(SysUser user)
+ public CommonResult checkLoginNameUnique(@RequestBody SysUser user)
{
- return sysUserService.checkUsernameUnique(user);
+ return CommonResult.success(sysUserService.checkUsernameUnique(user));
}
@ApiOperation(value = "校验手机号")
@PostMapping("/checkPhoneUnique")
- public boolean checkPhoneUnique(SysUser user)
+ public CommonResult checkPhoneUnique(@RequestBody SysUser user)
{
- return sysUserService.checkPhoneUnique(user);
+ return CommonResult.success(sysUserService.checkPhoneUnique(user));
+ }
+
+ @RepeatSubmit
+ @ApiOperation(value = "用户修改密码")
+ @PutMapping("/resetUserPwd")
+ public CommonResult resetUserPwd(@RequestBody SysUser user)
+ {
+ return CommonResult.success(sysUserService.resetUserPwd(user));
}
-
- /**
- * 用户状态修改
- */
+ @RepeatSubmit
@RequiresPermissions(value={"system:assess:monitor","system:assess:agency"},logical = Logical.OR)
@ApiOperation(value = "用户状态修改,停用/启用")
@PostMapping("/changeStatus")
- public CommonResult changeStatus(SysUser user)
+ public CommonResult changeStatus(@RequestBody SysUser user)
{
return CommonResult.success(sysUserService.changeUserStatus(user));
}
+ @RepeatSubmit
@RequiresPermissions("system:assess:monitor")
- @ApiOperation(value = "审批状态修改,停用/启用")
+ @ApiOperation(value = "审批状态修改,审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废)")
@PostMapping("/changeApprove")
- public CommonResult changeApprove(SysUser user)
+ public CommonResult changeApprove(@RequestBody SysUser user)
{
return CommonResult.success(sysUserService.changeApprove(user));
}
+ @RepeatSubmit
@RequiresPermissions(value={"system:assess:monitor","system:assess:agency"},logical = Logical.OR)
@ApiOperation(value = "根据id删除用户")
@DeleteMapping("/remove/{userId}")
@@ -131,4 +168,5 @@
+
}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysAgencyController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java
similarity index 79%
rename from assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysAgencyController.java
rename to assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java
index d7f343f..3245b1b 100644
--- a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysAgencyController.java
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java
@@ -1,4 +1,4 @@
-package com.gkhy.assess.admin.controller;
+package com.gkhy.assess.admin.controller.web.front;
import com.gkhy.assess.common.api.CommonResult;
import com.gkhy.assess.system.domain.SysAgency;
@@ -7,13 +7,14 @@
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
-@Api(tags = "机构前端控制器")
+@Api(tags = "前台首页-机构前端控制器")
@RestController
-@RequestMapping("/system/agency")
-public class SysAgencyController {
+@RequestMapping("/agency")
+public class AgencyController {
@Autowired
private SysAgencyService agencyService;
@@ -24,6 +25,8 @@
})
@GetMapping("/agencyList")
public CommonResult agencyList(SysAgency agency){
+ agency.setPublication(0);
+ agency.setDelFlag(0);
return CommonResult.success(agencyService.agencyList(agency));
}
@@ -36,12 +39,4 @@
public CommonResult getAgencyById(@RequestParam(required = true) Long agencyId){
return CommonResult.success(agencyService.getAgencyById(agencyId));
}
-
- @ApiOperation(value = "校验机构名称")
- @PostMapping("/checkAgencyNameUnique")
- public boolean checkAgencyNameUnique(SysAgency agency)
- {
- return agencyService.checkAgencyNameUnique(agency);
- }
-
}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/LawController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/LawController.java
new file mode 100644
index 0000000..1259e00
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/LawController.java
@@ -0,0 +1,42 @@
+package com.gkhy.assess.admin.controller.web.front;
+
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.domain.SysLaw;
+import com.gkhy.assess.system.service.SysLawService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "前台首页-法律法规前端控制器")
+@RestController
+@RequestMapping("/law")
+public class LawController {
+ @Autowired
+ private SysLawService lawService;
+
+ @ApiOperation(value = "法律法规列表(分页)")
+ @ApiImplicitParams({
+ @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+ @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10")
+ })
+ @GetMapping("/lawList")
+ public CommonResult lawList(SysLaw law){
+ law.setStatus(0);
+ return CommonResult.success(lawService.lawList(law));
+ }
+
+
+ @ApiOperation(value = "根据id获取法律法规详情")
+ @ApiImplicitParams({
+ @ApiImplicitParam(paramType = "query", name = "lawId", dataType = "int", required = true, value = "法律法规id")
+ })
+ @GetMapping("/getLawById")
+ public CommonResult getLawById(@RequestParam(required = true)Long lawId){
+ return CommonResult.success(lawService.getLawById(lawId));
+ }
+}
diff --git a/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/NoticeController.java b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/NoticeController.java
new file mode 100644
index 0000000..b858a36
--- /dev/null
+++ b/assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/NoticeController.java
@@ -0,0 +1,44 @@
+package com.gkhy.assess.admin.controller.web.front;
+
+import com.gkhy.assess.common.api.CommonResult;
+import com.gkhy.assess.system.domain.SysNotice;
+import com.gkhy.assess.system.service.SysNoticeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "前台首页-通知公告前端控制器")
+@RestController
+@RequestMapping("/notice")
+public class NoticeController {
+ @Autowired
+ private SysNoticeService noticeService;
+
+ @ApiOperation(value = "通知列表(分页)")
+ @ApiImplicitParams({
+ @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+ @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10")
+ })
+ @GetMapping("/noticeList")
+ public CommonResult noticeList(SysNotice notice){
+ notice.setStatus(0);
+ return CommonResult.success(noticeService.noticeList(notice));
+ }
+
+
+ @ApiOperation(value = "根据id获取通知详情")
+ @ApiImplicitParams({
+ @ApiImplicitParam(paramType = "query", name = "noticeId", dataType = "int", required = true, value = "通知id")
+ })
+ @GetMapping("/getNoticeById")
+ public CommonResult getNoticeById(@RequestParam(required = true)Long noticeId){
+ return CommonResult.success(noticeService.getNoticeById(noticeId));
+ }
+
+
+}
diff --git a/assess-admin/src/main/resources/application.yml b/assess-admin/src/main/resources/application.yml
index 9ae7cd4..f82a6b9 100644
--- a/assess-admin/src/main/resources/application.yml
+++ b/assess-admin/src/main/resources/application.yml
@@ -7,9 +7,9 @@
multipart:
enabled: true
# 单个文件大小
- max-file-size: 10MB
+ max-file-size: 20MB
# 设置总上传的文件大小
- max-request-size: 20MB
+ max-request-size: 100MB
mvc:
pathmatch:
matching-strategy: ant_path_matcher
@@ -19,16 +19,6 @@
servlet:
context-path: /api
-#shiro配置
-#shiro:
-# sessionManager:
-# sessionIdCookieEnabled: true
-# sessionIdUrlRewritingEnabled: true
-# unauthorizedUrl: /unauthorizedurl
-# web:
-# enabled: true
-# successUrl: /index
-# loginUrl: /account/login
# 用户配置
user:
@@ -38,6 +28,14 @@
image:
- root_path: upload
- upload_image: upload/images
- upload_file: upload/documents
+ upload_path: upload
+
+
+# 防止XSS攻击
+xss:
+ # 过滤开关
+ enabled: true
+ # 排除链接(多个用逗号分隔)
+ excludes: /system/notice
+ # 匹配链接
+ urlPatterns: /system/*,/monitor/*,/tool/*
diff --git a/assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql b/assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql
index ab3a99e..9caf8db 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql
@@ -2,34 +2,34 @@
CREATE TABLE `smart_assess`.`sys_user` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
`username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '登录账号',
-`name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户昵称/姓名',
+`name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '用户昵称/姓名',
`identity` tinyint NOT NULL COMMENT '用户身份(0代表监管用户,1代表机构用户,2代表专家用户)',
-`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '邮箱',
-`phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '手机号码',
+`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '邮箱',
+`phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '手机号码',
`sex` tinyint NULL DEFAULT 2 COMMENT '用户性别(0男,1女,2未知,默认2)',
-`avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '头像路径',
+`avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '头像路径',
`password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
-`salt` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '盐加密',
+`salt` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '盐加密',
`status` tinyint NULL DEFAULT 0 COMMENT '账号状态(0正常,1停用,默认0)',
`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)',
`user_type` tinyint NULL DEFAULT 0 COMMENT '账号类型(0代表工作人员,1代表领导,默认0)',
-`manage_region` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '管辖地区',
+`manage_region` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '管辖地区',
`expert_type` tinyint NULL DEFAULT 0 COMMENT '专家类型(0代表安全评价,1代表检验检测,默认0)',
`agency_id` bigint NULL DEFAULT NULL COMMENT '机构id',
-`post` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '职务',
-`job_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '职称',
-`major` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '专业方向',
-`approve` tinyint NULL DEFAULT 1 COMMENT '审批状态(0审批通过,1待审批,2未通过 默认1)',
-`login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '最后登录ip',
+`post` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '职务',
+`job_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '职称',
+`major` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '专业方向',
+`state` tinyint(2) NULL DEFAULT 1 COMMENT '审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)',
+`login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '最后登录ip',
`login_date` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后登录时间',
`pwd_update_date` datetime NULL DEFAULT NULL COMMENT '密码最后更新时间',
-`create_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者',
+`create_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建者',
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-`update_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
+`update_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新者',
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
+`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `index_username`(`username`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
-
-insert into sys_user values(1,'admin', '国科鸿宇', 0, 'gkhy@163.com', '15888888888', 0, '', '29c67a30398638269fe600f73a054934', '111111', 0, 0, 0,'',null,null,'','','',1,'127.0.0.1', sysdate(), sysdate(), 'admin', sysdate(), '', sysdate(), '管理员');
+-- admin admin@123
+insert into sys_user values(1,'admin', '国科鸿宇', 0, 'gkhy@163.com', '15888888888', 0, '', 'b3065cdf5dfdbbc573e2f576c8dc147a', '111111', 0, 0, 0,'',null,null,'','','',1,'127.0.0.1', sysdate(), sysdate(), 'admin', sysdate(), '', sysdate(), '管理员');
diff --git a/assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql b/assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql
index b4a1d7b..3a2b9af 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql
@@ -8,11 +8,11 @@
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典名称',
`dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典类型',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0正常,1停用)',
-`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,
-`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '',
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '',
+`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `index_name`(`name`) USING BTREE,
UNIQUE INDEX `index_type`(`dict_type`) USING BTREE
diff --git a/assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql b/assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql
index c52c178..98c2cd0 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql
@@ -11,11 +11,19 @@
`dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典类型',
`is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0正常 1停用)',
-`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,
-`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '',
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
+`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `index_l_v_t`(`dict_type`, `label`, `value`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic;
+
+insert into sys_dict_data values(1, 0, '煤炭开采业','0', 'sys_business_scope', 'Y',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(2, 0, '金属、非金属矿及其他矿采选业','1', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(3, 0, '陆地石油和天然气开采业','2', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(4, 0, '陆上油气管道运输业','3', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(5, 0, '石油加工业,化学原料、化学品及医药制造业','4', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(6, 0, '烟花爆竹制造业','5', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
+insert into sys_dict_data values(7, 0, '金属冶炼','6', 'sys_business_scope', 'N',0, 'admin', sysdate(), '', sysdate(), '业务范围数据');
diff --git a/assess-admin/src/main/resources/db/migration/V20231123004_config.sql b/assess-admin/src/main/resources/db/migration/V20231123004_config.sql
index 02358e3..1d86c69 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123004_config.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123004_config.sql
@@ -9,11 +9,11 @@
`config_key` varchar(100) NOT NULL COMMENT '参数键名',
`config_value` varchar(500) NOT NULL COMMENT '参数键值',
`type` char(1) NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)',
-`create_by` varchar(64) NULL DEFAULT '' COMMENT '创建人',
+`create_by` varchar(64) NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
-`update_by` varchar(64) NULL DEFAULT '' COMMENT '更新人',
+`update_by` varchar(64) NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-`remark` varchar(100) NULL DEFAULT '' COMMENT '备注',
+`remark` varchar(100) NULL COMMENT '备注',
PRIMARY KEY (`id`),
UNIQUE INDEX `index_key`(`config_key`) USING BTREE,
UNIQUE INDEX `index_name`(`name`) USING BTREE
diff --git a/assess-admin/src/main/resources/db/migration/V20231123005_agency.sql b/assess-admin/src/main/resources/db/migration/V20231123005_agency.sql
index 1b8881d..10a7652 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123005_agency.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123005_agency.sql
@@ -6,13 +6,13 @@
CREATE TABLE `smart_assess`.`sys_agency` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '机构名称',
-`credit_code` varchar(50) NOT NULL COMMENT '社会信用代码',
+`credit_code` varchar(30) NOT NULL COMMENT '社会信用代码',
`attribute` tinyint(2) NOT NULL COMMENT '机构属性(0疆内,1疆外,默认0)',
-`province` varchar(10) NULL DEFAULT '' COMMENT '省',
+`province` varchar(10) NULL COMMENT '省',
`city` varchar(20) NOT NULL COMMENT '市',
-`district` varchar(20) NOT NULL COMMENT '区',
+`district` varchar(20) NULL COMMENT '区',
`address` varchar(100) NOT NULL COMMENT '经营地址',
-`web` varchar(100) NULL DEFAULT '' COMMENT '机构网址',
+`web` varchar(100) NULL COMMENT '机构网址',
`legal_person` varchar(20) NOT NULL COMMENT '法定代表人',
`legal_phone` varchar(13) NOT NULL COMMENT '法人电话',
`manager` varchar(20) NOT NULL COMMENT '机构负责人',
@@ -25,13 +25,14 @@
`archive_area` varchar(20) NOT NULL COMMENT '档案室面积',
`reg_address` varchar(100) NOT NULL COMMENT '注册地址',
`business` varchar(20) NOT NULL COMMENT '业务范围',
-`report_path` varchar(50) NULL DEFAULT '' COMMENT '机构信息上报表存放路径',
+`report_path` varchar(50) NULL COMMENT '机构信息上报表存放路径',
+`publication` tinyint(2) NULL DEFAULT 0 COMMENT '是否公示(0代表公示,1代表不公示,默认0)',
`del_flag` tinyint(2) NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)',
-`create_by` varchar(20) NULL DEFAULT '' COMMENT '创建人',
+`create_by` varchar(20) NULL COMMENT '创建人',
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-`update_by` varchar(20) NULL DEFAULT '' COMMENT '更新人',
+`update_by` varchar(20) NULL COMMENT '更新人',
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-`remark` varchar(100) NULL DEFAULT '' COMMENT '备注',
+`remark` varchar(100) NULL COMMENT '备注',
PRIMARY KEY (`id`),
INDEX `index_name`(`name`) USING BTREE
)ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '机构表' ROW_FORMAT = Dynamic;
diff --git a/assess-admin/src/main/resources/db/migration/V20231123006_notice.sql b/assess-admin/src/main/resources/db/migration/V20231123006_notice.sql
index 1272c78..67711f2 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123006_notice.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123006_notice.sql
@@ -6,12 +6,12 @@
CREATE TABLE `smart_assess`.`sys_notice` (
`id` bigint NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL COMMENT '通知标题',
-`content` varchar(2000) NULL DEFAULT '' COMMENT '通知内容',
+`content` text NULL COMMENT '通知内容',
`status` tinyint(2) NULL DEFAULT 0 COMMENT '通知状态(0正常,1关闭 默认0)',
-`create_by` varchar(20) NULL DEFAULT '' COMMENT '创建人',
+`create_by` varchar(20) NULL COMMENT '创建人',
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-`update_by` varchar(20) NULL DEFAULT '' COMMENT '更新人',
+`update_by` varchar(20) NULL COMMENT '更新人',
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-`remark` varchar(100) NULL DEFAULT '' COMMENT '备注',
+`remark` varchar(100) NULL COMMENT '备注',
PRIMARY KEY (`id`)
)ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '通知表' ROW_FORMAT = Dynamic;
diff --git a/assess-admin/src/main/resources/db/migration/V20231123007_law.sql b/assess-admin/src/main/resources/db/migration/V20231123007_law.sql
index ded507e..4606862 100644
--- a/assess-admin/src/main/resources/db/migration/V20231123007_law.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231123007_law.sql
@@ -6,16 +6,16 @@
CREATE TABLE `smart_assess`.`sys_law` (
`id` bigint NOT NULL AUTO_INCREMENT,
`title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '住标题',
-`sub_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '副标题',
-`content` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '内容',
+`sub_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '副标题',
+`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容',
`law_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '法律法规类别',
`pub_agency` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '颁布机构',
`pub_date` datetime NOT NULL COMMENT '颁布日期',
`status` tinyint NULL DEFAULT 0 COMMENT '状态(0正常,1关闭 默认0)',
-`create_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建人',
+`create_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-`update_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新人',
+`update_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
+`remark` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '法律法规表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231124001_region.sql b/assess-admin/src/main/resources/db/migration/V20231124001_region.sql
index a270859..1d4a9d8 100644
--- a/assess-admin/src/main/resources/db/migration/V20231124001_region.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231124001_region.sql
@@ -8,6 +8,523 @@
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '地区名称',
`sort` int NULL DEFAULT 0 COMMENT '排序',
`parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父主键',
+`region_type` tinyint NULL DEFAULT 0 COMMENT '地区类型(0是疆内,1是疆外,默认0)',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
+`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE,
-UNIQUE INDEX `index_key`(`parent_id`, `name`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统地区表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
+UNIQUE INDEX `index_key`(`parent_id`, `name`,`region_type`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统地区表' ROW_FORMAT = DYNAMIC;
+
+
+
+use smart_assess;
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (1, '乌鲁木齐市', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (2, '天山区', 0, 1, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (3, '沙依巴克区', 0, 1, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (4, '新市区', 0, 1, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (5, '水磨沟区', 0, 1, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (6, '头屯河区', 0, 1, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (7, '达坂城区', 0, 1, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (8, '米东区', 0, 1, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (9, '乌鲁木齐县', 0, 1, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (10, '克拉玛依市', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (11, '独山子区', 0, 10, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (12, '克拉玛依区', 0, 10, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (13, '白碱滩区', 0, 10, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (14, '乌尔禾区', 0, 10, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (15, '吐鲁番市', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (16, '高昌区', 0, 15, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (17, '鄯善县', 0, 15, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (18, '托克逊县', 0, 15, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (19, '哈密市', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (20, '伊州区', 0, 19, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (21, '巴里坤哈萨克自治县', 0, 19, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (22, '伊吾县', 0, 19, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (23, '昌吉回族自治州', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (24, '昌吉市', 0, 23, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (25, '阜康市', 0, 23, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (26, '呼图壁县', 0, 23, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (27, '玛纳斯县', 0, 23, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (28, '奇台县', 0, 23, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (29, '吉木萨尔县', 0, 23, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (30, '木垒哈萨克自治县', 0, 23, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (31, '博尔塔拉蒙古自治州', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (32, '博乐市', 0, 31, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (33, '阿拉山口市', 0, 31, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (34, '精河县', 0, 31, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (35, '温泉县', 0, 31, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (36, '巴音郭楞蒙古自治州', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (37, '库尔勒市', 0, 36, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (38, '轮台县', 0, 36, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (39, '尉犁县', 0, 36, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (40, '若羌县', 0, 36, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (41, '且末县', 0, 36, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (42, '焉耆回族自治县', 0, 36, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (43, '和静县', 0, 36, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (44, '和硕县', 0, 36, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (45, '博湖县', 0, 36, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (46, '阿克苏地区', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (47, '阿克苏市', 0, 46, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (48, '库车市', 0, 46, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (49, '温宿县', 0, 46, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (50, '沙雅县', 0, 46, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (51, '新和县', 0, 46, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (52, '拜城县', 0, 46, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (53, '乌什县', 0, 46, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (54, '阿瓦提县', 0, 46, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (55, '柯坪县', 0, 46, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (56, '克孜勒苏柯尔克孜自治州', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (57, '阿图什市', 0, 56, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (58, '阿克陶县', 0, 56, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (59, '阿合奇县', 0, 56, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (60, '乌恰县', 0, 56, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (61, '喀什地区', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (62, '喀什市', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (63, '疏附县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (64, '疏勒县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (65, '英吉沙县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (66, '泽普县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (67, '莎车县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (68, '叶城县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (69, '麦盖提县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (70, '岳普湖县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (71, '伽师县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (72, '巴楚县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (73, '塔什库尔干塔吉克自治县', 0, 61, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (74, '和田地区', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (75, '和田市', 0, 74, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (76, '和田县', 0, 74, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (77, '墨玉县', 0, 74, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (78, '皮山县', 0, 74, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (79, '洛浦县', 0, 74, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (80, '策勒县', 0, 74, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (81, '于田县', 0, 74, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (82, '民丰县', 0, 74, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (83, '伊犁哈萨克自治州', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (84, '伊宁市', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (85, '奎屯市', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (86, '霍尔果斯市', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (87, '伊宁县', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (88, '察布查尔锡伯自治县', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (89, '霍城县', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (90, '巩留县', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (91, '新源县', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (92, '昭苏县', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (93, '特克斯县', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (94, '尼勒克县', 0, 83, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (95, '塔城地区', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (96, '塔城市', 0, 95, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (97, '乌苏市', 0, 95, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (98, '沙湾市', 0, 95, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (99, '额敏县', 0, 95, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (100, '托里县', 0, 95, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (101, '裕民县', 0, 95, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (102, '和布克赛尔蒙古自治县', 0, 95, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (103, '阿勒泰地区', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (104, '阿勒泰市', 0, 103, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (105, '布尔津县', 0, 103, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (106, '富蕴县', 0, 103, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (107, '福海县', 0, 103, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (108, '哈巴河县', 0, 103, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (109, '青河县', 0, 103, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (110, '吉木乃县', 0, 103, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (111, '自治区直辖县级行政区划', 0, 0, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (112, '石河子市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (113, '阿拉尔市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (114, '图木舒克市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (115, '五家渠市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (116, '北屯市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (117, '铁门关市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (118, '双河市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (119, '可克达拉市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (120, '昆玉市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (121, '胡杨河市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (122, '新星市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (123, '白杨市', 0, 111, 0);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (124, '北京市', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (125, '天津市', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (126, '河北省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (127, '石家庄市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (128, '唐山市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (129, '秦皇岛市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (130, '邯郸市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (131, '邢台市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (132, '保定市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (133, '张家口市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (134, '承德市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (135, '沧州市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (136, '廊坊市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (137, '衡水市', 0, 126, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (138, '山西省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (139, '太原市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (140, '大同市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (141, '阳泉市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (142, '长治市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (143, '晋城市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (144, '朔州市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (145, '晋中市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (146, '运城市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (147, '忻州市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (148, '临汾市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (149, '吕梁市', 0, 138, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (150, '内蒙古自治区', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (151, '呼和浩特市', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (152, '包头市', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (153, '乌海市', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (154, '赤峰市', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (155, '通辽市', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (156, '鄂尔多斯市', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (157, '呼伦贝尔市', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (158, '巴彦淖尔市', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (159, '乌兰察布市', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (160, '兴安盟', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (161, '锡林郭勒盟', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (162, '阿拉善盟', 0, 150, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (163, '辽宁省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (164, '沈阳市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (165, '大连市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (166, '鞍山市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (167, '抚顺市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (168, '本溪市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (169, '丹东市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (170, '锦州市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (171, '营口市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (172, '阜新市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (173, '辽阳市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (174, '盘锦市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (175, '铁岭市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (176, '朝阳市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (177, '葫芦岛市', 0, 163, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (178, '吉林省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (179, '长春市', 0, 178, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (180, '吉林市', 0, 178, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (181, '四平市', 0, 178, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (182, '辽源市', 0, 178, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (183, '通化市', 0, 178, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (184, '白山市', 0, 178, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (185, '松原市', 0, 178, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (186, '白城市', 0, 178, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (187, '延边朝鲜族自治州', 0, 178, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (188, '黑龙江省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (189, '哈尔滨市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (190, '齐齐哈尔市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (191, '鸡西市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (192, '鹤岗市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (193, '双鸭山市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (194, '大庆市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (195, '伊春市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (196, '佳木斯市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (197, '七台河市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (198, '牡丹江市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (199, '黑河市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (200, '绥化市', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (201, '大兴安岭地区', 0, 188, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (202, '上海市', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (203, '江苏省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (204, '南京市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (205, '无锡市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (206, '徐州市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (207, '常州市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (208, '苏州市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (209, '南通市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (210, '连云港市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (211, '淮安市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (212, '盐城市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (213, '扬州市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (214, '镇江市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (215, '泰州市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (216, '宿迁市', 0, 203, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (217, '浙江省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (218, '杭州市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (219, '宁波市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (220, '温州市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (221, '嘉兴市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (222, '湖州市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (223, '绍兴市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (224, '金华市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (225, '衢州市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (226, '舟山市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (227, '台州市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (228, '丽水市', 0, 217, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (229, '安徽省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (230, '合肥市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (231, '芜湖市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (232, '蚌埠市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (233, '淮南市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (234, '马鞍山市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (235, '淮北市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (236, '铜陵市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (237, '安庆市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (238, '黄山市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (239, '滁州市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (240, '阜阳市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (241, '宿州市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (242, '六安市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (243, '亳州市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (244, '池州市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (245, '宣城市', 0, 229, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (246, '福建省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (247, '福州市', 0, 246, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (248, '厦门市', 0, 246, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (249, '莆田市', 0, 246, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (250, '三明市', 0, 246, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (251, '泉州市', 0, 246, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (252, '漳州市', 0, 246, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (253, '南平市', 0, 246, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (254, '龙岩市', 0, 246, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (255, '宁德市', 0, 246, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (256, '江西省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (257, '南昌市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (258, '景德镇市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (259, '萍乡市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (260, '九江市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (261, '新余市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (262, '鹰潭市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (263, '赣州市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (264, '吉安市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (265, '宜春市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (266, '抚州市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (267, '上饶市', 0, 256, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (268, '山东省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (269, '济南市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (270, '青岛市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (271, '淄博市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (272, '枣庄市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (273, '东营市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (274, '烟台市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (275, '潍坊市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (276, '济宁市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (277, '泰安市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (278, '威海市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (279, '日照市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (280, '临沂市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (281, '德州市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (282, '聊城市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (283, '滨州市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (284, '菏泽市', 0, 268, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (285, '河南省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (286, '郑州市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (287, '开封市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (288, '洛阳市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (289, '平顶山市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (290, '安阳市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (291, '鹤壁市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (292, '新乡市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (293, '焦作市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (294, '濮阳市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (295, '许昌市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (296, '漯河市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (297, '三门峡市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (298, '南阳市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (299, '商丘市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (300, '信阳市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (301, '周口市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (302, '驻马店市', 0, 285, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (303, '湖北省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (304, '武汉市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (305, '黄石市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (306, '十堰市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (307, '宜昌市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (308, '襄阳市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (309, '鄂州市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (310, '荆门市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (311, '孝感市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (312, '荆州市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (313, '黄冈市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (314, '咸宁市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (315, '随州市', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (316, '恩施土家族苗族自治州', 0, 303, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (317, '湖南省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (318, '长沙市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (319, '株洲市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (320, '湘潭市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (321, '衡阳市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (322, '邵阳市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (323, '岳阳市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (324, '常德市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (325, '张家界市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (326, '益阳市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (327, '郴州市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (328, '永州市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (329, '怀化市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (330, '娄底市', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (331, '湘西土家族苗族自治州', 0, 317, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (332, '广东省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (333, '广州市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (334, '韶关市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (335, '深圳市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (336, '珠海市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (337, '汕头市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (338, '佛山市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (339, '江门市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (340, '湛江市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (341, '茂名市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (342, '肇庆市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (343, '惠州市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (344, '梅州市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (345, '汕尾市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (346, '河源市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (347, '阳江市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (348, '清远市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (349, '潮州市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (350, '揭阳市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (351, '云浮市', 0, 332, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (352, '广西壮族自治区', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (353, '南宁市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (354, '柳州市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (355, '桂林市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (356, '梧州市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (357, '北海市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (358, '防城港市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (359, '钦州市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (360, '贵港市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (361, '玉林市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (362, '百色市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (363, '贺州市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (364, '河池市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (365, '来宾市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (366, '崇左市', 0, 352, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (367, '海南省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (368, '海口市', 0, 367, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (369, '三亚市', 0, 367, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (370, '儋州市', 0, 367, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (371, '重庆市', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (372, '四川省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (373, '成都市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (374, '自贡市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (375, '攀枝花市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (376, '泸州市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (377, '德阳市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (378, '绵阳市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (379, '广元市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (380, '遂宁市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (381, '内江市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (382, '乐山市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (383, '南充市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (384, '眉山市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (385, '宜宾市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (386, '广安市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (387, '达州市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (388, '雅安市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (389, '巴中市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (390, '资阳市', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (391, '阿坝藏族羌族自治州', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (392, '甘孜藏族自治州', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (393, '凉山彝族自治州', 0, 372, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (394, '贵州省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (395, '贵阳市', 0, 394, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (396, '六盘水市', 0, 394, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (397, '遵义市', 0, 394, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (398, '安顺市', 0, 394, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (399, '毕节市', 0, 394, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (400, '铜仁市', 0, 394, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (401, '黔西南布依族苗族自治州', 0, 394, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (402, '黔东南苗族侗族自治州', 0, 394, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (403, '黔南布依族苗族自治州', 0, 394, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (404, '云南省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (405, '昆明市', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (406, '曲靖市', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (407, '玉溪市', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (408, '保山市', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (409, '昭通市', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (410, '丽江市', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (411, '普洱市', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (412, '临沧市', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (413, '楚雄彝族自治州', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (414, '红河哈尼族彝族自治州', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (415, '文山壮族苗族自治州', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (416, '西双版纳傣族自治州', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (417, '大理白族自治州', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (418, '德宏傣族景颇族自治州', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (419, '怒江傈僳族自治州', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (420, '迪庆藏族自治州', 0, 404, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (421, '西藏自治区', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (422, '拉萨市', 0, 421, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (423, '日喀则市', 0, 421, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (424, '昌都市', 0, 421, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (425, '林芝市', 0, 421, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (426, '山南市', 0, 421, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (427, '那曲市', 0, 421, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (428, '阿里地区', 0, 421, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (429, '陕西省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (430, '西安市', 0, 429, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (431, '铜川市', 0, 429, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (432, '宝鸡市', 0, 429, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (433, '咸阳市', 0, 429, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (434, '渭南市', 0, 429, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (435, '延安市', 0, 429, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (436, '汉中市', 0, 429, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (437, '榆林市', 0, 429, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (438, '安康市', 0, 429, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (439, '商洛市', 0, 429, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (440, '甘肃省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (441, '兰州市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (442, '金昌市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (443, '白银市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (444, '天水市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (445, '武威市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (446, '张掖市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (447, '平凉市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (448, '酒泉市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (449, '庆阳市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (450, '定西市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (451, '陇南市', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (452, '临夏回族自治州', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (453, '甘南藏族自治州', 0, 440, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (454, '青海省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (455, '西宁市', 0, 454, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (456, '海东市', 0, 454, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (457, '海北藏族自治州', 0, 454, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (458, '黄南藏族自治州', 0, 454, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (459, '海南藏族自治州', 0, 454, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (460, '果洛藏族自治州', 0, 454, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (461, '玉树藏族自治州', 0, 454, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (462, '海西蒙古族藏族自治州', 0, 454, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (463, '宁夏回族自治区', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (464, '银川市', 0, 463, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (465, '石嘴山市', 0, 463, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (466, '吴忠市', 0, 463, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (467, '固原市', 0, 463, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (468, '中卫市', 0, 463, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (469, '新疆维吾尔自治区', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (470, '乌鲁木齐市', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (471, '克拉玛依市', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (472, '吐鲁番市', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (473, '哈密市', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (474, '昌吉回族自治州', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (475, '博尔塔拉蒙古自治州', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (476, '巴音郭楞蒙古自治州', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (477, '阿克苏地区', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (478, '克孜勒苏柯尔克孜自治州', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (479, '喀什地区', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (480, '和田地区', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (481, '伊犁哈萨克自治州', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (482, '塔城地区', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (483, '阿勒泰地区', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (484, '自治区直辖县级行政区划', 0, 469, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (485, '台湾省', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (486, '台北市', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (487, '新北市', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (488, '桃园市', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (489, '台中市', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (490, '台南市', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (491, '高雄市', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (492, '基隆市', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (493, '新竹市', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (494, '嘉义市', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (495, '新竹县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (496, '苗栗县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (497, '彰化县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (498, '南投县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (499, '云林县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (500, '嘉义县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (501, '屏东县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (502, '宜兰县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (503, '花莲县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (504, '台东县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (505, '澎湖县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (506, '连江县', 0, 485, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (507, '香港特别行政区', 0, 0, 1);
+INSERT INTO `sys_region`(`id`, `name`, `sort`, `parent_id`, `region_type`) VALUES (508, '澳门特别行政区', 0, 0, 1);
diff --git a/assess-admin/src/main/resources/db/migration/V20231124002_attach.sql b/assess-admin/src/main/resources/db/migration/V20231124002_attach.sql
index b970e5c..08cc0c4 100644
--- a/assess-admin/src/main/resources/db/migration/V20231124002_attach.sql
+++ b/assess-admin/src/main/resources/db/migration/V20231124002_attach.sql
@@ -9,9 +9,9 @@
`path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件存放路径',
`type` tinyint NOT NULL COMMENT '文件所属类型(1社保,2医保,3工资单)',
`user_id` bigint NOT NULL COMMENT '用户id',
-`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建人',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
-`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新人',
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `index_name`(`name`) USING BTREE
diff --git a/assess-admin/src/main/resources/db/migration/V20231127001_expert_classify.sql b/assess-admin/src/main/resources/db/migration/V20231127001_expert_classify.sql
new file mode 100644
index 0000000..e4644b2
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231127001_expert_classify.sql
@@ -0,0 +1,17 @@
+
+-- ----------------------------
+-- 系统专家分类表
+-- ----------------------------
+drop table if exists `smart_assess`.`sys_expert_classify`;
+CREATE TABLE `smart_assess`.`sys_expert_classify` (
+`classify_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+`classify_name` varchar(20) NOT NULL COMMENT '分类名称',
+`parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父id',
+`del_flag` tinyint NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '修改人',
+`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`classify_id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统专家分类表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231127002_expert_info.sql b/assess-admin/src/main/resources/db/migration/V20231127002_expert_info.sql
new file mode 100644
index 0000000..517d21f
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231127002_expert_info.sql
@@ -0,0 +1,45 @@
+
+-- ----------------------------
+-- 系统专家分类表
+-- ----------------------------
+drop table if exists `smart_assess`.`sys_expert_info`;
+CREATE TABLE `smart_assess`.`sys_expert_info` (
+`expert_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
+`name` varchar(20) NOT NULL COMMENT '专家名称',
+`sex` tinyint NULL DEFAULT 2 COMMENT '性别(0男,1女,2未知,默认2)',
+`big_classify` bigint NULL COMMENT '类别id',
+`small_classify` bigint NULL COMMENT '类别id',
+`birthday` datetime NULL COMMENT '出生日期',
+`phone` varchar(11) NULL COMMENT '手机号',
+`title` varchar(20) NULL COMMENT '职称',
+`electronic_photo` varchar(100) NULL COMMENT '电子照片',
+`id_card` varchar(18) NULL COMMENT '身份证号码',
+`duty_status` tinyint NULL COMMENT '在职状态',
+`company_name` varchar(20) NULL COMMENT '公司名称',
+`company_address` varchar(50) NULL COMMENT '公司地址',
+`dept_name` varchar(20) NULL COMMENT '部门名称',
+`job` varchar(10) NULL COMMENT '职务',
+`company_telephone` varchar(11) NULL COMMENT '公司电话',
+`fax_num` varchar(11) NULL COMMENT '传真',
+`email` varchar(20) NULL COMMENT '邮箱',
+`graduation_school` varchar(20) NULL COMMENT '毕业学校',
+`degree` varchar(10) NULL COMMENT '学历',
+`speciality` varchar(20) NULL COMMENT '专业',
+`current_profession` varchar(20) NULL COMMENT '当前专业',
+`support_direction_safety` varchar(20) NULL COMMENT '支撑安全',
+`support_direction_prevention` varchar(20) NULL COMMENT '支撑预防',
+`support_direction_emergency` varchar(20) NULL COMMENT '支持应急',
+`resume_key` varchar(20) NULL COMMENT '简述',
+`paper_situation_key` varchar(20) NULL,
+`reward_key` varchar(20) NULL,
+`achievement_key` varchar(20) NULL,
+`personal_opinion_key` varchar(20) NULL,
+`recommend_unit_opinion_key` varchar(20) NULL,
+`del_flag` tinyint(255) NOT NULL DEFAULT 0 COMMENT '删除标志(0代表存在,1代表删除,默认0)',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '修改人',
+`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+`remark` varchar(100) NULL,
+PRIMARY KEY (`expert_id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统专家信息表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231130001_project.sql b/assess-admin/src/main/resources/db/migration/V20231130001_project.sql
new file mode 100644
index 0000000..2a43432
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231130001_project.sql
@@ -0,0 +1,36 @@
+
+-- ----------------------------
+-- 项目表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_project`;
+CREATE TABLE `smart_assess`.`ass_project` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`name` varchar(50) NOT NULL COMMENT '项目名称',
+`code` varchar(50) NULL COMMENT '项目编号',
+`agency_id` bigint NOT NULL COMMENT '机构id',
+`client` varchar(50) NOT NULL COMMENT '委托方',
+`province` varchar(20) NULL COMMENT '省份',
+`city` varchar(20) NOT NULL COMMENT '城市',
+`district` varchar(20) NOT NULL COMMENT '区县',
+`business` varchar(20) NOT NULL COMMENT '业务范围,字典id',
+`invest` varchar(10) NOT NULL COMMENT '项目投资额/万',
+`address` varchar(100) NOT NULL COMMENT '地址',
+`actual_location` varchar(60) NULL COMMENT '实际纬度/经度',
+`location` varchar(20) NULL COMMENT '纬度/经度',
+`estimate_type` bigint NULL COMMENT '评估类型,字典id',
+`leader_id` bigint NOT NULL COMMENT '负责人id',
+`defect_numb` int NULL,
+`review_plan_date` datetime NULL COMMENT '评估计划时间',
+`township` varchar(20) NULL,
+`credit_code` varchar(30) NOT NULL COMMENT '委托单位社会统一信用代码',
+`report_progress` tinyint(2) NULL DEFAULT 0 COMMENT '项目状态(0创建,1风险评估,2合同管理,默认0)',
+`state` tinyint(2) NULL DEFAULT 1 COMMENT '审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231130002_risk_estimate.sql b/assess-admin/src/main/resources/db/migration/V20231130002_risk_estimate.sql
new file mode 100644
index 0000000..306f28f
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231130002_risk_estimate.sql
@@ -0,0 +1,33 @@
+
+-- ----------------------------
+-- 风险评估表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_risk_estimate`;
+CREATE TABLE `smart_assess`.`ass_risk_estimate` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`project_id` bigint NOT NULL COMMENT '项目id',
+`introduction` varchar(500) NOT NULL COMMENT '基本概况(500字以内)',
+`risk_character` varchar(500) NOT NULL COMMENT '行业风险特性(500字以内)',
+`surroundings` varchar(500) NOT NULL COMMENT '周边环境(500字以内)',
+`equipment` varchar(500) NULL COMMENT '主要生产装置(500字以内)',
+`technology` varchar(500) NULL COMMENT '生产工艺概况(500字以内)',
+`is_accept_chargess` tinyint(1) NOT NULL COMMENT '评价费用是否在本机构所接受的范围内(0否,1是)',
+`is_feasibility` tinyint(1) NOT NULL COMMENT '项目的可行性(0否,1是)',
+`is_finish_report` tinyint(1) NOT NULL COMMENT '是否能在约定的时间内完成评价报告(0否,1是)',
+`is_in_business` tinyint(1) NOT NULL COMMENT '评价项目是否在本机构资质业务范围内(0否,1是)',
+`is_need_expert` tinyint(1) NOT NULL COMMENT '是否需要聘请相关专业的技术专家(0否,1是)',
+`is_satisfy_need` tinyint(1) NOT NULL COMMENT '评价人员专业构成是否满足评价项目需要(0否,1是)',
+`estimate_date` datetime NOT NULL COMMENT '评估时间',
+`tech_opinion` varchar(30) NOT NULL COMMENT '技术负责人意见(30字以内)',
+`risk_opinion` varchar(30) NOT NULL COMMENT '风险评估人意见(30字以内)',
+`agency_opinon` varchar(30) NOT NULL COMMENT '机构评价负责人意见(30字以内)',
+`state` tinyint(2) NULL DEFAULT 1 COMMENT '审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '风险评估表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231130003_contract.sql b/assess-admin/src/main/resources/db/migration/V20231130003_contract.sql
new file mode 100644
index 0000000..ad2d82b
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231130003_contract.sql
@@ -0,0 +1,22 @@
+
+-- ----------------------------
+-- 合同管理表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_contract`;
+CREATE TABLE `smart_assess`.`ass_contract` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`contract_money` decimal NOT NULL COMMENT '合同价格/万',
+`actual_contract_money` decimal NOT NULL COMMENT '实际合同价格/万',
+`contract_sign_date` datetime NOT NULL COMMENT '合同签订时间',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`contract_introduction` varchar(100) NULL COMMENT '合同额外说明(100字以内)',
+`actual_contract_introduction` varchar(100) NULL COMMENT '实际合同额外说明(100字以内)',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '合同管理表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231130004_estimate_task.sql b/assess-admin/src/main/resources/db/migration/V20231130004_estimate_task.sql
new file mode 100644
index 0000000..fce085f
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231130004_estimate_task.sql
@@ -0,0 +1,23 @@
+
+-- ----------------------------
+-- 评价认为通知表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_estimate_task`;
+CREATE TABLE `smart_assess`.`ass_estimate_task` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`leader_id` bigint NOT NULL COMMENT '项目负责人id',
+`link_man` varchar(10) NOT NULL COMMENT '联系人(10个字符)',
+`link_phone` varchar(11) NOT NULL COMMENT '联系电话(11个字符)',
+`fax` varchar(20) NULL COMMENT '传真',
+`transmit_date` datetime NOT NULL COMMENT '任务下达时间',
+`transmit_person` varchar(20) NULL COMMENT '任务下达人',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '评价认为通知表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231204001_device.sql b/assess-admin/src/main/resources/db/migration/V20231204001_device.sql
new file mode 100644
index 0000000..c5c7a6f
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231204001_device.sql
@@ -0,0 +1,38 @@
+
+-- ----------------------------
+-- 设备表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_device`;
+CREATE TABLE `smart_assess`.`ass_device` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`device_name` varchar(20) NOT NULL COMMENT '设备名称',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '设备表' ROW_FORMAT = DYNAMIC;
+
+
+-- ----------------------------
+-- 项目需要的设备清单表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_project_device`;
+CREATE TABLE `smart_assess`.`ass_project_device` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`project_id` bigint NOT NULL COMMENT '项目id',
+`device_id` bigint NOT NULL COMMENT '设备id',
+`start_date` datetime NOT NULL COMMENT '开始时间',
+`end_date` datetime NOT NULL COMMENT '结束时间',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目需要的设备清单表' ROW_FORMAT = DYNAMIC;
+
diff --git a/assess-admin/src/main/resources/db/migration/V20231204002_estimate_plan.sql b/assess-admin/src/main/resources/db/migration/V20231204002_estimate_plan.sql
new file mode 100644
index 0000000..daaa103
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231204002_estimate_plan.sql
@@ -0,0 +1,21 @@
+
+-- ----------------------------
+-- 评价项目计划表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_estimate_plan`;
+CREATE TABLE `smart_assess`.`ass_estimate_plan` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`auser_id` bigint NOT NULL COMMENT '评价机构负责人id',
+`technical_id` bigint NOT NULL COMMENT '技术负责人负责人id',
+`start_date` datetime NOT NULL COMMENT '评价开始时间',
+`end_date` datetime NOT NULL COMMENT '评价结束时间',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '评价项目计划表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231204003_estimate_schedule.sql b/assess-admin/src/main/resources/db/migration/V20231204003_estimate_schedule.sql
new file mode 100644
index 0000000..0dff831
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231204003_estimate_schedule.sql
@@ -0,0 +1,21 @@
+
+-- ----------------------------
+-- 评价日程安排表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_estimate_schedule`;
+CREATE TABLE `smart_assess`.`ass_estimate_schedule` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`name` varchar(20) NOT NULL COMMENT '日程名称',
+`schedule_type` tinyint(2) NOT NULL COMMENT '日程类型:1勘验准备,2现场勘验,3材料分析整理,4评价报告编写,5整改情况现场确认,6整理评价报告,7报告审核,8报告修改',
+`start_date` datetime NOT NULL COMMENT '开始时间',
+`end_date` datetime NOT NULL COMMENT '结束时间',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '评价日程安排表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231204004_plan_person.sql b/assess-admin/src/main/resources/db/migration/V20231204004_plan_person.sql
new file mode 100644
index 0000000..34ec067
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231204004_plan_person.sql
@@ -0,0 +1,30 @@
+
+-- ----------------------------
+-- 评价项目组成员表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_plan_person`;
+CREATE TABLE `smart_assess`.`ass_plan_person` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`person_id` bigint NOT NULL COMMENT '成员id',
+`certificate_number` varchar(30) NOT NULL COMMENT '资格证书编号',
+`ability` varchar(10) NOT NULL COMMENT '能力',
+`business_ability_id` bigint NULL COMMENT '能力id(字典id)',
+`identification_number` varchar(10) NOT NULL COMMENT '识别码',
+`job_type` tinyint(2) NOT NULL DEFAULT 1 COMMENT '工作类型:1普通人员,2组长',
+`later_promise` tinyint(1) NOT NULL COMMENT '承诺后期前往现场勘验(0否,1是)',
+`professional_ability` varchar(50) NOT NULL COMMENT '专业能力',
+`work` varchar(50) NOT NULL COMMENT '承担工作',
+`scene_statue` tinyint(2) NOT NULL DEFAULT 1 COMMENT '场景状态1 2',
+`reason` varchar(30) NULL COMMENT '未到现场勘验原因(30字)',
+`sort` int NULL DEFAULT 0 COMMENT '排序',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`work_notification_id` bigint NULL COMMENT '从业告知id',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '评价项目组成员表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231204005_plan_expert.sql b/assess-admin/src/main/resources/db/migration/V20231204005_plan_expert.sql
new file mode 100644
index 0000000..515c1c7
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231204005_plan_expert.sql
@@ -0,0 +1,25 @@
+
+-- ----------------------------
+-- 评价项目组专家表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_plan_expert`;
+CREATE TABLE `smart_assess`.`ass_plan_expert` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`expert_id` bigint NOT NULL COMMENT '专家id',
+`ability` varchar(10) NOT NULL COMMENT '能力',
+`business_ability_id` bigint NULL COMMENT '能力id(字典id)',
+`later_promise` tinyint(1) NOT NULL COMMENT '承诺后期前往现场勘验(0否,1是)',
+`professional_ability` varchar(50) NOT NULL COMMENT '专业能力',
+`work` varchar(50) NOT NULL COMMENT '工作任务',
+`sort` int NULL DEFAULT 0 COMMENT '排序',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`work_notification_id` bigint NULL COMMENT '从业告知id',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '评价项目组专家表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231205001_work_notification.sql b/assess-admin/src/main/resources/db/migration/V20231205001_work_notification.sql
new file mode 100644
index 0000000..e89f339
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231205001_work_notification.sql
@@ -0,0 +1,22 @@
+
+-- ----------------------------
+-- 从业告知表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_work_notification`;
+CREATE TABLE `smart_assess`.`ass_work_notification` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`service_start_date` datetime NOT NULL COMMENT '服务开始时间',
+`service_end_date` datetime NOT NULL COMMENT '服务结束时间',
+`investigation_plan_date` datetime NOT NULL COMMENT '计划现场勘验时间',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`state` tinyint(2) NULL DEFAULT 1 COMMENT '审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)',
+`audit_id` bigint NULL COMMENT '审核人员id',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '从业告知表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231205002_investigation.sql b/assess-admin/src/main/resources/db/migration/V20231205002_investigation.sql
new file mode 100644
index 0000000..5963af0
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231205002_investigation.sql
@@ -0,0 +1,21 @@
+
+-- ----------------------------
+-- 现场勘验记录表
+-- ----------------------------
+drop table if exists `smart_assess`.`ass_investigation`;
+CREATE TABLE `smart_assess`.`ass_investigation` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`investigation_date` datetime NOT NULL COMMENT '现场勘验时间',
+`is_first` tinyint(1) NULL DEFAULT 0 COMMENT '是否第一次(0是,1否)',
+`is_safety_check` tinyint(1) NULL DEFAULT 0 COMMENT '编制现场安全检查表',
+`record_data` varchar(200) NULL COMMENT '现场勘验记录(200字)',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(20) NULL COMMENT '创建人',
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+`update_by` varchar(20) NULL COMMENT '更新人',
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+`remark` varchar(100) NULL COMMENT '备注',
+PRIMARY KEY (`id`)
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '现场勘验记录表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231205003_accessory_file.sql b/assess-admin/src/main/resources/db/migration/V20231205003_accessory_file.sql
new file mode 100644
index 0000000..34492ad
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231205003_accessory_file.sql
@@ -0,0 +1,21 @@
+
+-- ----------------------------
+-- 评估文件上传记录表
+-- ----------------------------
+drop table if exists `smart_assess`.`sys_accessory_file`;
+CREATE TABLE `smart_assess`.`sys_accessory_file` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`file_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名称',
+`path` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件存放路径',
+`module_type` tinyint NOT NULL COMMENT '模块code',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
+`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+`remark` varchar(50) NULL COMMENT '文件描述',
+PRIMARY KEY (`id`) USING BTREE,
+UNIQUE INDEX `index_name`(`file_name`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '评估文件上传记录表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231205004_face_record.sql b/assess-admin/src/main/resources/db/migration/V20231205004_face_record.sql
new file mode 100644
index 0000000..cf246a4
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231205004_face_record.sql
@@ -0,0 +1,19 @@
+
+-- ----------------------------
+-- 现场勘验人员人脸识别记录表
+-- ----------------------------
+drop table if exists `smart_assess`.`sys_face_record`;
+CREATE TABLE `smart_assess`.`sys_face_record` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`person_id` bigint NOT NULL COMMENT '用户id',
+`file_id` bigint NOT NULL COMMENT '评估文件id(图片id)',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
+`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+`remark` varchar(50) NULL COMMENT '备注',
+PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '现场勘验人员人脸识别记录表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231205005_audit.sql b/assess-admin/src/main/resources/db/migration/V20231205005_audit.sql
new file mode 100644
index 0000000..9c5aba2
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231205005_audit.sql
@@ -0,0 +1,41 @@
+
+-- ----------------------------
+-- 审核表
+-- ----------------------------
+drop table if exists `smart_assess`.`sys_audit`;
+CREATE TABLE `smart_assess`.`sys_audit` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`audit_date` datetime NOT NULL COMMENT '审核日期',
+`affirm_date` datetime NOT NULL COMMENT '内部审核确定日期',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`audit_type` tinyint(2) NOT NULL COMMENT '审核类型(1内部审核2技术审核)',
+`assessor_id` bigint NOT NULL COMMENT '审核人id',
+`is_amend_finish` tinyint(1) NOT NULL DEFAULT 1 COMMENT '已按要求修改完成(0否 1是)',
+`is_basis` tinyint(1) NOT NULL DEFAULT 1 COMMENT '评价依据是否充分、准确、有效(0否 1是)',
+`is_conclusion` tinyint(1) NOT NULL DEFAULT 1 COMMENT '结论是否正确(0否 1是)',
+`is_danger_overall` tinyint(1) NOT NULL DEFAULT 1 COMMENT '危险有害因素识别是否全面(0否 1是)',
+`is_file` tinyint(1) NOT NULL DEFAULT 1 COMMENT '附件与附图是否有效及规范(0否 1是)',
+`is_format` tinyint(1) NOT NULL DEFAULT 1 COMMENT '格式是否符合要求(0否 1是)',
+`is_measure` tinyint(1) NOT NULL DEFAULT 1 COMMENT '对策措施与建议是否可行(0否 1是)',
+`is_method_selection` tinyint(1) NOT NULL DEFAULT 1 COMMENT '评价方法选择是否适当(0否 1是)',
+`is_report_audit` tinyint(1) NOT NULL DEFAULT 1 COMMENT '可报技术负责人审核(0否 1是)',
+`is_scope` tinyint(1) NOT NULL DEFAULT 1 COMMENT '评价范围是否与合同一致(0否 1是)',
+`is_text` tinyint(1) NOT NULL DEFAULT 1 COMMENT '文字、数据是否准确(0否 1是)',
+`is_unit_division` tinyint(1) NOT NULL DEFAULT 1 COMMENT '评价单元划分是否合理(0否 1是)',
+`is_basis_quote` tinyint(1) NOT NULL DEFAULT 1 COMMENT '报告中所列评价依据是否得到引用和验证(0否 1是)',
+`is_conclusion_right` tinyint(1) NOT NULL DEFAULT 1 COMMENT '评价结论及格式是否正确(0否 1是)',
+`is_danger_full` tinyint(1) NOT NULL DEFAULT 1 COMMENT '危险有害因素识别是否充分(0否 1是)',
+`is_data` tinyint(1) NOT NULL DEFAULT 1 COMMENT '现场收集的有关资料是否齐全、有效(0否 1是)',
+`is_omission` tinyint(1) NOT NULL DEFAULT 1 COMMENT '报告中是否有重大遗漏(0否 1是)',
+`is_measure_equitable` tinyint(1) NOT NULL DEFAULT 1 COMMENT '对策措施及建议是否有针对性、合理性(0否 1是)',
+`is_method_rational` tinyint(1) NOT NULL DEFAULT 1 COMMENT '评价方法选用是否合理(0否 1是)',
+`suggestions` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '存在问题及建议(500字符)',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
+`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+`remark` varchar(50) NULL COMMENT '备注',
+PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '审核表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231205006_conclusion.sql b/assess-admin/src/main/resources/db/migration/V20231205006_conclusion.sql
new file mode 100644
index 0000000..96d9010
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231205006_conclusion.sql
@@ -0,0 +1,19 @@
+
+-- ----------------------------
+-- 项目结论表
+-- ----------------------------
+drop table if exists `smart_assess`.`sys_conclusion`;
+CREATE TABLE `smart_assess`.`sys_conclusion` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`conclusion` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '评价结论',
+`is_revise_manual` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否有评价报告修改说明(0否 1是)',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
+`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+`remark` varchar(50) NULL COMMENT '备注',
+PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目结论表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231206001_process_audit.sql b/assess-admin/src/main/resources/db/migration/V20231206001_process_audit.sql
new file mode 100644
index 0000000..f755394
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231206001_process_audit.sql
@@ -0,0 +1,48 @@
+
+-- ----------------------------
+-- 过程控制负责人审核表
+-- ----------------------------
+drop table if exists `smart_assess`.`sys_process_audit`;
+CREATE TABLE `smart_assess`.`sys_process_audit` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`audit_date` datetime NOT NULL COMMENT '审核日期',
+`process_leader_id` bigint NOT NULL COMMENT '过程控制负责人id',
+`suggestions` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '存在问题及建议(500字符)',
+`is_estimate_plan` tinyint(1) NOT NULL DEFAULT 1 COMMENT '编制安全评价项目计划书(0否 1是)',
+`is_estimate_task` tinyint(1) NOT NULL DEFAULT 1 COMMENT '评价任务通知书(0否 1是)',
+`is_sign_contract` tinyint(1) NOT NULL DEFAULT 1 COMMENT '签订合同(0否 1是)',
+`is_exterior_audit` tinyint(1) NOT NULL DEFAULT 1 COMMENT '评价报告外审意见0否 1是)',
+`is_full_materials` tinyint(1) NOT NULL DEFAULT 1 COMMENT '报告归档材料完整性(0否 1是)',
+`is_interior_audit` tinyint(1) NOT NULL DEFAULT 1 COMMENT '评价报告内部审核(0否 1是)',
+`is_investigation_site` tinyint(1) NOT NULL DEFAULT 1 COMMENT '现场勘验记录及影像资料(0否 1是)',
+`is_open_information` tinyint(1) NOT NULL DEFAULT 1 COMMENT '评价项目网上信息公开(0否 1是)',
+`is_provide_materials` tinyint(1) NOT NULL DEFAULT 1 COMMENT '被评价单位提供材料清单(0否 1是)',
+`is_risk_analyse` tinyint(1) NOT NULL DEFAULT 1 COMMENT '风险分析(0否 1是)',
+`is_technolgy_audit` tinyint(1) NOT NULL DEFAULT 1 COMMENT '技术负责人审核(0否 1是)',
+`is_use_qrcode` tinyint(1) NOT NULL DEFAULT 1 COMMENT '二维码的使用(0否 1是)',
+`is_work_notification` tinyint(1) NOT NULL DEFAULT 1 COMMENT '从业告知(0否 1是)',
+`estimate_plan_des` varchar(20) NULL COMMENT '编制安全评价项目计划书-不符合描述(20字符)',
+`estimate_task_des` varchar(20) NULL COMMENT '评价任务通知书-不符合描述(20字符)',
+`sign_contract_des` varchar(20) NULL COMMENT '签订合同-不符合描述(20字符)',
+`exterior_audit_des` varchar(20) NULL COMMENT '评价报告外审意见-不符合描述(20字符)',
+`full_materials_des` varchar(20) NULL COMMENT '报告归档材料完整性-不符合描述(20字符)',
+`interior_audit_des` varchar(20) NULL COMMENT '评价报告内部审核-不符合描述(20字符)',
+`investigation_site_des` varchar(20) NULL COMMENT '现场勘验记录及影像资料-不符合描述(20字符)',
+`open_information_des` varchar(20) NULL COMMENT '评价项目网上信息公开-不符合描述(20字符)',
+`provide_materials_des` varchar(20) NULL COMMENT '被评价单位提供材料清单-不符合描述(20字符)',
+`risk_analyse_des` varchar(20) NULL COMMENT '风险分析-不符合描述(20字符)',
+`technolgy_audit_des` varchar(20) NULL COMMENT '技术负责人审核-不符合描述(20字符)',
+`use_qrcode_des` varchar(20) NULL COMMENT '二维码的使用-不符合描述(20字符)',
+`work_notification_des` varchar(20) NULL COMMENT '从业告知-不符合描述(20字符)',
+
+`is_full_process` tinyint(1) NOT NULL DEFAULT 1 COMMENT '审核结论是否满足过程控制要求(0否 1是)',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
+`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+`remark` varchar(50) NULL COMMENT '备注',
+PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '过程控制负责人审核表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/db/migration/V20231206002_project_material.sql b/assess-admin/src/main/resources/db/migration/V20231206002_project_material.sql
new file mode 100644
index 0000000..7dff537
--- /dev/null
+++ b/assess-admin/src/main/resources/db/migration/V20231206002_project_material.sql
@@ -0,0 +1,20 @@
+
+-- ----------------------------
+-- 项目归档文件表
+-- ----------------------------
+drop table if exists `smart_assess`.`sys_project_material`;
+CREATE TABLE `smart_assess`.`sys_project_material` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`name` varchar(50) NOT NULL COMMENT '名称',
+`type` tinyint NOT NULL COMMENT '类型',
+`project_id` bigint NOT NULL COMMENT '项目id',
+`file_id` bigint NULL COMMENT '评估文件id',
+`version` int NULL DEFAULT 0 COMMENT '乐观锁',
+`del_flag` tinyint NULL DEFAULT 0 COMMENT '删除标志(0正常,1删除,默认0)',
+`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '创建人',
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '更新人',
+`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+`remark` varchar(50) NULL COMMENT '原因说明',
+PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '项目归档文件表' ROW_FORMAT = DYNAMIC;
\ No newline at end of file
diff --git a/assess-admin/src/main/resources/region.json b/assess-admin/src/main/resources/region.json
new file mode 100644
index 0000000..39b3229
--- /dev/null
+++ b/assess-admin/src/main/resources/region.json
@@ -0,0 +1,8528 @@
+[
+ {
+ "province": "北京市",
+ "citys": [
+ {
+ "city": "北京市",
+ "areas": [
+ {
+ "area": "北京市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "天津市",
+ "citys": [
+ {
+ "city": "天津市",
+ "areas": [
+ {
+ "area": "天津市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "河北省",
+ "citys": [
+ {
+ "city": "石家庄市",
+ "areas": [
+ {
+ "area": "井陉县"
+ },
+ {
+ "area": "正定县"
+ },
+ {
+ "area": "行唐县"
+ },
+ {
+ "area": "灵寿县"
+ },
+ {
+ "area": "高邑县"
+ },
+ {
+ "area": "深泽县"
+ },
+ {
+ "area": "赞皇县"
+ },
+ {
+ "area": "无极县"
+ },
+ {
+ "area": "平山县"
+ },
+ {
+ "area": "元氏县"
+ },
+ {
+ "area": "赵县"
+ },
+ {
+ "area": "辛集市"
+ },
+ {
+ "area": "晋州市"
+ },
+ {
+ "area": "新乐市"
+ },
+ {
+ "area": "石家庄市"
+ }
+ ]
+ },
+ {
+ "city": "唐山市",
+ "areas": [
+ {
+ "area": "滦南县"
+ },
+ {
+ "area": "乐亭县"
+ },
+ {
+ "area": "迁西县"
+ },
+ {
+ "area": "玉田县"
+ },
+ {
+ "area": "遵化市"
+ },
+ {
+ "area": "迁安市"
+ },
+ {
+ "area": "滦州市"
+ },
+ {
+ "area": "唐山市"
+ }
+ ]
+ },
+ {
+ "city": "秦皇岛市",
+ "areas": [
+ {
+ "area": "青龙满族自治县"
+ },
+ {
+ "area": "昌黎县"
+ },
+ {
+ "area": "卢龙县"
+ },
+ {
+ "area": "秦皇岛市"
+ }
+ ]
+ },
+ {
+ "city": "邯郸市",
+ "areas": [
+ {
+ "area": "临漳县"
+ },
+ {
+ "area": "成安县"
+ },
+ {
+ "area": "大名县"
+ },
+ {
+ "area": "涉县"
+ },
+ {
+ "area": "磁县"
+ },
+ {
+ "area": "邱县"
+ },
+ {
+ "area": "鸡泽县"
+ },
+ {
+ "area": "广平县"
+ },
+ {
+ "area": "馆陶县"
+ },
+ {
+ "area": "魏县"
+ },
+ {
+ "area": "曲周县"
+ },
+ {
+ "area": "武安市"
+ },
+ {
+ "area": "邯郸市"
+ }
+ ]
+ },
+ {
+ "city": "邢台市",
+ "areas": [
+ {
+ "area": "临城县"
+ },
+ {
+ "area": "内丘县"
+ },
+ {
+ "area": "柏乡县"
+ },
+ {
+ "area": "隆尧县"
+ },
+ {
+ "area": "宁晋县"
+ },
+ {
+ "area": "巨鹿县"
+ },
+ {
+ "area": "新河县"
+ },
+ {
+ "area": "广宗县"
+ },
+ {
+ "area": "平乡县"
+ },
+ {
+ "area": "威县"
+ },
+ {
+ "area": "清河县"
+ },
+ {
+ "area": "临西县"
+ },
+ {
+ "area": "南宫市"
+ },
+ {
+ "area": "沙河市"
+ },
+ {
+ "area": "邢台市"
+ }
+ ]
+ },
+ {
+ "city": "保定市",
+ "areas": [
+ {
+ "area": "涞水县"
+ },
+ {
+ "area": "阜平县"
+ },
+ {
+ "area": "定兴县"
+ },
+ {
+ "area": "唐县"
+ },
+ {
+ "area": "高阳县"
+ },
+ {
+ "area": "容城县"
+ },
+ {
+ "area": "涞源县"
+ },
+ {
+ "area": "望都县"
+ },
+ {
+ "area": "安新县"
+ },
+ {
+ "area": "易县"
+ },
+ {
+ "area": "曲阳县"
+ },
+ {
+ "area": "蠡县"
+ },
+ {
+ "area": "顺平县"
+ },
+ {
+ "area": "博野县"
+ },
+ {
+ "area": "雄县"
+ },
+ {
+ "area": "涿州市"
+ },
+ {
+ "area": "定州市"
+ },
+ {
+ "area": "安国市"
+ },
+ {
+ "area": "高碑店市"
+ },
+ {
+ "area": "保定市"
+ }
+ ]
+ },
+ {
+ "city": "张家口市",
+ "areas": [
+ {
+ "area": "张北县"
+ },
+ {
+ "area": "康保县"
+ },
+ {
+ "area": "沽源县"
+ },
+ {
+ "area": "尚义县"
+ },
+ {
+ "area": "蔚县"
+ },
+ {
+ "area": "阳原县"
+ },
+ {
+ "area": "怀安县"
+ },
+ {
+ "area": "怀来县"
+ },
+ {
+ "area": "涿鹿县"
+ },
+ {
+ "area": "赤城县"
+ },
+ {
+ "area": "张家口市"
+ }
+ ]
+ },
+ {
+ "city": "承德市",
+ "areas": [
+ {
+ "area": "承德县"
+ },
+ {
+ "area": "兴隆县"
+ },
+ {
+ "area": "滦平县"
+ },
+ {
+ "area": "隆化县"
+ },
+ {
+ "area": "丰宁满族自治县"
+ },
+ {
+ "area": "宽城满族自治县"
+ },
+ {
+ "area": "围场满族蒙古族自治县"
+ },
+ {
+ "area": "平泉市"
+ },
+ {
+ "area": "承德市"
+ }
+ ]
+ },
+ {
+ "city": "沧州市",
+ "areas": [
+ {
+ "area": "沧县"
+ },
+ {
+ "area": "青县"
+ },
+ {
+ "area": "东光县"
+ },
+ {
+ "area": "海兴县"
+ },
+ {
+ "area": "盐山县"
+ },
+ {
+ "area": "肃宁县"
+ },
+ {
+ "area": "南皮县"
+ },
+ {
+ "area": "吴桥县"
+ },
+ {
+ "area": "献县"
+ },
+ {
+ "area": "孟村回族自治县"
+ },
+ {
+ "area": "泊头市"
+ },
+ {
+ "area": "任丘市"
+ },
+ {
+ "area": "黄骅市"
+ },
+ {
+ "area": "河间市"
+ },
+ {
+ "area": "沧州市"
+ }
+ ]
+ },
+ {
+ "city": "廊坊市",
+ "areas": [
+ {
+ "area": "固安县"
+ },
+ {
+ "area": "永清县"
+ },
+ {
+ "area": "香河县"
+ },
+ {
+ "area": "大城县"
+ },
+ {
+ "area": "文安县"
+ },
+ {
+ "area": "大厂回族自治县"
+ },
+ {
+ "area": "霸州市"
+ },
+ {
+ "area": "三河市"
+ },
+ {
+ "area": "廊坊市"
+ }
+ ]
+ },
+ {
+ "city": "衡水市",
+ "areas": [
+ {
+ "area": "枣强县"
+ },
+ {
+ "area": "武邑县"
+ },
+ {
+ "area": "武强县"
+ },
+ {
+ "area": "饶阳县"
+ },
+ {
+ "area": "安平县"
+ },
+ {
+ "area": "故城县"
+ },
+ {
+ "area": "景县"
+ },
+ {
+ "area": "阜城县"
+ },
+ {
+ "area": "深州市"
+ },
+ {
+ "area": "衡水市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "山西省",
+ "citys": [
+ {
+ "city": "太原市",
+ "areas": [
+ {
+ "area": "清徐县"
+ },
+ {
+ "area": "阳曲县"
+ },
+ {
+ "area": "娄烦县"
+ },
+ {
+ "area": "古交市"
+ },
+ {
+ "area": "太原市"
+ }
+ ]
+ },
+ {
+ "city": "大同市",
+ "areas": [
+ {
+ "area": "阳高县"
+ },
+ {
+ "area": "天镇县"
+ },
+ {
+ "area": "广灵县"
+ },
+ {
+ "area": "灵丘县"
+ },
+ {
+ "area": "浑源县"
+ },
+ {
+ "area": "左云县"
+ },
+ {
+ "area": "大同市"
+ }
+ ]
+ },
+ {
+ "city": "阳泉市",
+ "areas": [
+ {
+ "area": "平定县"
+ },
+ {
+ "area": "盂县"
+ },
+ {
+ "area": "阳泉市"
+ }
+ ]
+ },
+ {
+ "city": "长治市",
+ "areas": [
+ {
+ "area": "襄垣县"
+ },
+ {
+ "area": "平顺县"
+ },
+ {
+ "area": "黎城县"
+ },
+ {
+ "area": "壶关县"
+ },
+ {
+ "area": "长子县"
+ },
+ {
+ "area": "武乡县"
+ },
+ {
+ "area": "沁县"
+ },
+ {
+ "area": "沁源县"
+ },
+ {
+ "area": "长治市"
+ }
+ ]
+ },
+ {
+ "city": "晋城市",
+ "areas": [
+ {
+ "area": "沁水县"
+ },
+ {
+ "area": "阳城县"
+ },
+ {
+ "area": "陵川县"
+ },
+ {
+ "area": "泽州县"
+ },
+ {
+ "area": "高平市"
+ },
+ {
+ "area": "晋城市"
+ }
+ ]
+ },
+ {
+ "city": "朔州市",
+ "areas": [
+ {
+ "area": "山阴县"
+ },
+ {
+ "area": "应县"
+ },
+ {
+ "area": "右玉县"
+ },
+ {
+ "area": "怀仁市"
+ },
+ {
+ "area": "朔州市"
+ }
+ ]
+ },
+ {
+ "city": "晋中市",
+ "areas": [
+ {
+ "area": "榆社县"
+ },
+ {
+ "area": "左权县"
+ },
+ {
+ "area": "和顺县"
+ },
+ {
+ "area": "昔阳县"
+ },
+ {
+ "area": "寿阳县"
+ },
+ {
+ "area": "祁县"
+ },
+ {
+ "area": "平遥县"
+ },
+ {
+ "area": "灵石县"
+ },
+ {
+ "area": "介休市"
+ },
+ {
+ "area": "晋中市"
+ }
+ ]
+ },
+ {
+ "city": "运城市",
+ "areas": [
+ {
+ "area": "临猗县"
+ },
+ {
+ "area": "万荣县"
+ },
+ {
+ "area": "闻喜县"
+ },
+ {
+ "area": "稷山县"
+ },
+ {
+ "area": "新绛县"
+ },
+ {
+ "area": "绛县"
+ },
+ {
+ "area": "垣曲县"
+ },
+ {
+ "area": "夏县"
+ },
+ {
+ "area": "平陆县"
+ },
+ {
+ "area": "芮城县"
+ },
+ {
+ "area": "永济市"
+ },
+ {
+ "area": "河津市"
+ },
+ {
+ "area": "运城市"
+ }
+ ]
+ },
+ {
+ "city": "忻州市",
+ "areas": [
+ {
+ "area": "定襄县"
+ },
+ {
+ "area": "五台县"
+ },
+ {
+ "area": "代县"
+ },
+ {
+ "area": "繁峙县"
+ },
+ {
+ "area": "宁武县"
+ },
+ {
+ "area": "静乐县"
+ },
+ {
+ "area": "神池县"
+ },
+ {
+ "area": "五寨县"
+ },
+ {
+ "area": "岢岚县"
+ },
+ {
+ "area": "河曲县"
+ },
+ {
+ "area": "保德县"
+ },
+ {
+ "area": "偏关县"
+ },
+ {
+ "area": "原平市"
+ },
+ {
+ "area": "忻州市"
+ }
+ ]
+ },
+ {
+ "city": "临汾市",
+ "areas": [
+ {
+ "area": "曲沃县"
+ },
+ {
+ "area": "翼城县"
+ },
+ {
+ "area": "襄汾县"
+ },
+ {
+ "area": "洪洞县"
+ },
+ {
+ "area": "古县"
+ },
+ {
+ "area": "安泽县"
+ },
+ {
+ "area": "浮山县"
+ },
+ {
+ "area": "吉县"
+ },
+ {
+ "area": "乡宁县"
+ },
+ {
+ "area": "大宁县"
+ },
+ {
+ "area": "隰县"
+ },
+ {
+ "area": "永和县"
+ },
+ {
+ "area": "蒲县"
+ },
+ {
+ "area": "汾西县"
+ },
+ {
+ "area": "侯马市"
+ },
+ {
+ "area": "霍州市"
+ },
+ {
+ "area": "临汾市"
+ }
+ ]
+ },
+ {
+ "city": "吕梁市",
+ "areas": [
+ {
+ "area": "文水县"
+ },
+ {
+ "area": "交城县"
+ },
+ {
+ "area": "兴县"
+ },
+ {
+ "area": "临县"
+ },
+ {
+ "area": "柳林县"
+ },
+ {
+ "area": "石楼县"
+ },
+ {
+ "area": "岚县"
+ },
+ {
+ "area": "方山县"
+ },
+ {
+ "area": "中阳县"
+ },
+ {
+ "area": "交口县"
+ },
+ {
+ "area": "孝义市"
+ },
+ {
+ "area": "汾阳市"
+ },
+ {
+ "area": "吕梁市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "内蒙古自治区",
+ "citys": [
+ {
+ "city": "呼和浩特市",
+ "areas": [
+ {
+ "area": "土默特左旗"
+ },
+ {
+ "area": "托克托县"
+ },
+ {
+ "area": "和林格尔县"
+ },
+ {
+ "area": "清水河县"
+ },
+ {
+ "area": "武川县"
+ },
+ {
+ "area": "呼和浩特市"
+ }
+ ]
+ },
+ {
+ "city": "包头市",
+ "areas": [
+ {
+ "area": "土默特右旗"
+ },
+ {
+ "area": "固阳县"
+ },
+ {
+ "area": "达尔罕茂明安联合旗"
+ },
+ {
+ "area": "包头市"
+ }
+ ]
+ },
+ {
+ "city": "乌海市",
+ "areas": [
+ {
+ "area": "乌海市"
+ }
+ ]
+ },
+ {
+ "city": "赤峰市",
+ "areas": [
+ {
+ "area": "阿鲁科尔沁旗"
+ },
+ {
+ "area": "巴林左旗"
+ },
+ {
+ "area": "巴林右旗"
+ },
+ {
+ "area": "林西县"
+ },
+ {
+ "area": "克什克腾旗"
+ },
+ {
+ "area": "翁牛特旗"
+ },
+ {
+ "area": "喀喇沁旗"
+ },
+ {
+ "area": "宁城县"
+ },
+ {
+ "area": "敖汉旗"
+ },
+ {
+ "area": "赤峰市"
+ }
+ ]
+ },
+ {
+ "city": "通辽市",
+ "areas": [
+ {
+ "area": "科尔沁左翼中旗"
+ },
+ {
+ "area": "科尔沁左翼后旗"
+ },
+ {
+ "area": "开鲁县"
+ },
+ {
+ "area": "库伦旗"
+ },
+ {
+ "area": "奈曼旗"
+ },
+ {
+ "area": "扎鲁特旗"
+ },
+ {
+ "area": "霍林郭勒市"
+ },
+ {
+ "area": "通辽市"
+ }
+ ]
+ },
+ {
+ "city": "鄂尔多斯市",
+ "areas": [
+ {
+ "area": "达拉特旗"
+ },
+ {
+ "area": "准格尔旗"
+ },
+ {
+ "area": "鄂托克前旗"
+ },
+ {
+ "area": "鄂托克旗"
+ },
+ {
+ "area": "杭锦旗"
+ },
+ {
+ "area": "乌审旗"
+ },
+ {
+ "area": "伊金霍洛旗"
+ },
+ {
+ "area": "鄂尔多斯市"
+ }
+ ]
+ },
+ {
+ "city": "呼伦贝尔市",
+ "areas": [
+ {
+ "area": "阿荣旗"
+ },
+ {
+ "area": "莫力达瓦达斡尔族自治旗"
+ },
+ {
+ "area": "鄂伦春自治旗"
+ },
+ {
+ "area": "鄂温克族自治旗"
+ },
+ {
+ "area": "陈巴尔虎旗"
+ },
+ {
+ "area": "新巴尔虎左旗"
+ },
+ {
+ "area": "新巴尔虎右旗"
+ },
+ {
+ "area": "满洲里市"
+ },
+ {
+ "area": "牙克石市"
+ },
+ {
+ "area": "扎兰屯市"
+ },
+ {
+ "area": "额尔古纳市"
+ },
+ {
+ "area": "根河市"
+ },
+ {
+ "area": "呼伦贝尔市"
+ }
+ ]
+ },
+ {
+ "city": "巴彦淖尔市",
+ "areas": [
+ {
+ "area": "五原县"
+ },
+ {
+ "area": "磴口县"
+ },
+ {
+ "area": "乌拉特前旗"
+ },
+ {
+ "area": "乌拉特中旗"
+ },
+ {
+ "area": "乌拉特后旗"
+ },
+ {
+ "area": "杭锦后旗"
+ },
+ {
+ "area": "巴彦淖尔市"
+ }
+ ]
+ },
+ {
+ "city": "乌兰察布市",
+ "areas": [
+ {
+ "area": "卓资县"
+ },
+ {
+ "area": "化德县"
+ },
+ {
+ "area": "商都县"
+ },
+ {
+ "area": "兴和县"
+ },
+ {
+ "area": "凉城县"
+ },
+ {
+ "area": "察哈尔右翼前旗"
+ },
+ {
+ "area": "察哈尔右翼中旗"
+ },
+ {
+ "area": "察哈尔右翼后旗"
+ },
+ {
+ "area": "四子王旗"
+ },
+ {
+ "area": "丰镇市"
+ },
+ {
+ "area": "乌兰察布市"
+ }
+ ]
+ },
+ {
+ "city": "兴安盟",
+ "areas": [
+ {
+ "area": "乌兰浩特市"
+ },
+ {
+ "area": "阿尔山市"
+ },
+ {
+ "area": "科尔沁右翼前旗"
+ },
+ {
+ "area": "科尔沁右翼中旗"
+ },
+ {
+ "area": "扎赉特旗"
+ },
+ {
+ "area": "突泉县"
+ }
+ ]
+ },
+ {
+ "city": "锡林郭勒盟",
+ "areas": [
+ {
+ "area": "二连浩特市"
+ },
+ {
+ "area": "锡林浩特市"
+ },
+ {
+ "area": "阿巴嘎旗"
+ },
+ {
+ "area": "苏尼特左旗"
+ },
+ {
+ "area": "苏尼特右旗"
+ },
+ {
+ "area": "东乌珠穆沁旗"
+ },
+ {
+ "area": "西乌珠穆沁旗"
+ },
+ {
+ "area": "太仆寺旗"
+ },
+ {
+ "area": "镶黄旗"
+ },
+ {
+ "area": "正镶白旗"
+ },
+ {
+ "area": "正蓝旗"
+ },
+ {
+ "area": "多伦县"
+ }
+ ]
+ },
+ {
+ "city": "阿拉善盟",
+ "areas": [
+ {
+ "area": "阿拉善左旗"
+ },
+ {
+ "area": "阿拉善右旗"
+ },
+ {
+ "area": "额济纳旗"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "辽宁省",
+ "citys": [
+ {
+ "city": "沈阳市",
+ "areas": [
+ {
+ "area": "康平县"
+ },
+ {
+ "area": "法库县"
+ },
+ {
+ "area": "新民市"
+ },
+ {
+ "area": "沈阳市"
+ }
+ ]
+ },
+ {
+ "city": "大连市",
+ "areas": [
+ {
+ "area": "长海县"
+ },
+ {
+ "area": "瓦房店市"
+ },
+ {
+ "area": "庄河市"
+ },
+ {
+ "area": "大连市"
+ }
+ ]
+ },
+ {
+ "city": "鞍山市",
+ "areas": [
+ {
+ "area": "台安县"
+ },
+ {
+ "area": "岫岩满族自治县"
+ },
+ {
+ "area": "海城市"
+ },
+ {
+ "area": "鞍山市"
+ }
+ ]
+ },
+ {
+ "city": "抚顺市",
+ "areas": [
+ {
+ "area": "抚顺县"
+ },
+ {
+ "area": "新宾满族自治县"
+ },
+ {
+ "area": "清原满族自治县"
+ },
+ {
+ "area": "抚顺市"
+ }
+ ]
+ },
+ {
+ "city": "本溪市",
+ "areas": [
+ {
+ "area": "本溪满族自治县"
+ },
+ {
+ "area": "桓仁满族自治县"
+ },
+ {
+ "area": "本溪市"
+ }
+ ]
+ },
+ {
+ "city": "丹东市",
+ "areas": [
+ {
+ "area": "宽甸满族自治县"
+ },
+ {
+ "area": "东港市"
+ },
+ {
+ "area": "凤城市"
+ },
+ {
+ "area": "丹东市"
+ }
+ ]
+ },
+ {
+ "city": "锦州市",
+ "areas": [
+ {
+ "area": "黑山县"
+ },
+ {
+ "area": "义县"
+ },
+ {
+ "area": "凌海市"
+ },
+ {
+ "area": "北镇市"
+ },
+ {
+ "area": "锦州市"
+ }
+ ]
+ },
+ {
+ "city": "营口市",
+ "areas": [
+ {
+ "area": "盖州市"
+ },
+ {
+ "area": "大石桥市"
+ },
+ {
+ "area": "营口市"
+ }
+ ]
+ },
+ {
+ "city": "阜新市",
+ "areas": [
+ {
+ "area": "阜新蒙古族自治县"
+ },
+ {
+ "area": "彰武县"
+ },
+ {
+ "area": "阜新市"
+ }
+ ]
+ },
+ {
+ "city": "辽阳市",
+ "areas": [
+ {
+ "area": "辽阳县"
+ },
+ {
+ "area": "灯塔市"
+ },
+ {
+ "area": "辽阳市"
+ }
+ ]
+ },
+ {
+ "city": "盘锦市",
+ "areas": [
+ {
+ "area": "盘山县"
+ },
+ {
+ "area": "盘锦市"
+ }
+ ]
+ },
+ {
+ "city": "铁岭市",
+ "areas": [
+ {
+ "area": "铁岭县"
+ },
+ {
+ "area": "西丰县"
+ },
+ {
+ "area": "昌图县"
+ },
+ {
+ "area": "调兵山市"
+ },
+ {
+ "area": "开原市"
+ },
+ {
+ "area": "铁岭市"
+ }
+ ]
+ },
+ {
+ "city": "朝阳市",
+ "areas": [
+ {
+ "area": "朝阳县"
+ },
+ {
+ "area": "建平县"
+ },
+ {
+ "area": "喀喇沁左翼蒙古族自治县"
+ },
+ {
+ "area": "北票市"
+ },
+ {
+ "area": "凌源市"
+ },
+ {
+ "area": "朝阳市"
+ }
+ ]
+ },
+ {
+ "city": "葫芦岛市",
+ "areas": [
+ {
+ "area": "绥中县"
+ },
+ {
+ "area": "建昌县"
+ },
+ {
+ "area": "兴城市"
+ },
+ {
+ "area": "葫芦岛市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "吉林省",
+ "citys": [
+ {
+ "city": "长春市",
+ "areas": [
+ {
+ "area": "农安县"
+ },
+ {
+ "area": "榆树市"
+ },
+ {
+ "area": "德惠市"
+ },
+ {
+ "area": "公主岭市"
+ },
+ {
+ "area": "长春市"
+ }
+ ]
+ },
+ {
+ "city": "吉林市",
+ "areas": [
+ {
+ "area": "永吉县"
+ },
+ {
+ "area": "蛟河市"
+ },
+ {
+ "area": "桦甸市"
+ },
+ {
+ "area": "舒兰市"
+ },
+ {
+ "area": "磐石市"
+ },
+ {
+ "area": "吉林市"
+ }
+ ]
+ },
+ {
+ "city": "四平市",
+ "areas": [
+ {
+ "area": "梨树县"
+ },
+ {
+ "area": "伊通满族自治县"
+ },
+ {
+ "area": "双辽市"
+ },
+ {
+ "area": "四平市"
+ }
+ ]
+ },
+ {
+ "city": "辽源市",
+ "areas": [
+ {
+ "area": "东丰县"
+ },
+ {
+ "area": "东辽县"
+ },
+ {
+ "area": "辽源市"
+ }
+ ]
+ },
+ {
+ "city": "通化市",
+ "areas": [
+ {
+ "area": "通化县"
+ },
+ {
+ "area": "辉南县"
+ },
+ {
+ "area": "柳河县"
+ },
+ {
+ "area": "梅河口市"
+ },
+ {
+ "area": "集安市"
+ },
+ {
+ "area": "通化市"
+ }
+ ]
+ },
+ {
+ "city": "白山市",
+ "areas": [
+ {
+ "area": "抚松县"
+ },
+ {
+ "area": "靖宇县"
+ },
+ {
+ "area": "长白朝鲜族自治县"
+ },
+ {
+ "area": "临江市"
+ },
+ {
+ "area": "白山市"
+ }
+ ]
+ },
+ {
+ "city": "松原市",
+ "areas": [
+ {
+ "area": "前郭尔罗斯蒙古族自治县"
+ },
+ {
+ "area": "长岭县"
+ },
+ {
+ "area": "乾安县"
+ },
+ {
+ "area": "扶余市"
+ },
+ {
+ "area": "松原市"
+ }
+ ]
+ },
+ {
+ "city": "白城市",
+ "areas": [
+ {
+ "area": "镇赉县"
+ },
+ {
+ "area": "通榆县"
+ },
+ {
+ "area": "洮南市"
+ },
+ {
+ "area": "大安市"
+ },
+ {
+ "area": "白城市"
+ }
+ ]
+ },
+ {
+ "city": "延边朝鲜族自治州",
+ "areas": [
+ {
+ "area": "延吉市"
+ },
+ {
+ "area": "图们市"
+ },
+ {
+ "area": "敦化市"
+ },
+ {
+ "area": "珲春市"
+ },
+ {
+ "area": "龙井市"
+ },
+ {
+ "area": "和龙市"
+ },
+ {
+ "area": "汪清县"
+ },
+ {
+ "area": "安图县"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "黑龙江省",
+ "citys": [
+ {
+ "city": "哈尔滨市",
+ "areas": [
+ {
+ "area": "依兰县"
+ },
+ {
+ "area": "方正县"
+ },
+ {
+ "area": "宾县"
+ },
+ {
+ "area": "巴彦县"
+ },
+ {
+ "area": "木兰县"
+ },
+ {
+ "area": "通河县"
+ },
+ {
+ "area": "延寿县"
+ },
+ {
+ "area": "尚志市"
+ },
+ {
+ "area": "五常市"
+ },
+ {
+ "area": "哈尔滨市"
+ }
+ ]
+ },
+ {
+ "city": "齐齐哈尔市",
+ "areas": [
+ {
+ "area": "龙江县"
+ },
+ {
+ "area": "依安县"
+ },
+ {
+ "area": "泰来县"
+ },
+ {
+ "area": "甘南县"
+ },
+ {
+ "area": "富裕县"
+ },
+ {
+ "area": "克山县"
+ },
+ {
+ "area": "克东县"
+ },
+ {
+ "area": "拜泉县"
+ },
+ {
+ "area": "讷河市"
+ },
+ {
+ "area": "齐齐哈尔市"
+ }
+ ]
+ },
+ {
+ "city": "鸡西市",
+ "areas": [
+ {
+ "area": "鸡东县"
+ },
+ {
+ "area": "虎林市"
+ },
+ {
+ "area": "密山市"
+ },
+ {
+ "area": "鸡西市"
+ }
+ ]
+ },
+ {
+ "city": "鹤岗市",
+ "areas": [
+ {
+ "area": "萝北县"
+ },
+ {
+ "area": "绥滨县"
+ },
+ {
+ "area": "鹤岗市"
+ }
+ ]
+ },
+ {
+ "city": "双鸭山市",
+ "areas": [
+ {
+ "area": "集贤县"
+ },
+ {
+ "area": "友谊县"
+ },
+ {
+ "area": "宝清县"
+ },
+ {
+ "area": "饶河县"
+ },
+ {
+ "area": "双鸭山市"
+ }
+ ]
+ },
+ {
+ "city": "大庆市",
+ "areas": [
+ {
+ "area": "肇州县"
+ },
+ {
+ "area": "肇源县"
+ },
+ {
+ "area": "林甸县"
+ },
+ {
+ "area": "杜尔伯特蒙古族自治县"
+ },
+ {
+ "area": "大庆市"
+ }
+ ]
+ },
+ {
+ "city": "伊春市",
+ "areas": [
+ {
+ "area": "嘉荫县"
+ },
+ {
+ "area": "汤旺县"
+ },
+ {
+ "area": "丰林县"
+ },
+ {
+ "area": "大箐山县"
+ },
+ {
+ "area": "南岔县"
+ },
+ {
+ "area": "铁力市"
+ },
+ {
+ "area": "伊春市"
+ }
+ ]
+ },
+ {
+ "city": "佳木斯市",
+ "areas": [
+ {
+ "area": "桦南县"
+ },
+ {
+ "area": "桦川县"
+ },
+ {
+ "area": "汤原县"
+ },
+ {
+ "area": "同江市"
+ },
+ {
+ "area": "富锦市"
+ },
+ {
+ "area": "抚远市"
+ },
+ {
+ "area": "佳木斯市"
+ }
+ ]
+ },
+ {
+ "city": "七台河市",
+ "areas": [
+ {
+ "area": "勃利县"
+ },
+ {
+ "area": "七台河市"
+ }
+ ]
+ },
+ {
+ "city": "牡丹江市",
+ "areas": [
+ {
+ "area": "林口县"
+ },
+ {
+ "area": "绥芬河市"
+ },
+ {
+ "area": "海林市"
+ },
+ {
+ "area": "宁安市"
+ },
+ {
+ "area": "穆棱市"
+ },
+ {
+ "area": "东宁市"
+ },
+ {
+ "area": "牡丹江市"
+ }
+ ]
+ },
+ {
+ "city": "黑河市",
+ "areas": [
+ {
+ "area": "逊克县"
+ },
+ {
+ "area": "孙吴县"
+ },
+ {
+ "area": "北安市"
+ },
+ {
+ "area": "五大连池市"
+ },
+ {
+ "area": "嫩江市"
+ },
+ {
+ "area": "黑河市"
+ }
+ ]
+ },
+ {
+ "city": "绥化市",
+ "areas": [
+ {
+ "area": "望奎县"
+ },
+ {
+ "area": "兰西县"
+ },
+ {
+ "area": "青冈县"
+ },
+ {
+ "area": "庆安县"
+ },
+ {
+ "area": "明水县"
+ },
+ {
+ "area": "绥棱县"
+ },
+ {
+ "area": "安达市"
+ },
+ {
+ "area": "肇东市"
+ },
+ {
+ "area": "海伦市"
+ },
+ {
+ "area": "绥化市"
+ }
+ ]
+ },
+ {
+ "city": "大兴安岭地区",
+ "areas": [
+ {
+ "area": "漠河市"
+ },
+ {
+ "area": "呼玛县"
+ },
+ {
+ "area": "塔河县"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "上海市",
+ "citys": [
+ {
+ "city": "上海市",
+ "areas": [
+ {
+ "area": "上海市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "江苏省",
+ "citys": [
+ {
+ "city": "南京市",
+ "areas": [
+ {
+ "area": "南京市"
+ }
+ ]
+ },
+ {
+ "city": "无锡市",
+ "areas": [
+ {
+ "area": "江阴市"
+ },
+ {
+ "area": "宜兴市"
+ },
+ {
+ "area": "无锡市"
+ }
+ ]
+ },
+ {
+ "city": "徐州市",
+ "areas": [
+ {
+ "area": "丰县"
+ },
+ {
+ "area": "沛县"
+ },
+ {
+ "area": "睢宁县"
+ },
+ {
+ "area": "新沂市"
+ },
+ {
+ "area": "邳州市"
+ },
+ {
+ "area": "徐州市"
+ }
+ ]
+ },
+ {
+ "city": "常州市",
+ "areas": [
+ {
+ "area": "溧阳市"
+ },
+ {
+ "area": "常州市"
+ }
+ ]
+ },
+ {
+ "city": "苏州市",
+ "areas": [
+ {
+ "area": "常熟市"
+ },
+ {
+ "area": "张家港市"
+ },
+ {
+ "area": "昆山市"
+ },
+ {
+ "area": "太仓市"
+ },
+ {
+ "area": "苏州市"
+ }
+ ]
+ },
+ {
+ "city": "南通市",
+ "areas": [
+ {
+ "area": "如东县"
+ },
+ {
+ "area": "启东市"
+ },
+ {
+ "area": "如皋市"
+ },
+ {
+ "area": "海安市"
+ },
+ {
+ "area": "南通市"
+ }
+ ]
+ },
+ {
+ "city": "连云港市",
+ "areas": [
+ {
+ "area": "东海县"
+ },
+ {
+ "area": "灌云县"
+ },
+ {
+ "area": "灌南县"
+ },
+ {
+ "area": "连云港市"
+ }
+ ]
+ },
+ {
+ "city": "淮安市",
+ "areas": [
+ {
+ "area": "涟水县"
+ },
+ {
+ "area": "盱眙县"
+ },
+ {
+ "area": "金湖县"
+ },
+ {
+ "area": "淮安市"
+ }
+ ]
+ },
+ {
+ "city": "盐城市",
+ "areas": [
+ {
+ "area": "响水县"
+ },
+ {
+ "area": "滨海县"
+ },
+ {
+ "area": "阜宁县"
+ },
+ {
+ "area": "射阳县"
+ },
+ {
+ "area": "建湖县"
+ },
+ {
+ "area": "东台市"
+ },
+ {
+ "area": "盐城市"
+ }
+ ]
+ },
+ {
+ "city": "扬州市",
+ "areas": [
+ {
+ "area": "宝应县"
+ },
+ {
+ "area": "仪征市"
+ },
+ {
+ "area": "高邮市"
+ },
+ {
+ "area": "扬州市"
+ }
+ ]
+ },
+ {
+ "city": "镇江市",
+ "areas": [
+ {
+ "area": "丹阳市"
+ },
+ {
+ "area": "扬中市"
+ },
+ {
+ "area": "句容市"
+ },
+ {
+ "area": "镇江市"
+ }
+ ]
+ },
+ {
+ "city": "泰州市",
+ "areas": [
+ {
+ "area": "兴化市"
+ },
+ {
+ "area": "靖江市"
+ },
+ {
+ "area": "泰兴市"
+ },
+ {
+ "area": "泰州市"
+ }
+ ]
+ },
+ {
+ "city": "宿迁市",
+ "areas": [
+ {
+ "area": "沭阳县"
+ },
+ {
+ "area": "泗阳县"
+ },
+ {
+ "area": "泗洪县"
+ },
+ {
+ "area": "宿迁市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "浙江省",
+ "citys": [
+ {
+ "city": "杭州市",
+ "areas": [
+ {
+ "area": "桐庐县"
+ },
+ {
+ "area": "淳安县"
+ },
+ {
+ "area": "建德市"
+ },
+ {
+ "area": "杭州市"
+ }
+ ]
+ },
+ {
+ "city": "宁波市",
+ "areas": [
+ {
+ "area": "象山县"
+ },
+ {
+ "area": "宁海县"
+ },
+ {
+ "area": "余姚市"
+ },
+ {
+ "area": "慈溪市"
+ },
+ {
+ "area": "宁波市"
+ }
+ ]
+ },
+ {
+ "city": "温州市",
+ "areas": [
+ {
+ "area": "永嘉县"
+ },
+ {
+ "area": "平阳县"
+ },
+ {
+ "area": "苍南县"
+ },
+ {
+ "area": "文成县"
+ },
+ {
+ "area": "泰顺县"
+ },
+ {
+ "area": "瑞安市"
+ },
+ {
+ "area": "乐清市"
+ },
+ {
+ "area": "龙港市"
+ },
+ {
+ "area": "温州市"
+ }
+ ]
+ },
+ {
+ "city": "嘉兴市",
+ "areas": [
+ {
+ "area": "嘉善县"
+ },
+ {
+ "area": "海盐县"
+ },
+ {
+ "area": "海宁市"
+ },
+ {
+ "area": "平湖市"
+ },
+ {
+ "area": "桐乡市"
+ },
+ {
+ "area": "嘉兴市"
+ }
+ ]
+ },
+ {
+ "city": "湖州市",
+ "areas": [
+ {
+ "area": "德清县"
+ },
+ {
+ "area": "长兴县"
+ },
+ {
+ "area": "安吉县"
+ },
+ {
+ "area": "湖州市"
+ }
+ ]
+ },
+ {
+ "city": "绍兴市",
+ "areas": [
+ {
+ "area": "新昌县"
+ },
+ {
+ "area": "诸暨市"
+ },
+ {
+ "area": "嵊州市"
+ },
+ {
+ "area": "绍兴市"
+ }
+ ]
+ },
+ {
+ "city": "金华市",
+ "areas": [
+ {
+ "area": "武义县"
+ },
+ {
+ "area": "浦江县"
+ },
+ {
+ "area": "磐安县"
+ },
+ {
+ "area": "兰溪市"
+ },
+ {
+ "area": "义乌市"
+ },
+ {
+ "area": "东阳市"
+ },
+ {
+ "area": "永康市"
+ },
+ {
+ "area": "金华市"
+ }
+ ]
+ },
+ {
+ "city": "衢州市",
+ "areas": [
+ {
+ "area": "常山县"
+ },
+ {
+ "area": "开化县"
+ },
+ {
+ "area": "龙游县"
+ },
+ {
+ "area": "江山市"
+ },
+ {
+ "area": "衢州市"
+ }
+ ]
+ },
+ {
+ "city": "舟山市",
+ "areas": [
+ {
+ "area": "岱山县"
+ },
+ {
+ "area": "嵊泗县"
+ },
+ {
+ "area": "舟山市"
+ }
+ ]
+ },
+ {
+ "city": "台州市",
+ "areas": [
+ {
+ "area": "三门县"
+ },
+ {
+ "area": "天台县"
+ },
+ {
+ "area": "仙居县"
+ },
+ {
+ "area": "温岭市"
+ },
+ {
+ "area": "临海市"
+ },
+ {
+ "area": "玉环市"
+ },
+ {
+ "area": "台州市"
+ }
+ ]
+ },
+ {
+ "city": "丽水市",
+ "areas": [
+ {
+ "area": "青田县"
+ },
+ {
+ "area": "缙云县"
+ },
+ {
+ "area": "遂昌县"
+ },
+ {
+ "area": "松阳县"
+ },
+ {
+ "area": "云和县"
+ },
+ {
+ "area": "庆元县"
+ },
+ {
+ "area": "景宁畲族自治县"
+ },
+ {
+ "area": "龙泉市"
+ },
+ {
+ "area": "丽水市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "安徽省",
+ "citys": [
+ {
+ "city": "合肥市",
+ "areas": [
+ {
+ "area": "长丰县"
+ },
+ {
+ "area": "肥东县"
+ },
+ {
+ "area": "肥西县"
+ },
+ {
+ "area": "庐江县"
+ },
+ {
+ "area": "巢湖市"
+ },
+ {
+ "area": "合肥市"
+ }
+ ]
+ },
+ {
+ "city": "芜湖市",
+ "areas": [
+ {
+ "area": "南陵县"
+ },
+ {
+ "area": "无为市"
+ },
+ {
+ "area": "芜湖市"
+ }
+ ]
+ },
+ {
+ "city": "蚌埠市",
+ "areas": [
+ {
+ "area": "怀远县"
+ },
+ {
+ "area": "五河县"
+ },
+ {
+ "area": "固镇县"
+ },
+ {
+ "area": "蚌埠市"
+ }
+ ]
+ },
+ {
+ "city": "淮南市",
+ "areas": [
+ {
+ "area": "凤台县"
+ },
+ {
+ "area": "寿县"
+ },
+ {
+ "area": "淮南市"
+ }
+ ]
+ },
+ {
+ "city": "马鞍山市",
+ "areas": [
+ {
+ "area": "当涂县"
+ },
+ {
+ "area": "含山县"
+ },
+ {
+ "area": "和县"
+ },
+ {
+ "area": "马鞍山市"
+ }
+ ]
+ },
+ {
+ "city": "淮北市",
+ "areas": [
+ {
+ "area": "濉溪县"
+ },
+ {
+ "area": "淮北市"
+ }
+ ]
+ },
+ {
+ "city": "铜陵市",
+ "areas": [
+ {
+ "area": "枞阳县"
+ },
+ {
+ "area": "铜陵市"
+ }
+ ]
+ },
+ {
+ "city": "安庆市",
+ "areas": [
+ {
+ "area": "怀宁县"
+ },
+ {
+ "area": "太湖县"
+ },
+ {
+ "area": "宿松县"
+ },
+ {
+ "area": "望江县"
+ },
+ {
+ "area": "岳西县"
+ },
+ {
+ "area": "桐城市"
+ },
+ {
+ "area": "潜山市"
+ },
+ {
+ "area": "安庆市"
+ }
+ ]
+ },
+ {
+ "city": "黄山市",
+ "areas": [
+ {
+ "area": "歙县"
+ },
+ {
+ "area": "休宁县"
+ },
+ {
+ "area": "黟县"
+ },
+ {
+ "area": "祁门县"
+ },
+ {
+ "area": "黄山市"
+ }
+ ]
+ },
+ {
+ "city": "滁州市",
+ "areas": [
+ {
+ "area": "来安县"
+ },
+ {
+ "area": "全椒县"
+ },
+ {
+ "area": "定远县"
+ },
+ {
+ "area": "凤阳县"
+ },
+ {
+ "area": "天长市"
+ },
+ {
+ "area": "明光市"
+ },
+ {
+ "area": "滁州市"
+ }
+ ]
+ },
+ {
+ "city": "阜阳市",
+ "areas": [
+ {
+ "area": "临泉县"
+ },
+ {
+ "area": "太和县"
+ },
+ {
+ "area": "阜南县"
+ },
+ {
+ "area": "颍上县"
+ },
+ {
+ "area": "界首市"
+ },
+ {
+ "area": "阜阳市"
+ }
+ ]
+ },
+ {
+ "city": "宿州市",
+ "areas": [
+ {
+ "area": "砀山县"
+ },
+ {
+ "area": "萧县"
+ },
+ {
+ "area": "灵璧县"
+ },
+ {
+ "area": "泗县"
+ },
+ {
+ "area": "宿州市"
+ }
+ ]
+ },
+ {
+ "city": "六安市",
+ "areas": [
+ {
+ "area": "霍邱县"
+ },
+ {
+ "area": "舒城县"
+ },
+ {
+ "area": "金寨县"
+ },
+ {
+ "area": "霍山县"
+ },
+ {
+ "area": "六安市"
+ }
+ ]
+ },
+ {
+ "city": "亳州市",
+ "areas": [
+ {
+ "area": "涡阳县"
+ },
+ {
+ "area": "蒙城县"
+ },
+ {
+ "area": "利辛县"
+ },
+ {
+ "area": "亳州市"
+ }
+ ]
+ },
+ {
+ "city": "池州市",
+ "areas": [
+ {
+ "area": "东至县"
+ },
+ {
+ "area": "石台县"
+ },
+ {
+ "area": "青阳县"
+ },
+ {
+ "area": "池州市"
+ }
+ ]
+ },
+ {
+ "city": "宣城市",
+ "areas": [
+ {
+ "area": "郎溪县"
+ },
+ {
+ "area": "泾县"
+ },
+ {
+ "area": "绩溪县"
+ },
+ {
+ "area": "旌德县"
+ },
+ {
+ "area": "宁国市"
+ },
+ {
+ "area": "广德市"
+ },
+ {
+ "area": "宣城市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "福建省",
+ "citys": [
+ {
+ "city": "福州市",
+ "areas": [
+ {
+ "area": "闽侯县"
+ },
+ {
+ "area": "连江县"
+ },
+ {
+ "area": "罗源县"
+ },
+ {
+ "area": "闽清县"
+ },
+ {
+ "area": "永泰县"
+ },
+ {
+ "area": "平潭县"
+ },
+ {
+ "area": "福清市"
+ },
+ {
+ "area": "福州市"
+ }
+ ]
+ },
+ {
+ "city": "厦门市",
+ "areas": [
+ {
+ "area": "厦门市"
+ }
+ ]
+ },
+ {
+ "city": "莆田市",
+ "areas": [
+ {
+ "area": "仙游县"
+ },
+ {
+ "area": "莆田市"
+ }
+ ]
+ },
+ {
+ "city": "三明市",
+ "areas": [
+ {
+ "area": "明溪县"
+ },
+ {
+ "area": "清流县"
+ },
+ {
+ "area": "宁化县"
+ },
+ {
+ "area": "大田县"
+ },
+ {
+ "area": "尤溪县"
+ },
+ {
+ "area": "将乐县"
+ },
+ {
+ "area": "泰宁县"
+ },
+ {
+ "area": "建宁县"
+ },
+ {
+ "area": "永安市"
+ },
+ {
+ "area": "三明市"
+ }
+ ]
+ },
+ {
+ "city": "泉州市",
+ "areas": [
+ {
+ "area": "惠安县"
+ },
+ {
+ "area": "安溪县"
+ },
+ {
+ "area": "永春县"
+ },
+ {
+ "area": "德化县"
+ },
+ {
+ "area": "金门县"
+ },
+ {
+ "area": "石狮市"
+ },
+ {
+ "area": "晋江市"
+ },
+ {
+ "area": "南安市"
+ },
+ {
+ "area": "泉州市"
+ }
+ ]
+ },
+ {
+ "city": "漳州市",
+ "areas": [
+ {
+ "area": "云霄县"
+ },
+ {
+ "area": "漳浦县"
+ },
+ {
+ "area": "诏安县"
+ },
+ {
+ "area": "东山县"
+ },
+ {
+ "area": "南靖县"
+ },
+ {
+ "area": "平和县"
+ },
+ {
+ "area": "华安县"
+ },
+ {
+ "area": "漳州市"
+ }
+ ]
+ },
+ {
+ "city": "南平市",
+ "areas": [
+ {
+ "area": "顺昌县"
+ },
+ {
+ "area": "浦城县"
+ },
+ {
+ "area": "光泽县"
+ },
+ {
+ "area": "松溪县"
+ },
+ {
+ "area": "政和县"
+ },
+ {
+ "area": "邵武市"
+ },
+ {
+ "area": "武夷山市"
+ },
+ {
+ "area": "建瓯市"
+ },
+ {
+ "area": "南平市"
+ }
+ ]
+ },
+ {
+ "city": "龙岩市",
+ "areas": [
+ {
+ "area": "长汀县"
+ },
+ {
+ "area": "上杭县"
+ },
+ {
+ "area": "武平县"
+ },
+ {
+ "area": "连城县"
+ },
+ {
+ "area": "漳平市"
+ },
+ {
+ "area": "龙岩市"
+ }
+ ]
+ },
+ {
+ "city": "宁德市",
+ "areas": [
+ {
+ "area": "霞浦县"
+ },
+ {
+ "area": "古田县"
+ },
+ {
+ "area": "屏南县"
+ },
+ {
+ "area": "寿宁县"
+ },
+ {
+ "area": "周宁县"
+ },
+ {
+ "area": "柘荣县"
+ },
+ {
+ "area": "福安市"
+ },
+ {
+ "area": "福鼎市"
+ },
+ {
+ "area": "宁德市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "江西省",
+ "citys": [
+ {
+ "city": "南昌市",
+ "areas": [
+ {
+ "area": "南昌县"
+ },
+ {
+ "area": "安义县"
+ },
+ {
+ "area": "进贤县"
+ },
+ {
+ "area": "南昌市"
+ }
+ ]
+ },
+ {
+ "city": "景德镇市",
+ "areas": [
+ {
+ "area": "浮梁县"
+ },
+ {
+ "area": "乐平市"
+ },
+ {
+ "area": "景德镇市"
+ }
+ ]
+ },
+ {
+ "city": "萍乡市",
+ "areas": [
+ {
+ "area": "莲花县"
+ },
+ {
+ "area": "上栗县"
+ },
+ {
+ "area": "芦溪县"
+ },
+ {
+ "area": "萍乡市"
+ }
+ ]
+ },
+ {
+ "city": "九江市",
+ "areas": [
+ {
+ "area": "武宁县"
+ },
+ {
+ "area": "修水县"
+ },
+ {
+ "area": "永修县"
+ },
+ {
+ "area": "德安县"
+ },
+ {
+ "area": "都昌县"
+ },
+ {
+ "area": "湖口县"
+ },
+ {
+ "area": "彭泽县"
+ },
+ {
+ "area": "瑞昌市"
+ },
+ {
+ "area": "共青城市"
+ },
+ {
+ "area": "庐山市"
+ },
+ {
+ "area": "九江市"
+ }
+ ]
+ },
+ {
+ "city": "新余市",
+ "areas": [
+ {
+ "area": "分宜县"
+ },
+ {
+ "area": "新余市"
+ }
+ ]
+ },
+ {
+ "city": "鹰潭市",
+ "areas": [
+ {
+ "area": "贵溪市"
+ },
+ {
+ "area": "鹰潭市"
+ }
+ ]
+ },
+ {
+ "city": "赣州市",
+ "areas": [
+ {
+ "area": "信丰县"
+ },
+ {
+ "area": "大余县"
+ },
+ {
+ "area": "上犹县"
+ },
+ {
+ "area": "崇义县"
+ },
+ {
+ "area": "安远县"
+ },
+ {
+ "area": "定南县"
+ },
+ {
+ "area": "全南县"
+ },
+ {
+ "area": "宁都县"
+ },
+ {
+ "area": "于都县"
+ },
+ {
+ "area": "兴国县"
+ },
+ {
+ "area": "会昌县"
+ },
+ {
+ "area": "寻乌县"
+ },
+ {
+ "area": "石城县"
+ },
+ {
+ "area": "瑞金市"
+ },
+ {
+ "area": "龙南市"
+ },
+ {
+ "area": "赣州市"
+ }
+ ]
+ },
+ {
+ "city": "吉安市",
+ "areas": [
+ {
+ "area": "吉安县"
+ },
+ {
+ "area": "吉水县"
+ },
+ {
+ "area": "峡江县"
+ },
+ {
+ "area": "新干县"
+ },
+ {
+ "area": "永丰县"
+ },
+ {
+ "area": "泰和县"
+ },
+ {
+ "area": "遂川县"
+ },
+ {
+ "area": "万安县"
+ },
+ {
+ "area": "安福县"
+ },
+ {
+ "area": "永新县"
+ },
+ {
+ "area": "井冈山市"
+ },
+ {
+ "area": "吉安市"
+ }
+ ]
+ },
+ {
+ "city": "宜春市",
+ "areas": [
+ {
+ "area": "奉新县"
+ },
+ {
+ "area": "万载县"
+ },
+ {
+ "area": "上高县"
+ },
+ {
+ "area": "宜丰县"
+ },
+ {
+ "area": "靖安县"
+ },
+ {
+ "area": "铜鼓县"
+ },
+ {
+ "area": "丰城市"
+ },
+ {
+ "area": "樟树市"
+ },
+ {
+ "area": "高安市"
+ },
+ {
+ "area": "宜春市"
+ }
+ ]
+ },
+ {
+ "city": "抚州市",
+ "areas": [
+ {
+ "area": "南城县"
+ },
+ {
+ "area": "黎川县"
+ },
+ {
+ "area": "南丰县"
+ },
+ {
+ "area": "崇仁县"
+ },
+ {
+ "area": "乐安县"
+ },
+ {
+ "area": "宜黄县"
+ },
+ {
+ "area": "金溪县"
+ },
+ {
+ "area": "资溪县"
+ },
+ {
+ "area": "广昌县"
+ },
+ {
+ "area": "抚州市"
+ }
+ ]
+ },
+ {
+ "city": "上饶市",
+ "areas": [
+ {
+ "area": "玉山县"
+ },
+ {
+ "area": "铅山县"
+ },
+ {
+ "area": "横峰县"
+ },
+ {
+ "area": "弋阳县"
+ },
+ {
+ "area": "余干县"
+ },
+ {
+ "area": "鄱阳县"
+ },
+ {
+ "area": "万年县"
+ },
+ {
+ "area": "婺源县"
+ },
+ {
+ "area": "德兴市"
+ },
+ {
+ "area": "上饶市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "山东省",
+ "citys": [
+ {
+ "city": "济南市",
+ "areas": [
+ {
+ "area": "平阴县"
+ },
+ {
+ "area": "商河县"
+ },
+ {
+ "area": "济南市"
+ }
+ ]
+ },
+ {
+ "city": "青岛市",
+ "areas": [
+ {
+ "area": "胶州市"
+ },
+ {
+ "area": "平度市"
+ },
+ {
+ "area": "莱西市"
+ },
+ {
+ "area": "青岛市"
+ }
+ ]
+ },
+ {
+ "city": "淄博市",
+ "areas": [
+ {
+ "area": "桓台县"
+ },
+ {
+ "area": "高青县"
+ },
+ {
+ "area": "沂源县"
+ },
+ {
+ "area": "淄博市"
+ }
+ ]
+ },
+ {
+ "city": "枣庄市",
+ "areas": [
+ {
+ "area": "滕州市"
+ },
+ {
+ "area": "枣庄市"
+ }
+ ]
+ },
+ {
+ "city": "东营市",
+ "areas": [
+ {
+ "area": "利津县"
+ },
+ {
+ "area": "广饶县"
+ },
+ {
+ "area": "东营市"
+ }
+ ]
+ },
+ {
+ "city": "烟台市",
+ "areas": [
+ {
+ "area": "龙口市"
+ },
+ {
+ "area": "莱阳市"
+ },
+ {
+ "area": "莱州市"
+ },
+ {
+ "area": "招远市"
+ },
+ {
+ "area": "栖霞市"
+ },
+ {
+ "area": "海阳市"
+ },
+ {
+ "area": "烟台市"
+ }
+ ]
+ },
+ {
+ "city": "潍坊市",
+ "areas": [
+ {
+ "area": "临朐县"
+ },
+ {
+ "area": "昌乐县"
+ },
+ {
+ "area": "青州市"
+ },
+ {
+ "area": "诸城市"
+ },
+ {
+ "area": "寿光市"
+ },
+ {
+ "area": "安丘市"
+ },
+ {
+ "area": "高密市"
+ },
+ {
+ "area": "昌邑市"
+ },
+ {
+ "area": "潍坊市"
+ }
+ ]
+ },
+ {
+ "city": "济宁市",
+ "areas": [
+ {
+ "area": "微山县"
+ },
+ {
+ "area": "鱼台县"
+ },
+ {
+ "area": "金乡县"
+ },
+ {
+ "area": "嘉祥县"
+ },
+ {
+ "area": "汶上县"
+ },
+ {
+ "area": "泗水县"
+ },
+ {
+ "area": "梁山县"
+ },
+ {
+ "area": "曲阜市"
+ },
+ {
+ "area": "邹城市"
+ },
+ {
+ "area": "济宁市"
+ }
+ ]
+ },
+ {
+ "city": "泰安市",
+ "areas": [
+ {
+ "area": "宁阳县"
+ },
+ {
+ "area": "东平县"
+ },
+ {
+ "area": "新泰市"
+ },
+ {
+ "area": "肥城市"
+ },
+ {
+ "area": "泰安市"
+ }
+ ]
+ },
+ {
+ "city": "威海市",
+ "areas": [
+ {
+ "area": "荣成市"
+ },
+ {
+ "area": "乳山市"
+ },
+ {
+ "area": "威海市"
+ }
+ ]
+ },
+ {
+ "city": "日照市",
+ "areas": [
+ {
+ "area": "五莲县"
+ },
+ {
+ "area": "莒县"
+ },
+ {
+ "area": "日照市"
+ }
+ ]
+ },
+ {
+ "city": "临沂市",
+ "areas": [
+ {
+ "area": "沂南县"
+ },
+ {
+ "area": "郯城县"
+ },
+ {
+ "area": "沂水县"
+ },
+ {
+ "area": "兰陵县"
+ },
+ {
+ "area": "费县"
+ },
+ {
+ "area": "平邑县"
+ },
+ {
+ "area": "莒南县"
+ },
+ {
+ "area": "蒙阴县"
+ },
+ {
+ "area": "临沭县"
+ },
+ {
+ "area": "临沂市"
+ }
+ ]
+ },
+ {
+ "city": "德州市",
+ "areas": [
+ {
+ "area": "宁津县"
+ },
+ {
+ "area": "庆云县"
+ },
+ {
+ "area": "临邑县"
+ },
+ {
+ "area": "齐河县"
+ },
+ {
+ "area": "平原县"
+ },
+ {
+ "area": "夏津县"
+ },
+ {
+ "area": "武城县"
+ },
+ {
+ "area": "乐陵市"
+ },
+ {
+ "area": "禹城市"
+ },
+ {
+ "area": "德州市"
+ }
+ ]
+ },
+ {
+ "city": "聊城市",
+ "areas": [
+ {
+ "area": "阳谷县"
+ },
+ {
+ "area": "莘县"
+ },
+ {
+ "area": "东阿县"
+ },
+ {
+ "area": "冠县"
+ },
+ {
+ "area": "高唐县"
+ },
+ {
+ "area": "临清市"
+ },
+ {
+ "area": "聊城市"
+ }
+ ]
+ },
+ {
+ "city": "滨州市",
+ "areas": [
+ {
+ "area": "惠民县"
+ },
+ {
+ "area": "阳信县"
+ },
+ {
+ "area": "无棣县"
+ },
+ {
+ "area": "博兴县"
+ },
+ {
+ "area": "邹平市"
+ },
+ {
+ "area": "滨州市"
+ }
+ ]
+ },
+ {
+ "city": "菏泽市",
+ "areas": [
+ {
+ "area": "曹县"
+ },
+ {
+ "area": "单县"
+ },
+ {
+ "area": "成武县"
+ },
+ {
+ "area": "巨野县"
+ },
+ {
+ "area": "郓城县"
+ },
+ {
+ "area": "鄄城县"
+ },
+ {
+ "area": "东明县"
+ },
+ {
+ "area": "菏泽市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "河南省",
+ "citys": [
+ {
+ "city": "郑州市",
+ "areas": [
+ {
+ "area": "中牟县"
+ },
+ {
+ "area": "巩义市"
+ },
+ {
+ "area": "荥阳市"
+ },
+ {
+ "area": "新密市"
+ },
+ {
+ "area": "新郑市"
+ },
+ {
+ "area": "登封市"
+ },
+ {
+ "area": "郑州市"
+ }
+ ]
+ },
+ {
+ "city": "开封市",
+ "areas": [
+ {
+ "area": "杞县"
+ },
+ {
+ "area": "通许县"
+ },
+ {
+ "area": "尉氏县"
+ },
+ {
+ "area": "兰考县"
+ },
+ {
+ "area": "开封市"
+ }
+ ]
+ },
+ {
+ "city": "洛阳市",
+ "areas": [
+ {
+ "area": "新安县"
+ },
+ {
+ "area": "栾川县"
+ },
+ {
+ "area": "嵩县"
+ },
+ {
+ "area": "汝阳县"
+ },
+ {
+ "area": "宜阳县"
+ },
+ {
+ "area": "洛宁县"
+ },
+ {
+ "area": "伊川县"
+ },
+ {
+ "area": "洛阳市"
+ }
+ ]
+ },
+ {
+ "city": "平顶山市",
+ "areas": [
+ {
+ "area": "宝丰县"
+ },
+ {
+ "area": "叶县"
+ },
+ {
+ "area": "鲁山县"
+ },
+ {
+ "area": "郏县"
+ },
+ {
+ "area": "舞钢市"
+ },
+ {
+ "area": "汝州市"
+ },
+ {
+ "area": "平顶山市"
+ }
+ ]
+ },
+ {
+ "city": "安阳市",
+ "areas": [
+ {
+ "area": "安阳县"
+ },
+ {
+ "area": "汤阴县"
+ },
+ {
+ "area": "滑县"
+ },
+ {
+ "area": "内黄县"
+ },
+ {
+ "area": "林州市"
+ },
+ {
+ "area": "安阳市"
+ }
+ ]
+ },
+ {
+ "city": "鹤壁市",
+ "areas": [
+ {
+ "area": "浚县"
+ },
+ {
+ "area": "淇县"
+ },
+ {
+ "area": "鹤壁市"
+ }
+ ]
+ },
+ {
+ "city": "新乡市",
+ "areas": [
+ {
+ "area": "新乡县"
+ },
+ {
+ "area": "获嘉县"
+ },
+ {
+ "area": "原阳县"
+ },
+ {
+ "area": "延津县"
+ },
+ {
+ "area": "封丘县"
+ },
+ {
+ "area": "卫辉市"
+ },
+ {
+ "area": "辉县市"
+ },
+ {
+ "area": "长垣市"
+ },
+ {
+ "area": "新乡市"
+ }
+ ]
+ },
+ {
+ "city": "焦作市",
+ "areas": [
+ {
+ "area": "修武县"
+ },
+ {
+ "area": "博爱县"
+ },
+ {
+ "area": "武陟县"
+ },
+ {
+ "area": "温县"
+ },
+ {
+ "area": "沁阳市"
+ },
+ {
+ "area": "孟州市"
+ },
+ {
+ "area": "焦作市"
+ }
+ ]
+ },
+ {
+ "city": "濮阳市",
+ "areas": [
+ {
+ "area": "清丰县"
+ },
+ {
+ "area": "南乐县"
+ },
+ {
+ "area": "范县"
+ },
+ {
+ "area": "台前县"
+ },
+ {
+ "area": "濮阳县"
+ },
+ {
+ "area": "濮阳市"
+ }
+ ]
+ },
+ {
+ "city": "许昌市",
+ "areas": [
+ {
+ "area": "鄢陵县"
+ },
+ {
+ "area": "襄城县"
+ },
+ {
+ "area": "禹州市"
+ },
+ {
+ "area": "长葛市"
+ },
+ {
+ "area": "许昌市"
+ }
+ ]
+ },
+ {
+ "city": "漯河市",
+ "areas": [
+ {
+ "area": "舞阳县"
+ },
+ {
+ "area": "临颍县"
+ },
+ {
+ "area": "漯河市"
+ }
+ ]
+ },
+ {
+ "city": "三门峡市",
+ "areas": [
+ {
+ "area": "渑池县"
+ },
+ {
+ "area": "卢氏县"
+ },
+ {
+ "area": "义马市"
+ },
+ {
+ "area": "灵宝市"
+ },
+ {
+ "area": "三门峡市"
+ }
+ ]
+ },
+ {
+ "city": "南阳市",
+ "areas": [
+ {
+ "area": "南召县"
+ },
+ {
+ "area": "方城县"
+ },
+ {
+ "area": "西峡县"
+ },
+ {
+ "area": "镇平县"
+ },
+ {
+ "area": "内乡县"
+ },
+ {
+ "area": "淅川县"
+ },
+ {
+ "area": "社旗县"
+ },
+ {
+ "area": "唐河县"
+ },
+ {
+ "area": "新野县"
+ },
+ {
+ "area": "桐柏县"
+ },
+ {
+ "area": "邓州市"
+ },
+ {
+ "area": "南阳市"
+ }
+ ]
+ },
+ {
+ "city": "商丘市",
+ "areas": [
+ {
+ "area": "民权县"
+ },
+ {
+ "area": "睢县"
+ },
+ {
+ "area": "宁陵县"
+ },
+ {
+ "area": "柘城县"
+ },
+ {
+ "area": "虞城县"
+ },
+ {
+ "area": "夏邑县"
+ },
+ {
+ "area": "永城市"
+ },
+ {
+ "area": "商丘市"
+ }
+ ]
+ },
+ {
+ "city": "信阳市",
+ "areas": [
+ {
+ "area": "罗山县"
+ },
+ {
+ "area": "光山县"
+ },
+ {
+ "area": "新县"
+ },
+ {
+ "area": "商城县"
+ },
+ {
+ "area": "固始县"
+ },
+ {
+ "area": "潢川县"
+ },
+ {
+ "area": "淮滨县"
+ },
+ {
+ "area": "息县"
+ },
+ {
+ "area": "信阳市"
+ }
+ ]
+ },
+ {
+ "city": "周口市",
+ "areas": [
+ {
+ "area": "扶沟县"
+ },
+ {
+ "area": "西华县"
+ },
+ {
+ "area": "商水县"
+ },
+ {
+ "area": "沈丘县"
+ },
+ {
+ "area": "郸城县"
+ },
+ {
+ "area": "太康县"
+ },
+ {
+ "area": "鹿邑县"
+ },
+ {
+ "area": "项城市"
+ },
+ {
+ "area": "周口市"
+ }
+ ]
+ },
+ {
+ "city": "驻马店市",
+ "areas": [
+ {
+ "area": "西平县"
+ },
+ {
+ "area": "上蔡县"
+ },
+ {
+ "area": "平舆县"
+ },
+ {
+ "area": "正阳县"
+ },
+ {
+ "area": "确山县"
+ },
+ {
+ "area": "泌阳县"
+ },
+ {
+ "area": "汝南县"
+ },
+ {
+ "area": "遂平县"
+ },
+ {
+ "area": "新蔡县"
+ },
+ {
+ "area": "济源市"
+ },
+ {
+ "area": "驻马店市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "湖北省",
+ "citys": [
+ {
+ "city": "武汉市",
+ "areas": [
+ {
+ "area": "武汉市"
+ }
+ ]
+ },
+ {
+ "city": "黄石市",
+ "areas": [
+ {
+ "area": "阳新县"
+ },
+ {
+ "area": "大冶市"
+ },
+ {
+ "area": "黄石市"
+ }
+ ]
+ },
+ {
+ "city": "十堰市",
+ "areas": [
+ {
+ "area": "郧西县"
+ },
+ {
+ "area": "竹山县"
+ },
+ {
+ "area": "竹溪县"
+ },
+ {
+ "area": "房县"
+ },
+ {
+ "area": "丹江口市"
+ },
+ {
+ "area": "十堰市"
+ }
+ ]
+ },
+ {
+ "city": "宜昌市",
+ "areas": [
+ {
+ "area": "远安县"
+ },
+ {
+ "area": "兴山县"
+ },
+ {
+ "area": "秭归县"
+ },
+ {
+ "area": "长阳土家族自治县"
+ },
+ {
+ "area": "五峰土家族自治县"
+ },
+ {
+ "area": "宜都市"
+ },
+ {
+ "area": "当阳市"
+ },
+ {
+ "area": "枝江市"
+ },
+ {
+ "area": "宜昌市"
+ }
+ ]
+ },
+ {
+ "city": "襄阳市",
+ "areas": [
+ {
+ "area": "南漳县"
+ },
+ {
+ "area": "谷城县"
+ },
+ {
+ "area": "保康县"
+ },
+ {
+ "area": "老河口市"
+ },
+ {
+ "area": "枣阳市"
+ },
+ {
+ "area": "宜城市"
+ },
+ {
+ "area": "襄阳市"
+ }
+ ]
+ },
+ {
+ "city": "鄂州市",
+ "areas": [
+ {
+ "area": "鄂州市"
+ }
+ ]
+ },
+ {
+ "city": "荆门市",
+ "areas": [
+ {
+ "area": "沙洋县"
+ },
+ {
+ "area": "钟祥市"
+ },
+ {
+ "area": "京山市"
+ },
+ {
+ "area": "荆门市"
+ }
+ ]
+ },
+ {
+ "city": "孝感市",
+ "areas": [
+ {
+ "area": "孝昌县"
+ },
+ {
+ "area": "大悟县"
+ },
+ {
+ "area": "云梦县"
+ },
+ {
+ "area": "应城市"
+ },
+ {
+ "area": "安陆市"
+ },
+ {
+ "area": "汉川市"
+ },
+ {
+ "area": "孝感市"
+ }
+ ]
+ },
+ {
+ "city": "荆州市",
+ "areas": [
+ {
+ "area": "公安县"
+ },
+ {
+ "area": "江陵县"
+ },
+ {
+ "area": "石首市"
+ },
+ {
+ "area": "洪湖市"
+ },
+ {
+ "area": "松滋市"
+ },
+ {
+ "area": "监利市"
+ },
+ {
+ "area": "荆州市"
+ }
+ ]
+ },
+ {
+ "city": "黄冈市",
+ "areas": [
+ {
+ "area": "团风县"
+ },
+ {
+ "area": "红安县"
+ },
+ {
+ "area": "罗田县"
+ },
+ {
+ "area": "英山县"
+ },
+ {
+ "area": "浠水县"
+ },
+ {
+ "area": "蕲春县"
+ },
+ {
+ "area": "黄梅县"
+ },
+ {
+ "area": "麻城市"
+ },
+ {
+ "area": "武穴市"
+ },
+ {
+ "area": "黄冈市"
+ }
+ ]
+ },
+ {
+ "city": "咸宁市",
+ "areas": [
+ {
+ "area": "嘉鱼县"
+ },
+ {
+ "area": "通城县"
+ },
+ {
+ "area": "崇阳县"
+ },
+ {
+ "area": "通山县"
+ },
+ {
+ "area": "赤壁市"
+ },
+ {
+ "area": "咸宁市"
+ }
+ ]
+ },
+ {
+ "city": "随州市",
+ "areas": [
+ {
+ "area": "随县"
+ },
+ {
+ "area": "广水市"
+ },
+ {
+ "area": "随州市"
+ }
+ ]
+ },
+ {
+ "city": "恩施土家族苗族自治州",
+ "areas": [
+ {
+ "area": "恩施市"
+ },
+ {
+ "area": "利川市"
+ },
+ {
+ "area": "建始县"
+ },
+ {
+ "area": "巴东县"
+ },
+ {
+ "area": "宣恩县"
+ },
+ {
+ "area": "咸丰县"
+ },
+ {
+ "area": "来凤县"
+ },
+ {
+ "area": "鹤峰县"
+ },
+ {
+ "area": "仙桃市"
+ },
+ {
+ "area": "潜江市"
+ },
+ {
+ "area": "天门市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "湖南省",
+ "citys": [
+ {
+ "city": "长沙市",
+ "areas": [
+ {
+ "area": "长沙县"
+ },
+ {
+ "area": "浏阳市"
+ },
+ {
+ "area": "宁乡市"
+ },
+ {
+ "area": "长沙市"
+ }
+ ]
+ },
+ {
+ "city": "株洲市",
+ "areas": [
+ {
+ "area": "攸县"
+ },
+ {
+ "area": "茶陵县"
+ },
+ {
+ "area": "炎陵县"
+ },
+ {
+ "area": "醴陵市"
+ },
+ {
+ "area": "株洲市"
+ }
+ ]
+ },
+ {
+ "city": "湘潭市",
+ "areas": [
+ {
+ "area": "湘潭县"
+ },
+ {
+ "area": "湘乡市"
+ },
+ {
+ "area": "韶山市"
+ },
+ {
+ "area": "湘潭市"
+ }
+ ]
+ },
+ {
+ "city": "衡阳市",
+ "areas": [
+ {
+ "area": "衡阳县"
+ },
+ {
+ "area": "衡南县"
+ },
+ {
+ "area": "衡山县"
+ },
+ {
+ "area": "衡东县"
+ },
+ {
+ "area": "祁东县"
+ },
+ {
+ "area": "耒阳市"
+ },
+ {
+ "area": "常宁市"
+ },
+ {
+ "area": "衡阳市"
+ }
+ ]
+ },
+ {
+ "city": "邵阳市",
+ "areas": [
+ {
+ "area": "新邵县"
+ },
+ {
+ "area": "邵阳县"
+ },
+ {
+ "area": "隆回县"
+ },
+ {
+ "area": "洞口县"
+ },
+ {
+ "area": "绥宁县"
+ },
+ {
+ "area": "新宁县"
+ },
+ {
+ "area": "城步苗族自治县"
+ },
+ {
+ "area": "武冈市"
+ },
+ {
+ "area": "邵东市"
+ },
+ {
+ "area": "邵阳市"
+ }
+ ]
+ },
+ {
+ "city": "岳阳市",
+ "areas": [
+ {
+ "area": "岳阳县"
+ },
+ {
+ "area": "华容县"
+ },
+ {
+ "area": "湘阴县"
+ },
+ {
+ "area": "平江县"
+ },
+ {
+ "area": "汨罗市"
+ },
+ {
+ "area": "临湘市"
+ },
+ {
+ "area": "岳阳市"
+ }
+ ]
+ },
+ {
+ "city": "常德市",
+ "areas": [
+ {
+ "area": "安乡县"
+ },
+ {
+ "area": "汉寿县"
+ },
+ {
+ "area": "澧县"
+ },
+ {
+ "area": "临澧县"
+ },
+ {
+ "area": "桃源县"
+ },
+ {
+ "area": "石门县"
+ },
+ {
+ "area": "津市市"
+ },
+ {
+ "area": "常德市"
+ }
+ ]
+ },
+ {
+ "city": "张家界市",
+ "areas": [
+ {
+ "area": "慈利县"
+ },
+ {
+ "area": "桑植县"
+ },
+ {
+ "area": "张家界市"
+ }
+ ]
+ },
+ {
+ "city": "益阳市",
+ "areas": [
+ {
+ "area": "南县"
+ },
+ {
+ "area": "桃江县"
+ },
+ {
+ "area": "安化县"
+ },
+ {
+ "area": "沅江市"
+ },
+ {
+ "area": "益阳市"
+ }
+ ]
+ },
+ {
+ "city": "郴州市",
+ "areas": [
+ {
+ "area": "桂阳县"
+ },
+ {
+ "area": "宜章县"
+ },
+ {
+ "area": "永兴县"
+ },
+ {
+ "area": "嘉禾县"
+ },
+ {
+ "area": "临武县"
+ },
+ {
+ "area": "汝城县"
+ },
+ {
+ "area": "桂东县"
+ },
+ {
+ "area": "安仁县"
+ },
+ {
+ "area": "资兴市"
+ },
+ {
+ "area": "郴州市"
+ }
+ ]
+ },
+ {
+ "city": "永州市",
+ "areas": [
+ {
+ "area": "东安县"
+ },
+ {
+ "area": "双牌县"
+ },
+ {
+ "area": "道县"
+ },
+ {
+ "area": "江永县"
+ },
+ {
+ "area": "宁远县"
+ },
+ {
+ "area": "蓝山县"
+ },
+ {
+ "area": "新田县"
+ },
+ {
+ "area": "江华瑶族自治县"
+ },
+ {
+ "area": "祁阳市"
+ },
+ {
+ "area": "永州市"
+ }
+ ]
+ },
+ {
+ "city": "怀化市",
+ "areas": [
+ {
+ "area": "中方县"
+ },
+ {
+ "area": "沅陵县"
+ },
+ {
+ "area": "辰溪县"
+ },
+ {
+ "area": "溆浦县"
+ },
+ {
+ "area": "会同县"
+ },
+ {
+ "area": "麻阳苗族自治县"
+ },
+ {
+ "area": "新晃侗族自治县"
+ },
+ {
+ "area": "芷江侗族自治县"
+ },
+ {
+ "area": "靖州苗族侗族自治县"
+ },
+ {
+ "area": "通道侗族自治县"
+ },
+ {
+ "area": "洪江市"
+ },
+ {
+ "area": "怀化市"
+ }
+ ]
+ },
+ {
+ "city": "娄底市",
+ "areas": [
+ {
+ "area": "双峰县"
+ },
+ {
+ "area": "新化县"
+ },
+ {
+ "area": "冷水江市"
+ },
+ {
+ "area": "涟源市"
+ },
+ {
+ "area": "娄底市"
+ }
+ ]
+ },
+ {
+ "city": "湘西土家族苗族自治州",
+ "areas": [
+ {
+ "area": "吉首市"
+ },
+ {
+ "area": "泸溪县"
+ },
+ {
+ "area": "凤凰县"
+ },
+ {
+ "area": "花垣县"
+ },
+ {
+ "area": "保靖县"
+ },
+ {
+ "area": "古丈县"
+ },
+ {
+ "area": "永顺县"
+ },
+ {
+ "area": "龙山县"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "广东省",
+ "citys": [
+ {
+ "city": "广州市",
+ "areas": [
+ {
+ "area": "广州市"
+ }
+ ]
+ },
+ {
+ "city": "韶关市",
+ "areas": [
+ {
+ "area": "始兴县"
+ },
+ {
+ "area": "仁化县"
+ },
+ {
+ "area": "翁源县"
+ },
+ {
+ "area": "乳源瑶族自治县"
+ },
+ {
+ "area": "新丰县"
+ },
+ {
+ "area": "乐昌市"
+ },
+ {
+ "area": "南雄市"
+ },
+ {
+ "area": "韶关市"
+ }
+ ]
+ },
+ {
+ "city": "深圳市",
+ "areas": [
+ {
+ "area": "深圳市"
+ }
+ ]
+ },
+ {
+ "city": "珠海市",
+ "areas": [
+ {
+ "area": "珠海市"
+ }
+ ]
+ },
+ {
+ "city": "汕头市",
+ "areas": [
+ {
+ "area": "南澳县"
+ },
+ {
+ "area": "汕头市"
+ }
+ ]
+ },
+ {
+ "city": "佛山市",
+ "areas": [
+ {
+ "area": "佛山市"
+ }
+ ]
+ },
+ {
+ "city": "江门市",
+ "areas": [
+ {
+ "area": "台山市"
+ },
+ {
+ "area": "开平市"
+ },
+ {
+ "area": "鹤山市"
+ },
+ {
+ "area": "恩平市"
+ },
+ {
+ "area": "江门市"
+ }
+ ]
+ },
+ {
+ "city": "湛江市",
+ "areas": [
+ {
+ "area": "遂溪县"
+ },
+ {
+ "area": "徐闻县"
+ },
+ {
+ "area": "廉江市"
+ },
+ {
+ "area": "雷州市"
+ },
+ {
+ "area": "吴川市"
+ },
+ {
+ "area": "湛江市"
+ }
+ ]
+ },
+ {
+ "city": "茂名市",
+ "areas": [
+ {
+ "area": "高州市"
+ },
+ {
+ "area": "化州市"
+ },
+ {
+ "area": "信宜市"
+ },
+ {
+ "area": "茂名市"
+ }
+ ]
+ },
+ {
+ "city": "肇庆市",
+ "areas": [
+ {
+ "area": "广宁县"
+ },
+ {
+ "area": "怀集县"
+ },
+ {
+ "area": "封开县"
+ },
+ {
+ "area": "德庆县"
+ },
+ {
+ "area": "四会市"
+ },
+ {
+ "area": "肇庆市"
+ }
+ ]
+ },
+ {
+ "city": "惠州市",
+ "areas": [
+ {
+ "area": "博罗县"
+ },
+ {
+ "area": "惠东县"
+ },
+ {
+ "area": "龙门县"
+ },
+ {
+ "area": "惠州市"
+ }
+ ]
+ },
+ {
+ "city": "梅州市",
+ "areas": [
+ {
+ "area": "大埔县"
+ },
+ {
+ "area": "丰顺县"
+ },
+ {
+ "area": "五华县"
+ },
+ {
+ "area": "平远县"
+ },
+ {
+ "area": "蕉岭县"
+ },
+ {
+ "area": "兴宁市"
+ },
+ {
+ "area": "梅州市"
+ }
+ ]
+ },
+ {
+ "city": "汕尾市",
+ "areas": [
+ {
+ "area": "海丰县"
+ },
+ {
+ "area": "陆河县"
+ },
+ {
+ "area": "陆丰市"
+ },
+ {
+ "area": "汕尾市"
+ }
+ ]
+ },
+ {
+ "city": "河源市",
+ "areas": [
+ {
+ "area": "紫金县"
+ },
+ {
+ "area": "龙川县"
+ },
+ {
+ "area": "连平县"
+ },
+ {
+ "area": "和平县"
+ },
+ {
+ "area": "东源县"
+ },
+ {
+ "area": "河源市"
+ }
+ ]
+ },
+ {
+ "city": "阳江市",
+ "areas": [
+ {
+ "area": "阳西县"
+ },
+ {
+ "area": "阳春市"
+ },
+ {
+ "area": "阳江市"
+ }
+ ]
+ },
+ {
+ "city": "清远市",
+ "areas": [
+ {
+ "area": "佛冈县"
+ },
+ {
+ "area": "阳山县"
+ },
+ {
+ "area": "连山壮族瑶族自治县"
+ },
+ {
+ "area": "连南瑶族自治县"
+ },
+ {
+ "area": "英德市"
+ },
+ {
+ "area": "连州市"
+ },
+ {
+ "area": "清远市"
+ }
+ ]
+ },
+ {
+ "city": "潮州市",
+ "areas": [
+ {
+ "area": "饶平县"
+ },
+ {
+ "area": "潮州市"
+ }
+ ]
+ },
+ {
+ "city": "揭阳市",
+ "areas": [
+ {
+ "area": "揭西县"
+ },
+ {
+ "area": "惠来县"
+ },
+ {
+ "area": "普宁市"
+ },
+ {
+ "area": "揭阳市"
+ }
+ ]
+ },
+ {
+ "city": "云浮市",
+ "areas": [
+ {
+ "area": "新兴县"
+ },
+ {
+ "area": "郁南县"
+ },
+ {
+ "area": "罗定市"
+ },
+ {
+ "area": "云浮市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "广西壮族自治区",
+ "citys": [
+ {
+ "city": "南宁市",
+ "areas": [
+ {
+ "area": "隆安县"
+ },
+ {
+ "area": "马山县"
+ },
+ {
+ "area": "上林县"
+ },
+ {
+ "area": "宾阳县"
+ },
+ {
+ "area": "横州市"
+ },
+ {
+ "area": "南宁市"
+ }
+ ]
+ },
+ {
+ "city": "柳州市",
+ "areas": [
+ {
+ "area": "柳城县"
+ },
+ {
+ "area": "鹿寨县"
+ },
+ {
+ "area": "融安县"
+ },
+ {
+ "area": "融水苗族自治县"
+ },
+ {
+ "area": "三江侗族自治县"
+ },
+ {
+ "area": "柳州市"
+ }
+ ]
+ },
+ {
+ "city": "桂林市",
+ "areas": [
+ {
+ "area": "阳朔县"
+ },
+ {
+ "area": "灵川县"
+ },
+ {
+ "area": "全州县"
+ },
+ {
+ "area": "兴安县"
+ },
+ {
+ "area": "永福县"
+ },
+ {
+ "area": "灌阳县"
+ },
+ {
+ "area": "龙胜各族自治县"
+ },
+ {
+ "area": "资源县"
+ },
+ {
+ "area": "平乐县"
+ },
+ {
+ "area": "恭城瑶族自治县"
+ },
+ {
+ "area": "荔浦市"
+ },
+ {
+ "area": "桂林市"
+ }
+ ]
+ },
+ {
+ "city": "梧州市",
+ "areas": [
+ {
+ "area": "苍梧县"
+ },
+ {
+ "area": "藤县"
+ },
+ {
+ "area": "蒙山县"
+ },
+ {
+ "area": "岑溪市"
+ },
+ {
+ "area": "梧州市"
+ }
+ ]
+ },
+ {
+ "city": "北海市",
+ "areas": [
+ {
+ "area": "合浦县"
+ },
+ {
+ "area": "北海市"
+ }
+ ]
+ },
+ {
+ "city": "防城港市",
+ "areas": [
+ {
+ "area": "上思县"
+ },
+ {
+ "area": "东兴市"
+ },
+ {
+ "area": "防城港市"
+ }
+ ]
+ },
+ {
+ "city": "钦州市",
+ "areas": [
+ {
+ "area": "灵山县"
+ },
+ {
+ "area": "浦北县"
+ },
+ {
+ "area": "钦州市"
+ }
+ ]
+ },
+ {
+ "city": "贵港市",
+ "areas": [
+ {
+ "area": "平南县"
+ },
+ {
+ "area": "桂平市"
+ },
+ {
+ "area": "贵港市"
+ }
+ ]
+ },
+ {
+ "city": "玉林市",
+ "areas": [
+ {
+ "area": "容县"
+ },
+ {
+ "area": "陆川县"
+ },
+ {
+ "area": "博白县"
+ },
+ {
+ "area": "兴业县"
+ },
+ {
+ "area": "北流市"
+ },
+ {
+ "area": "玉林市"
+ }
+ ]
+ },
+ {
+ "city": "百色市",
+ "areas": [
+ {
+ "area": "田东县"
+ },
+ {
+ "area": "德保县"
+ },
+ {
+ "area": "那坡县"
+ },
+ {
+ "area": "凌云县"
+ },
+ {
+ "area": "乐业县"
+ },
+ {
+ "area": "田林县"
+ },
+ {
+ "area": "西林县"
+ },
+ {
+ "area": "隆林各族自治县"
+ },
+ {
+ "area": "靖西市"
+ },
+ {
+ "area": "平果市"
+ },
+ {
+ "area": "百色市"
+ }
+ ]
+ },
+ {
+ "city": "贺州市",
+ "areas": [
+ {
+ "area": "昭平县"
+ },
+ {
+ "area": "钟山县"
+ },
+ {
+ "area": "富川瑶族自治县"
+ },
+ {
+ "area": "贺州市"
+ }
+ ]
+ },
+ {
+ "city": "河池市",
+ "areas": [
+ {
+ "area": "南丹县"
+ },
+ {
+ "area": "天峨县"
+ },
+ {
+ "area": "凤山县"
+ },
+ {
+ "area": "东兰县"
+ },
+ {
+ "area": "罗城仫佬族自治县"
+ },
+ {
+ "area": "环江毛南族自治县"
+ },
+ {
+ "area": "巴马瑶族自治县"
+ },
+ {
+ "area": "都安瑶族自治县"
+ },
+ {
+ "area": "大化瑶族自治县"
+ },
+ {
+ "area": "河池市"
+ }
+ ]
+ },
+ {
+ "city": "来宾市",
+ "areas": [
+ {
+ "area": "忻城县"
+ },
+ {
+ "area": "象州县"
+ },
+ {
+ "area": "武宣县"
+ },
+ {
+ "area": "金秀瑶族自治县"
+ },
+ {
+ "area": "合山市"
+ },
+ {
+ "area": "来宾市"
+ }
+ ]
+ },
+ {
+ "city": "崇左市",
+ "areas": [
+ {
+ "area": "扶绥县"
+ },
+ {
+ "area": "宁明县"
+ },
+ {
+ "area": "龙州县"
+ },
+ {
+ "area": "大新县"
+ },
+ {
+ "area": "天等县"
+ },
+ {
+ "area": "凭祥市"
+ },
+ {
+ "area": "崇左市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "海南省",
+ "citys": [
+ {
+ "city": "海口市",
+ "areas": [
+ {
+ "area": "海口市"
+ }
+ ]
+ },
+ {
+ "city": "三亚市",
+ "areas": [
+ {
+ "area": "三亚市"
+ }
+ ]
+ },
+ {
+ "city": "儋州市",
+ "areas": [
+ {
+ "area": "五指山市"
+ },
+ {
+ "area": "琼海市"
+ },
+ {
+ "area": "文昌市"
+ },
+ {
+ "area": "万宁市"
+ },
+ {
+ "area": "东方市"
+ },
+ {
+ "area": "定安县"
+ },
+ {
+ "area": "屯昌县"
+ },
+ {
+ "area": "澄迈县"
+ },
+ {
+ "area": "临高县"
+ },
+ {
+ "area": "白沙黎族自治县"
+ },
+ {
+ "area": "昌江黎族自治县"
+ },
+ {
+ "area": "乐东黎族自治县"
+ },
+ {
+ "area": "陵水黎族自治县"
+ },
+ {
+ "area": "保亭黎族苗族自治县"
+ },
+ {
+ "area": "琼中黎族苗族自治县"
+ },
+ {
+ "area": "儋州市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "重庆市",
+ "citys": [
+ {
+ "city": "重庆市",
+ "areas": [
+ {
+ "area": "城口县"
+ },
+ {
+ "area": "丰都县"
+ },
+ {
+ "area": "垫江县"
+ },
+ {
+ "area": "忠县"
+ },
+ {
+ "area": "云阳县"
+ },
+ {
+ "area": "奉节县"
+ },
+ {
+ "area": "巫山县"
+ },
+ {
+ "area": "巫溪县"
+ },
+ {
+ "area": "石柱土家族自治县"
+ },
+ {
+ "area": "秀山土家族苗族自治县"
+ },
+ {
+ "area": "酉阳土家族苗族自治县"
+ },
+ {
+ "area": "彭水苗族土家族自治县"
+ },
+ {
+ "area": "重庆市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "四川省",
+ "citys": [
+ {
+ "city": "成都市",
+ "areas": [
+ {
+ "area": "金堂县"
+ },
+ {
+ "area": "大邑县"
+ },
+ {
+ "area": "蒲江县"
+ },
+ {
+ "area": "都江堰市"
+ },
+ {
+ "area": "彭州市"
+ },
+ {
+ "area": "邛崃市"
+ },
+ {
+ "area": "崇州市"
+ },
+ {
+ "area": "简阳市"
+ },
+ {
+ "area": "成都市"
+ }
+ ]
+ },
+ {
+ "city": "自贡市",
+ "areas": [
+ {
+ "area": "荣县"
+ },
+ {
+ "area": "富顺县"
+ },
+ {
+ "area": "自贡市"
+ }
+ ]
+ },
+ {
+ "city": "攀枝花市",
+ "areas": [
+ {
+ "area": "米易县"
+ },
+ {
+ "area": "盐边县"
+ },
+ {
+ "area": "攀枝花市"
+ }
+ ]
+ },
+ {
+ "city": "泸州市",
+ "areas": [
+ {
+ "area": "泸县"
+ },
+ {
+ "area": "合江县"
+ },
+ {
+ "area": "叙永县"
+ },
+ {
+ "area": "古蔺县"
+ },
+ {
+ "area": "泸州市"
+ }
+ ]
+ },
+ {
+ "city": "德阳市",
+ "areas": [
+ {
+ "area": "中江县"
+ },
+ {
+ "area": "广汉市"
+ },
+ {
+ "area": "什邡市"
+ },
+ {
+ "area": "绵竹市"
+ },
+ {
+ "area": "德阳市"
+ }
+ ]
+ },
+ {
+ "city": "绵阳市",
+ "areas": [
+ {
+ "area": "三台县"
+ },
+ {
+ "area": "盐亭县"
+ },
+ {
+ "area": "梓潼县"
+ },
+ {
+ "area": "北川羌族自治县"
+ },
+ {
+ "area": "平武县"
+ },
+ {
+ "area": "江油市"
+ },
+ {
+ "area": "绵阳市"
+ }
+ ]
+ },
+ {
+ "city": "广元市",
+ "areas": [
+ {
+ "area": "旺苍县"
+ },
+ {
+ "area": "青川县"
+ },
+ {
+ "area": "剑阁县"
+ },
+ {
+ "area": "苍溪县"
+ },
+ {
+ "area": "广元市"
+ }
+ ]
+ },
+ {
+ "city": "遂宁市",
+ "areas": [
+ {
+ "area": "蓬溪县"
+ },
+ {
+ "area": "大英县"
+ },
+ {
+ "area": "射洪市"
+ },
+ {
+ "area": "遂宁市"
+ }
+ ]
+ },
+ {
+ "city": "内江市",
+ "areas": [
+ {
+ "area": "威远县"
+ },
+ {
+ "area": "资中县"
+ },
+ {
+ "area": "隆昌市"
+ },
+ {
+ "area": "内江市"
+ }
+ ]
+ },
+ {
+ "city": "乐山市",
+ "areas": [
+ {
+ "area": "犍为县"
+ },
+ {
+ "area": "井研县"
+ },
+ {
+ "area": "夹江县"
+ },
+ {
+ "area": "沐川县"
+ },
+ {
+ "area": "峨边彝族自治县"
+ },
+ {
+ "area": "马边彝族自治县"
+ },
+ {
+ "area": "峨眉山市"
+ },
+ {
+ "area": "乐山市"
+ }
+ ]
+ },
+ {
+ "city": "南充市",
+ "areas": [
+ {
+ "area": "南部县"
+ },
+ {
+ "area": "营山县"
+ },
+ {
+ "area": "蓬安县"
+ },
+ {
+ "area": "仪陇县"
+ },
+ {
+ "area": "西充县"
+ },
+ {
+ "area": "阆中市"
+ },
+ {
+ "area": "南充市"
+ }
+ ]
+ },
+ {
+ "city": "眉山市",
+ "areas": [
+ {
+ "area": "仁寿县"
+ },
+ {
+ "area": "洪雅县"
+ },
+ {
+ "area": "丹棱县"
+ },
+ {
+ "area": "青神县"
+ },
+ {
+ "area": "眉山市"
+ }
+ ]
+ },
+ {
+ "city": "宜宾市",
+ "areas": [
+ {
+ "area": "江安县"
+ },
+ {
+ "area": "长宁县"
+ },
+ {
+ "area": "高县"
+ },
+ {
+ "area": "珙县"
+ },
+ {
+ "area": "筠连县"
+ },
+ {
+ "area": "兴文县"
+ },
+ {
+ "area": "屏山县"
+ },
+ {
+ "area": "宜宾市"
+ }
+ ]
+ },
+ {
+ "city": "广安市",
+ "areas": [
+ {
+ "area": "岳池县"
+ },
+ {
+ "area": "武胜县"
+ },
+ {
+ "area": "邻水县"
+ },
+ {
+ "area": "华蓥市"
+ },
+ {
+ "area": "广安市"
+ }
+ ]
+ },
+ {
+ "city": "达州市",
+ "areas": [
+ {
+ "area": "宣汉县"
+ },
+ {
+ "area": "开江县"
+ },
+ {
+ "area": "大竹县"
+ },
+ {
+ "area": "渠县"
+ },
+ {
+ "area": "万源市"
+ },
+ {
+ "area": "达州市"
+ }
+ ]
+ },
+ {
+ "city": "雅安市",
+ "areas": [
+ {
+ "area": "荥经县"
+ },
+ {
+ "area": "汉源县"
+ },
+ {
+ "area": "石棉县"
+ },
+ {
+ "area": "天全县"
+ },
+ {
+ "area": "芦山县"
+ },
+ {
+ "area": "宝兴县"
+ },
+ {
+ "area": "雅安市"
+ }
+ ]
+ },
+ {
+ "city": "巴中市",
+ "areas": [
+ {
+ "area": "通江县"
+ },
+ {
+ "area": "南江县"
+ },
+ {
+ "area": "平昌县"
+ },
+ {
+ "area": "巴中市"
+ }
+ ]
+ },
+ {
+ "city": "资阳市",
+ "areas": [
+ {
+ "area": "安岳县"
+ },
+ {
+ "area": "乐至县"
+ },
+ {
+ "area": "资阳市"
+ }
+ ]
+ },
+ {
+ "city": "阿坝藏族羌族自治州",
+ "areas": [
+ {
+ "area": "马尔康市"
+ },
+ {
+ "area": "汶川县"
+ },
+ {
+ "area": "理县"
+ },
+ {
+ "area": "茂县"
+ },
+ {
+ "area": "松潘县"
+ },
+ {
+ "area": "九寨沟县"
+ },
+ {
+ "area": "金川县"
+ },
+ {
+ "area": "小金县"
+ },
+ {
+ "area": "黑水县"
+ },
+ {
+ "area": "壤塘县"
+ },
+ {
+ "area": "阿坝县"
+ },
+ {
+ "area": "若尔盖县"
+ },
+ {
+ "area": "红原县"
+ }
+ ]
+ },
+ {
+ "city": "甘孜藏族自治州",
+ "areas": [
+ {
+ "area": "康定市"
+ },
+ {
+ "area": "泸定县"
+ },
+ {
+ "area": "丹巴县"
+ },
+ {
+ "area": "九龙县"
+ },
+ {
+ "area": "雅江县"
+ },
+ {
+ "area": "道孚县"
+ },
+ {
+ "area": "炉霍县"
+ },
+ {
+ "area": "甘孜县"
+ },
+ {
+ "area": "新龙县"
+ },
+ {
+ "area": "德格县"
+ },
+ {
+ "area": "白玉县"
+ },
+ {
+ "area": "石渠县"
+ },
+ {
+ "area": "色达县"
+ },
+ {
+ "area": "理塘县"
+ },
+ {
+ "area": "巴塘县"
+ },
+ {
+ "area": "乡城县"
+ },
+ {
+ "area": "稻城县"
+ },
+ {
+ "area": "得荣县"
+ }
+ ]
+ },
+ {
+ "city": "凉山彝族自治州",
+ "areas": [
+ {
+ "area": "西昌市"
+ },
+ {
+ "area": "会理市"
+ },
+ {
+ "area": "木里藏族自治县"
+ },
+ {
+ "area": "盐源县"
+ },
+ {
+ "area": "德昌县"
+ },
+ {
+ "area": "会东县"
+ },
+ {
+ "area": "宁南县"
+ },
+ {
+ "area": "普格县"
+ },
+ {
+ "area": "布拖县"
+ },
+ {
+ "area": "金阳县"
+ },
+ {
+ "area": "昭觉县"
+ },
+ {
+ "area": "喜德县"
+ },
+ {
+ "area": "冕宁县"
+ },
+ {
+ "area": "越西县"
+ },
+ {
+ "area": "甘洛县"
+ },
+ {
+ "area": "美姑县"
+ },
+ {
+ "area": "雷波县"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "贵州省",
+ "citys": [
+ {
+ "city": "贵阳市",
+ "areas": [
+ {
+ "area": "开阳县"
+ },
+ {
+ "area": "息烽县"
+ },
+ {
+ "area": "修文县"
+ },
+ {
+ "area": "清镇市"
+ },
+ {
+ "area": "贵阳市"
+ }
+ ]
+ },
+ {
+ "city": "六盘水市",
+ "areas": [
+ {
+ "area": "盘州市"
+ },
+ {
+ "area": "六盘水市"
+ }
+ ]
+ },
+ {
+ "city": "遵义市",
+ "areas": [
+ {
+ "area": "桐梓县"
+ },
+ {
+ "area": "绥阳县"
+ },
+ {
+ "area": "正安县"
+ },
+ {
+ "area": "道真仡佬族苗族自治县"
+ },
+ {
+ "area": "务川仡佬族苗族自治县"
+ },
+ {
+ "area": "凤冈县"
+ },
+ {
+ "area": "湄潭县"
+ },
+ {
+ "area": "余庆县"
+ },
+ {
+ "area": "习水县"
+ },
+ {
+ "area": "赤水市"
+ },
+ {
+ "area": "仁怀市"
+ },
+ {
+ "area": "遵义市"
+ }
+ ]
+ },
+ {
+ "city": "安顺市",
+ "areas": [
+ {
+ "area": "普定县"
+ },
+ {
+ "area": "镇宁布依族苗族自治县"
+ },
+ {
+ "area": "关岭布依族苗族自治县"
+ },
+ {
+ "area": "紫云苗族布依族自治县"
+ },
+ {
+ "area": "安顺市"
+ }
+ ]
+ },
+ {
+ "city": "毕节市",
+ "areas": [
+ {
+ "area": "大方县"
+ },
+ {
+ "area": "金沙县"
+ },
+ {
+ "area": "织金县"
+ },
+ {
+ "area": "纳雍县"
+ },
+ {
+ "area": "威宁彝族回族苗族自治县"
+ },
+ {
+ "area": "赫章县"
+ },
+ {
+ "area": "黔西市"
+ },
+ {
+ "area": "毕节市"
+ }
+ ]
+ },
+ {
+ "city": "铜仁市",
+ "areas": [
+ {
+ "area": "江口县"
+ },
+ {
+ "area": "玉屏侗族自治县"
+ },
+ {
+ "area": "石阡县"
+ },
+ {
+ "area": "思南县"
+ },
+ {
+ "area": "印江土家族苗族自治县"
+ },
+ {
+ "area": "德江县"
+ },
+ {
+ "area": "沿河土家族自治县"
+ },
+ {
+ "area": "松桃苗族自治县"
+ },
+ {
+ "area": "铜仁市"
+ }
+ ]
+ },
+ {
+ "city": "黔西南布依族苗族自治州",
+ "areas": [
+ {
+ "area": "兴义市"
+ },
+ {
+ "area": "兴仁市"
+ },
+ {
+ "area": "普安县"
+ },
+ {
+ "area": "晴隆县"
+ },
+ {
+ "area": "贞丰县"
+ },
+ {
+ "area": "望谟县"
+ },
+ {
+ "area": "册亨县"
+ },
+ {
+ "area": "安龙县"
+ }
+ ]
+ },
+ {
+ "city": "黔东南苗族侗族自治州",
+ "areas": [
+ {
+ "area": "凯里市"
+ },
+ {
+ "area": "黄平县"
+ },
+ {
+ "area": "施秉县"
+ },
+ {
+ "area": "三穗县"
+ },
+ {
+ "area": "镇远县"
+ },
+ {
+ "area": "岑巩县"
+ },
+ {
+ "area": "天柱县"
+ },
+ {
+ "area": "锦屏县"
+ },
+ {
+ "area": "剑河县"
+ },
+ {
+ "area": "台江县"
+ },
+ {
+ "area": "黎平县"
+ },
+ {
+ "area": "榕江县"
+ },
+ {
+ "area": "从江县"
+ },
+ {
+ "area": "雷山县"
+ },
+ {
+ "area": "麻江县"
+ },
+ {
+ "area": "丹寨县"
+ }
+ ]
+ },
+ {
+ "city": "黔南布依族苗族自治州",
+ "areas": [
+ {
+ "area": "都匀市"
+ },
+ {
+ "area": "福泉市"
+ },
+ {
+ "area": "荔波县"
+ },
+ {
+ "area": "贵定县"
+ },
+ {
+ "area": "瓮安县"
+ },
+ {
+ "area": "独山县"
+ },
+ {
+ "area": "平塘县"
+ },
+ {
+ "area": "罗甸县"
+ },
+ {
+ "area": "长顺县"
+ },
+ {
+ "area": "龙里县"
+ },
+ {
+ "area": "惠水县"
+ },
+ {
+ "area": "三都水族自治县"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "云南省",
+ "citys": [
+ {
+ "city": "昆明市",
+ "areas": [
+ {
+ "area": "富民县"
+ },
+ {
+ "area": "宜良县"
+ },
+ {
+ "area": "石林彝族自治县"
+ },
+ {
+ "area": "嵩明县"
+ },
+ {
+ "area": "禄劝彝族苗族自治县"
+ },
+ {
+ "area": "寻甸回族彝族自治县"
+ },
+ {
+ "area": "安宁市"
+ },
+ {
+ "area": "昆明市"
+ }
+ ]
+ },
+ {
+ "city": "曲靖市",
+ "areas": [
+ {
+ "area": "陆良县"
+ },
+ {
+ "area": "师宗县"
+ },
+ {
+ "area": "罗平县"
+ },
+ {
+ "area": "富源县"
+ },
+ {
+ "area": "会泽县"
+ },
+ {
+ "area": "宣威市"
+ },
+ {
+ "area": "曲靖市"
+ }
+ ]
+ },
+ {
+ "city": "玉溪市",
+ "areas": [
+ {
+ "area": "通海县"
+ },
+ {
+ "area": "华宁县"
+ },
+ {
+ "area": "易门县"
+ },
+ {
+ "area": "峨山彝族自治县"
+ },
+ {
+ "area": "新平彝族傣族自治县"
+ },
+ {
+ "area": "元江哈尼族彝族傣族自治县"
+ },
+ {
+ "area": "澄江市"
+ },
+ {
+ "area": "玉溪市"
+ }
+ ]
+ },
+ {
+ "city": "保山市",
+ "areas": [
+ {
+ "area": "施甸县"
+ },
+ {
+ "area": "龙陵县"
+ },
+ {
+ "area": "昌宁县"
+ },
+ {
+ "area": "腾冲市"
+ },
+ {
+ "area": "保山市"
+ }
+ ]
+ },
+ {
+ "city": "昭通市",
+ "areas": [
+ {
+ "area": "鲁甸县"
+ },
+ {
+ "area": "巧家县"
+ },
+ {
+ "area": "盐津县"
+ },
+ {
+ "area": "大关县"
+ },
+ {
+ "area": "永善县"
+ },
+ {
+ "area": "绥江县"
+ },
+ {
+ "area": "镇雄县"
+ },
+ {
+ "area": "彝良县"
+ },
+ {
+ "area": "威信县"
+ },
+ {
+ "area": "水富市"
+ },
+ {
+ "area": "昭通市"
+ }
+ ]
+ },
+ {
+ "city": "丽江市",
+ "areas": [
+ {
+ "area": "玉龙纳西族自治县"
+ },
+ {
+ "area": "永胜县"
+ },
+ {
+ "area": "华坪县"
+ },
+ {
+ "area": "宁蒗彝族自治县"
+ },
+ {
+ "area": "丽江市"
+ }
+ ]
+ },
+ {
+ "city": "普洱市",
+ "areas": [
+ {
+ "area": "宁洱哈尼族彝族自治县"
+ },
+ {
+ "area": "墨江哈尼族自治县"
+ },
+ {
+ "area": "景东彝族自治县"
+ },
+ {
+ "area": "景谷傣族彝族自治县"
+ },
+ {
+ "area": "镇沅彝族哈尼族拉祜族自治县"
+ },
+ {
+ "area": "江城哈尼族彝族自治县"
+ },
+ {
+ "area": "孟连傣族拉祜族佤族自治县"
+ },
+ {
+ "area": "澜沧拉祜族自治县"
+ },
+ {
+ "area": "西盟佤族自治县"
+ },
+ {
+ "area": "普洱市"
+ }
+ ]
+ },
+ {
+ "city": "临沧市",
+ "areas": [
+ {
+ "area": "凤庆县"
+ },
+ {
+ "area": "云县"
+ },
+ {
+ "area": "永德县"
+ },
+ {
+ "area": "镇康县"
+ },
+ {
+ "area": "双江拉祜族佤族布朗族傣族自治县"
+ },
+ {
+ "area": "耿马傣族佤族自治县"
+ },
+ {
+ "area": "沧源佤族自治县"
+ },
+ {
+ "area": "临沧市"
+ }
+ ]
+ },
+ {
+ "city": "楚雄彝族自治州",
+ "areas": [
+ {
+ "area": "楚雄市"
+ },
+ {
+ "area": "禄丰市"
+ },
+ {
+ "area": "双柏县"
+ },
+ {
+ "area": "牟定县"
+ },
+ {
+ "area": "南华县"
+ },
+ {
+ "area": "姚安县"
+ },
+ {
+ "area": "大姚县"
+ },
+ {
+ "area": "永仁县"
+ },
+ {
+ "area": "元谋县"
+ },
+ {
+ "area": "武定县"
+ }
+ ]
+ },
+ {
+ "city": "红河哈尼族彝族自治州",
+ "areas": [
+ {
+ "area": "个旧市"
+ },
+ {
+ "area": "开远市"
+ },
+ {
+ "area": "蒙自市"
+ },
+ {
+ "area": "弥勒市"
+ },
+ {
+ "area": "屏边苗族自治县"
+ },
+ {
+ "area": "建水县"
+ },
+ {
+ "area": "石屏县"
+ },
+ {
+ "area": "泸西县"
+ },
+ {
+ "area": "元阳县"
+ },
+ {
+ "area": "红河县"
+ },
+ {
+ "area": "金平苗族瑶族傣族自治县"
+ },
+ {
+ "area": "绿春县"
+ },
+ {
+ "area": "河口瑶族自治县"
+ }
+ ]
+ },
+ {
+ "city": "文山壮族苗族自治州",
+ "areas": [
+ {
+ "area": "文山市"
+ },
+ {
+ "area": "砚山县"
+ },
+ {
+ "area": "西畴县"
+ },
+ {
+ "area": "麻栗坡县"
+ },
+ {
+ "area": "马关县"
+ },
+ {
+ "area": "丘北县"
+ },
+ {
+ "area": "广南县"
+ },
+ {
+ "area": "富宁县"
+ }
+ ]
+ },
+ {
+ "city": "西双版纳傣族自治州",
+ "areas": [
+ {
+ "area": "景洪市"
+ },
+ {
+ "area": "勐海县"
+ },
+ {
+ "area": "勐腊县"
+ }
+ ]
+ },
+ {
+ "city": "大理白族自治州",
+ "areas": [
+ {
+ "area": "大理市"
+ },
+ {
+ "area": "漾濞彝族自治县"
+ },
+ {
+ "area": "祥云县"
+ },
+ {
+ "area": "宾川县"
+ },
+ {
+ "area": "弥渡县"
+ },
+ {
+ "area": "南涧彝族自治县"
+ },
+ {
+ "area": "巍山彝族回族自治县"
+ },
+ {
+ "area": "永平县"
+ },
+ {
+ "area": "云龙县"
+ },
+ {
+ "area": "洱源县"
+ },
+ {
+ "area": "剑川县"
+ },
+ {
+ "area": "鹤庆县"
+ }
+ ]
+ },
+ {
+ "city": "德宏傣族景颇族自治州",
+ "areas": [
+ {
+ "area": "瑞丽市"
+ },
+ {
+ "area": "芒市"
+ },
+ {
+ "area": "梁河县"
+ },
+ {
+ "area": "盈江县"
+ },
+ {
+ "area": "陇川县"
+ }
+ ]
+ },
+ {
+ "city": "怒江傈僳族自治州",
+ "areas": [
+ {
+ "area": "泸水市"
+ },
+ {
+ "area": "福贡县"
+ },
+ {
+ "area": "贡山独龙族怒族自治县"
+ },
+ {
+ "area": "兰坪白族普米族自治县"
+ }
+ ]
+ },
+ {
+ "city": "迪庆藏族自治州",
+ "areas": [
+ {
+ "area": "香格里拉市"
+ },
+ {
+ "area": "德钦县"
+ },
+ {
+ "area": "维西傈僳族自治县"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "西藏自治区",
+ "citys": [
+ {
+ "city": "拉萨市",
+ "areas": [
+ {
+ "area": "林周县"
+ },
+ {
+ "area": "当雄县"
+ },
+ {
+ "area": "尼木县"
+ },
+ {
+ "area": "曲水县"
+ },
+ {
+ "area": "墨竹工卡县"
+ },
+ {
+ "area": "拉萨市"
+ }
+ ]
+ },
+ {
+ "city": "日喀则市",
+ "areas": [
+ {
+ "area": "南木林县"
+ },
+ {
+ "area": "江孜县"
+ },
+ {
+ "area": "定日县"
+ },
+ {
+ "area": "萨迦县"
+ },
+ {
+ "area": "拉孜县"
+ },
+ {
+ "area": "昂仁县"
+ },
+ {
+ "area": "谢通门县"
+ },
+ {
+ "area": "白朗县"
+ },
+ {
+ "area": "仁布县"
+ },
+ {
+ "area": "康马县"
+ },
+ {
+ "area": "定结县"
+ },
+ {
+ "area": "仲巴县"
+ },
+ {
+ "area": "亚东县"
+ },
+ {
+ "area": "吉隆县"
+ },
+ {
+ "area": "聂拉木县"
+ },
+ {
+ "area": "萨嘎县"
+ },
+ {
+ "area": "岗巴县"
+ },
+ {
+ "area": "日喀则市"
+ }
+ ]
+ },
+ {
+ "city": "昌都市",
+ "areas": [
+ {
+ "area": "江达县"
+ },
+ {
+ "area": "贡觉县"
+ },
+ {
+ "area": "类乌齐县"
+ },
+ {
+ "area": "丁青县"
+ },
+ {
+ "area": "察雅县"
+ },
+ {
+ "area": "八宿县"
+ },
+ {
+ "area": "左贡县"
+ },
+ {
+ "area": "芒康县"
+ },
+ {
+ "area": "洛隆县"
+ },
+ {
+ "area": "边坝县"
+ },
+ {
+ "area": "昌都市"
+ }
+ ]
+ },
+ {
+ "city": "林芝市",
+ "areas": [
+ {
+ "area": "工布江达县"
+ },
+ {
+ "area": "米林县"
+ },
+ {
+ "area": "墨脱县"
+ },
+ {
+ "area": "波密县"
+ },
+ {
+ "area": "察隅县"
+ },
+ {
+ "area": "朗县"
+ },
+ {
+ "area": "林芝市"
+ }
+ ]
+ },
+ {
+ "city": "山南市",
+ "areas": [
+ {
+ "area": "扎囊县"
+ },
+ {
+ "area": "贡嘎县"
+ },
+ {
+ "area": "桑日县"
+ },
+ {
+ "area": "琼结县"
+ },
+ {
+ "area": "曲松县"
+ },
+ {
+ "area": "措美县"
+ },
+ {
+ "area": "洛扎县"
+ },
+ {
+ "area": "加查县"
+ },
+ {
+ "area": "隆子县"
+ },
+ {
+ "area": "错那县"
+ },
+ {
+ "area": "浪卡子县"
+ },
+ {
+ "area": "山南市"
+ }
+ ]
+ },
+ {
+ "city": "那曲市",
+ "areas": [
+ {
+ "area": "嘉黎县"
+ },
+ {
+ "area": "比如县"
+ },
+ {
+ "area": "聂荣县"
+ },
+ {
+ "area": "安多县"
+ },
+ {
+ "area": "申扎县"
+ },
+ {
+ "area": "索县"
+ },
+ {
+ "area": "班戈县"
+ },
+ {
+ "area": "巴青县"
+ },
+ {
+ "area": "尼玛县"
+ },
+ {
+ "area": "双湖县"
+ },
+ {
+ "area": "那曲市"
+ }
+ ]
+ },
+ {
+ "city": "阿里地区",
+ "areas": [
+ {
+ "area": "普兰县"
+ },
+ {
+ "area": "札达县"
+ },
+ {
+ "area": "噶尔县"
+ },
+ {
+ "area": "日土县"
+ },
+ {
+ "area": "革吉县"
+ },
+ {
+ "area": "改则县"
+ },
+ {
+ "area": "措勤县"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "陕西省",
+ "citys": [
+ {
+ "city": "西安市",
+ "areas": [
+ {
+ "area": "蓝田县"
+ },
+ {
+ "area": "周至县"
+ },
+ {
+ "area": "西安市"
+ }
+ ]
+ },
+ {
+ "city": "铜川市",
+ "areas": [
+ {
+ "area": "宜君县"
+ },
+ {
+ "area": "铜川市"
+ }
+ ]
+ },
+ {
+ "city": "宝鸡市",
+ "areas": [
+ {
+ "area": "岐山县"
+ },
+ {
+ "area": "扶风县"
+ },
+ {
+ "area": "眉县"
+ },
+ {
+ "area": "陇县"
+ },
+ {
+ "area": "千阳县"
+ },
+ {
+ "area": "麟游县"
+ },
+ {
+ "area": "凤县"
+ },
+ {
+ "area": "太白县"
+ },
+ {
+ "area": "宝鸡市"
+ }
+ ]
+ },
+ {
+ "city": "咸阳市",
+ "areas": [
+ {
+ "area": "三原县"
+ },
+ {
+ "area": "泾阳县"
+ },
+ {
+ "area": "乾县"
+ },
+ {
+ "area": "礼泉县"
+ },
+ {
+ "area": "永寿县"
+ },
+ {
+ "area": "长武县"
+ },
+ {
+ "area": "旬邑县"
+ },
+ {
+ "area": "淳化县"
+ },
+ {
+ "area": "武功县"
+ },
+ {
+ "area": "兴平市"
+ },
+ {
+ "area": "彬州市"
+ },
+ {
+ "area": "咸阳市"
+ }
+ ]
+ },
+ {
+ "city": "渭南市",
+ "areas": [
+ {
+ "area": "潼关县"
+ },
+ {
+ "area": "大荔县"
+ },
+ {
+ "area": "合阳县"
+ },
+ {
+ "area": "澄城县"
+ },
+ {
+ "area": "蒲城县"
+ },
+ {
+ "area": "白水县"
+ },
+ {
+ "area": "富平县"
+ },
+ {
+ "area": "韩城市"
+ },
+ {
+ "area": "华阴市"
+ },
+ {
+ "area": "渭南市"
+ }
+ ]
+ },
+ {
+ "city": "延安市",
+ "areas": [
+ {
+ "area": "延长县"
+ },
+ {
+ "area": "延川县"
+ },
+ {
+ "area": "志丹县"
+ },
+ {
+ "area": "吴起县"
+ },
+ {
+ "area": "甘泉县"
+ },
+ {
+ "area": "富县"
+ },
+ {
+ "area": "洛川县"
+ },
+ {
+ "area": "宜川县"
+ },
+ {
+ "area": "黄龙县"
+ },
+ {
+ "area": "黄陵县"
+ },
+ {
+ "area": "子长市"
+ },
+ {
+ "area": "延安市"
+ }
+ ]
+ },
+ {
+ "city": "汉中市",
+ "areas": [
+ {
+ "area": "城固县"
+ },
+ {
+ "area": "洋县"
+ },
+ {
+ "area": "西乡县"
+ },
+ {
+ "area": "勉县"
+ },
+ {
+ "area": "宁强县"
+ },
+ {
+ "area": "略阳县"
+ },
+ {
+ "area": "镇巴县"
+ },
+ {
+ "area": "留坝县"
+ },
+ {
+ "area": "佛坪县"
+ },
+ {
+ "area": "汉中市"
+ }
+ ]
+ },
+ {
+ "city": "榆林市",
+ "areas": [
+ {
+ "area": "府谷县"
+ },
+ {
+ "area": "靖边县"
+ },
+ {
+ "area": "定边县"
+ },
+ {
+ "area": "绥德县"
+ },
+ {
+ "area": "米脂县"
+ },
+ {
+ "area": "佳县"
+ },
+ {
+ "area": "吴堡县"
+ },
+ {
+ "area": "清涧县"
+ },
+ {
+ "area": "子洲县"
+ },
+ {
+ "area": "神木市"
+ },
+ {
+ "area": "榆林市"
+ }
+ ]
+ },
+ {
+ "city": "安康市",
+ "areas": [
+ {
+ "area": "汉阴县"
+ },
+ {
+ "area": "石泉县"
+ },
+ {
+ "area": "宁陕县"
+ },
+ {
+ "area": "紫阳县"
+ },
+ {
+ "area": "岚皋县"
+ },
+ {
+ "area": "平利县"
+ },
+ {
+ "area": "镇坪县"
+ },
+ {
+ "area": "白河县"
+ },
+ {
+ "area": "旬阳市"
+ },
+ {
+ "area": "安康市"
+ }
+ ]
+ },
+ {
+ "city": "商洛市",
+ "areas": [
+ {
+ "area": "洛南县"
+ },
+ {
+ "area": "丹凤县"
+ },
+ {
+ "area": "商南县"
+ },
+ {
+ "area": "山阳县"
+ },
+ {
+ "area": "镇安县"
+ },
+ {
+ "area": "柞水县"
+ },
+ {
+ "area": "商洛市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "甘肃省",
+ "citys": [
+ {
+ "city": "兰州市",
+ "areas": [
+ {
+ "area": "永登县"
+ },
+ {
+ "area": "皋兰县"
+ },
+ {
+ "area": "榆中县"
+ },
+ {
+ "area": "兰州市"
+ }
+ ]
+ },
+ {
+ "city": "金昌市",
+ "areas": [
+ {
+ "area": "永昌县"
+ },
+ {
+ "area": "金昌市"
+ }
+ ]
+ },
+ {
+ "city": "白银市",
+ "areas": [
+ {
+ "area": "靖远县"
+ },
+ {
+ "area": "会宁县"
+ },
+ {
+ "area": "景泰县"
+ },
+ {
+ "area": "白银市"
+ }
+ ]
+ },
+ {
+ "city": "天水市",
+ "areas": [
+ {
+ "area": "清水县"
+ },
+ {
+ "area": "秦安县"
+ },
+ {
+ "area": "甘谷县"
+ },
+ {
+ "area": "武山县"
+ },
+ {
+ "area": "张家川回族自治县"
+ },
+ {
+ "area": "天水市"
+ }
+ ]
+ },
+ {
+ "city": "武威市",
+ "areas": [
+ {
+ "area": "民勤县"
+ },
+ {
+ "area": "古浪县"
+ },
+ {
+ "area": "天祝藏族自治县"
+ },
+ {
+ "area": "武威市"
+ }
+ ]
+ },
+ {
+ "city": "张掖市",
+ "areas": [
+ {
+ "area": "肃南裕固族自治县"
+ },
+ {
+ "area": "民乐县"
+ },
+ {
+ "area": "临泽县"
+ },
+ {
+ "area": "高台县"
+ },
+ {
+ "area": "山丹县"
+ },
+ {
+ "area": "张掖市"
+ }
+ ]
+ },
+ {
+ "city": "平凉市",
+ "areas": [
+ {
+ "area": "泾川县"
+ },
+ {
+ "area": "灵台县"
+ },
+ {
+ "area": "崇信县"
+ },
+ {
+ "area": "庄浪县"
+ },
+ {
+ "area": "静宁县"
+ },
+ {
+ "area": "华亭市"
+ },
+ {
+ "area": "平凉市"
+ }
+ ]
+ },
+ {
+ "city": "酒泉市",
+ "areas": [
+ {
+ "area": "金塔县"
+ },
+ {
+ "area": "瓜州县"
+ },
+ {
+ "area": "肃北蒙古族自治县"
+ },
+ {
+ "area": "阿克塞哈萨克族自治县"
+ },
+ {
+ "area": "玉门市"
+ },
+ {
+ "area": "敦煌市"
+ },
+ {
+ "area": "酒泉市"
+ }
+ ]
+ },
+ {
+ "city": "庆阳市",
+ "areas": [
+ {
+ "area": "庆城县"
+ },
+ {
+ "area": "环县"
+ },
+ {
+ "area": "华池县"
+ },
+ {
+ "area": "合水县"
+ },
+ {
+ "area": "正宁县"
+ },
+ {
+ "area": "宁县"
+ },
+ {
+ "area": "镇原县"
+ },
+ {
+ "area": "庆阳市"
+ }
+ ]
+ },
+ {
+ "city": "定西市",
+ "areas": [
+ {
+ "area": "通渭县"
+ },
+ {
+ "area": "陇西县"
+ },
+ {
+ "area": "渭源县"
+ },
+ {
+ "area": "临洮县"
+ },
+ {
+ "area": "漳县"
+ },
+ {
+ "area": "岷县"
+ },
+ {
+ "area": "定西市"
+ }
+ ]
+ },
+ {
+ "city": "陇南市",
+ "areas": [
+ {
+ "area": "成县"
+ },
+ {
+ "area": "文县"
+ },
+ {
+ "area": "宕昌县"
+ },
+ {
+ "area": "康县"
+ },
+ {
+ "area": "西和县"
+ },
+ {
+ "area": "礼县"
+ },
+ {
+ "area": "徽县"
+ },
+ {
+ "area": "两当县"
+ },
+ {
+ "area": "陇南市"
+ }
+ ]
+ },
+ {
+ "city": "临夏回族自治州",
+ "areas": [
+ {
+ "area": "临夏市"
+ },
+ {
+ "area": "临夏县"
+ },
+ {
+ "area": "康乐县"
+ },
+ {
+ "area": "永靖县"
+ },
+ {
+ "area": "广河县"
+ },
+ {
+ "area": "和政县"
+ },
+ {
+ "area": "东乡族自治县"
+ },
+ {
+ "area": "积石山保安族东乡族撒拉族自治县"
+ }
+ ]
+ },
+ {
+ "city": "甘南藏族自治州",
+ "areas": [
+ {
+ "area": "合作市"
+ },
+ {
+ "area": "临潭县"
+ },
+ {
+ "area": "卓尼县"
+ },
+ {
+ "area": "舟曲县"
+ },
+ {
+ "area": "迭部县"
+ },
+ {
+ "area": "玛曲县"
+ },
+ {
+ "area": "碌曲县"
+ },
+ {
+ "area": "夏河县"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "青海省",
+ "citys": [
+ {
+ "city": "西宁市",
+ "areas": [
+ {
+ "area": "大通回族土族自治县"
+ },
+ {
+ "area": "湟源县"
+ },
+ {
+ "area": "西宁市"
+ }
+ ]
+ },
+ {
+ "city": "海东市",
+ "areas": [
+ {
+ "area": "民和回族土族自治县"
+ },
+ {
+ "area": "互助土族自治县"
+ },
+ {
+ "area": "化隆回族自治县"
+ },
+ {
+ "area": "循化撒拉族自治县"
+ },
+ {
+ "area": "海东市"
+ }
+ ]
+ },
+ {
+ "city": "海北藏族自治州",
+ "areas": [
+ {
+ "area": "门源回族自治县"
+ },
+ {
+ "area": "祁连县"
+ },
+ {
+ "area": "海晏县"
+ },
+ {
+ "area": "刚察县"
+ }
+ ]
+ },
+ {
+ "city": "黄南藏族自治州",
+ "areas": [
+ {
+ "area": "同仁市"
+ },
+ {
+ "area": "尖扎县"
+ },
+ {
+ "area": "泽库县"
+ },
+ {
+ "area": "河南蒙古族自治县"
+ }
+ ]
+ },
+ {
+ "city": "海南藏族自治州",
+ "areas": [
+ {
+ "area": "共和县"
+ },
+ {
+ "area": "同德县"
+ },
+ {
+ "area": "贵德县"
+ },
+ {
+ "area": "兴海县"
+ },
+ {
+ "area": "贵南县"
+ }
+ ]
+ },
+ {
+ "city": "果洛藏族自治州",
+ "areas": [
+ {
+ "area": "玛沁县"
+ },
+ {
+ "area": "班玛县"
+ },
+ {
+ "area": "甘德县"
+ },
+ {
+ "area": "达日县"
+ },
+ {
+ "area": "久治县"
+ },
+ {
+ "area": "玛多县"
+ }
+ ]
+ },
+ {
+ "city": "玉树藏族自治州",
+ "areas": [
+ {
+ "area": "玉树市"
+ },
+ {
+ "area": "杂多县"
+ },
+ {
+ "area": "称多县"
+ },
+ {
+ "area": "治多县"
+ },
+ {
+ "area": "囊谦县"
+ },
+ {
+ "area": "曲麻莱县"
+ }
+ ]
+ },
+ {
+ "city": "海西蒙古族藏族自治州",
+ "areas": [
+ {
+ "area": "格尔木市"
+ },
+ {
+ "area": "德令哈市"
+ },
+ {
+ "area": "茫崖市"
+ },
+ {
+ "area": "乌兰县"
+ },
+ {
+ "area": "都兰县"
+ },
+ {
+ "area": "天峻县"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "宁夏回族自治区",
+ "citys": [
+ {
+ "city": "银川市",
+ "areas": [
+ {
+ "area": "永宁县"
+ },
+ {
+ "area": "贺兰县"
+ },
+ {
+ "area": "灵武市"
+ },
+ {
+ "area": "银川市"
+ }
+ ]
+ },
+ {
+ "city": "石嘴山市",
+ "areas": [
+ {
+ "area": "平罗县"
+ },
+ {
+ "area": "石嘴山市"
+ }
+ ]
+ },
+ {
+ "city": "吴忠市",
+ "areas": [
+ {
+ "area": "盐池县"
+ },
+ {
+ "area": "同心县"
+ },
+ {
+ "area": "青铜峡市"
+ },
+ {
+ "area": "吴忠市"
+ }
+ ]
+ },
+ {
+ "city": "固原市",
+ "areas": [
+ {
+ "area": "西吉县"
+ },
+ {
+ "area": "隆德县"
+ },
+ {
+ "area": "泾源县"
+ },
+ {
+ "area": "彭阳县"
+ },
+ {
+ "area": "固原市"
+ }
+ ]
+ },
+ {
+ "city": "中卫市",
+ "areas": [
+ {
+ "area": "中宁县"
+ },
+ {
+ "area": "海原县"
+ },
+ {
+ "area": "中卫市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "新疆维吾尔自治区",
+ "citys": [
+ {
+ "city": "乌鲁木齐市",
+ "areas": [
+ {
+ "area": "天山区"
+ },
+ {
+ "area": "沙依巴克区"
+ },
+ {
+ "area": "新市区"
+ },
+ {
+ "area": "水磨沟区"
+ },
+ {
+ "area": "头屯河区"
+ },
+ {
+ "area": "达坂城区"
+ },
+ {
+ "area": "米东区"
+ },
+ {
+ "area": "乌鲁木齐县"
+ }
+ ]
+ },
+ {
+ "city": "克拉玛依市",
+ "areas": [
+ {
+ "area": "独山子区"
+ },
+ {
+ "area": "克拉玛依区"
+ },
+ {
+ "area": "白碱滩区"
+ },
+ {
+ "area": "乌尔禾区"
+ }
+ ]
+ },
+ {
+ "city": "吐鲁番市",
+ "areas": [
+ {
+ "area": "高昌区"
+ },
+ {
+ "area": "鄯善县"
+ },
+ {
+ "area": "托克逊县"
+ }
+
+ ]
+ },
+ {
+ "city": "哈密市",
+ "areas": [
+ {
+ "area": "伊州区"
+ },
+ {
+ "area": "巴里坤哈萨克自治县"
+ },
+ {
+ "area": "伊吾县"
+ }
+ ]
+ },
+ {
+ "city": "昌吉回族自治州",
+ "areas": [
+ {
+ "area": "昌吉市"
+ },
+ {
+ "area": "阜康市"
+ },
+ {
+ "area": "呼图壁县"
+ },
+ {
+ "area": "玛纳斯县"
+ },
+ {
+ "area": "奇台县"
+ },
+ {
+ "area": "吉木萨尔县"
+ },
+ {
+ "area": "木垒哈萨克自治县"
+ }
+ ]
+ },
+ {
+ "city": "博尔塔拉蒙古自治州",
+ "areas": [
+ {
+ "area": "博乐市"
+ },
+ {
+ "area": "阿拉山口市"
+ },
+ {
+ "area": "精河县"
+ },
+ {
+ "area": "温泉县"
+ }
+ ]
+ },
+ {
+ "city": "巴音郭楞蒙古自治州",
+ "areas": [
+ {
+ "area": "库尔勒市"
+ },
+ {
+ "area": "轮台县"
+ },
+ {
+ "area": "尉犁县"
+ },
+ {
+ "area": "若羌县"
+ },
+ {
+ "area": "且末县"
+ },
+ {
+ "area": "焉耆回族自治县"
+ },
+ {
+ "area": "和静县"
+ },
+ {
+ "area": "和硕县"
+ },
+ {
+ "area": "博湖县"
+ }
+ ]
+ },
+ {
+ "city": "阿克苏地区",
+ "areas": [
+ {
+ "area": "阿克苏市"
+ },
+ {
+ "area": "库车市"
+ },
+ {
+ "area": "温宿县"
+ },
+ {
+ "area": "沙雅县"
+ },
+ {
+ "area": "新和县"
+ },
+ {
+ "area": "拜城县"
+ },
+ {
+ "area": "乌什县"
+ },
+ {
+ "area": "阿瓦提县"
+ },
+ {
+ "area": "柯坪县"
+ }
+ ]
+ },
+ {
+ "city": "克孜勒苏柯尔克孜自治州",
+ "areas": [
+ {
+ "area": "阿图什市"
+ },
+ {
+ "area": "阿克陶县"
+ },
+ {
+ "area": "阿合奇县"
+ },
+ {
+ "area": "乌恰县"
+ }
+ ]
+ },
+ {
+ "city": "喀什地区",
+ "areas": [
+ {
+ "area": "喀什市"
+ },
+ {
+ "area": "疏附县"
+ },
+ {
+ "area": "疏勒县"
+ },
+ {
+ "area": "英吉沙县"
+ },
+ {
+ "area": "泽普县"
+ },
+ {
+ "area": "莎车县"
+ },
+ {
+ "area": "叶城县"
+ },
+ {
+ "area": "麦盖提县"
+ },
+ {
+ "area": "岳普湖县"
+ },
+ {
+ "area": "伽师县"
+ },
+ {
+ "area": "巴楚县"
+ },
+ {
+ "area": "塔什库尔干塔吉克自治县"
+ }
+ ]
+ },
+ {
+ "city": "和田地区",
+ "areas": [
+ {
+ "area": "和田市"
+ },
+ {
+ "area": "和田县"
+ },
+ {
+ "area": "墨玉县"
+ },
+ {
+ "area": "皮山县"
+ },
+ {
+ "area": "洛浦县"
+ },
+ {
+ "area": "策勒县"
+ },
+ {
+ "area": "于田县"
+ },
+ {
+ "area": "民丰县"
+ }
+ ]
+ },
+ {
+ "city": "伊犁哈萨克自治州",
+ "areas": [
+ {
+ "area": "伊宁市"
+ },
+ {
+ "area": "奎屯市"
+ },
+ {
+ "area": "霍尔果斯市"
+ },
+ {
+ "area": "伊宁县"
+ },
+ {
+ "area": "察布查尔锡伯自治县"
+ },
+ {
+ "area": "霍城县"
+ },
+ {
+ "area": "巩留县"
+ },
+ {
+ "area": "新源县"
+ },
+ {
+ "area": "昭苏县"
+ },
+ {
+ "area": "特克斯县"
+ },
+ {
+ "area": "尼勒克县"
+ }
+ ]
+ },
+ {
+ "city": "塔城地区",
+ "areas": [
+ {
+ "area": "塔城市"
+ },
+ {
+ "area": "乌苏市"
+ },
+ {
+ "area": "沙湾市"
+ },
+ {
+ "area": "额敏县"
+ },
+ {
+ "area": "托里县"
+ },
+ {
+ "area": "裕民县"
+ },
+ {
+ "area": "和布克赛尔蒙古自治县"
+ }
+ ]
+ },
+ {
+ "city": "阿勒泰地区",
+ "areas": [
+ {
+ "area": "阿勒泰市"
+ },
+ {
+ "area": "布尔津县"
+ },
+ {
+ "area": "富蕴县"
+ },
+ {
+ "area": "福海县"
+ },
+ {
+ "area": "哈巴河县"
+ },
+ {
+ "area": "青河县"
+ },
+ {
+ "area": "吉木乃县"
+ }
+ ]
+ },
+ {
+ "city": "自治区直辖县级行政区划",
+ "areas": [
+ {
+ "area": "石河子市"
+ },
+ {
+ "area": "阿拉尔市"
+ },
+ {
+ "area": "图木舒克市"
+ },
+ {
+ "area": "五家渠市"
+ },
+ {
+ "area": "北屯市"
+ },
+ {
+ "area": "铁门关市"
+ },
+ {
+ "area": "双河市"
+ },
+ {
+ "area": "可克达拉市"
+ },
+ {
+ "area": "昆玉市"
+ },
+ {
+ "area": "胡杨河市"
+ },
+ {
+ "area": "新星市"
+ },
+ {
+ "area": "白杨市"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "台湾省",
+ "citys": [
+ {
+ "city": "台北市",
+ "areas": [
+ {
+ "area": "台北市"
+ }
+ ]
+ },
+ {
+ "city": "新北市",
+ "areas": [
+ {
+ "area": "新北市"
+ }
+ ]
+ },
+ {
+ "city": "桃园市",
+ "areas": [
+ {
+ "area": "桃园市"
+ }
+ ]
+ },
+ {
+ "city": "台中市",
+ "areas": [
+ {
+ "area": "台中市"
+ }
+ ]
+ },
+ {
+ "city": "台南市",
+ "areas": [
+ {
+ "area": "台南市"
+ }
+ ]
+ },
+ {
+ "city": "高雄市",
+ "areas": [
+ {
+ "area": "高雄市"
+ }
+ ]
+ },
+ {
+ "city": "基隆市",
+ "areas": [
+ {
+ "area": "基隆市"
+ }
+ ]
+ },
+ {
+ "city": "新竹市",
+ "areas": [
+ {
+ "area": "新竹市"
+ }
+ ]
+ },
+ {
+ "city": "嘉义市",
+ "areas": [
+ {
+ "area": "嘉义市"
+ }
+ ]
+ },
+ {
+ "city": "新竹县",
+ "areas": [
+ {
+ "area": "新竹县"
+ }
+ ]
+ },
+ {
+ "city": "苗栗县",
+ "areas": [
+ {
+ "area": "苗栗县"
+ }
+ ]
+ },
+ {
+ "city": "彰化县",
+ "areas": [
+ {
+ "area": "彰化县"
+ }
+ ]
+ },
+ {
+ "city": "南投县",
+ "areas": [
+ {
+ "area": "南投县"
+ }
+ ]
+ },
+ {
+ "city": "云林县",
+ "areas": [
+ {
+ "area": "云林县"
+ }
+ ]
+ },
+ {
+ "city": "嘉义县",
+ "areas": [
+ {
+ "area": "嘉义县"
+ }
+ ]
+ },
+ {
+ "city": "屏东县",
+ "areas": [
+ {
+ "area": "屏东县"
+ }
+ ]
+ },
+ {
+ "city": "宜兰县",
+ "areas": [
+ {
+ "area": "宜兰县"
+ }
+ ]
+ },
+ {
+ "city": "花莲县",
+ "areas": [
+ {
+ "area": "花莲县"
+ }
+ ]
+ },
+ {
+ "city": "台东县",
+ "areas": [
+ {
+ "area": "台东县"
+ }
+ ]
+ },
+ {
+ "city": "澎湖县",
+ "areas": [
+ {
+ "area": "澎湖县"
+ }
+ ]
+ },
+ {
+ "city": "连江县",
+ "areas": [
+ {
+ "area": "连江县"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "香港特别行政区",
+ "citys": [
+ {
+ "city": "香港特别行政区",
+ "areas": [
+ {
+ "area": "香港特别行政区"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "province": "澳门特别行政区",
+ "citys": [
+ {
+ "city": "澳门特别行政区",
+ "areas": [
+ {
+ "area": "澳门特别行政区"
+ }
+ ]
+ }
+ ]
+ }
+ ]
\ No newline at end of file
diff --git a/assess-admin/src/test/java/com/gkhy/admin/RegionTest.java b/assess-admin/src/test/java/com/gkhy/admin/RegionTest.java
new file mode 100644
index 0000000..13a25d5
--- /dev/null
+++ b/assess-admin/src/test/java/com/gkhy/admin/RegionTest.java
@@ -0,0 +1,116 @@
+package com.gkhy.admin;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.gkhy.assess.admin.GkhyAdminApplication;
+import com.gkhy.assess.system.domain.SysRegion;
+import com.gkhy.assess.system.service.SysRegionService;
+import com.gkhy.assess.system.service.impl.SysRegionServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+import sun.swing.plaf.GTKKeybindings;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = GkhyAdminApplication.class)
+//@ActiveProfiles("dev")
+@Slf4j
+public class RegionTest {
+
+ @Autowired
+ private SysRegionService regionService;
+
+ //添加疆外数据
+ @Test
+ public void addRegion() throws IOException {
+ String path="F:\\kzy\\codes\\java\\smart_assess\\assess-admin\\src\\main\\resources\\region.json";
+ StringBuilder stringBuilder=new StringBuilder();
+ BufferedReader br=new BufferedReader(new FileReader(new File(path)));
+ String s=null;
+ while ((s=br.readLine())!=null){
+ stringBuilder.append(s);
+ }
+ br.close();
+ JSONArray jsonArray = JSONObject.parseArray(stringBuilder.toString());
+
+ for(Object obj : jsonArray){
+ JSONObject jsonObject= (JSONObject) obj;
+ String pro= (String) jsonObject.get("province");
+ SysRegion region=new SysRegion()
+ .setName(pro)
+ .setRegionType(1);
+ regionService.save(region);
+ List<JSONObject> citys= (List<JSONObject>) jsonObject.get("citys");
+ if(citys.size()==1){
+ continue;
+ }
+ List<SysRegion> childRegion=new ArrayList<>();
+ for(JSONObject cityObject:citys){
+ String cityName= (String) cityObject.get("city");
+ SysRegion region2=new SysRegion()
+ .setName(cityName)
+ .setRegionType(1)
+ .setParentId(region.getId());
+ childRegion.add(region2);
+ }
+ regionService.saveBatch(childRegion);
+ }
+ }
+ //添加疆内数据
+ @Test
+ public void addRegion2() throws IOException {
+ String path="F:\\kzy\\codes\\java\\smart_assess\\assess-admin\\src\\main\\resources\\region.json";
+ StringBuilder stringBuilder=new StringBuilder();
+ BufferedReader br=new BufferedReader(new FileReader(new File(path)));
+ String s=null;
+ while ((s=br.readLine())!=null){
+ stringBuilder.append(s);
+ }
+ br.close();
+ JSONArray jsonArray = JSONObject.parseArray(stringBuilder.toString());
+
+ for(Object obj : jsonArray){
+ JSONObject jsonObject= (JSONObject) obj;
+ String pro= (String) jsonObject.get("province");
+ if(!pro.equalsIgnoreCase("新疆维吾尔自治区")){
+ continue;
+ }
+ List<JSONObject> citys= (List<JSONObject>) jsonObject.get("citys");
+ for(JSONObject cityObject:citys){
+ String cityName= (String) cityObject.get("city");
+ SysRegion region=new SysRegion()
+ .setName(cityName)
+ .setRegionType(0);
+ regionService.save(region);
+ List<JSONObject> areas= (List<JSONObject>) cityObject.get("areas");
+ List<SysRegion> childRegion=new ArrayList<>();
+ for(JSONObject areaObject:areas){
+ String areaName= (String) areaObject.get("area");
+ SysRegion region2=new SysRegion()
+ .setName(areaName)
+ .setRegionType(0)
+ .setParentId(region.getId());
+ childRegion.add(region2);
+ }
+ regionService.saveBatch(childRegion);
+ }
+
+ }
+
+
+
+ }
+}
diff --git a/assess-common/pom.xml b/assess-common/pom.xml
index 78cd94b..2e310ce 100644
--- a/assess-common/pom.xml
+++ b/assess-common/pom.xml
@@ -111,6 +111,11 @@
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ </dependency>
</dependencies>
</project>
\ No newline at end of file
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/constant/CacheConstant.java b/assess-common/src/main/java/com/gkhy/assess/common/constant/CacheConstant.java
index 053462c..62cab57 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/constant/CacheConstant.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/constant/CacheConstant.java
@@ -13,6 +13,15 @@
String CAPTCHA_CODE_KEY = "captcha_codes:";
+ String SYS_REGION_KEY ="sys_region";
+
+
+ /**
+ * 防重提交 redis key
+ */
+ String REPEAT_SUBMIT_KEY = "repeat_submit:";
+
+
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java b/assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java
index be277a8..ed74267 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java
@@ -7,6 +7,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
+import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -15,6 +16,7 @@
@Getter
@Setter
+@Accessors(chain = true)
@ApiModel(value = "baseEntity对象", description = "基础类")
public class BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/domain/PageDomain.java b/assess-common/src/main/java/com/gkhy/assess/common/domain/PageDomain.java
index e2c9f4d..f35ce52 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/domain/PageDomain.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/domain/PageDomain.java
@@ -1,7 +1,7 @@
package com.gkhy.assess.common.domain;
-import cn.hutool.core.util.StrUtil;
-import org.apache.commons.lang3.StringUtils;
+
+import com.gkhy.assess.common.utils.StringUtils;
public class PageDomain {
@@ -15,10 +15,10 @@
private Boolean reasonable=true;
public String getOrderBy(){
- if(StrUtil.isEmpty(orderByColumn)){
+ if(StringUtils.isEmpty(orderByColumn)){
return "";
}
- return StrUtil.toUnderlineCase(orderByColumn)+" "+isAsc;
+ return StringUtils.toUnderlineCase(orderByColumn)+" "+isAsc;
}
public Integer getPageNum() {
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java b/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java
index 5ca29e7..f9ba2c5 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java
@@ -1,5 +1,6 @@
package com.gkhy.assess.common.domain.vo;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -31,4 +32,8 @@
@ApiModelProperty("生产的token,接口请求头字段: Authorization")
private String token;
+
+ @ApiModelProperty("用户身份(0代表监管用户,1代表机构用户,2代表专家用户)")
+ private Integer identity;
+
}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/enums/AccessoryFileTypeEnum.java b/assess-common/src/main/java/com/gkhy/assess/common/enums/AccessoryFileTypeEnum.java
new file mode 100644
index 0000000..b413c40
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/enums/AccessoryFileTypeEnum.java
@@ -0,0 +1,38 @@
+package com.gkhy.assess.common.enums;
+
+/**
+ * 评估文件类型
+ *
+ */
+public enum AccessoryFileTypeEnum
+{
+ DEVICE_IMAGE(1, "评价机构项目现场勘验人员在主要装置前的合影照片"),
+ INVESTINGATION_IMAGE(2, "评价机构项目现场勘验照片"),
+ COMPANY_IMAGE(3, "评价机构项目现场勘验人员与企业陪同人员图片"),
+ INVESTINGATION_EAST_IMAGE(4, "预评价现场勘验照片-东"),
+ INVESTINGATION_SOUTH_IMAGE(5, "预评价现场勘验照片-南"),
+ INVESTINGATION_WEST_IMAGE(6, "预评价现场勘验照片-西"),
+ INVESTINGATION_NORTH_IMAGE(7, "预评价现场勘验照片-北"),
+ INVESTINGATION_VIDEO(8, "评价机构项目现场勘验视频"),
+ EXCODE(9, "二维码"),
+ PROARCHIVE_FILE(10, "安全评价过程控制记录文档附件");
+
+ private final Integer code;
+ private final String info;
+
+ AccessoryFileTypeEnum(Integer code, String info)
+ {
+ this.code = code;
+ this.info = info;
+ }
+
+ public Integer getCode()
+ {
+ return code;
+ }
+
+ public String getInfo()
+ {
+ return info;
+ }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/enums/ApproveStatusEnum.java b/assess-common/src/main/java/com/gkhy/assess/common/enums/ApproveStatusEnum.java
index 8e1a4e3..36dcc40 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/enums/ApproveStatusEnum.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/enums/ApproveStatusEnum.java
@@ -6,7 +6,7 @@
*/
public enum ApproveStatusEnum
{
- APPROVED(0, "审批通过"), APPROVING(1, "待审批"), FAIL(2, "未通过");
+ TEMPORARY(0, "暂存"), APPROVING(1, "待审批"), APPROVED(2, "审批通过"),REJECT(3, "审批驳回"),DISCARD(4, "废弃");
private final Integer code;
private final String info;
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/enums/ExpertTypeEnum.java b/assess-common/src/main/java/com/gkhy/assess/common/enums/ExpertTypeEnum.java
new file mode 100644
index 0000000..3854482
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/enums/ExpertTypeEnum.java
@@ -0,0 +1,29 @@
+package com.gkhy.assess.common.enums;
+
+/**
+ * 专家类型
+ *
+ */
+public enum ExpertTypeEnum
+{
+ SAFETY_ASSESS(1, "安全评价"), INSPECTION(2, "检验检测");
+
+ private final Integer code;
+ private final String info;
+
+ ExpertTypeEnum(Integer code, String info)
+ {
+ this.code = code;
+ this.info = info;
+ }
+
+ public Integer getCode()
+ {
+ return code;
+ }
+
+ public String getInfo()
+ {
+ return info;
+ }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/enums/RegionTypeEnum.java b/assess-common/src/main/java/com/gkhy/assess/common/enums/RegionTypeEnum.java
new file mode 100644
index 0000000..f790f53
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/enums/RegionTypeEnum.java
@@ -0,0 +1,29 @@
+package com.gkhy.assess.common.enums;
+
+/**
+ * 疆内疆外
+ *
+ */
+public enum RegionTypeEnum
+{
+ INSIDE(0, "疆内"), OUTSIDE(1, "疆外");
+
+ private final Integer code;
+ private final String info;
+
+ RegionTypeEnum(Integer code, String info)
+ {
+ this.code = code;
+ this.info = info;
+ }
+
+ public Integer getCode()
+ {
+ return code;
+ }
+
+ public String getInfo()
+ {
+ return info;
+ }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/filter/RepeatableFilter.java b/assess-common/src/main/java/com/gkhy/assess/common/filter/RepeatableFilter.java
new file mode 100644
index 0000000..c546e21
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/filter/RepeatableFilter.java
@@ -0,0 +1,47 @@
+package com.gkhy.assess.common.filter;
+
+import com.gkhy.assess.common.utils.StringUtils;
+import org.springframework.http.MediaType;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+/**
+ * Repeatable 过滤器
+ *
+ */
+public class RepeatableFilter implements Filter
+{
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException
+ {
+
+ }
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws IOException, ServletException
+ {
+ ServletRequest requestWrapper = null;
+ if (request instanceof HttpServletRequest
+ && StringUtils.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE))
+ {
+ requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response);
+ }
+ if (null == requestWrapper)
+ {
+ chain.doFilter(request, response);
+ }
+ else
+ {
+ chain.doFilter(requestWrapper, response);
+ }
+ }
+
+ @Override
+ public void destroy()
+ {
+
+ }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/filter/RepeatedlyRequestWrapper.java b/assess-common/src/main/java/com/gkhy/assess/common/filter/RepeatedlyRequestWrapper.java
new file mode 100644
index 0000000..828e76c
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/filter/RepeatedlyRequestWrapper.java
@@ -0,0 +1,77 @@
+package com.gkhy.assess.common.filter;
+
+
+import com.gkhy.assess.common.utils.http.HttpHelper;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * 构建可重复读取inputStream的request
+ *
+ * @author ruoyi
+ */
+public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper
+{
+ private final byte[] body;
+
+ public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException
+ {
+ super(request);
+ request.setCharacterEncoding("UTF-8");
+ response.setCharacterEncoding("UTF-8");
+
+ body = HttpHelper.getBodyString(request).getBytes("UTF-8");
+ }
+
+ @Override
+ public BufferedReader getReader() throws IOException
+ {
+ return new BufferedReader(new InputStreamReader(getInputStream()));
+ }
+
+ @Override
+ public ServletInputStream getInputStream() throws IOException
+ {
+ final ByteArrayInputStream bais = new ByteArrayInputStream(body);
+ return new ServletInputStream()
+ {
+ @Override
+ public int read() throws IOException
+ {
+ return bais.read();
+ }
+
+ @Override
+ public int available() throws IOException
+ {
+ return body.length;
+ }
+
+ @Override
+ public boolean isFinished()
+ {
+ return false;
+ }
+
+ @Override
+ public boolean isReady()
+ {
+ return false;
+ }
+
+ @Override
+ public void setReadListener(ReadListener readListener)
+ {
+
+ }
+ };
+ }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/filter/XssFilter.java b/assess-common/src/main/java/com/gkhy/assess/common/filter/XssFilter.java
new file mode 100644
index 0000000..2318d32
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/filter/XssFilter.java
@@ -0,0 +1,70 @@
+package com.gkhy.assess.common.filter;
+
+import com.gkhy.assess.common.utils.StringUtils;
+import org.springframework.http.HttpMethod;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 防止XSS攻击的过滤器
+ *
+ */
+public class XssFilter implements Filter
+{
+ /**
+ * 排除链接
+ */
+ public List<String> excludes = new ArrayList<>();
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException
+ {
+ String tempExcludes = filterConfig.getInitParameter("excludes");
+ if (StringUtils.isNotBlank(tempExcludes))
+ {
+ String[] url = tempExcludes.split(",");
+ for (int i = 0; url != null && i < url.length; i++)
+ {
+ excludes.add(url[i]);
+ }
+ }
+ }
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws IOException, ServletException
+ {
+ HttpServletRequest req = (HttpServletRequest) request;
+ HttpServletResponse resp = (HttpServletResponse) response;
+ if (handleExcludeURL(req, resp))
+ {
+ chain.doFilter(request, response);
+ return;
+ }
+ XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
+ chain.doFilter(xssRequest, response);
+ }
+
+ private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response)
+ {
+ String url = request.getServletPath();
+ String method = request.getMethod();
+ // GET DELETE 不过滤
+ if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method))
+ {
+ return true;
+ }
+ return StringUtils.matches(url, excludes);
+ }
+
+ @Override
+ public void destroy()
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/filter/XssHttpServletRequestWrapper.java b/assess-common/src/main/java/com/gkhy/assess/common/filter/XssHttpServletRequestWrapper.java
new file mode 100644
index 0000000..4de0bb9
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/filter/XssHttpServletRequestWrapper.java
@@ -0,0 +1,111 @@
+package com.gkhy.assess.common.filter;
+
+import com.gkhy.assess.common.utils.StringUtils;
+import com.gkhy.assess.common.utils.html.EscapeUtil;
+import org.apache.commons.io.IOUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+/**
+ * XSS过滤处理
+ *
+ */
+public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
+{
+ /**
+ * @param request
+ */
+ public XssHttpServletRequestWrapper(HttpServletRequest request)
+ {
+ super(request);
+ }
+
+ @Override
+ public String[] getParameterValues(String name)
+ {
+ String[] values = super.getParameterValues(name);
+ if (values != null)
+ {
+ int length = values.length;
+ String[] escapesValues = new String[length];
+ for (int i = 0; i < length; i++)
+ {
+ // 防xss攻击和过滤前后空格
+ escapesValues[i] = EscapeUtil.clean(values[i]).trim();
+ }
+ return escapesValues;
+ }
+ return super.getParameterValues(name);
+ }
+
+ @Override
+ public ServletInputStream getInputStream() throws IOException
+ {
+ // 非json类型,直接返回
+ if (!isJsonRequest())
+ {
+ return super.getInputStream();
+ }
+
+ // 为空,直接返回
+ String json = IOUtils.toString(super.getInputStream(), "utf-8");
+ if (StringUtils.isBlank(json))
+ {
+ return super.getInputStream();
+ }
+
+ // xss过滤
+ json = EscapeUtil.clean(json).trim();
+ byte[] jsonBytes = json.getBytes("utf-8");
+ final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes);
+ return new ServletInputStream()
+ {
+ @Override
+ public boolean isFinished()
+ {
+ return true;
+ }
+
+ @Override
+ public boolean isReady()
+ {
+ return true;
+ }
+
+ @Override
+ public int available() throws IOException
+ {
+ return jsonBytes.length;
+ }
+
+ @Override
+ public void setReadListener(ReadListener readListener)
+ {
+ }
+
+ @Override
+ public int read() throws IOException
+ {
+ return bis.read();
+ }
+ };
+ }
+
+ /**
+ * 是否是Json请求
+ *
+ * @param request
+ */
+ public boolean isJsonRequest()
+ {
+ String header = super.getHeader(HttpHeaders.CONTENT_TYPE);
+ return StringUtils.startWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);
+ }
+}
\ No newline at end of file
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/ConvertUtil.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/ConvertUtil.java
index 461c629..3e011ec 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/utils/ConvertUtil.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/ConvertUtil.java
@@ -1,6 +1,5 @@
package com.gkhy.assess.common.utils;
-import cn.hutool.core.util.StrUtil;
import org.apache.commons.lang3.ArrayUtils;
import java.math.BigDecimal;
@@ -72,7 +71,7 @@
}
final String valueStr = toStr(value, null);
- return StrUtil.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
+ return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
}
/**
@@ -112,7 +111,7 @@
return ((Number) value).byteValue();
}
final String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -163,7 +162,7 @@
return ((Number) value).shortValue();
}
final String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -210,7 +209,7 @@
return (Number) value;
}
final String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -261,7 +260,7 @@
return ((Number) value).intValue();
}
final String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -319,7 +318,7 @@
*/
public static Integer[] toIntArray(String split, String str)
{
- if (StrUtil.isEmpty(str))
+ if (StringUtils.isEmpty(str))
{
return new Integer[] {};
}
@@ -342,7 +341,7 @@
*/
public static Long[] toLongArray(String split, String str)
{
- if (StrUtil.isEmpty(str))
+ if (StringUtils.isEmpty(str))
{
return new Long[] {};
}
@@ -403,7 +402,7 @@
return ((Number) value).longValue();
}
final String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -455,7 +454,7 @@
return ((Number) value).doubleValue();
}
final String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -507,7 +506,7 @@
return ((Number) value).floatValue();
}
final String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -554,7 +553,7 @@
return (Boolean) value;
}
String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -610,7 +609,7 @@
return myE;
}
final String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -661,7 +660,7 @@
return BigInteger.valueOf((Long) value);
}
final String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -720,7 +719,7 @@
return new BigDecimal((Integer) value);
}
final String valueStr = toStr(value, null);
- if (StrUtil.isEmpty(valueStr))
+ if (StringUtils.isEmpty(valueStr))
{
return defaultValue;
}
@@ -806,7 +805,7 @@
*/
public static String str(byte[] bytes, String charset)
{
- return str(bytes, StrUtil.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+ return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
}
/**
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/JSONUtil.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/JSONUtil.java
new file mode 100644
index 0000000..df809f3
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/JSONUtil.java
@@ -0,0 +1,182 @@
+package com.gkhy.assess.common.utils;
+
+import com.fasterxml.jackson.core.JsonGenerationException;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class JSONUtil {
+ public static final String DEFAULT_FAIL = "\"Parse failed\"";
+ private static final ObjectMapper objectMapper = new ObjectMapper();
+ private static final ObjectWriter objectWriter = objectMapper.writerWithDefaultPrettyPrinter();
+
+ public static void marshal(File file, Object value) throws Exception
+ {
+ try
+ {
+ objectWriter.writeValue(file, value);
+ }
+ catch (JsonGenerationException e)
+ {
+ throw new Exception(e);
+ }
+ catch (JsonMappingException e)
+ {
+ throw new Exception(e);
+ }
+ catch (IOException e)
+ {
+ throw new Exception(e);
+ }
+ }
+
+ public static void marshal(OutputStream os, Object value) throws Exception
+ {
+ try
+ {
+ objectWriter.writeValue(os, value);
+ }
+ catch (JsonGenerationException e)
+ {
+ throw new Exception(e);
+ }
+ catch (JsonMappingException e)
+ {
+ throw new Exception(e);
+ }
+ catch (IOException e)
+ {
+ throw new Exception(e);
+ }
+ }
+
+ public static String marshal(Object value) throws Exception
+ {
+ try
+ {
+ return objectWriter.writeValueAsString(value);
+ }
+ catch (JsonGenerationException e)
+ {
+ throw new Exception(e);
+ }
+ catch (JsonMappingException e)
+ {
+ throw new Exception(e);
+ }
+ catch (IOException e)
+ {
+ throw new Exception(e);
+ }
+ }
+
+ public static byte[] marshalBytes(Object value) throws Exception
+ {
+ try
+ {
+ return objectWriter.writeValueAsBytes(value);
+ }
+ catch (JsonGenerationException e)
+ {
+ throw new Exception(e);
+ }
+ catch (JsonMappingException e)
+ {
+ throw new Exception(e);
+ }
+ catch (IOException e)
+ {
+ throw new Exception(e);
+ }
+ }
+
+ public static <T> T unmarshal(File file, Class<T> valueType) throws Exception
+ {
+ try
+ {
+ return objectMapper.readValue(file, valueType);
+ }
+ catch (JsonParseException e)
+ {
+ throw new Exception(e);
+ }
+ catch (JsonMappingException e)
+ {
+ throw new Exception(e);
+ }
+ catch (IOException e)
+ {
+ throw new Exception(e);
+ }
+ }
+
+ public static <T> T unmarshal(InputStream is, Class<T> valueType) throws Exception
+ {
+ try
+ {
+ return objectMapper.readValue(is, valueType);
+ }
+ catch (JsonParseException e)
+ {
+ throw new Exception(e);
+ }
+ catch (JsonMappingException e)
+ {
+ throw new Exception(e);
+ }
+ catch (IOException e)
+ {
+ throw new Exception(e);
+ }
+ }
+
+ public static <T> T unmarshal(String str, Class<T> valueType) throws Exception
+ {
+ try
+ {
+ return objectMapper.readValue(str, valueType);
+ }
+ catch (JsonParseException e)
+ {
+ throw new Exception(e);
+ }
+ catch (JsonMappingException e)
+ {
+ throw new Exception(e);
+ }
+ catch (IOException e)
+ {
+ throw new Exception(e);
+ }
+ }
+
+ public static <T> T unmarshal(byte[] bytes, Class<T> valueType) throws Exception
+ {
+ try
+ {
+ if (bytes == null)
+ {
+ bytes = new byte[0];
+ }
+ return objectMapper.readValue(bytes, 0, bytes.length, valueType);
+ }
+ catch (JsonParseException e)
+ {
+ throw new Exception(e);
+ }
+ catch (JsonMappingException e)
+ {
+ throw new Exception(e);
+ }
+ catch (IOException e)
+ {
+ throw new Exception(e);
+ }
+ }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java
index fec4f2d..cd30016 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java
@@ -8,6 +8,7 @@
import com.auth0.jwt.interfaces.DecodedJWT;
import com.gkhy.assess.common.exception.ApiException;
import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.crypto.hash.Md5Hash;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -111,5 +112,19 @@
}
+ /**
+ * 密码加密
+ * @param username
+ * @param password
+ * @param salt
+ * @return
+ */
+ public static String encryptPassword(String username,String password,String salt){
+ if(salt==null){
+ salt="";
+ }
+ return new Md5Hash(username+password+salt).toHex();
+ }
+
}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/SqlUtil.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/SqlUtil.java
index 765af77..e23134d 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/utils/SqlUtil.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/SqlUtil.java
@@ -1,7 +1,5 @@
package com.gkhy.assess.common.utils;
-
-import cn.hutool.core.util.StrUtil;
import com.gkhy.assess.common.exception.UtilException;
import java.util.List;
@@ -33,11 +31,11 @@
*/
public static String escapeOrderBySql(String value)
{
- if (StrUtil.isNotEmpty(value) && !isValidOrderBySql(value))
+ if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
{
throw new UtilException("参数不符合规范,不能进行查询");
}
- if (StrUtil.length(value) > ORDER_BY_MAX_LENGTH)
+ if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH)
{
throw new UtilException("参数已超过最大限制,不能进行查询");
}
@@ -57,14 +55,14 @@
*/
public static void filterKeyword(String value)
{
- if (StrUtil.isEmpty(value))
+ if (StringUtils.isEmpty(value))
{
return;
}
- List<String> sqlKeywords = StrUtil.split(SQL_REGEX, "\\|");
+ List<String> sqlKeywords = StringUtils.split(SQL_REGEX, "\\|");
for (String sqlKeyword : sqlKeywords)
{
- if (StrUtil.indexOfIgnoreCase(value, sqlKeyword) > -1)
+ if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1)
{
throw new UtilException("参数存在SQL注入风险");
}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/StringUtils.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/StringUtils.java
new file mode 100644
index 0000000..fa2ea40
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/StringUtils.java
@@ -0,0 +1,49 @@
+package com.gkhy.assess.common.utils;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import org.springframework.util.AntPathMatcher;
+
+import java.util.List;
+
+public class StringUtils extends StrUtil {
+
+ /**
+ * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串
+ *
+ * @param str 指定字符串
+ * @param strs 需要检查的字符串数组
+ * @return 是否匹配
+ */
+ public static boolean matches(String str, List<String> strs)
+ {
+ if (isBlank(str) || ObjectUtil.isEmpty(strs))
+ {
+ return false;
+ }
+ for (String pattern : strs)
+ {
+ if (isMatch(pattern, str))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 判断url是否与规则配置:
+ * ? 表示单个字符;
+ * * 表示一层路径内的任意字符串,不可跨层级;
+ * ** 表示任意层路径;
+ *
+ * @param pattern 匹配规则
+ * @param url 需要匹配的url
+ * @return
+ */
+ public static boolean isMatch(String pattern, String url)
+ {
+ AntPathMatcher matcher = new AntPathMatcher();
+ return matcher.match(pattern, url);
+ }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/html/EscapeUtil.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/html/EscapeUtil.java
new file mode 100644
index 0000000..04df21b
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/html/EscapeUtil.java
@@ -0,0 +1,167 @@
+package com.gkhy.assess.common.utils.html;
+
+import com.gkhy.assess.common.utils.StringUtils;
+
+/**
+ * 转义和反转义工具类
+ *
+ * @author ruoyi
+ */
+public class EscapeUtil
+{
+ public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)";
+
+ private static final char[][] TEXT = new char[64][];
+
+ static
+ {
+ for (int i = 0; i < 64; i++)
+ {
+ TEXT[i] = new char[] { (char) i };
+ }
+
+ // special HTML characters
+ TEXT['\''] = "'".toCharArray(); // 单引号
+ TEXT['"'] = """.toCharArray(); // 双引号
+ TEXT['&'] = "&".toCharArray(); // &符
+ TEXT['<'] = "<".toCharArray(); // 小于号
+ TEXT['>'] = ">".toCharArray(); // 大于号
+ }
+
+ /**
+ * 转义文本中的HTML字符为安全的字符
+ *
+ * @param text 被转义的文本
+ * @return 转义后的文本
+ */
+ public static String escape(String text)
+ {
+ return encode(text);
+ }
+
+ /**
+ * 还原被转义的HTML特殊字符
+ *
+ * @param content 包含转义符的HTML内容
+ * @return 转换后的字符串
+ */
+ public static String unescape(String content)
+ {
+ return decode(content);
+ }
+
+ /**
+ * 清除所有HTML标签,但是不删除标签内的内容
+ *
+ * @param content 文本
+ * @return 清除标签后的文本
+ */
+ public static String clean(String content)
+ {
+ return new HTMLFilter().filter(content);
+ }
+
+ /**
+ * Escape编码
+ *
+ * @param text 被编码的文本
+ * @return 编码后的字符
+ */
+ private static String encode(String text)
+ {
+ if (StringUtils.isEmpty(text))
+ {
+ return StringUtils.EMPTY;
+ }
+
+ final StringBuilder tmp = new StringBuilder(text.length() * 6);
+ char c;
+ for (int i = 0; i < text.length(); i++)
+ {
+ c = text.charAt(i);
+ if (c < 256)
+ {
+ tmp.append("%");
+ if (c < 16)
+ {
+ tmp.append("0");
+ }
+ tmp.append(Integer.toString(c, 16));
+ }
+ else
+ {
+ tmp.append("%u");
+ if (c <= 0xfff)
+ {
+ // issue#I49JU8@Gitee
+ tmp.append("0");
+ }
+ tmp.append(Integer.toString(c, 16));
+ }
+ }
+ return tmp.toString();
+ }
+
+ /**
+ * Escape解码
+ *
+ * @param content 被转义的内容
+ * @return 解码后的字符串
+ */
+ public static String decode(String content)
+ {
+ if (StringUtils.isEmpty(content))
+ {
+ return content;
+ }
+
+ StringBuilder tmp = new StringBuilder(content.length());
+ int lastPos = 0, pos = 0;
+ char ch;
+ while (lastPos < content.length())
+ {
+ pos = content.indexOf("%", lastPos);
+ if (pos == lastPos)
+ {
+ if (content.charAt(pos + 1) == 'u')
+ {
+ ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);
+ tmp.append(ch);
+ lastPos = pos + 6;
+ }
+ else
+ {
+ ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);
+ tmp.append(ch);
+ lastPos = pos + 3;
+ }
+ }
+ else
+ {
+ if (pos == -1)
+ {
+ tmp.append(content.substring(lastPos));
+ lastPos = content.length();
+ }
+ else
+ {
+ tmp.append(content.substring(lastPos, pos));
+ lastPos = pos;
+ }
+ }
+ }
+ return tmp.toString();
+ }
+
+ public static void main(String[] args)
+ {
+ String html = "<script>alert(1);</script>";
+ String escape = EscapeUtil.escape(html);
+ // String html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>";
+ // String html = "<123";
+ // String html = "123>";
+ System.out.println("clean: " + EscapeUtil.clean(html));
+ System.out.println("escape: " + escape);
+ System.out.println("unescape: " + EscapeUtil.unescape(escape));
+ }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/html/HTMLFilter.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/html/HTMLFilter.java
new file mode 100644
index 0000000..e82e083
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/html/HTMLFilter.java
@@ -0,0 +1,566 @@
+package com.gkhy.assess.common.utils.html;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * HTML过滤器,用于去除XSS漏洞隐患。
+ *
+ * @author ruoyi
+ */
+public final class HTMLFilter
+{
+ /**
+ * regex flag union representing /si modifiers in php
+ **/
+ private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
+ private static final Pattern P_COMMENTS = Pattern.compile("<!--(.*?)-->", Pattern.DOTALL);
+ private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI);
+ private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL);
+ private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);
+ private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);
+ private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI);
+ private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI);
+ private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);
+ private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?");
+ private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?");
+ private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");
+ private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))");
+ private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);
+ private static final Pattern P_END_ARROW = Pattern.compile("^>");
+ private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)");
+ private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)");
+ private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)");
+ private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)");
+ private static final Pattern P_AMP = Pattern.compile("&");
+ private static final Pattern P_QUOTE = Pattern.compile("\"");
+ private static final Pattern P_LEFT_ARROW = Pattern.compile("<");
+ private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");
+ private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");
+
+ // @xxx could grow large... maybe use sesat's ReferenceMap
+ private static final ConcurrentMap<String, Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>();
+ private static final ConcurrentMap<String, Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>();
+
+ /**
+ * set of allowed html elements, along with allowed attributes for each element
+ **/
+ private final Map<String, List<String>> vAllowed;
+ /**
+ * counts of open tags for each (allowable) html element
+ **/
+ private final Map<String, Integer> vTagCounts = new HashMap<>();
+
+ /**
+ * html elements which must always be self-closing (e.g. "<img />")
+ **/
+ private final String[] vSelfClosingTags;
+ /**
+ * html elements which must always have separate opening and closing tags (e.g. "<b></b>")
+ **/
+ private final String[] vNeedClosingTags;
+ /**
+ * set of disallowed html elements
+ **/
+ private final String[] vDisallowed;
+ /**
+ * attributes which should be checked for valid protocols
+ **/
+ private final String[] vProtocolAtts;
+ /**
+ * allowed protocols
+ **/
+ private final String[] vAllowedProtocols;
+ /**
+ * tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />")
+ **/
+ private final String[] vRemoveBlanks;
+ /**
+ * entities allowed within html markup
+ **/
+ private final String[] vAllowedEntities;
+ /**
+ * flag determining whether comments are allowed in input String.
+ */
+ private final boolean stripComment;
+ private final boolean encodeQuotes;
+ /**
+ * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "<b text </b>"
+ * becomes "<b> text </b>"). If set to false, unbalanced angle brackets will be html escaped.
+ */
+ private final boolean alwaysMakeTags;
+
+ /**
+ * Default constructor.
+ */
+ public HTMLFilter()
+ {
+ vAllowed = new HashMap<>();
+
+ final ArrayList<String> a_atts = new ArrayList<>();
+ a_atts.add("href");
+ a_atts.add("target");
+ vAllowed.put("a", a_atts);
+
+ final ArrayList<String> img_atts = new ArrayList<>();
+ img_atts.add("src");
+ img_atts.add("width");
+ img_atts.add("height");
+ img_atts.add("alt");
+ vAllowed.put("img", img_atts);
+
+ final ArrayList<String> no_atts = new ArrayList<>();
+ vAllowed.put("b", no_atts);
+ vAllowed.put("strong", no_atts);
+ vAllowed.put("i", no_atts);
+ vAllowed.put("em", no_atts);
+
+ vSelfClosingTags = new String[] { "img" };
+ vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" };
+ vDisallowed = new String[] {};
+ vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp.
+ vProtocolAtts = new String[] { "src", "href" };
+ vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" };
+ vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" };
+ stripComment = true;
+ encodeQuotes = true;
+ alwaysMakeTags = false;
+ }
+
+ /**
+ * Map-parameter configurable constructor.
+ *
+ * @param conf map containing configuration. keys match field names.
+ */
+ @SuppressWarnings("unchecked")
+ public HTMLFilter(final Map<String, Object> conf)
+ {
+
+ assert conf.containsKey("vAllowed") : "configuration requires vAllowed";
+ assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";
+ assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags";
+ assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed";
+ assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols";
+ assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts";
+ assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks";
+ assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities";
+
+ vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get("vAllowed"));
+ vSelfClosingTags = (String[]) conf.get("vSelfClosingTags");
+ vNeedClosingTags = (String[]) conf.get("vNeedClosingTags");
+ vDisallowed = (String[]) conf.get("vDisallowed");
+ vAllowedProtocols = (String[]) conf.get("vAllowedProtocols");
+ vProtocolAtts = (String[]) conf.get("vProtocolAtts");
+ vRemoveBlanks = (String[]) conf.get("vRemoveBlanks");
+ vAllowedEntities = (String[]) conf.get("vAllowedEntities");
+ stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true;
+ encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true;
+ alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;
+ }
+
+ private void reset()
+ {
+ vTagCounts.clear();
+ }
+
+ // ---------------------------------------------------------------
+ // my versions of some PHP library functions
+ public static String chr(final int decimal)
+ {
+ return String.valueOf((char) decimal);
+ }
+
+ public static String htmlSpecialChars(final String s)
+ {
+ String result = s;
+ result = regexReplace(P_AMP, "&", result);
+ result = regexReplace(P_QUOTE, """, result);
+ result = regexReplace(P_LEFT_ARROW, "<", result);
+ result = regexReplace(P_RIGHT_ARROW, ">", result);
+ return result;
+ }
+
+ // ---------------------------------------------------------------
+
+ /**
+ * given a user submitted input String, filter out any invalid or restricted html.
+ *
+ * @param input text (i.e. submitted by a user) than may contain html
+ * @return "clean" version of input, with only valid, whitelisted html elements allowed
+ */
+ public String filter(final String input)
+ {
+ reset();
+ String s = input;
+
+ s = escapeComments(s);
+
+ s = balanceHTML(s);
+
+ s = checkTags(s);
+
+ s = processRemoveBlanks(s);
+
+ // s = validateEntities(s);
+
+ return s;
+ }
+
+ public boolean isAlwaysMakeTags()
+ {
+ return alwaysMakeTags;
+ }
+
+ public boolean isStripComments()
+ {
+ return stripComment;
+ }
+
+ private String escapeComments(final String s)
+ {
+ final Matcher m = P_COMMENTS.matcher(s);
+ final StringBuffer buf = new StringBuffer();
+ if (m.find())
+ {
+ final String match = m.group(1); // (.*?)
+ m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));
+ }
+ m.appendTail(buf);
+
+ return buf.toString();
+ }
+
+ private String balanceHTML(String s)
+ {
+ if (alwaysMakeTags)
+ {
+ //
+ // try and form html
+ //
+ s = regexReplace(P_END_ARROW, "", s);
+ // 不追加结束标签
+ s = regexReplace(P_BODY_TO_END, "<$1>", s);
+ s = regexReplace(P_XML_CONTENT, "$1<$2", s);
+
+ }
+ else
+ {
+ //
+ // escape stray brackets
+ //
+ s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s);
+ s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s);
+
+ //
+ // the last regexp causes '<>' entities to appear
+ // (we need to do a lookahead assertion so that the last bracket can
+ // be used in the next pass of the regexp)
+ //
+ s = regexReplace(P_BOTH_ARROWS, "", s);
+ }
+
+ return s;
+ }
+
+ private String checkTags(String s)
+ {
+ Matcher m = P_TAGS.matcher(s);
+
+ final StringBuffer buf = new StringBuffer();
+ while (m.find())
+ {
+ String replaceStr = m.group(1);
+ replaceStr = processTag(replaceStr);
+ m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));
+ }
+ m.appendTail(buf);
+
+ // these get tallied in processTag
+ // (remember to reset before subsequent calls to filter method)
+ final StringBuilder sBuilder = new StringBuilder(buf.toString());
+ for (String key : vTagCounts.keySet())
+ {
+ for (int ii = 0; ii < vTagCounts.get(key); ii++)
+ {
+ sBuilder.append("</").append(key).append(">");
+ }
+ }
+ s = sBuilder.toString();
+
+ return s;
+ }
+
+ private String processRemoveBlanks(final String s)
+ {
+ String result = s;
+ for (String tag : vRemoveBlanks)
+ {
+ if (!P_REMOVE_PAIR_BLANKS.containsKey(tag))
+ {
+ P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));
+ }
+ result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);
+ if (!P_REMOVE_SELF_BLANKS.containsKey(tag))
+ {
+ P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));
+ }
+ result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);
+ }
+
+ return result;
+ }
+
+ private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s)
+ {
+ Matcher m = regex_pattern.matcher(s);
+ return m.replaceAll(replacement);
+ }
+
+ private String processTag(final String s)
+ {
+ // ending tags
+ Matcher m = P_END_TAG.matcher(s);
+ if (m.find())
+ {
+ final String name = m.group(1).toLowerCase();
+ if (allowed(name))
+ {
+ if (!inArray(name, vSelfClosingTags))
+ {
+ if (vTagCounts.containsKey(name))
+ {
+ vTagCounts.put(name, vTagCounts.get(name) - 1);
+ return "</" + name + ">";
+ }
+ }
+ }
+ }
+
+ // starting tags
+ m = P_START_TAG.matcher(s);
+ if (m.find())
+ {
+ final String name = m.group(1).toLowerCase();
+ final String body = m.group(2);
+ String ending = m.group(3);
+
+ // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );
+ if (allowed(name))
+ {
+ final StringBuilder params = new StringBuilder();
+
+ final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);
+ final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);
+ final List<String> paramNames = new ArrayList<>();
+ final List<String> paramValues = new ArrayList<>();
+ while (m2.find())
+ {
+ paramNames.add(m2.group(1)); // ([a-z0-9]+)
+ paramValues.add(m2.group(3)); // (.*?)
+ }
+ while (m3.find())
+ {
+ paramNames.add(m3.group(1)); // ([a-z0-9]+)
+ paramValues.add(m3.group(3)); // ([^\"\\s']+)
+ }
+
+ String paramName, paramValue;
+ for (int ii = 0; ii < paramNames.size(); ii++)
+ {
+ paramName = paramNames.get(ii).toLowerCase();
+ paramValue = paramValues.get(ii);
+
+ // debug( "paramName='" + paramName + "'" );
+ // debug( "paramValue='" + paramValue + "'" );
+ // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) );
+
+ if (allowedAttribute(name, paramName))
+ {
+ if (inArray(paramName, vProtocolAtts))
+ {
+ paramValue = processParamProtocol(paramValue);
+ }
+ params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\"");
+ }
+ }
+
+ if (inArray(name, vSelfClosingTags))
+ {
+ ending = " /";
+ }
+
+ if (inArray(name, vNeedClosingTags))
+ {
+ ending = "";
+ }
+
+ if (ending == null || ending.length() < 1)
+ {
+ if (vTagCounts.containsKey(name))
+ {
+ vTagCounts.put(name, vTagCounts.get(name) + 1);
+ }
+ else
+ {
+ vTagCounts.put(name, 1);
+ }
+ }
+ else
+ {
+ ending = " /";
+ }
+ return "<" + name + params + ending + ">";
+ }
+ else
+ {
+ return "";
+ }
+ }
+
+ // comments
+ m = P_COMMENT.matcher(s);
+ if (!stripComment && m.find())
+ {
+ return "<" + m.group() + ">";
+ }
+
+ return "";
+ }
+
+ private String processParamProtocol(String s)
+ {
+ s = decodeEntities(s);
+ final Matcher m = P_PROTOCOL.matcher(s);
+ if (m.find())
+ {
+ final String protocol = m.group(1);
+ if (!inArray(protocol, vAllowedProtocols))
+ {
+ // bad protocol, turn into local anchor link instead
+ s = "#" + s.substring(protocol.length() + 1);
+ if (s.startsWith("#//"))
+ {
+ s = "#" + s.substring(3);
+ }
+ }
+ }
+
+ return s;
+ }
+
+ private String decodeEntities(String s)
+ {
+ StringBuffer buf = new StringBuffer();
+
+ Matcher m = P_ENTITY.matcher(s);
+ while (m.find())
+ {
+ final String match = m.group(1);
+ final int decimal = Integer.decode(match).intValue();
+ m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+ }
+ m.appendTail(buf);
+ s = buf.toString();
+
+ buf = new StringBuffer();
+ m = P_ENTITY_UNICODE.matcher(s);
+ while (m.find())
+ {
+ final String match = m.group(1);
+ final int decimal = Integer.valueOf(match, 16).intValue();
+ m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+ }
+ m.appendTail(buf);
+ s = buf.toString();
+
+ buf = new StringBuffer();
+ m = P_ENCODE.matcher(s);
+ while (m.find())
+ {
+ final String match = m.group(1);
+ final int decimal = Integer.valueOf(match, 16).intValue();
+ m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+ }
+ m.appendTail(buf);
+ s = buf.toString();
+
+ s = validateEntities(s);
+ return s;
+ }
+
+ private String validateEntities(final String s)
+ {
+ StringBuffer buf = new StringBuffer();
+
+ // validate entities throughout the string
+ Matcher m = P_VALID_ENTITIES.matcher(s);
+ while (m.find())
+ {
+ final String one = m.group(1); // ([^&;]*)
+ final String two = m.group(2); // (?=(;|&|$))
+ m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));
+ }
+ m.appendTail(buf);
+
+ return encodeQuotes(buf.toString());
+ }
+
+ private String encodeQuotes(final String s)
+ {
+ if (encodeQuotes)
+ {
+ StringBuffer buf = new StringBuffer();
+ Matcher m = P_VALID_QUOTES.matcher(s);
+ while (m.find())
+ {
+ final String one = m.group(1); // (>|^)
+ final String two = m.group(2); // ([^<]+?)
+ final String three = m.group(3); // (<|$)
+ // 不替换双引号为",防止json格式无效 regexReplace(P_QUOTE, """, two)
+ m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three));
+ }
+ m.appendTail(buf);
+ return buf.toString();
+ }
+ else
+ {
+ return s;
+ }
+ }
+
+ private String checkEntity(final String preamble, final String term)
+ {
+
+ return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble;
+ }
+
+ private boolean isValidEntity(final String entity)
+ {
+ return inArray(entity, vAllowedEntities);
+ }
+
+ private static boolean inArray(final String s, final String[] array)
+ {
+ for (String item : array)
+ {
+ if (item != null && item.equals(s))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean allowed(final String name)
+ {
+ return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);
+ }
+
+ private boolean allowedAttribute(final String name, final String paramName)
+ {
+ return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));
+ }
+}
\ No newline at end of file
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/http/HttpHelper.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/http/HttpHelper.java
new file mode 100644
index 0000000..ea7edb9
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/http/HttpHelper.java
@@ -0,0 +1,55 @@
+package com.gkhy.assess.common.utils.http;
+
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 通用http工具封装
+ *
+ */
+public class HttpHelper
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class);
+
+ public static String getBodyString(ServletRequest request)
+ {
+ StringBuilder sb = new StringBuilder();
+ BufferedReader reader = null;
+ try (InputStream inputStream = request.getInputStream())
+ {
+ reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
+ String line = "";
+ while ((line = reader.readLine()) != null)
+ {
+ sb.append(line);
+ }
+ }
+ catch (IOException e)
+ {
+ LOGGER.warn("getBodyString出现问题!");
+ }
+ finally
+ {
+ if (reader != null)
+ {
+ try
+ {
+ reader.close();
+ }
+ catch (IOException e)
+ {
+ LOGGER.error(ExceptionUtils.getMessage(e));
+ }
+ }
+ }
+ return sb.toString();
+ }
+}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/utils/http/HttpUtils.java b/assess-common/src/main/java/com/gkhy/assess/common/utils/http/HttpUtils.java
new file mode 100644
index 0000000..b697f1e
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/utils/http/HttpUtils.java
@@ -0,0 +1,265 @@
+package com.gkhy.assess.common.utils.http;
+
+import com.gkhy.assess.common.utils.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.ConnectException;
+import java.net.SocketTimeoutException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
+import java.security.cert.X509Certificate;
+
+/**
+ * 通用http发送方法
+ *
+ * @author ruoyi
+ */
+public class HttpUtils
+{
+ private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
+
+ /**
+ * 向指定 URL 发送GET方法的请求
+ *
+ * @param url 发送请求的 URL
+ * @return 所代表远程资源的响应结果
+ */
+ public static String sendGet(String url)
+ {
+ return sendGet(url, StringUtils.EMPTY);
+ }
+
+ /**
+ * 向指定 URL 发送GET方法的请求
+ *
+ * @param url 发送请求的 URL
+ * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+ * @return 所代表远程资源的响应结果
+ */
+ public static String sendGet(String url, String param)
+ {
+ return sendGet(url, param, "UTF-8");
+ }
+
+ /**
+ * 向指定 URL 发送GET方法的请求
+ *
+ * @param url 发送请求的 URL
+ * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+ * @param contentType 编码类型
+ * @return 所代表远程资源的响应结果
+ */
+ public static String sendGet(String url, String param, String contentType)
+ {
+ StringBuilder result = new StringBuilder();
+ BufferedReader in = null;
+ try
+ {
+ String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url;
+ log.info("sendGet - {}", urlNameString);
+ URL realUrl = new URL(urlNameString);
+ URLConnection connection = realUrl.openConnection();
+ connection.setRequestProperty("accept", "*/*");
+ connection.setRequestProperty("connection", "Keep-Alive");
+ connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+ connection.connect();
+ in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType));
+ String line;
+ while ((line = in.readLine()) != null)
+ {
+ result.append(line);
+ }
+ log.info("recv - {}", result);
+ }
+ catch (ConnectException e)
+ {
+ log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e);
+ }
+ catch (SocketTimeoutException e)
+ {
+ log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e);
+ }
+ catch (IOException e)
+ {
+ log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e);
+ }
+ catch (Exception e)
+ {
+ log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e);
+ }
+ finally
+ {
+ try
+ {
+ if (in != null)
+ {
+ in.close();
+ }
+ }
+ catch (Exception ex)
+ {
+ log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
+ }
+ }
+ return result.toString();
+ }
+
+ /**
+ * 向指定 URL 发送POST方法的请求
+ *
+ * @param url 发送请求的 URL
+ * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+ * @return 所代表远程资源的响应结果
+ */
+ public static String sendPost(String url, String param)
+ {
+ PrintWriter out = null;
+ BufferedReader in = null;
+ StringBuilder result = new StringBuilder();
+ try
+ {
+ log.info("sendPost - {}", url);
+ URL realUrl = new URL(url);
+ URLConnection conn = realUrl.openConnection();
+ conn.setRequestProperty("accept", "*/*");
+ conn.setRequestProperty("connection", "Keep-Alive");
+ conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+ conn.setRequestProperty("Accept-Charset", "utf-8");
+ conn.setRequestProperty("contentType", "utf-8");
+ conn.setDoOutput(true);
+ conn.setDoInput(true);
+ out = new PrintWriter(conn.getOutputStream());
+ out.print(param);
+ out.flush();
+ in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
+ String line;
+ while ((line = in.readLine()) != null)
+ {
+ result.append(line);
+ }
+ log.info("recv - {}", result);
+ }
+ catch (ConnectException e)
+ {
+ log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+ }
+ catch (SocketTimeoutException e)
+ {
+ log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+ }
+ catch (IOException e)
+ {
+ log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+ }
+ catch (Exception e)
+ {
+ log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+ }
+ finally
+ {
+ try
+ {
+ if (out != null)
+ {
+ out.close();
+ }
+ if (in != null)
+ {
+ in.close();
+ }
+ }
+ catch (IOException ex)
+ {
+ log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
+ }
+ }
+ return result.toString();
+ }
+
+ public static String sendSSLPost(String url, String param)
+ {
+ StringBuilder result = new StringBuilder();
+ String urlNameString = url + "?" + param;
+ try
+ {
+ log.info("sendSSLPost - {}", urlNameString);
+ SSLContext sc = SSLContext.getInstance("SSL");
+ sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());
+ URL console = new URL(urlNameString);
+ HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
+ conn.setRequestProperty("accept", "*/*");
+ conn.setRequestProperty("connection", "Keep-Alive");
+ conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+ conn.setRequestProperty("Accept-Charset", "utf-8");
+ conn.setRequestProperty("contentType", "utf-8");
+ conn.setDoOutput(true);
+ conn.setDoInput(true);
+
+ conn.setSSLSocketFactory(sc.getSocketFactory());
+ conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
+ conn.connect();
+ InputStream is = conn.getInputStream();
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ String ret = "";
+ while ((ret = br.readLine()) != null)
+ {
+ if (ret != null && !"".equals(ret.trim()))
+ {
+ result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
+ }
+ }
+ log.info("recv - {}", result);
+ conn.disconnect();
+ br.close();
+ }
+ catch (ConnectException e)
+ {
+ log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);
+ }
+ catch (SocketTimeoutException e)
+ {
+ log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+ }
+ catch (IOException e)
+ {
+ log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);
+ }
+ catch (Exception e)
+ {
+ log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);
+ }
+ return result.toString();
+ }
+
+ private static class TrustAnyTrustManager implements X509TrustManager
+ {
+ @Override
+ public void checkClientTrusted(X509Certificate[] chain, String authType)
+ {
+ }
+
+ @Override
+ public void checkServerTrusted(X509Certificate[] chain, String authType)
+ {
+ }
+
+ @Override
+ public X509Certificate[] getAcceptedIssuers()
+ {
+ return new X509Certificate[] {};
+ }
+ }
+
+ private static class TrustAnyHostnameVerifier implements HostnameVerifier
+ {
+ @Override
+ public boolean verify(String hostname, SSLSession session)
+ {
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/validate/AgencyGroup.java b/assess-common/src/main/java/com/gkhy/assess/common/validate/AgencyGroup.java
index 7ea4634..3be4707 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/validate/AgencyGroup.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/validate/AgencyGroup.java
@@ -1,7 +1,9 @@
package com.gkhy.assess.common.validate;
+import javax.validation.groups.Default;
+
/**
* 机构校验分组
*/
-public interface AgencyGroup {
+public interface AgencyGroup extends Default {
}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/validate/ExpertGroup.java b/assess-common/src/main/java/com/gkhy/assess/common/validate/ExpertGroup.java
index fe24b92..3ee9c05 100644
--- a/assess-common/src/main/java/com/gkhy/assess/common/validate/ExpertGroup.java
+++ b/assess-common/src/main/java/com/gkhy/assess/common/validate/ExpertGroup.java
@@ -1,7 +1,9 @@
package com.gkhy.assess.common.validate;
+import javax.validation.groups.Default;
+
/**
* 专家校验分组
*/
-public interface ExpertGroup {
+public interface ExpertGroup extends Default {
}
diff --git a/assess-common/src/main/java/com/gkhy/assess/common/validate/MonitorGroup.java b/assess-common/src/main/java/com/gkhy/assess/common/validate/MonitorGroup.java
new file mode 100644
index 0000000..3fde1bf
--- /dev/null
+++ b/assess-common/src/main/java/com/gkhy/assess/common/validate/MonitorGroup.java
@@ -0,0 +1,9 @@
+package com.gkhy.assess.common.validate;
+
+import javax.validation.groups.Default;
+
+/**
+ * 监管用户校验分组
+ */
+public interface MonitorGroup extends Default {
+}
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java b/assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java
index 41fed63..f810eb2 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java
@@ -1,9 +1,9 @@
package com.gkhy.assess.framework.aop;
-import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.json.JSONObject;
+import com.gkhy.assess.common.utils.StringUtils;
import com.gkhy.assess.system.utils.ShiroUtils;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
@@ -54,7 +54,7 @@
StringBuffer requestURL = request.getRequestURL();
JSONObject webLog = new JSONObject();
String urlStr = request.getRequestURL().toString();
- webLog.put("basePath",StrUtil.removeSuffix(urlStr, URLUtil.url(urlStr).getPath()));
+ webLog.put("basePath", StringUtils.removeSuffix(urlStr, URLUtil.url(urlStr).getPath()));
webLog.put("ip", ServletUtil.getClientIP(request,null));
webLog.put("method",request.getMethod());
Object params=getParameter(method, joinPoint.getArgs());
@@ -111,7 +111,7 @@
if (requestParam != null) {
Map<String, Object> map = new HashMap<>();
String key = parameters[i].getName();
- if (StrUtil.isNotEmpty(requestParam.value())) {
+ if (StringUtils.isNotEmpty(requestParam.value())) {
key = requestParam.value();
}
map.put(key, args[i]);
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java b/assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java
index 88c51df..579768a 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java
@@ -1,6 +1,9 @@
package com.gkhy.assess.framework.config;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
@@ -10,6 +13,8 @@
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.TimeZone;
/**
@@ -24,15 +29,33 @@
@MapperScan("com.gkhy.**.mapper")
public class ApplicationConfig
{
+
+ @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
+ private String pattern;
+
/**
* 时区配置
*/
+// @Bean
+// public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization()
+// {
+// return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
+// }
+
@Bean
- public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization()
- {
- return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
+ public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
+ return builder -> {
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+
+ //返回时间数据序列化
+ builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
+ //接收时间数据反序列化
+ builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
+ builder.timeZone(TimeZone.getDefault());
+ };
}
+
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/config/FilterConfig.java b/assess-framework/src/main/java/com/gkhy/assess/framework/config/FilterConfig.java
new file mode 100644
index 0000000..94d83f8
--- /dev/null
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/config/FilterConfig.java
@@ -0,0 +1,58 @@
+package com.gkhy.assess.framework.config;
+
+import com.gkhy.assess.common.filter.RepeatableFilter;
+import com.gkhy.assess.common.filter.XssFilter;
+import com.gkhy.assess.common.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.DispatcherType;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Filter配置
+ *
+ */
+@Configuration
+public class FilterConfig
+{
+ @Value("${xss.excludes}")
+ private String excludes;
+
+ @Value("${xss.urlPatterns}")
+ private String urlPatterns;
+//
+// @SuppressWarnings({ "rawtypes", "unchecked" })
+// @Bean
+// @ConditionalOnProperty(value = "xss.enabled", havingValue = "true")
+// public FilterRegistrationBean xssFilterRegistration()
+// {
+// FilterRegistrationBean registration = new FilterRegistrationBean();
+// registration.setDispatcherTypes(DispatcherType.REQUEST);
+// registration.setFilter(new XssFilter());
+// registration.addUrlPatterns(String.valueOf(StringUtils.split(urlPatterns, ",")));
+// registration.setName("xssFilter");
+// registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE);
+// Map<String, String> initParameters = new HashMap<String, String>();
+// initParameters.put("excludes", excludes);
+// registration.setInitParameters(initParameters);
+// return registration;
+// }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Bean
+ public FilterRegistrationBean someFilterRegistration()
+ {
+ FilterRegistrationBean registration = new FilterRegistrationBean();
+ registration.setFilter(new RepeatableFilter());
+ registration.addUrlPatterns("/*");
+ registration.setName("repeatableFilter");
+ registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE);
+ return registration;
+ }
+
+}
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java b/assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java
index 9ce2f10..b03009d 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java
@@ -1,6 +1,7 @@
package com.gkhy.assess.framework.config;
import com.gkhy.assess.framework.interceptor.LogInterceptor;
+import com.gkhy.assess.framework.interceptor.RepeatSubmitInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@@ -13,11 +14,14 @@
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
- @Value("${image.root_path}")
- private String uploadRootPath;
+ @Value("${image.upload_path}")
+ private String uploadPath;
@Autowired
private LogInterceptor logInterceptor;
+
+ @Autowired
+ private RepeatSubmitInterceptor repeatSubmitInterceptor;
/**
* 配置图片访问路径
@@ -26,13 +30,14 @@
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String systemDir=System.getProperty("user.dir");
- registry.addResourceHandler("/api/assess_file/**").addResourceLocations("file:"+systemDir+ File.separator+uploadRootPath+File.separator);
+ registry.addResourceHandler("/upload/**").addResourceLocations("file:"+systemDir+ File.separator+uploadPath+File.separator);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(logInterceptor)
.addPathPatterns("/**");
+ registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
}
}
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java b/assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java
index d4b5872..633d963 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java
@@ -30,7 +30,7 @@
@ExceptionHandler(value = ApiException.class)
public CommonResult handle(ApiException e){
- writeExceptionLogFile(e);
+ // writeExceptionLogFile(e);
if(e.getErrorCode()!=null){
return CommonResult.failed(e.getErrorCode());
}
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/LogInterceptor.java b/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/LogInterceptor.java
index 03740b0..33eef52 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/LogInterceptor.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/LogInterceptor.java
@@ -13,7 +13,6 @@
/**
* @ClassName LogInterceptor
* @Description TODO
- * @Date 2021/7/5 14:56
**/
@Component
public class LogInterceptor implements HandlerInterceptor {
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/RepeatSubmitInterceptor.java b/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/RepeatSubmitInterceptor.java
new file mode 100644
index 0000000..5ff614b
--- /dev/null
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/RepeatSubmitInterceptor.java
@@ -0,0 +1,51 @@
+package com.gkhy.assess.framework.interceptor;
+
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.exception.ApiException;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Method;
+
+/**
+ * 防止器重复提交拦截
+ *
+ */
+@Component
+public abstract class RepeatSubmitInterceptor implements HandlerInterceptor
+{
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
+ {
+ if (handler instanceof HandlerMethod)
+ {
+ HandlerMethod handlerMethod = (HandlerMethod) handler;
+ Method method = handlerMethod.getMethod();
+ RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class);
+ if (annotation != null)
+ {
+ if (this.isRepeatSubmit(request, annotation))
+ {
+ throw new ApiException(annotation.message());
+ }
+ }
+ return true;
+ }
+ else
+ {
+ return true;
+ }
+ }
+
+ /**
+ * 验证是否重复提交由子类实现具体的防重复提交的规则
+ *
+ * @param request 请求对象
+ * @param annotation 防复注解
+ * @return 结果
+ */
+ public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) throws Exception;
+}
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/SameUrlDataInterceptor.java b/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/SameUrlDataInterceptor.java
new file mode 100644
index 0000000..4da74f7
--- /dev/null
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/SameUrlDataInterceptor.java
@@ -0,0 +1,106 @@
+package com.gkhy.assess.framework.interceptor;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gkhy.assess.common.annotation.RepeatSubmit;
+import com.gkhy.assess.common.constant.CacheConstant;
+import com.gkhy.assess.common.filter.RepeatedlyRequestWrapper;
+import com.gkhy.assess.common.utils.JwtTokenUtil;
+import com.gkhy.assess.common.utils.RedisUtils;
+import com.gkhy.assess.common.utils.StringUtils;
+import com.gkhy.assess.common.utils.http.HttpHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 判断请求url和数据是否和上一次相同,
+ * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。
+ *
+ * @author ruoyi
+ */
+@Component
+public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
+{
+ public final String REPEAT_PARAMS = "repeatParams";
+
+ public final String REPEAT_TIME = "repeatTime";
+
+
+ @Autowired
+ private RedisUtils redisUtils;
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) throws Exception {
+ String nowParams = "";
+ if (request instanceof RepeatedlyRequestWrapper)
+ {
+ RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request;
+ nowParams = HttpHelper.getBodyString(repeatedlyRequest);
+ }
+
+ // body参数为空,获取Parameter的数据
+ if (StringUtils.isBlank(nowParams))
+ {
+ nowParams = JSONObject.toJSONString(request.getParameterMap());
+ }
+ Map<String, Object> nowDataMap = new HashMap<String, Object>();
+ nowDataMap.put(REPEAT_PARAMS, nowParams);
+ nowDataMap.put(REPEAT_TIME, System.currentTimeMillis());
+
+ // 请求地址(作为存放cache的key值)
+ String url = request.getRequestURI();
+
+ // 唯一值(没有消息头则使用请求地址)
+ String submitKey = StringUtils.trimToEmpty(request.getHeader(JwtTokenUtil.USER_LOGIN_TOKEN));
+
+ // 唯一标识(指定key + url + 消息头)
+ String cacheRepeatKey = CacheConstant.REPEAT_SUBMIT_KEY + url + submitKey;
+
+ Object sessionObj = redisUtils.get(cacheRepeatKey);
+ if (sessionObj != null)
+ {
+ Map<String, Object> sessionMap = (Map<String, Object>) sessionObj;
+ if (sessionMap.containsKey(url))
+ {
+ Map<String, Object> preDataMap = (Map<String, Object>) sessionMap.get(url);
+ if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval()))
+ {
+ return true;
+ }
+ }
+ }
+ Map<String, Object> cacheMap = new HashMap<String, Object>();
+ cacheMap.put(url, nowDataMap);
+ redisUtils.set(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS);
+ return false;
+ }
+
+ /**
+ * 判断参数是否相同
+ */
+ private boolean compareParams(Map<String, Object> nowMap, Map<String, Object> preMap)
+ {
+ String nowParams = (String) nowMap.get(REPEAT_PARAMS);
+ String preParams = (String) preMap.get(REPEAT_PARAMS);
+ return nowParams.equals(preParams);
+ }
+
+ /**
+ * 判断两次间隔时间
+ */
+ private boolean compareTime(Map<String, Object> nowMap, Map<String, Object> preMap, int interval)
+ {
+ long time1 = (Long) nowMap.get(REPEAT_TIME);
+ long time2 = (Long) preMap.get(REPEAT_TIME);
+ if ((time1 - time2) < interval)
+ {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java
index eccc136..98bb8c4 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java
@@ -62,25 +62,44 @@
chain.addPathDefinition("/swagger-resources/**","anon");
chain.addPathDefinition("/doc.html", "anon");
chain.addPathDefinition("/v2/api-docs", "anon");
+ chain.addPathDefinition("/favicon.ico","anon");
chain.addPathDefinition("/static/**", "anon");
+ // 配置shiro错误从定向问题 /error 路径的错误处理
chain.addPathDefinition("/error", "anon");
+ chain.addPathDefinition("/upload/**", "anon");
chain.addPathDefinition("/account/login","anon");
- // chain.addPathDefinition("/api/account/login","anon");
chain.addPathDefinition("/logout", "logout");
- chain.addPathDefinition("/system/notice/noticeList","anon");
- chain.addPathDefinition("/system/notice/getNoticeById","anon");
+ chain.addPathDefinition("/notice/noticeList","anon");
+ chain.addPathDefinition("/notice/getNoticeById","anon");
+ chain.addPathDefinition("/law/lawList","anon");
+ chain.addPathDefinition("/law/getLawById","anon");
+ chain.addPathDefinition("/agency/agencyList","anon");
+ chain.addPathDefinition("/agency/getAgencyById","anon");
- chain.addPathDefinition("/system/law/lawList","anon");
- chain.addPathDefinition("/system/law/getLawById","anon");
+ chain.addPathDefinition("/system/dictType/getDictDataByType","anon");
- chain.addPathDefinition("/system/agency/agencyList","anon");
- chain.addPathDefinition("/system/agency/getAgencyById","anon");
- chain.addPathDefinition("/system/user/agencyRegister","anon");
+
+ chain.addPathDefinition("/system/agency/checkAgencyNameUnique","anon");
+ chain.addPathDefinition("/system/user/addAgency","anon");
+ chain.addPathDefinition("/system/user/checkUserNameUnique","anon");
+ chain.addPathDefinition("/system/user/checkPhoneUnique","anon");
chain.addPathDefinition("/system/captcha/captchaImage","anon");
+ chain.addPathDefinition("/system/region/regionTree","anon");
+
+ chain.addPathDefinition("/system/common/uploadFile","anon");
+ chain.addPathDefinition("/system/common/removeFile","anon");
+
+
+
+
+
+
+
+
//除了以上的请求外,其它请求都需要登录
chain.addPathDefinition("/**", "jwtFilter,authc"); // 需登录才能访问
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java
index 84bdc4d..a56af8e 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java
@@ -1,6 +1,7 @@
package com.gkhy.assess.framework.shiro.realm;
import com.gkhy.assess.common.enums.UserIdentityEnum;
+import com.gkhy.assess.common.exception.ApiException;
import com.gkhy.assess.common.utils.RequestUtil;
import com.gkhy.assess.common.utils.SpringContextUtils;
import com.gkhy.assess.framework.shiro.JwtToken;
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java
index a6676c0..31cf00c 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java
@@ -1,6 +1,8 @@
package com.gkhy.assess.framework.shiro.service;
import com.gkhy.assess.common.constant.CacheConstant;
+import com.gkhy.assess.common.enums.ApproveStatusEnum;
+import com.gkhy.assess.common.enums.UserIdentityEnum;
import com.gkhy.assess.common.enums.UserStatusEnum;
import com.gkhy.assess.common.exception.ApiException;
import com.gkhy.assess.common.utils.JwtTokenUtil;
@@ -34,13 +36,18 @@
public void validUser(SysUser sysUser){
if(sysUser==null) {
- throw new ApiException("用户不存在");
+ throw new AuthenticationException("用户不存在");
}
if(UserStatusEnum.DELETED.getCode().equals(sysUser.getDelFlag())){
- throw new ApiException("用户已被删除");
+ throw new AuthenticationException("用户已被删除");
}
if(UserStatusEnum.DISABLE.getCode().equals(sysUser.getStatus())){
- throw new ApiException("用户已被停用");
+ throw new AuthenticationException("用户已被停用");
+ }
+ if(UserIdentityEnum.AGENCY.getCode().equals(sysUser.getIdentity())){
+ if(!ApproveStatusEnum.APPROVED.getCode().equals(sysUser.getState())){
+ throw new AuthenticationException("机构账户审批还未通过");
+ }
}
}
@@ -72,15 +79,17 @@
* @return
*/
public boolean jwtTokenRefresh(String jwtToken,String username,String passWord){
- String key=redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(jwtToken));
- String cacheToken= (String) redisUtils.get(key);
+ String tokenKey=redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(jwtToken));
+ String userKey=redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+username);
+ String cacheToken= (String) redisUtils.get(tokenKey);
if(StringUtils.isNotEmpty(cacheToken)){
// 校验token有效性
if(!JwtTokenUtil.verify(cacheToken,username,passWord)){
String newToken=JwtTokenUtil.sign(username,passWord);
// 设置超时时间
- redisUtils.set(key,newToken);
- redisUtils.expire(key,JwtTokenUtil.EXPIRATION*2/1000);
+ redisUtils.set(tokenKey,newToken);
+ redisUtils.expire(tokenKey,JwtTokenUtil.EXPIRATION*2/1000);
+ redisUtils.expire(userKey,(JwtTokenUtil.EXPIRATION*2/1000)+2);
}
return true;
}
diff --git a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysPasswordService.java b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysPasswordService.java
index c8e60a8..70cdb3a 100644
--- a/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysPasswordService.java
+++ b/assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysPasswordService.java
@@ -1,10 +1,10 @@
package com.gkhy.assess.framework.shiro.service;
import com.gkhy.assess.common.constant.CacheConstant;
-import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.common.utils.JwtTokenUtil;
import com.gkhy.assess.common.utils.RedisUtils;
import com.gkhy.assess.system.domain.SysUser;
-import org.apache.shiro.crypto.hash.Md5Hash;
+import org.apache.shiro.authc.AuthenticationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@@ -21,20 +21,20 @@
@Value(value = "${user.password.maxRetryCount:5}")
private Integer maxRetryCount;
- public void validate(SysUser user, String password){
+ public void validate(SysUser user, String password) throws AuthenticationException {
String username=user.getUsername();
String key= redisUtils.generateKey(CacheConstant.SYS_LOGIN_RECORD_CACHE+":"+username);
- AtomicInteger retryCount= (AtomicInteger) redisUtils.get(key);
+ Integer retryCount= (Integer) redisUtils.get(key);
if(retryCount==null){
- retryCount=new AtomicInteger(0);
- redisUtils.set(key,retryCount);
+ retryCount=0;
}
- if(retryCount.incrementAndGet()>maxRetryCount){
- throw new ApiException("登录次数已达上限");
+ ++retryCount;
+ if(retryCount>maxRetryCount){
+ throw new AuthenticationException("登录次数已达上限,5分钟之后再试");
}
if(!matches(user,password)){
- redisUtils.set(key,retryCount);
- throw new ApiException("登录密码错误");
+ redisUtils.set(key,retryCount,60*5);//5分钟后释放
+ throw new AuthenticationException("登录密码错误");
}else{
redisUtils.del(key);
}
@@ -42,11 +42,9 @@
}
public boolean matches(SysUser sysUser,String newPassword){
- return sysUser.getPassword().equals(encryptPassword(sysUser.getUsername(),newPassword,sysUser.getSalt()));
+ return sysUser.getPassword().equals(JwtTokenUtil.encryptPassword(sysUser.getUsername(),newPassword,sysUser.getSalt()));
}
- public String encryptPassword(String username,String password,String salt){
- return new Md5Hash(username+password+salt).toHex();
- }
+
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java
index 72be32f..51943af 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java
@@ -6,14 +6,21 @@
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
+import java.util.List;
+import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.gkhy.assess.common.domain.BaseEntity;
+import com.gkhy.assess.common.validate.AgencyGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
+import lombok.experimental.Accessors;
+import org.hibernate.validator.constraints.Length;
+import org.springframework.format.annotation.DateTimeFormat;
+import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@@ -31,6 +38,7 @@
@Setter
@TableName("sys_agency")
@ApiModel(value = "SysAgency对象", description = "机构表")
+@Accessors(chain = true)
@JsonInclude(NON_NULL)
public class SysAgency extends BaseEntity {
@@ -39,34 +47,40 @@
@TableId(value = "id", type = IdType.AUTO)
private Long id;
+
@NotBlank(message = "机构名称不能为空")
@ApiModelProperty("机构名称")
@TableField("name")
private String name;
+
@NotBlank(message = "社会信用代码不能为空")
@ApiModelProperty(value = "社会信用代码",required = true)
@TableField("credit_code")
private String creditCode;
+
@NotNull(message = "机构属性不能为空")
@ApiModelProperty(value = "机构属性(0疆内,1疆外,默认0)",required = true)
@TableField("attribute")
private Integer attribute;
+
@ApiModelProperty("省")
@TableField("province")
private String province;
+
@NotBlank(message = "市不能为空")
@ApiModelProperty(value = "市",required = true)
@TableField("city")
private String city;
- @NotBlank(message = "区不能为空")
+ // @NotBlank(message = "区不能为空")
@ApiModelProperty(value = "区",required = true)
@TableField("district")
private String district;
+
@NotBlank(message = "经营地址不能为空")
@ApiModelProperty(value = "经营地址",required = true)
@@ -77,65 +91,84 @@
@TableField("web")
private String web;
+
@NotBlank(message = "法定代表人不能为空")
@ApiModelProperty(value = "法定代表人",required = true)
@TableField("legal_person")
private String legalPerson;
+
@NotBlank(message = "法人电话不能为空")
+ @Length(min = 11, max = 11, message = "手机号只能为11位")
@ApiModelProperty(value = "法人电话",required = true)
@TableField("legal_phone")
private String legalPhone;
+
@NotBlank(message = "机构负责人不能为空")
@ApiModelProperty(value = "机构负责人",required = true)
@TableField("manager")
private String manager;
+
@NotBlank(message = "负责人电话不能为空")
+ @Length(min = 11, max = 11, message = "手机号只能为11位")
@ApiModelProperty(value = "负责人电话",required = true)
@TableField("manager_phone")
private String managerPhone;
+
@NotBlank(message = "资质证书编号不能为空")
@ApiModelProperty(value = "资质证书编号",required = true)
@TableField("cert_number")
private String certNumber;
- @NotBlank(message = "发证日期不能为空")
+
+ @NotNull(message = "发证日期不能为空")
@ApiModelProperty(value = "发证日期",required = true)
@TableField("issue_date")
+ @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime issueDate;
- @NotBlank(message = "有效日期不能为空")
+
+ @NotNull(message = "有效日期不能为空")
@ApiModelProperty(value = "有效日期",required = true)
@TableField("valid_date")
+ @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime validDate;
+
@NotBlank(message = "固定资产总值不能为空")
@ApiModelProperty(value = "固定资产总值",required = true)
@TableField("asset_value")
private String assetValue;
+
@NotBlank(message = "工作场所建筑面积不能为空")
@ApiModelProperty(value = "工作场所建筑面积",required = true)
@TableField("work_area")
private String workArea;
+
@NotBlank(message = "档案室面积不能为空")
@ApiModelProperty(value = "档案室面积",required = true)
@TableField("archive_area")
private String archiveArea;
+
@NotBlank(message = "注册地址不能为空")
@ApiModelProperty(value = "注册地址",required = true)
@TableField("reg_address")
private String regAddress;
+
@NotBlank(message = "业务范围不能为空")
- @ApiModelProperty(value = "业务范围",required = true)
+ @ApiModelProperty(value = "业务范围,字典id,多个逗号隔开",required = true)
@TableField("business")
private String business;
+
@NotBlank(message = "机构信息上报表存放路径不能为空")
@ApiModelProperty(value = "机构信息上报表存放路径",required = true)
@@ -146,5 +179,16 @@
@TableField("del_flag")
private Integer delFlag;
+ @ApiModelProperty("是否公示(0代表公示,1代表不公示,默认0)")
+ @TableField("publication")
+ private Integer publication;
+
+ @ApiModelProperty(value = "业务范围,字典对应的名称")
+ @TableField(exist = false)
+ private List<String> businessNames;
+
+ @ApiModelProperty(value = "注册用户")
+ @TableField(exist = false)
+ private SysUser user;
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java
index 2283d1a..33ec092 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java
@@ -28,7 +28,7 @@
@Getter
@Setter
@TableName("sys_attach")
-@ApiModel(value = "SysAttach对象", description = "系统配置表")
+@ApiModel(value = "SysAttach对象", description = "系统上传文件表,用户信息相关的")
@JsonInclude(NON_NULL)
public class SysAttach implements Serializable {
@@ -52,8 +52,8 @@
@TableField("type")
private Integer type;
- @NotBlank(message = "类型不能为空")
- @ApiModelProperty(value = "用户id",required = true)
+
+ @ApiModelProperty(value = "用户id")
@TableField("user_id")
private Long userId;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.java
index fe72085..b4be289 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.java
@@ -7,6 +7,7 @@
import java.io.Serializable;
import java.time.LocalDateTime;
+import com.fasterxml.jackson.annotation.JsonInclude;
import com.gkhy.assess.common.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -14,6 +15,8 @@
import lombok.Setter;
import javax.validation.constraints.NotBlank;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
/**
* <p>
@@ -27,6 +30,7 @@
@Setter
@TableName("sys_dict_data")
@ApiModel(value = "SysDictData对象", description = "字典数据表")
+@JsonInclude(NON_NULL)
public class SysDictData extends BaseEntity {
private static final long serialVersionUID = 1L;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.java
index 1f02521..0c57758 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.java
@@ -7,13 +7,17 @@
import java.io.Serializable;
import java.time.LocalDateTime;
+import com.fasterxml.jackson.annotation.JsonInclude;
import com.gkhy.assess.common.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
+import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
/**
* <p>
@@ -27,6 +31,8 @@
@Setter
@TableName("sys_dict_type")
@ApiModel(value = "SysDictType对象", description = "字典类型表")
+@Accessors(chain = true)
+@JsonInclude(NON_NULL)
public class SysDictType extends BaseEntity {
private static final long serialVersionUID = 1L;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertClassify.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertClassify.java
new file mode 100644
index 0000000..a5a603e
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertClassify.java
@@ -0,0 +1,60 @@
+package com.gkhy.assess.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.gkhy.assess.common.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 系统专家分类表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-11-27 16:33:33
+ */
+@Getter
+@Setter
+@TableName("sys_expert_classify")
+@ApiModel(value = "SysExpertClassify对象", description = "系统专家分类表")
+@JsonInclude(NON_NULL)
+public class SysExpertClassify extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("主键")
+ @TableId(value = "classify_id", type = IdType.AUTO)
+ private Long classifyId;
+
+ @NotBlank(message = "分类名称不能为空")
+ @ApiModelProperty(value = "分类名称",required = true)
+ @TableField("classify_name")
+ private String classifyName;
+
+ @ApiModelProperty("父id")
+ @TableField("parent_id")
+ private Long parentId;
+
+ @ApiModelProperty("删除标志(0代表存在,1代表删除,默认0)")
+ @TableField("del_flag")
+ private Integer delFlag;
+
+ @ApiModelProperty("子分类")
+ @TableField(exist = false)
+ private List<SysExpertClassify> children;
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java
new file mode 100644
index 0000000..969c2aa
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java
@@ -0,0 +1,180 @@
+package com.gkhy.assess.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+
+/**
+ * <p>
+ * 系统专家信息表
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-11-27 16:33:33
+ */
+@Getter
+@Setter
+@TableName("sys_expert_info")
+@Accessors(chain = true)
+@ApiModel(value = "SysExpertInfo对象", description = "系统专家信息表")
+@JsonInclude(NON_NULL)
+public class SysExpertInfo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("主键")
+ @TableId(value = "expert_id", type = IdType.AUTO)
+ private Long expertId;
+
+ @ApiModelProperty("专家名称")
+ @TableField("name")
+ private String name;
+
+ @ApiModelProperty("性别(0男,1女,2未知,默认2)")
+ @TableField("sex")
+ private Integer sex;
+
+ @ApiModelProperty("类别id")
+ @TableField("big_classify")
+ private Long bigClassify;
+
+ @ApiModelProperty("类别id")
+ @TableField("small_classify")
+ private Long smallClassify;
+
+ @ApiModelProperty("出生日期")
+ @TableField("birthday")
+ private LocalDateTime birthday;
+
+ @ApiModelProperty("手机号")
+ @TableField("phone")
+ private String phone;
+
+ @ApiModelProperty("职称")
+ @TableField("title")
+ private String title;
+
+ @ApiModelProperty("电子照片")
+ @TableField("electronic_photo")
+ private String electronicPhoto;
+
+ @ApiModelProperty("身份证号码")
+ @TableField("id_card")
+ private String idCard;
+
+ @ApiModelProperty("在职状态")
+ @TableField("duty_status")
+ private Integer dutyStatus;
+
+ @ApiModelProperty("公司名称")
+ @TableField("company_name")
+ private String companyName;
+
+ @ApiModelProperty("公司地址")
+ @TableField("company_address")
+ private String companyAddress;
+
+ @ApiModelProperty("部门名称")
+ @TableField("dept_name")
+ private String deptName;
+
+ @ApiModelProperty("职务")
+ @TableField("job")
+ private String job;
+
+ @ApiModelProperty("公司电话")
+ @TableField("company_telephone")
+ private String companyTelephone;
+
+ @ApiModelProperty("传真")
+ @TableField("fax_num")
+ private String faxNum;
+
+ @ApiModelProperty("邮箱")
+ @TableField("email")
+ private String email;
+
+ @ApiModelProperty("毕业学校")
+ @TableField("graduation_school")
+ private String graduationSchool;
+
+ @ApiModelProperty("学历")
+ @TableField("degree")
+ private String degree;
+
+ @ApiModelProperty("专业")
+ @TableField("speciality")
+ private String speciality;
+
+ @ApiModelProperty("当前专业")
+ @TableField("current_profession")
+ private String currentProfession;
+
+ @ApiModelProperty("支撑安全")
+ @TableField("support_direction_safety")
+ private String supportDirectionSafety;
+
+ @ApiModelProperty("支撑预防")
+ @TableField("support_direction_prevention")
+ private String supportDirectionPrevention;
+
+ @ApiModelProperty("支持应急")
+ @TableField("support_direction_emergency")
+ private String supportDirectionEmergency;
+
+ @ApiModelProperty("简述")
+ @TableField("resume_key")
+ private String resumeKey;
+
+ @TableField("paper_situation_key")
+ private String paperSituationKey;
+
+ @TableField("reward_key")
+ private String rewardKey;
+
+ @TableField("achievement_key")
+ private String achievementKey;
+
+ @TableField("personal_opinion_key")
+ private String personalOpinionKey;
+
+ @TableField("recommend_unit_opinion_key")
+ private String recommendUnitOpinionKey;
+
+ @ApiModelProperty("删除标志(0代表存在,1代表删除,默认0)")
+ @TableField("del_flag")
+ private Integer delFlag;
+
+ @ApiModelProperty("创建人")
+ @TableField("create_by")
+ private String createBy;
+
+ @ApiModelProperty("创建时间")
+ @TableField("create_time")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("修改人")
+ @TableField("update_by")
+ private String updateBy;
+
+ @ApiModelProperty("修改时间")
+ @TableField("update_time")
+ private LocalDateTime updateTime;
+
+ @TableField("remark")
+ private String remark;
+
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.java
index fb7727a..80c99df 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.java
@@ -12,6 +12,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
+import lombok.experimental.Accessors;
import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
@@ -27,6 +28,7 @@
@Setter
@TableName("sys_law")
@ApiModel(value = "SysLaw对象", description = "法律法规表")
+@Accessors(chain = true)
@JsonInclude(NON_NULL)
public class SysLaw implements Serializable {
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.java
index 9c11855..2baba16 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.java
@@ -12,6 +12,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
+import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
@@ -29,6 +30,7 @@
@Setter
@TableName("sys_notice")
@ApiModel(value = "SysNotice对象", description = "通知表")
+@Accessors(chain = true)
@JsonInclude(NON_NULL)
public class SysNotice implements Serializable {
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java
index 5bab183..221bc87 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java
@@ -45,6 +45,9 @@
@TableField("sort")
private Integer sort;
+ @ApiModelProperty("地区类型(0是疆内,1是疆外,默认0)")
+ @TableField("region_type")
+ private Integer regionType;
@TableField(exist = false)
private List<SysRegion> children;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java
index 5368b5b..cefea2c 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java
@@ -8,6 +8,7 @@
import com.gkhy.assess.common.domain.BaseEntity;
import com.gkhy.assess.common.validate.AgencyGroup;
import com.gkhy.assess.common.validate.ExpertGroup;
+import com.gkhy.assess.common.validate.MonitorGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
@@ -15,6 +16,7 @@
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
+import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
@@ -44,8 +46,10 @@
@TableId(value = "id", type = IdType.AUTO)
private Long id;
- @NotBlank(message = "登录账号不能为空")
- @ApiModelProperty(value = "登录账号",required = true)
+ @NotBlank(message = "用户名不能为空")
+ @ApiModelProperty(value = "用户名",required = true)
+ @Length(min=5,max=16,message = "用户名长度需要在{min}和{max}之间")
+ @Pattern(regexp = "^[A-Za-z0-9]+$",message = "用户名只能由英文字母或者数字组成!")
@TableField("username")
private String username;
@@ -57,7 +61,8 @@
@TableField("identity")
private Integer identity;
- @ApiModelProperty("用户类型(0代表工作人员,1代表领导,默认0)")
+ @NotNull(message = "用户类型不能为空",groups ={MonitorGroup.class} )
+ @ApiModelProperty("用户类型(0代表工作人员,1代表领导,默认0)监管用户")
@TableField("user_type")
private Integer userType;
@@ -67,7 +72,7 @@
@NotBlank(message = "手机号码不能为空")
@Length(min = 11, max = 11, message = "手机号只能为11位")
- @Pattern(regexp = "^1[345678]\\\\d{9}$",message = "手机号码有误!")
+ @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$",message = "手机号码有误!")
@ApiModelProperty(value = "手机号码",required = true)
@TableField("phone")
private String phone;
@@ -81,7 +86,7 @@
private String avatar;
@NotBlank(message = "密码不能为空")
- @ApiModelProperty(value = "密码",required = true)
+ @ApiModelProperty(value = "密码(base64)",required = true)
@TableField("password")
private String password;
@@ -97,6 +102,7 @@
@TableField("del_flag")
private Integer delFlag;
+ @NotBlank(message = "管辖区域不能为空",groups ={MonitorGroup.class} )
@ApiModelProperty("管辖区域")
@TableField("manage_region")
private String manageRegion;
@@ -106,7 +112,7 @@
private Long agencyId;
@NotNull(message = "专家类型不能为空",groups ={ExpertGroup.class} )
- @ApiModelProperty("专家类型")
+ @ApiModelProperty("专家类型(专家用户)(1安全评价,2检验检测)")
@TableField("expert_type")
private Integer expertType;
@@ -130,9 +136,9 @@
@TableField("major")
private String major;
- @ApiModelProperty("审批状态(0审批通过,1待审批,2未通过 默认1)")
- @TableField("approve")
- private Integer approve;
+ @ApiModelProperty("审批状态(0暂存,1审核中,2审批通过,3审批驳回,4已作废 默认1)")
+ @TableField("state")
+ private Integer state;
@ApiModelProperty("最后登录ip")
@TableField("login_ip")
@@ -146,23 +152,24 @@
@TableField("pwd_update_date")
private LocalDateTime pwdUpdateDate;
+ @Valid
@NotNull(message = "机构不能为空",groups ={AgencyGroup.class} )
- @ApiModelProperty("机构对象")
+ @ApiModelProperty("机构对象,只限创建机构用户传")
@TableField(exist = false)
private SysAgency agency;
@NotNull(message = "社保照片不能为空",groups ={ExpertGroup.class} )
- @ApiModelProperty("社保照片路径列表")
+ @ApiModelProperty("社保照片路径列表,创建专家传")
@TableField(exist = false)
private List<SysAttach> socialAttach;
@NotNull(message = "医保照片不能为空",groups ={ExpertGroup.class} )
- @ApiModelProperty("医保照片路径列表")
+ @ApiModelProperty("医保照片路径列表,创建专家传")
@TableField(exist = false)
private List<SysAttach> medicalAttach;
@NotNull(message = "工资照片不能为空",groups ={ExpertGroup.class} )
- @ApiModelProperty("工资照片路径列表")
+ @ApiModelProperty("工资照片路径列表,创建专家传")
@TableField(exist = false)
private List<SysAttach> salaryAttach;
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java
index 89739a1..0932e0b 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java
@@ -11,7 +11,7 @@
@Accessors(chain = true) //链式写法
@ApiModel(value = "上传文件返回对象", description = "上传文件返回对象")
public class UploadObjectVO {
- @ApiModelProperty("文件名称,前端访问图片链接格式:http://ip:port/api/images/文件保存相对路径")
+ @ApiModelProperty("文件名称,前端访问图片链接格式:http://ip:port/api/文件保存相对路径")
private String filename;
@ApiModelProperty("文件保存相对路径")
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertClassifyMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertClassifyMapper.java
new file mode 100644
index 0000000..5990ff6
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertClassifyMapper.java
@@ -0,0 +1,18 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.SysExpertClassify;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 系统专家分类表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-11-27 16:33:33
+ */
+@Mapper
+public interface SysExpertClassifyMapper extends BaseMapper<SysExpertClassify> {
+
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertInfoMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertInfoMapper.java
new file mode 100644
index 0000000..abab04d
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertInfoMapper.java
@@ -0,0 +1,39 @@
+package com.gkhy.assess.system.mapper;
+
+import com.gkhy.assess.system.domain.SysExpertInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 系统专家信息表 Mapper 接口
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-11-27 16:33:33
+ */
+@Mapper
+public interface SysExpertInfoMapper extends BaseMapper<SysExpertInfo> {
+ /**
+ * 根据条件获取专家信息列表
+ * @param expertInfo
+ * @return
+ */
+ List<SysExpertInfo> expertInfoList(SysExpertInfo expertInfo);
+
+ /**
+ * 根据id card获取专家信息
+ * @param idCard
+ * @return
+ */
+ SysExpertInfo checkIdcardUnique(String idCard);
+
+ /**
+ * 批量删除专家信息
+ * @param expertIds
+ * @return
+ */
+ int deleteBatchByIds(Long[] expertIds);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysRegionMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysRegionMapper.java
index 2e08555..ebec532 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysRegionMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysRegionMapper.java
@@ -20,5 +20,5 @@
* @param name
* @return
*/
- SysRegion checkRegionUnique(@Param("name") String name, @Param("parentId")Long parentId);
+ SysRegion checkRegionUnique(@Param("name") String name,@Param("regionType")Integer regionType, @Param("parentId")Long parentId);
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java
index c1c4083..f4b8f2f 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java
@@ -108,4 +108,10 @@
*/
SysUser checkEmailUnique(String email);
+ /**
+ * 根据id获取用户详情
+ * @param userId
+ * @return
+ */
+ SysUser getUserInfoById(Long userId);
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java
index 47b471d..1385517 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java
@@ -27,7 +27,7 @@
* @param agency
* @return
*/
- Boolean checkAgencyNameUnique(SysAgency agency);
+ boolean checkAgencyNameUnique(SysAgency agency);
/**
* 根据id获取机构详情
@@ -35,4 +35,11 @@
* @return
*/
SysAgency getAgencyById(Long agencyId);
+
+ /**
+ * 修改公示状态
+ * @param agency
+ * @return
+ */
+ boolean changePublic(SysAgency agency);
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertClassifyService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertClassifyService.java
new file mode 100644
index 0000000..b7be109
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertClassifyService.java
@@ -0,0 +1,44 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.system.domain.SysExpertClassify;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 系统专家分类表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-11-27 16:33:33
+ */
+public interface SysExpertClassifyService extends IService<SysExpertClassify> {
+ /**
+ * 专家分类列表
+ * @param expertClassify
+ * @return
+ */
+ List<SysExpertClassify> classifyTree(SysExpertClassify expertClassify);
+
+ /**
+ * 修改分类
+ * @param expertClassify
+ * @return
+ */
+ int modClassify(SysExpertClassify expertClassify);
+
+ /**
+ * 删除分类
+ * @param classifyId
+ * @return
+ */
+ int delClassify(Long classifyId);
+
+ /**
+ * 新增分类
+ * @param expertClassify
+ * @return
+ */
+ int addClassify(SysExpertClassify expertClassify);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertInfoService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertInfoService.java
new file mode 100644
index 0000000..bd60fa5
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertInfoService.java
@@ -0,0 +1,50 @@
+package com.gkhy.assess.system.service;
+
+import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.system.domain.SysExpertInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 系统专家信息表 服务类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-11-27 16:33:33
+ */
+public interface SysExpertInfoService extends IService<SysExpertInfo> {
+ /**
+ * 分页获取专家信息
+ * @param expertInfo
+ * @return
+ */
+ CommonPage exportInfoList(SysExpertInfo expertInfo);
+
+ /**
+ * 新增专家信息
+ * @param expertInfo
+ * @return
+ */
+ int addExpertInfo(SysExpertInfo expertInfo);
+
+ /**
+ * 修改专家信息
+ * @param expertInfo
+ * @return
+ */
+ int modExpertInfo(SysExpertInfo expertInfo);
+
+ /**
+ * 删除专家信息
+ * @param expertId
+ * @return
+ */
+ int delExpertInfo(Long expertId);
+
+ /**
+ * 批量删除专家信息
+ * @param expertIds
+ * @return
+ */
+ int delExpertInfoBatch(Long[] expertIds);
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysLawService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysLawService.java
index 28859e2..b411ce1 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/SysLawService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysLawService.java
@@ -56,4 +56,11 @@
* @return
*/
int changeLawStatus(SysLaw law);
+
+ /**
+ * 校验法律法规数据
+ * @param lawId
+ * @return
+ */
+ SysLaw checkLawDataScope(Long lawId);
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysNoticeService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysNoticeService.java
index 1a2745f..4dba354 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/SysNoticeService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysNoticeService.java
@@ -55,4 +55,11 @@
*/
int changeNoticeStatus(SysNotice notice);
+ /**
+ * 校验数据
+ * @param noticeId
+ * @return
+ */
+ SysNotice checkNoticeDataScope(Long noticeId);
+
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java b/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java
index db7c500..611359d 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java
@@ -65,11 +65,18 @@
SysUser getUserByUsernamePhone(String username);
/**
+ * 新增监管用户
+ * @param user
+ * @return
+ */
+ int addMonitor(SysUser user);
+
+ /**
* 机构用户注册
* @param user
* @return
*/
- int agencyRegister(SysUser user);
+ int addAgency(SysUser user);
/**
* 创建专家
@@ -99,6 +106,12 @@
*/
int deleteUserById(Long userId);
+ /**
+ * 编辑监管用户
+ * @param user
+ * @return
+ */
+ int editMonitor(SysUser user);
/**
* 编辑机构用户
@@ -152,7 +165,7 @@
* 校验用户是否有数据权限
* @param userId
*/
- void checkUserDataScope(Long userId);
+ SysUser checkUserDataScope(Long userId);
/**
* 导入用户数据
@@ -176,4 +189,11 @@
*/
boolean changeApprove(SysUser user);
+ /**
+ * 根据id获取用户详情信息
+ * @param userId
+ * @return
+ */
+ SysUser getUserInfoById(Long userId);
+
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java
index 40b4be6..65803ab 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java
@@ -1,12 +1,17 @@
package com.gkhy.assess.system.service.impl;
+import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.common.exception.ApiException;
import com.gkhy.assess.common.utils.PageUtil;
import com.gkhy.assess.system.domain.SysAgency;
+import com.gkhy.assess.system.domain.SysUser;
import com.gkhy.assess.system.mapper.SysAgencyMapper;
import com.gkhy.assess.system.service.SysAgencyService;
+import com.gkhy.assess.system.utils.ShiroUtils;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@@ -30,7 +35,7 @@
}
@Override
- public Boolean checkAgencyNameUnique(SysAgency agency) {
+ public boolean checkAgencyNameUnique(SysAgency agency) {
Long agencyId = agency.getId()==null? -1L : agency.getId();
SysAgency info = baseMapper.checkAgencyNameUnique(agency.getName());
if (info!=null && info.getId().longValue() != agencyId.longValue())
@@ -44,4 +49,24 @@
public SysAgency getAgencyById(Long agencyId) {
return baseMapper.getAgencyById(agencyId);
}
+
+ @Override
+ public boolean changePublic(SysAgency agency) {
+ checkAgencyDataScope(agency.getId());
+ SysAgency ay=new SysAgency().setId(agency.getId()).setPublication(agency.getPublication());
+ ay.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+ return updateById(ay);
+ }
+
+ public SysAgency checkAgencyDataScope(Long agencyId) {
+ if(agencyId==null){
+ throw new ApiException("机构id为空!");
+ }
+ SysAgency agency = baseMapper.getAgencyById(agencyId);
+ if (ObjectUtil.isNull(agency))
+ {
+ throw new ApiException("机构数据不存在!");
+ }
+ return agency;
+ }
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java
index e126d7e..25f68bd 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java
@@ -1,5 +1,6 @@
package com.gkhy.assess.system.service.impl;
+import cn.hutool.core.date.DateUtil;
import com.gkhy.assess.common.exception.ApiException;
import com.gkhy.assess.system.domain.vo.UploadObjectVO;
import com.gkhy.assess.system.service.SysCommonService;
@@ -10,16 +11,14 @@
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.util.Date;
import java.util.UUID;
@Service
public class SysCommonServiceImpl implements SysCommonService {
- @Value("${image.upload_file}")
- private String uploadFilePath;
-
- @Value("${image.upload_image}")
- private String uploadImagePath;
+ @Value("${image.upload_path}")
+ private String uploadPath;
@Override
public UploadObjectVO uploadFile(MultipartFile file) {
@@ -32,11 +31,11 @@
String systemDir=System.getProperty("user.dir");
String filePath=systemDir+File.separator+path;
File dirFile=new File(filePath);
- if(!dirFile.isFile()){
- throw new ApiException("非文件,不能删除");
- }
if(!dirFile.exists()){
throw new ApiException("文件不存在");
+ }
+ if(!dirFile.isFile()){
+ throw new ApiException("非文件,不能删除");
}
dirFile.delete();
return true;
@@ -47,12 +46,8 @@
String subfix=filename.substring(filename.lastIndexOf("."));
filename= UUID.randomUUID().toString().replace("-","")+subfix;
String systemDir=System.getProperty("user.dir");
- String filePath="";
- if(checkImageType(subfix)){
- filePath=uploadImagePath;
- }else{
- filePath=uploadFilePath;
- }
+ String dateStr= DateUtil.format(new Date(),"yyyyMMdd");
+ String filePath=uploadPath+File.separator+dateStr;
File dirFile=new File(filePath);
if(!dirFile.exists()){
dirFile.mkdirs();
@@ -65,6 +60,7 @@
} catch (IOException e) {
throw new ApiException("发生错误,请联系管理员");
}
+ filePath=filePath.replace("\\","/");
UploadObjectVO uploadObjectVO=new UploadObjectVO().setFilename(filename)
.setPath(filePath);
return uploadObjectVO;
@@ -76,7 +72,10 @@
".jpeg".equalsIgnoreCase(subfix)||
".png".equalsIgnoreCase(subfix)||
".bmp".equalsIgnoreCase(subfix)||
- ".tif".equalsIgnoreCase(subfix)
+ ".tif".equalsIgnoreCase(subfix)||
+ ".jfif".equalsIgnoreCase(subfix)||
+ ".webp".equalsIgnoreCase(subfix)||
+ ".gif".equalsIgnoreCase(subfix)
){
return true;
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java
index a886f29..9d842fb 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java
@@ -1,10 +1,10 @@
package com.gkhy.assess.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.assess.common.constant.CacheConstant;
import com.gkhy.assess.common.utils.RedisUtils;
+import com.gkhy.assess.common.utils.StringUtils;
import com.gkhy.assess.system.domain.SysConfig;
import com.gkhy.assess.system.mapper.SysConfigMapper;
import com.gkhy.assess.system.service.SysConfigService;
@@ -28,7 +28,7 @@
public String getConfigByKey(String configKey) {
String redisKey=getCacheKey(configKey);
String configValue= (String) redisUtils.get(redisKey);
- if(StrUtil.isNotEmpty(configValue)){
+ if(StringUtils.isNotEmpty(configValue)){
return configValue;
}
SysConfig retConfig=baseMapper.getConfig(new SysConfig().setConfigKey(configKey));
@@ -36,7 +36,7 @@
redisUtils.set(redisKey,retConfig.getConfigValue());
return retConfig.getConfigValue();
}
- return StrUtil.EMPTY;
+ return StringUtils.EMPTY;
}
private String getCacheName(){
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java
index ab0e065..f26be53 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java
@@ -11,6 +11,7 @@
import com.gkhy.assess.system.mapper.SysDictTypeMapper;
import com.gkhy.assess.system.service.SysDictTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.utils.ShiroUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -52,10 +53,10 @@
}
@Override
- @Transactional(rollbackFor = RuntimeException.class)
+ // @Transactional(rollbackFor = RuntimeException.class)
public int editDictType(SysDictType dict) {
SysDictType oldDict= baseMapper.getDictTypeById(dict.getId());
- dictDataMapper.updateDictDataDictType(oldDict.getDictType(), dict.getDictType());
+ dict.setDictType(oldDict.getDictType());//字典类型不能修改
boolean b=updateById(dict);
if(!b){
throw new ApiException("修改数据字典类型失败");
@@ -78,11 +79,9 @@
@Override
public int changeDictTypeStatus(SysDictType dictType) {
- boolean b=updateById(dictType);
- if(!b){
- throw new ApiException("修改数据字典类型失败");
- }
- return 1;
+ SysDictType dt=new SysDictType().setId(dictType.getId()).setDictType(dictType.getDictType());
+ dt.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+ return baseMapper.updateById(dt);
}
@Override
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertClassifyServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertClassifyServiceImpl.java
new file mode 100644
index 0000000..c3f44fd
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertClassifyServiceImpl.java
@@ -0,0 +1,84 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.common.enums.DeleteFlagEnum;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.common.utils.StringUtils;
+import com.gkhy.assess.system.domain.SysExpertClassify;
+import com.gkhy.assess.system.mapper.SysExpertClassifyMapper;
+import com.gkhy.assess.system.service.SysExpertClassifyService;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 系统专家分类表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-11-27 16:33:33
+ */
+@Service
+public class SysExpertClassifyServiceImpl extends ServiceImpl<SysExpertClassifyMapper, SysExpertClassify> implements SysExpertClassifyService {
+
+ @Override
+ public List<SysExpertClassify> classifyTree(SysExpertClassify expertClassify) {
+ LambdaQueryWrapper<SysExpertClassify> lambdaQueryWrapper = Wrappers.<SysExpertClassify>lambdaQuery();
+ if(StringUtils.isNotBlank(expertClassify.getClassifyName())){
+ lambdaQueryWrapper.like(SysExpertClassify::getClassifyName,expertClassify.getClassifyName());
+ }
+ List<SysExpertClassify> classifies= list(lambdaQueryWrapper);
+ //筛选出所有一级标签
+ return classifies.stream()
+ .filter(classifyEntity -> classifyEntity.getParentId()==0L)
+ .peek(classifyEntity -> classifyEntity.setChildren(this.listClassifyChildren(classifyEntity,classifies)))
+ .collect(Collectors.toList());
+ }
+
+ public List<SysExpertClassify> listClassifyChildren(SysExpertClassify classify,List<SysExpertClassify> classifies){
+ //递归查找子类
+ return classifies.stream()
+ .filter(classifyEntity -> Objects.equals(classifyEntity.getParentId(), classify.getClassifyId()))
+ .peek(classifyEntity -> classifyEntity.setChildren(this.listClassifyChildren(classifyEntity,classifies)))
+ .collect(Collectors.toList());
+ }
+
+
+ @Override
+ public int modClassify(SysExpertClassify expertClassify) {
+ expertClassify.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+ boolean b=updateById(expertClassify);
+ if(!b){
+ throw new ApiException("修改专家分类失败");
+ }
+ return 1;
+ }
+
+ @Override
+ public int delClassify(Long classifyId) {
+ SysExpertClassify classify = new SysExpertClassify();
+ classify.setClassifyId(classifyId);
+ classify.setDelFlag(DeleteFlagEnum.DELETED.getCode());
+ boolean b=updateById(classify);
+ if(!b){
+ throw new ApiException("删除专家分类失败");
+ }
+ return 1;
+ }
+
+ @Override
+ public int addClassify(SysExpertClassify expertClassify) {
+ expertClassify.setCreateBy(ShiroUtils.getSysUser().getUsername());
+ boolean b=save(expertClassify);
+ if(!b){
+ throw new ApiException("新增专家分类失败");
+ }
+ return 1;
+ }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertInfoServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertInfoServiceImpl.java
new file mode 100644
index 0000000..ce0272d
--- /dev/null
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertInfoServiceImpl.java
@@ -0,0 +1,86 @@
+package com.gkhy.assess.system.service.impl;
+
+import com.gkhy.assess.common.api.CommonPage;
+import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.common.utils.PageUtil;
+import com.gkhy.assess.system.domain.SysAgency;
+import com.gkhy.assess.system.domain.SysExpertInfo;
+import com.gkhy.assess.system.domain.SysUser;
+import com.gkhy.assess.system.mapper.SysExpertInfoMapper;
+import com.gkhy.assess.system.service.SysExpertInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.utils.ShiroUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 系统专家信息表 服务实现类
+ * </p>
+ *
+ * @author kzy
+ * @since 2023-11-27 16:33:33
+ */
+@Service
+public class SysExpertInfoServiceImpl extends ServiceImpl<SysExpertInfoMapper, SysExpertInfo> implements SysExpertInfoService {
+
+ @Override
+ public CommonPage exportInfoList(SysExpertInfo expertInfo) {
+ PageUtil.startPage();
+ List<SysExpertInfo> agencyList=baseMapper.expertInfoList(expertInfo);
+ return CommonPage.restPage(agencyList);
+ }
+
+ @Override
+ public int addExpertInfo(SysExpertInfo expertInfo) {
+ if(!checkIdCardUnique(new SysExpertInfo().setIdCard(expertInfo.getIdCard()))){
+ throw new ApiException(expertInfo.getIdCard()+"身份证号码已经存在");
+ }
+ expertInfo.setCreateBy(ShiroUtils.getSysUser().getUsername());
+ boolean b=save(expertInfo);
+ if(!b){
+ throw new ApiException("新增专家信息失败");
+ }
+ return 1;
+ }
+
+ @Override
+ public int modExpertInfo(SysExpertInfo expertInfo) {
+ if(!checkIdCardUnique(expertInfo)){
+ throw new ApiException(expertInfo.getIdCard()+"身份证号码已经存在");
+ }
+ boolean b=updateById(expertInfo);
+ if(!b){
+ throw new ApiException("修改专家信息失败");
+ }
+ return 1;
+ }
+
+ @Override
+ public int delExpertInfo(Long expertId) {
+ SysExpertInfo expertInfo = new SysExpertInfo();
+ expertInfo.setExpertId(expertId);
+ expertInfo.setDelFlag(1);
+ boolean b= updateById(expertInfo);
+ if(!b){
+ throw new ApiException("删除专家信息失败");
+ }
+ return 1;
+ }
+
+ @Override
+ public int delExpertInfoBatch(Long[] expertIds) {
+ return baseMapper.deleteBatchByIds(expertIds);
+ }
+
+ public boolean checkIdCardUnique(SysExpertInfo expertInfo){
+ Long expertId = expertInfo.getExpertId()==null? -1L : expertInfo.getExpertId();
+ SysExpertInfo info = baseMapper.checkIdcardUnique(expertInfo.getIdCard());
+ if (info!=null && info.getExpertId().longValue() != expertId.longValue())
+ {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java
index 3981dcc..22b85e0 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java
@@ -1,5 +1,6 @@
package com.gkhy.assess.system.service.impl;
+import cn.hutool.core.util.ObjectUtil;
import com.gkhy.assess.common.api.CommonPage;
import com.gkhy.assess.common.exception.ApiException;
import com.gkhy.assess.common.utils.PageUtil;
@@ -8,6 +9,7 @@
import com.gkhy.assess.system.mapper.SysLawMapper;
import com.gkhy.assess.system.service.SysLawService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.system.utils.ShiroUtils;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -64,6 +66,22 @@
@Override
public int changeLawStatus(SysLaw law) {
- return editLaw(law);
+ checkLawDataScope(law.getId());
+ SysLaw lw=new SysLaw().setId(law.getId()).setStatus(law.getStatus());
+ lw.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+ return baseMapper.updateById(lw);
+ }
+
+ @Override
+ public SysLaw checkLawDataScope(Long lawId) {
+ if(lawId==null){
+ throw new ApiException("法律法规id为空!");
+ }
+ SysLaw law = baseMapper.getLawById(lawId);
+ if (ObjectUtil.isNull(law))
+ {
+ throw new ApiException("law数据不存在!");
+ }
+ return law;
}
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java
index 2a88184..51c50e9 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java
@@ -1,12 +1,15 @@
package com.gkhy.assess.system.service.impl;
+import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.assess.common.api.CommonPage;
import com.gkhy.assess.common.exception.ApiException;
import com.gkhy.assess.common.utils.PageUtil;
import com.gkhy.assess.system.domain.SysNotice;
+import com.gkhy.assess.system.domain.SysUser;
import com.gkhy.assess.system.mapper.SysNoticeMapper;
import com.gkhy.assess.system.service.SysNoticeService;
+import com.gkhy.assess.system.utils.ShiroUtils;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -63,6 +66,23 @@
@Override
public int changeNoticeStatus(SysNotice notice) {
- return editNotice(notice);
+ checkNoticeDataScope(notice.getId());
+ SysNotice nc=new SysNotice().setId(notice.getId()).setStatus(notice.getStatus());
+ nc.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+ return baseMapper.updateById(nc);
+ }
+
+
+ @Override
+ public SysNotice checkNoticeDataScope(Long noticeId) {
+ if(noticeId==null){
+ throw new ApiException("通知id为空!");
+ }
+ SysNotice notice = baseMapper.getNoticeById(noticeId);
+ if (ObjectUtil.isNull(notice))
+ {
+ throw new ApiException("通知数据不存在!");
+ }
+ return notice;
}
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java
index 42e6343..6baaa09 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java
@@ -1,21 +1,23 @@
package com.gkhy.assess.system.service.impl;
-import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.assess.common.constant.CacheConstant;
+import com.gkhy.assess.common.enums.RegionTypeEnum;
import com.gkhy.assess.common.exception.ApiException;
+import com.gkhy.assess.common.utils.RedisUtils;
+import com.gkhy.assess.common.utils.StringUtils;
import com.gkhy.assess.system.domain.SysRegion;
-import com.gkhy.assess.system.domain.SysUser;
import com.gkhy.assess.system.mapper.SysRegionMapper;
import com.gkhy.assess.system.service.SysRegionService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.data.domain.Sort;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -29,20 +31,34 @@
@Service
public class SysRegionServiceImpl extends ServiceImpl<SysRegionMapper, SysRegion> implements SysRegionService {
+ @Autowired
+ private RedisUtils redisUtils;
@Override
public List<SysRegion> regionTree(SysRegion region) {
LambdaQueryWrapper<SysRegion> lambdaQueryWrapper = Wrappers.<SysRegion>lambdaQuery();
- if(StrUtil.isNotBlank(region.getName())){
+ if(StringUtils.isNotBlank(region.getName())){
lambdaQueryWrapper.like(SysRegion::getName,region.getName());
}
+ Integer regionType=region.getRegionType();
+ if(regionType==null){
+ regionType= RegionTypeEnum.INSIDE.getCode();
+ }
+ String key=redisUtils.generateKey(CacheConstant.SYS_REGION_KEY+regionType);
+ List<SysRegion> regionList= (List<SysRegion>) redisUtils.get(key);
+ if(regionList!=null&®ionList.size()>0){
+ return regionList;
+ }
+ lambdaQueryWrapper.eq(SysRegion::getRegionType,regionType);
lambdaQueryWrapper.orderBy(true, true,SysRegion::getSort);
List<SysRegion> regions= list(lambdaQueryWrapper);
//筛选出所有一级标签
- return regions.stream()
- .filter(tagEntity -> tagEntity.getParentId()==0L)
- .peek(tagEntity -> tagEntity.setChildren(this.listRegionChildren(tagEntity,regions)))
+ regionList= regions.stream()
+ .filter(regionEntity -> regionEntity.getParentId()==0L)
+ .peek(regionEntity -> regionEntity.setChildren(this.listRegionChildren(regionEntity,regions)))
.sorted(Comparator.comparing(SysRegion::getSort))
.collect(Collectors.toList());
+ redisUtils.set(key,regionList,60, TimeUnit.MINUTES);
+ return regionList;
}
public List<SysRegion> listRegionChildren(SysRegion region,List<SysRegion> regions){
@@ -56,19 +72,26 @@
@Override
public int addRegion(SysRegion region) {
- if(!checkRegionUnique(new SysRegion().setName(region.getName()))){
+ if(!checkRegionUnique(new SysRegion().setName(region.getName()).setRegionType(RegionTypeEnum.INSIDE.getCode()))){
throw new ApiException("已存在相同地区名称");
}
+ region.setRegionType(RegionTypeEnum.INSIDE.getCode());
boolean b=save(region);
if(!b){
throw new ApiException("新增地区失败");
}
+ deleteRedisCache(RegionTypeEnum.INSIDE.getCode());
return 0;
+ }
+
+ private void deleteRedisCache(Integer regionType){
+ String key=redisUtils.generateKey(CacheConstant.SYS_REGION_KEY+regionType);
+ redisUtils.del(key);
}
public boolean checkRegionUnique(SysRegion region){
Long userId = region.getId()==null? -1L : region.getId();
- SysRegion info = baseMapper.checkRegionUnique(region.getName(),region.getParentId()==null?0L:region.getParentId());
+ SysRegion info = baseMapper.checkRegionUnique(region.getName(),region.getRegionType(),region.getParentId()==null?0L:region.getParentId());
if (info!=null && info.getId().longValue() != userId.longValue())
{
return false;
@@ -78,13 +101,17 @@
@Override
public int editRegion(SysRegion region) {
- if(!checkRegionUnique(new SysRegion().setName(region.getName()))){
+ if(!region.getRegionType().equals(RegionTypeEnum.INSIDE.getCode())){
+ throw new ApiException("疆外数据不能修改");
+ }
+ if(!checkRegionUnique(region)){
throw new ApiException("已存在相同地区名称");
}
boolean b=updateById(region);
if(!b){
throw new ApiException("修改地区失败");
}
+ deleteRedisCache(RegionTypeEnum.INSIDE.getCode());
return 0;
}
@@ -93,12 +120,17 @@
Long count=count(Wrappers.<SysRegion>lambdaQuery()
.eq(true,SysRegion::getParentId,reginId));
if(count>0){
- throw new ApiException("下级存在区县数据");
+ throw new ApiException("下级存在地区数据,不能删除");
+ }
+ SysRegion region=getById(reginId);
+ if(region.getRegionType().equals(RegionTypeEnum.OUTSIDE.getCode())){
+ throw new ApiException("疆外地区数据,不能删除");
}
boolean b=removeById(reginId);
if(!b){
throw new ApiException("删除地区失败");
}
+ deleteRedisCache(RegionTypeEnum.INSIDE.getCode());
return 0;
}
diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
index a1ca5d8..a552f44 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
@@ -1,7 +1,7 @@
package com.gkhy.assess.system.service.impl;
+import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.assess.common.api.CommonPage;
import com.gkhy.assess.common.constant.CacheConstant;
@@ -9,19 +9,18 @@
import com.gkhy.assess.common.domain.vo.LoginBody;
import com.gkhy.assess.common.enums.AttachTypeEnum;
import com.gkhy.assess.common.enums.UserIdentityEnum;
-import com.gkhy.assess.common.enums.UserTypeEnum;
import com.gkhy.assess.common.exception.ApiException;
-import com.gkhy.assess.common.utils.BeanValidators;
-import com.gkhy.assess.common.utils.JwtTokenUtil;
-import com.gkhy.assess.common.utils.PageUtil;
-import com.gkhy.assess.common.utils.RedisUtils;
-import com.gkhy.assess.system.domain.*;
+import com.gkhy.assess.common.utils.*;
+import com.gkhy.assess.system.domain.SysAgency;
+import com.gkhy.assess.system.domain.SysAttach;
+import com.gkhy.assess.system.domain.SysUser;
import com.gkhy.assess.system.mapper.SysAgencyMapper;
import com.gkhy.assess.system.mapper.SysUserMapper;
+import com.gkhy.assess.system.service.SysAgencyService;
import com.gkhy.assess.system.service.SysAttachService;
import com.gkhy.assess.system.service.SysConfigService;
-import com.gkhy.assess.system.utils.ShiroUtils;
import com.gkhy.assess.system.service.SysUserService;
+import com.gkhy.assess.system.utils.ShiroUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.subject.Subject;
@@ -34,6 +33,7 @@
import javax.validation.Validator;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
/**
@@ -57,7 +57,8 @@
private HttpServletRequest request;
@Autowired
private SysAgencyMapper agencyMapper;
-
+ @Autowired
+ private SysAgencyService agencyService;
@Autowired
private SysAttachService attachService;
@@ -65,8 +66,8 @@
@Override
public AccountVO login(LoginBody loginBody) {
// 验证码校验
- // validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
- UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), loginBody.getPassword(), false);
+ // validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
+ UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), false);
Subject subject= SecurityUtils.getSubject();
String msg ;
try {
@@ -77,20 +78,39 @@
String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword());
accountVO.setToken(token);
- String key= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(token));
- // 设置超时时间
- redisUtils.set(key,token);
- redisUtils.expire(key,JwtTokenUtil.EXPIRATION*2/1000);
+ cacheUserToken(sysUser.getUsername(),token);
return accountVO;
}catch (UnknownAccountException | IncorrectCredentialsException uae){
throw new ApiException("用户名/密码错误,请重新输入");
} catch (LockedAccountException lae) { // 账号已被锁定
msg = "账号已被锁定";
throw new ApiException(msg);
- } catch (AuthenticationException ae) { // 其他身份验证异常
- msg = "用户认证失败";
+ }catch (AuthenticationException ae) { // 其他身份验证异常
+ msg = "用户认证失败:"+ae.getMessage();
throw new ApiException(msg);
}
+ }
+
+ /**
+ * 清空旧的登录信息,保证同时只有一个用户再登录,后登录用户会挤掉前一个用户
+ * @param username
+ */
+ public void cacheUserToken(String username,String newToken){
+
+// String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username);
+// String oldToken = (String) redisUtils.get(userKey);
+// if (StrUtil.isNotBlank(oldToken)) {
+// String oldTokenkey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + JwtTokenUtil.md5Encode(oldToken));
+// redisUtils.del(oldTokenkey);
+// redisUtils.del(userKey);
+// }
+// redisUtils.set(userKey, newToken,(JwtTokenUtil.EXPIRATION*2/1000)+2);
+
+
+ String tokenKey= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(newToken));
+ // 设置超时时间
+ redisUtils.set(tokenKey,newToken);
+ redisUtils.expire(tokenKey,JwtTokenUtil.EXPIRATION*2/1000);
}
/**
@@ -103,13 +123,13 @@
*/
public void validateCaptcha(String username, String code, String uuid)
{
- if(StrUtil.isBlank(code)||StrUtil.isBlank(uuid)){
+ if(StringUtils.isBlank(code)||StringUtils.isBlank(uuid)){
throw new ApiException("验证码或验证码标识为空");
}
String verifyKey = CacheConstant.CAPTCHA_CODE_KEY +uuid;
String captcha = (String) redisUtils.get(verifyKey);
redisUtils.del(verifyKey);
- if (StrUtil.isBlank(captcha))
+ if (StringUtils.isBlank(captcha))
{
throw new ApiException("验证码已失效");
}
@@ -161,6 +181,11 @@
return sysUser;
}
+ public void delCacheByUsername(String username){
+ String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
+ redisUtils.del(key);
+ }
+
@Override
public SysUser getUserByUsernamePhone(String username) {
String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
@@ -174,9 +199,14 @@
return sysUser;
}
+ public void validatorPassword(String password){
+ if(password.length()<5||password.length()>30){
+ throw new ApiException("密码长度须在5-30之间");
+ }
+ }
+
@Override
- @Transactional(rollbackFor = RuntimeException.class)
- public int agencyRegister(SysUser user) {
+ public int addMonitor(SysUser user) {
//校验用户信息
if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
throw new ApiException("用户名已存在");
@@ -184,22 +214,46 @@
if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
throw new ApiException("手机号已存在");
}
+ String originPsword=Base64.decodeStr(user.getPassword());
+ validatorPassword(originPsword);
+ user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
+ user.setIdentity(UserIdentityEnum.MONITOR.getCode());
+ boolean b=save(user);
+ if(!b){
+ throw new ApiException("创建监管用户信息失败");
+ }
+ return 1;
+ }
+
+ @Override
+ @Transactional(rollbackFor = RuntimeException.class)
+ public int addAgency(SysUser user) {
+ //校验用户信息
+ if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
+ throw new ApiException("用户名已存在");
+ }
+ if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
+ throw new ApiException("手机号已存在");
+ }
+ String originPsword=Base64.decodeStr(user.getPassword());
+ validatorPassword(originPsword);
SysAgency agency=user.getAgency();
if(ObjectUtil.isNull(agency)){
throw new ApiException("机构信息不能为空");
}
+
//查询机构信息是否存在
- if(ObjectUtil.isNotNull(agencyMapper.checkAgencyNameUnique(agency.getName()))){
+ if(!agencyService.checkAgencyNameUnique(new SysAgency().setName(agency.getName()))){
throw new ApiException("机构名称已存在");
}
-
int i=agencyMapper.insert(agency);
if(i<1){
throw new ApiException("保存机构信息失败");
}
-
+ user.setIdentity(UserIdentityEnum.AGENCY.getCode());
user.setAgencyId(agency.getId());
- user.setUserType(UserIdentityEnum.AGENCY.getCode());
+ user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
+
boolean b=save(user);
if(!b){
throw new ApiException("创建机构用户信息失败");
@@ -217,8 +271,11 @@
if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
throw new ApiException("手机号已存在");
}
- user.setUserType(UserIdentityEnum.EXPERT.getCode());
+ String originPsword=Base64.decodeStr(user.getPassword());
+ validatorPassword(originPsword);
+ user.setIdentity(UserIdentityEnum.EXPERT.getCode());
user.setCreateBy(ShiroUtils.getSysUser().getUsername());
+ user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
boolean b=save(user);
if(!b){
throw new ApiException("创建专家信息失败");
@@ -258,14 +315,47 @@
}
@Override
+ public SysUser getUserInfoById(Long userId) {
+ return baseMapper.getUserInfoById(userId);
+ }
+
+ @Override
@Transactional(rollbackFor = RuntimeException.class)
public int deleteUserById(Long userId) {
SysUser user=getUserById(userId);
+ if(user==null){
+ throw new ApiException("用户不存在");
+ }
+ if(Objects.equals(ShiroUtils.getUserId(), userId)){
+ throw new ApiException("不能删除自己账号");
+ }
//机构用户,将机构信息设置成删除状态
- if(user.getUserType().equals(UserIdentityEnum.AGENCY.getCode())){
+ if(user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())){
+ if(user.getAgencyId()==null){
+ throw new ApiException("获取机构id为空");
+ }
agencyMapper.deleteAgencyById(user.getAgencyId());
}
+ delCacheByUsername(user.getUsername());
return baseMapper.deleteUserById(userId);
+ }
+
+ @Override
+ public int editMonitor(SysUser user) {
+ //校验用户信息
+ if(!checkUsernameUnique(user)){
+ throw new ApiException("用户名已存在");
+ }
+ if(!checkPhoneUnique(user)){
+ throw new ApiException("手机号已存在");
+ }
+ delCacheByUsername(user.getUsername());
+ user.setPassword(null);
+ boolean b=updateById(user);
+ if(!b){
+ throw new ApiException("更新监管用户信息失败");
+ }
+ return 1;
}
@@ -280,14 +370,18 @@
throw new ApiException("手机号已存在");
}
SysAgency agency=user.getAgency();
- if(ObjectUtil.isNull(agency)){
- throw new ApiException("机构信息不能为空");
+ if(ObjectUtil.isNull(agency)||agency.getId()==null){
+ throw new ApiException("机构信息或者id不能为空");
}
+
//查询机构信息是否存在
- if(ObjectUtil.isNotNull(agency)){
+ if(!agencyService.checkAgencyNameUnique(agency)){
throw new ApiException("机构名称已存在");
}
- agencyMapper.updateById(agency);
+
+ delCacheByUsername(user.getUsername());
+ agencyService.updateById(agency);
+ user.setPassword(null);
boolean b=updateById(user);
if(!b){
throw new ApiException("更新用户失败");
@@ -304,6 +398,7 @@
if(!checkPhoneUnique(user)){
throw new ApiException("手机号已存在");
}
+ user.setPassword(null);
boolean b=updateById(user);
if(!b){
throw new ApiException("更新专家信息失败");
@@ -331,14 +426,21 @@
attaches.add(attach);
}
attachService.saveBatch(attaches);
-
+ delCacheByUsername(user.getUsername());
return 1;
}
@Override
public boolean resetUserPwd(SysUser user) {
- return updateById(user);
+ String originPsword=Base64.decodeStr(user.getPassword());
+ validatorPassword(originPsword);
+ checkUserAllowed(user);
+ SysUser oldUser=checkUserDataScope(user.getId());
+ SysUser newUser=new SysUser().setId(user.getId()).setPassword(JwtTokenUtil.encryptPassword(oldUser.getUsername(),originPsword,oldUser.getSalt()));
+ newUser.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+ delCacheByUsername(oldUser.getUsername());
+ return updateById(newUser);
}
@Override
@@ -380,12 +482,16 @@
}
@Override
- public void checkUserDataScope(Long userId) {
+ public SysUser checkUserDataScope(Long userId) {
+ if(userId==null){
+ throw new ApiException("用户id为空!");
+ }
SysUser user = baseMapper.getUserById(userId);
if (ObjectUtil.isNull(user))
{
throw new ApiException("用户数据不存在!");
}
+ return user;
}
@Override
@@ -441,14 +547,20 @@
@Override
public boolean changeUserStatus(SysUser user) {
checkUserAllowed(user);
- checkUserDataScope(user.getId());
- return updateById(user);
+ SysUser existUser=checkUserDataScope(user.getId());
+ SysUser su=new SysUser().setId(user.getId()).setStatus(user.getStatus());
+ su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+ delCacheByUsername(existUser.getUsername());
+ return updateById(su);
}
@Override
public boolean changeApprove(SysUser user) {
checkUserAllowed(user);
- checkUserDataScope(user.getId());
- return updateById(user);
+ SysUser existUser=checkUserDataScope(user.getId());
+ SysUser su=new SysUser().setId(user.getId()).setState(user.getState());
+ su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+ delCacheByUsername(existUser.getUsername());
+ return updateById(su);
}
}
diff --git a/assess-system/src/main/resources/mapper/system/SysAgencyMapper.xml b/assess-system/src/main/resources/mapper/system/SysAgencyMapper.xml
index 0cc159e..cab000a 100644
--- a/assess-system/src/main/resources/mapper/system/SysAgencyMapper.xml
+++ b/assess-system/src/main/resources/mapper/system/SysAgencyMapper.xml
@@ -1,17 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gkhy.assess.system.mapper.SysAgencyMapper">
+ <resultMap type="com.gkhy.assess.system.domain.SysAgency" id="SysAgencyResult">
+ <id property="id" column="id" />
+ <result property="name" column="name" />
+ <result property="creditCode" column="credit_code" />
+ <result property="attribute" column="attribute" />
+ <result property="province" column="province" />
+ <result property="city" column="city" />
+ <result property="district" column="district" />
+ <result property="address" column="address" />
+ <result property="web" column="web" />
+ <result property="legalPerson" column="legal_person" />
+ <result property="legalPhone" column="legal_phone" />
+ <result property="manager" column="manager" />
+ <result property="managerPhone" column="manager_phone" />
+ <result property="certNumber" column="cert_number" />
+ <result property="issueDate" column="issue_date" />
+ <result property="validDate" column="valid_date" />
+ <result property="assetValue" column="asset_value" />
+ <result property="workArea" column="work_area" />
+ <result property="archiveArea" column="archive_area" />
+ <result property="regAddress" column="reg_address" />
+ <result property="business" column="business" />
+ <result property="reportPath" column="report_path" />
+ <result property="delFlag" column="del_flag" />
+ <result property="publication" column="publication" />
+ <result property="createTime" column="create_time" />
+ <result property="remark" column="remark" />
+ <association property="user" javaType="com.gkhy.assess.system.domain.SysUser" resultMap="userResult" />
+ <collection property="businessNames" ofType="java.lang.String" select="getBusinessById" column="{business=business}"/>
+ </resultMap>
+
+ <resultMap id="userResult" type="com.gkhy.assess.system.domain.SysUser">
+ <id property="id" column="user_id" />
+ <result property="username" column="username" />
+ <result property="phone" column="phone" />
+ </resultMap>
+
+
<sql id="selectAgencyVo">
- select a.id,a.name,a.credit_code,a.attribute,a.city,a.district,a.address,a.web,a.legal_person,a.legal_phone,a.manager,a.manager_phone,a.cert_number,a.issue_date,a.valid_date,a.asset_value,a.work_area,a.archive_area,a.reg_address,a.business,a.report_path,a.del_flag,a.create_time,a.remark
+ select a.id,a.name,a.credit_code,a.attribute,a.province,a.city,a.district,a.address,a.web,a.legal_person,
+ a.legal_phone,a.manager,a.manager_phone,a.cert_number,a.issue_date,a.valid_date,a.asset_value,a.work_area,a.archive_area,
+ a.reg_address,a.business,a.report_path,a.del_flag,a.publication,a.create_time,a.remark,
+ b.id as user_id,b.username,b.phone
from sys_agency a
+ left join sys_user b on b.agency_id=a.id and b.identity=1 and b.del_flag=0
</sql>
<select id="checkAgencyNameUnique" resultType="com.gkhy.assess.system.domain.SysAgency">
select id,name from sys_agency where name=#{name} and del_flag=0 limit 1
</select>
- <select id="agencyList" resultType="com.gkhy.assess.system.domain.SysAgency">
- select a.id,a.name,a.create_time,a.business,a.city from sys_agency a
+ <select id="agencyList" resultMap="SysAgencyResult">
+ select a.id,a.name,a.credit_code,a.attribute,a.cert_number,a.issue_date,a.valid_date,a.create_time,a.business,a.province,a.city,a.district,a.publication from sys_agency a
<where>
and a.del_flag = 0
<if test="name != null and name != ''">
@@ -21,13 +63,13 @@
AND a.city=#{city}
</if>
<if test="business != null and business != ''">
- AND a.business=#{business}
+ AND a.business like concat("%",#{business},"%")
</if>
</where>
order by a.create_time desc
</select>
- <select id="getAgencyById" resultType="com.gkhy.assess.system.domain.SysAgency">
+ <select id="getAgencyById" resultMap="SysAgencyResult">
<include refid="selectAgencyVo"/>
where a.del_flag = 0 and a.id=#{agencyId}
</select>
@@ -35,4 +77,12 @@
<delete id="deleteAgencyById" parameterType="java.lang.Long">
update sys_agency set del_flag=1 where id=#{agencyId}
</delete>
+
+
+ <select id="getBusinessById" resultType="java.lang.String">
+ select label from sys_dict_data where id in
+ <foreach item="item" index="index" collection="business.split(',')" open="(" separator="," close=")">
+ #{item}
+ </foreach>
+ </select>
</mapper>
diff --git a/assess-system/src/main/resources/mapper/system/SysAttachMapper.xml b/assess-system/src/main/resources/mapper/system/SysAttachMapper.xml
index 91733c0..abdd9ff 100644
--- a/assess-system/src/main/resources/mapper/system/SysAttachMapper.xml
+++ b/assess-system/src/main/resources/mapper/system/SysAttachMapper.xml
@@ -4,7 +4,7 @@
<delete id="deleteAttachsByUserId">
delete from sys_attach
<where>
- and user_id=#{user_id}
+ and user_id=#{userId}
<if test="type!=null and type!=''">
and type=#{type}
</if>
diff --git a/assess-system/src/main/resources/mapper/system/SysExpertClassifyMapper.xml b/assess-system/src/main/resources/mapper/system/SysExpertClassifyMapper.xml
new file mode 100644
index 0000000..b97128d
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/system/SysExpertClassifyMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gkhy.assess.system.mapper.SysExpertClassifyMapper">
+
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/system/SysExpertInfoMapper.xml b/assess-system/src/main/resources/mapper/system/SysExpertInfoMapper.xml
new file mode 100644
index 0000000..1bd95ed
--- /dev/null
+++ b/assess-system/src/main/resources/mapper/system/SysExpertInfoMapper.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gkhy.assess.system.mapper.SysExpertInfoMapper">
+
+ <sql id="selectExpertInfoVo">
+ select expert_id,name,sex,birthday,phone,title,electronic_photo,id_card,duty_status,
+ company_name,company_address,dept_name,job,company_telephone,fax_num,email,
+ graduation_school,degree,speciality,current_profession,support_direction_safety,
+ support_direction_prevention,support_direction_emergency,resume_key,paper_situation_key,
+ reward_key,achievement_key,personal_opinion_key,recommend_unit_opinion_key,remark,create_by,
+ create_time,big_classify,small_classify,del_flag
+ from sys_agency
+ </sql>
+
+ <delete id="deleteBatchByIds">
+ update expert_info set del_flag = 1 where expert_id in
+ <foreach collection="expertIds" item="expertId" separator="," open="(" close=")">
+ #{expertId}
+ </foreach>
+ </delete>
+
+ <select id="expertInfoList" resultType="com.gkhy.assess.system.domain.SysExpertInfo">
+ <include refid="selectExpertInfoVo"/>
+ <where>
+ and del_flag = 0
+ <if test="name != null and name != ''">
+ and name like concat('%', #{name}, '%')
+ </if>
+ <if test="bigClassify != null">
+ and big_classify = #{bigClassify}
+ </if>
+ <if test="smallClassify != null">
+ and small_classify = #{smallClassify}
+ </if>
+ <if test="dutyStatus != null">
+ and duty_status = #{dutyStatus}
+ </if>
+ <if test="params.startTime != null "><!-- 开始时间检索 -->
+ and date_format(create_time,'%y%m%d') >= date_format(#{params.startTime},'%y%m%d')
+ </if>
+ <if test="params.endTime != null "><!-- 结束时间检索 -->
+ and date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
+ </if>
+ </where>
+ order by create_time desc
+ </select>
+ <select id="checkIdcardUnique" resultType="com.gkhy.assess.system.domain.SysExpertInfo">
+ select expert_id,name from sys_expert_info where del_flag=0 limit 1
+ </select>
+</mapper>
diff --git a/assess-system/src/main/resources/mapper/system/SysLawMapper.xml b/assess-system/src/main/resources/mapper/system/SysLawMapper.xml
index de6e34e..679233f 100644
--- a/assess-system/src/main/resources/mapper/system/SysLawMapper.xml
+++ b/assess-system/src/main/resources/mapper/system/SysLawMapper.xml
@@ -7,7 +7,7 @@
</sql>
<select id="lawList" resultType="com.gkhy.assess.system.domain.SysLaw">
- select l.id,l.title,l.create_time from sys_law l
+ select l.id,l.title,l.sub_title,l.law_type,l.pub_agency,l.pub_date,l.create_time from sys_law l
<where>
<if test="title != null and title != ''">
AND l.title like concat('%', #{title}, '%')
diff --git a/assess-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/assess-system/src/main/resources/mapper/system/SysNoticeMapper.xml
index 9179ea2..290bbcf 100644
--- a/assess-system/src/main/resources/mapper/system/SysNoticeMapper.xml
+++ b/assess-system/src/main/resources/mapper/system/SysNoticeMapper.xml
@@ -3,12 +3,12 @@
<mapper namespace="com.gkhy.assess.system.mapper.SysNoticeMapper">
<sql id="selectNoticeVo">
- select n.id,n.title,n.content,n.status,n.create_time,n.remark
+ select n.id,n.title,n.content,n.status,n.create_time,n.update_time,n.remark
from sys_notice n
</sql>
<select id="noticeList" resultType="com.gkhy.assess.system.domain.SysNotice">
- select n.id,n.title,n.create_time from sys_notice n
+ select n.id,n.title,n.create_time,n.update_time from sys_notice n
<where>
<if test="title != null and title != ''">
AND n.title like concat('%', #{title}, '%')
diff --git a/assess-system/src/main/resources/mapper/system/SysRegionMapper.xml b/assess-system/src/main/resources/mapper/system/SysRegionMapper.xml
index 846a848..0887f26 100644
--- a/assess-system/src/main/resources/mapper/system/SysRegionMapper.xml
+++ b/assess-system/src/main/resources/mapper/system/SysRegionMapper.xml
@@ -3,6 +3,6 @@
<mapper namespace="com.gkhy.assess.system.mapper.SysRegionMapper">
<select id="checkRegionUnique" resultType="com.gkhy.assess.system.domain.SysRegion">
- select * from sys_region where name=#{name} and parent_id=#{parentId}
+ select * from sys_region where name=#{name} and parent_id=#{parentId} and region_type=#{regionType}
</select>
</mapper>
diff --git a/assess-system/src/main/resources/mapper/system/SysUserMapper.xml b/assess-system/src/main/resources/mapper/system/SysUserMapper.xml
index 7b7b107..f42a7e2 100644
--- a/assess-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/assess-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -22,7 +22,7 @@
<result property="expertType" column="expert_type" />
<result property="jobTitle" column="job_title" />
<result property="major" column="major" />
- <result property="approve" column="approve" />
+ <result property="state" column="state" />
<result property="loginIp" column="login_ip" />
<result property="loginDate" column="login_date" />
<result property="pwdUpdateDate" column="pwd_update_date" />
@@ -32,9 +32,9 @@
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
<association property="agency" javaType="com.gkhy.assess.system.domain.SysAgency" resultMap="agencyResult" />
- <collection property="socialAttach" ofType="com.gkhy.assess.system.domain.SysAttach" select="getAttachByUserId" column="{userId=id}"/>
- <collection property="medicalAttach" ofType="com.gkhy.assess.system.domain.SysAttach" select="getAttachByUserId" column="{userId=id}"/>
- <collection property="salaryAttach" ofType="com.gkhy.assess.system.domain.SysAttach" select="getAttachByUserId" column="{userId=id}"/>
+ <collection property="socialAttach" ofType="com.gkhy.assess.system.domain.SysAttach" select="getSocialAttachByUserId" column="{userId=id}"/>
+ <collection property="medicalAttach" ofType="com.gkhy.assess.system.domain.SysAttach" select="getMedicalAttachByUserId" column="{userId=id}"/>
+ <collection property="salaryAttach" ofType="com.gkhy.assess.system.domain.SysAttach" select="getSalaryAttachByUserId" column="{userId=id}"/>
</resultMap>
@@ -45,7 +45,7 @@
</resultMap>
<sql id="selectUserVo">
- select u.id,u.username, u.name,u.identity,u.user_type,u.phone,u.sex,u.status,u.del_flag,u.manage_region,u.expert_type,u.agency_id,u.post,u.job_title,u.major,u.approve,u.create_time,u.remark,a.id as agency_id,a.name as agency_name,a.credit_code
+ select u.id,u.username, u.name,u.identity,u.user_type,u.phone,u.sex,u.status,u.del_flag,u.manage_region,u.expert_type,u.agency_id,u.post,u.job_title,u.major,u.state,u.create_time,u.remark,a.id as agency_id,a.name as agency_name,a.credit_code
from sys_user u
left join sys_agency a on u.agency_id=a.id
</sql>
@@ -61,14 +61,14 @@
</delete>
<select id="getUserByUsername" resultMap="SysUserResult">
- select id,username,name,password,salt,identity,status,del_flag from sys_user
+ select id,username,name,password,salt,identity,state,status,del_flag from sys_user
where username=#{username} and del_flag=0
</select>
<select id="monitorList" resultType="com.gkhy.assess.system.domain.SysUser">
<include refid="selectUserVo"/>
<where>
- and u.del_flag = 0 and u.user_type=0
+ and u.del_flag = 0 and u.identity=0
<if test="username != null and username != ''">
AND u.username like concat('%', #{username}, '%')
</if>
@@ -85,7 +85,7 @@
<select id="agencyList" resultMap="SysUserResult">
<include refid="selectUserVo"/>
<where>
- and u.del_flag = 0 and u.user_type=1
+ and u.del_flag = 0 and u.identity=1
<if test="username != null and username != ''">
AND u.username like concat('%', #{username}, '%')
</if>
@@ -102,7 +102,7 @@
<select id="expertList" resultMap="SysUserResult">
<include refid="selectUserVo"/>
<where>
- and u.del_flag = 0 and u.user_type=2
+ and u.del_flag = 0 and u.identity=2
<if test="username != null and username != ''">
AND u.username like concat('%', #{username}, '%')
</if>
@@ -112,6 +112,9 @@
<if test="phone != null and phone != ''">
AND u.phone like concat('%', #{phone}, '%')
</if>
+ <if test="expertType != null and expertType != ''">
+ AND u.expert_type =#{expertType}
+ </if>
</where>
order by u.create_time desc
</select>
@@ -119,17 +122,17 @@
<select id="getUserByPhone" resultMap="SysUserResult">
- select id,username,name,password,salt,identity,status,del_flag from sys_user
+ select id,username,name,password,salt,identity,state,status,del_flag from sys_user
where phone=#{phone} and del_flag=0
</select>
<select id="getUserByEmail" resultMap="SysUserResult">
- select id,username,name,password,salt,identity,status,del_flag from sys_user
+ select id,username,name,password,salt,identity,state,status,del_flag from sys_user
where email=#{email} and del_flag=0
</select>
<select id="getUserById" resultMap="SysUserResult">
- select id,username,name,password,salt,identity,status,del_flag from sys_user
+ select id,username,name,password,salt,identity,status,del_flag,agency_id from sys_user
where id=#{userId}
</select>
@@ -146,12 +149,25 @@
</select>
<select id="getUserByUsernamePhone" resultType="com.gkhy.assess.system.domain.SysUser">
- select id,username,name,password,salt,identity,status,del_flag from sys_user
+ select id,username,name,password,salt,identity,state,status,del_flag from sys_user
where (username=#{username} or phone=#{username}) and del_flag=0
</select>
- <select id="getAttachByUserId" resultType="com.gkhy.assess.system.domain.SysAttach">
- select id,name,path,type,user_id,create_time from sys_attach where user_id=#{userId} order by create_time desc limit 1
+ <select id="getSocialAttachByUserId" resultType="com.gkhy.assess.system.domain.SysAttach">
+ select id,name,path,type,user_id,create_time from sys_attach where user_id=#{userId} and type=1 order by create_time desc
+ </select>
+
+ <select id="getMedicalAttachByUserId" resultType="com.gkhy.assess.system.domain.SysAttach">
+ select id,name,path,type,user_id,create_time from sys_attach where user_id=#{userId} and type=2 order by create_time desc
+ </select>
+
+ <select id="getSalaryAttachByUserId" resultType="com.gkhy.assess.system.domain.SysAttach">
+ select id,name,path,type,user_id,create_time from sys_attach where user_id=#{userId} and type=3 order by create_time desc
+ </select>
+
+ <select id="getUserInfoById" resultMap="SysUserResult">
+ <include refid="selectUserVo"/>
+ where u.id=#{userId}
</select>
</mapper>
diff --git a/pom.xml b/pom.xml
index ea92af6..5fbb586 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,6 +40,7 @@
<fastjson.version>1.2.76</fastjson.version>
<caffeine.version>2.9.3</caffeine.version>
<kaptcha.version>2.3.2</kaptcha.version>
+ <commons.io.version>2.13.0</commons.io.version>
</properties>
<dependencyManagement>
<dependencies>
@@ -151,6 +152,13 @@
<version>${kaptcha.version}</version>
</dependency>
+ <!-- io常用工具类 -->
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>${commons.io.version}</version>
+ </dependency>
+
</dependencies>
</dependencyManagement>
--
Gitblit v1.9.2