kongzy
2023-12-08 ca5445257b1fdeceddf3fcc2dea18c442023aeb7
新街口
已重命名10个文件
已修改61个文件
已添加52个文件
已复制1个文件
13595 ■■■■■ 文件已修改
assess-admin/src/main/java/com/gkhy/assess/admin/GkhyAdminApplication.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/CaptchaController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertClassifyController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/ExpertInfoController.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/LawController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/NoticeController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/application.yml 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231123001_add_user.sql 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231123002_dict_type.sql 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231123003_dict_data.sql 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231123004_config.sql 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231123005_agency.sql 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231123006_notice.sql 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231123007_law.sql 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231124001_region.sql 521 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231124002_attach.sql 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231127001_expert_classify.sql 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231127002_expert_info.sql 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231130001_project.sql 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231130002_risk_estimate.sql 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231130003_contract.sql 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231130004_estimate_task.sql 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231204001_device.sql 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231204002_estimate_plan.sql 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231204003_estimate_schedule.sql 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231204004_plan_person.sql 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231204005_plan_expert.sql 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231205001_work_notification.sql 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231205002_investigation.sql 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231205003_accessory_file.sql 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231205004_face_record.sql 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231205005_audit.sql 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231205006_conclusion.sql 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231206001_process_audit.sql 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/db/migration/V20231206002_project_material.sql 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/main/resources/region.json 8528 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-admin/src/test/java/com/gkhy/admin/RegionTest.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/constant/CacheConstant.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/domain/BaseEntity.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/domain/PageDomain.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/domain/vo/AccountVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/enums/AccessoryFileTypeEnum.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/enums/ApproveStatusEnum.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/enums/ExpertTypeEnum.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/enums/RegionTypeEnum.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/filter/RepeatableFilter.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/filter/RepeatedlyRequestWrapper.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/filter/XssFilter.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/filter/XssHttpServletRequestWrapper.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/utils/ConvertUtil.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/utils/JSONUtil.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/utils/JwtTokenUtil.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/utils/SqlUtil.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/utils/StringUtils.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/utils/html/EscapeUtil.java 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/utils/html/HTMLFilter.java 566 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/utils/http/HttpHelper.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/utils/http/HttpUtils.java 265 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/validate/AgencyGroup.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/validate/ExpertGroup.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-common/src/main/java/com/gkhy/assess/common/validate/MonitorGroup.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/aop/LogAspect.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/config/ApplicationConfig.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/config/FilterConfig.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/config/MyWebMvcConfig.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/exception/GlobalExceptionHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/LogInterceptor.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/RepeatSubmitInterceptor.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/interceptor/SameUrlDataInterceptor.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/shiro/ShiroConfig.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/shiro/realm/UserRealm.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysLoginService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-framework/src/main/java/com/gkhy/assess/framework/shiro/service/SysPasswordService.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/SysAgency.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/SysAttach.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictData.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/SysDictType.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertClassify.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/SysExpertInfo.java 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/SysLaw.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/SysNotice.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/SysRegion.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/SysUser.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/domain/vo/UploadObjectVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertClassifyMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/mapper/SysExpertInfoMapper.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/mapper/SysRegionMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/mapper/SysUserMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/SysAgencyService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertClassifyService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/SysExpertInfoService.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/SysLawService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/SysNoticeService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/SysUserService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysAgencyServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysCommonServiceImpl.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysConfigServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysDictTypeServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertClassifyServiceImpl.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysExpertInfoServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysLawServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysNoticeServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysRegionServiceImpl.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java 188 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/resources/mapper/system/SysAgencyMapper.xml 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/resources/mapper/system/SysAttachMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/resources/mapper/system/SysExpertClassifyMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/resources/mapper/system/SysExpertInfoMapper.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/resources/mapper/system/SysLawMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/resources/mapper/system/SysNoticeMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/resources/mapper/system/SysRegionMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
assess-system/src/main/resources/mapper/system/SysUserMapper.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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) {
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/CaptchaController.java
文件名从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/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;
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));
    }
}
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));
    }
}
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysAgencyController.java
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
文件从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/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));
    }
}
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysCommonController.java
文件名从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/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;
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictDataController.java
文件名从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/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));
    }
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysDictTypeController.java
文件名从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/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));
    }
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLawController.java
文件名从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/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));
    }
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysLoginController.java
文件名从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/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;
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysNoticeController.java
文件名从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/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));
    }
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysRegionController.java
文件名从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/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));
    }
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/SysUserController.java
文件名从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/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 @@
}
assess-admin/src/main/java/com/gkhy/assess/admin/controller/web/front/AgencyController.java
文件名从 assess-admin/src/main/java/com/gkhy/assess/admin/controller/SysAgencyController.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);
    }
}
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));
    }
}
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));
    }
}
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/*
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(), '管理员');
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
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(), '业务范围数据');
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
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;
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;
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;
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;
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);
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
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
assess-admin/src/main/resources/region.json
对比新文件
文件太大
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);
            }
        }
    }
}
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>
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:";
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;
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() {
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;
}
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;
    }
}
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;
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;
    }
}
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;
    }
}
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()
    {
    }
}
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)
            {
            }
        };
    }
}
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()
    {
    }
}
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);
    }
}
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));
    }
    /**
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);
        }
    }
}
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();
    }
}
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注入风险");
            }
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);
    }
}
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['\''] = "&#039;".toCharArray(); // 单引号
        TEXT['"'] = "&#34;".toCharArray(); // 双引号
        TEXT['&'] = "&#38;".toCharArray(); // &符
        TEXT['<'] = "&#60;".toCharArray(); // 小于号
        TEXT['>'] = "&#62;".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));
    }
}
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, "&amp;", result);
        result = regexReplace(P_QUOTE, "&quot;", result);
        result = regexReplace(P_LEFT_ARROW, "&lt;", result);
        result = regexReplace(P_RIGHT_ARROW, "&gt;", 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, "&lt;$1", s);
            s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2&gt;<", 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); // (<|$)
                // 不替换双引号为&quot;,防止json格式无效 regexReplace(P_QUOTE, "&quot;", 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 : "&amp;" + 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));
    }
}
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();
    }
}
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;
        }
    }
}
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 {
}
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 {
}
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 {
}
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]);
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();
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;
    }
}
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("/**");
    }
}
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());
        }
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 {
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;
}
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;
    }
}
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"); // 需登录才能访问
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;
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;
        }
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();
    }
}
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;
}
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;
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;
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;
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;
}
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;
}
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 {
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 {
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;
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;
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("文件保存相对路径")
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> {
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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;
    }
}
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;
        }
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(){
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
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;
    }
}
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;
    }
}
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;
    }
}
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;
    }
}
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&&regionList.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;
    }
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);
    }
}
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>
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>
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>
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') &gt;= date_format(#{params.startTime},'%y%m%d')
            </if>
            <if test="params.endTime != null "><!-- 结束时间检索 -->
                and date_format(create_time,'%y%m%d') &lt;= 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>
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}, '%')
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}, '%')
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>
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>
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>