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