Browse Source

迁移代码

wisewoods 3 years ago
parent
commit
af5a00ea4f
100 changed files with 6595 additions and 64 deletions
  1. 568 0
      README.md
  2. 5 0
      docker/copy.sh
  3. 1 1
      docker/mysql/db/readme.txt
  4. 2 2
      docker/nacos/conf/application.properties
  5. 0 1
      docker/nginx/html/dist/readme.txt
  6. 1 1
      docker/ruoyi/auth/dockerfile
  7. 1 1
      docker/ruoyi/auth/jar/readme.txt
  8. 1 1
      docker/ruoyi/gateway/dockerfile
  9. 1 1
      docker/ruoyi/gateway/jar/readme.txt
  10. 15 0
      docker/ruoyi/modules/business/dockerfile
  11. 1 0
      docker/ruoyi/modules/business/jar/readme.txt
  12. 1 1
      docker/ruoyi/modules/file/dockerfile
  13. 1 1
      docker/ruoyi/modules/file/jar/readme.txt
  14. 1 1
      docker/ruoyi/modules/gen/dockerfile
  15. 1 1
      docker/ruoyi/modules/gen/jar/readme.txt
  16. 1 1
      docker/ruoyi/modules/job/dockerfile
  17. 1 1
      docker/ruoyi/modules/job/jar/readme.txt
  18. 15 0
      docker/ruoyi/modules/organization/dockerfile
  19. 1 0
      docker/ruoyi/modules/organization/jar/readme.txt
  20. 1 1
      docker/ruoyi/modules/system/dockerfile
  21. 1 1
      docker/ruoyi/modules/system/jar/readme.txt
  22. 1 1
      docker/ruoyi/visual/monitor/jar/readme.txt
  23. 28 0
      pom.xml
  24. 1 0
      ruoyi-api/pom.xml
  25. 44 0
      ruoyi-api/ruoyi-api-ext/pom.xml
  26. 27 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/RemoteDictDataService.java
  27. 29 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/RemoteDictTypeService.java
  28. 24 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/datascope/DataScopeExt.java
  29. 149 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/datascope/DataScopeExtAspect.java
  30. 66 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBException.java
  31. 74 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBExecResult.java
  32. 81 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBFactory.java
  33. 1395 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBImpl.java
  34. 440 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBResult.java
  35. 31 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBTool.java
  36. 175 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/domain/SysDictData.java
  37. 98 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/domain/SysObjDictRet.java
  38. 88 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/domain/SysObjDictType.java
  39. 29 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/CheckInStatus.java
  40. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/ContractStatus.java
  41. 29 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/DocumentTypeStatus.java
  42. 29 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/ExamineStatus.java
  43. 29 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/ResultStatus.java
  44. 29 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/RoomManagementStatus.java
  45. 29 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/RoomStatus.java
  46. 29 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/StateStatus.java
  47. 30 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/SysDeptJlStatus.java
  48. 29 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/WhetherStatus.java
  49. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/factory/RemoteDictDataFallbackFactory.java
  50. 34 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/factory/RemoteDictTypeFallbackFactory.java
  51. 163 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/utils/IDCardUtil.java
  52. 1309 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/utils/StringUtilsN.java
  53. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ChineseV.java
  54. 34 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ChineseValidator.java
  55. 30 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/DateV.java
  56. 91 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/DateValidator.java
  57. 30 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/DictV.java
  58. 67 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/DictValidator.java
  59. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EmailV.java
  60. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EmailValidator.java
  61. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EnglishV.java
  62. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EnglishValidator.java
  63. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EnumV.java
  64. 38 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EnumValidator.java
  65. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/FzjgV.java
  66. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/FzjgValidator.java
  67. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/IdCardV.java
  68. 23 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/IdCardValidator.java
  69. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/MobileV.java
  70. 34 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/MobileValidator.java
  71. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/MoneyV.java
  72. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/MoneyValidator.java
  73. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/NumberOrEnglishV.java
  74. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/NumberOrEnglishValidator.java
  75. 30 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ObjDictV.java
  76. 82 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ObjDictValidator.java
  77. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/PhoneV.java
  78. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/PhoneValidator.java
  79. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/QQV.java
  80. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/QQValidator.java
  81. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/UrlV.java
  82. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/UrlValidator.java
  83. 26 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ZipV.java
  84. 32 0
      ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ZipValidator.java
  85. 4 0
      ruoyi-api/ruoyi-api-ext/src/main/resources/META-INF/spring.factories
  86. 6 0
      ruoyi-api/ruoyi-api-system/pom.xml
  87. 20 2
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java
  88. 0 2
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java
  89. 0 2
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java
  90. 11 2
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java
  91. 12 2
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
  92. 7 0
      ruoyi-auth/pom.xml
  93. 10 5
      ruoyi-auth/src/main/resources/bootstrap.yml
  94. 4 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java
  95. 25 5
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/GenConstants.java
  96. 44 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
  97. 51 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java
  98. 15 0
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/AjaxResult.java
  99. 98 27
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseEntity.java
  100. 0 0
      ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java

+ 568 - 0
README.md

@@ -9,6 +9,574 @@
 	<a href="https://gitee.com/y_project/RuoYi-Cloud/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
 </p>
 
+## 端口占用说明 ----
+常用
+80/443 nginx
+8848/9848/9849 nacos
+4500/500 vpn
+9000 docker可视化
+8000 jenkins
+27017 mongodb
+8718 sentinel
+
+
+60001 探访项目前端
+60002 探访项目公众号
+60003 探访项目大屏
+30301 探访项目大屏后端
+30101 探访项目后端
+60044 一汽项目前端
+30144 一汽项目后端
+
+
+8080 考试系统网关
+9200 考试系统认证
+9100 考试系统监控
+9300 考试系统文件上传
+9202 考试系统代码生成器
+9203 考试系统定时任务
+9201 考试系统系统模块
+8122 考试系统教育
+8121 考试系统资源
+800 考试系统前端
+60077 考试系统uniapp
+6378 考试redis
+
+
+9090 民政系统网关
+9400 民政系统认证
+9101 民政系统监控
+9399 民政系统文件上传
+9402 民政系统代码生成器
+9403 民政系统定时任务
+9401 民政系统系统模块
+8280 民政系统机构模块
+8290 民政系统政务模块
+801 民政系统前端
+6379 民政redis
+
+
+## 升级改造
+1.首先在根目录的pom文件添加
+```xml
+<profiles>
+    <profile>
+        <id>dev</id>
+        <properties>
+            <!-- 环境标识,需要与配置文件的名称相对应 -->
+            <profiles.active>dev</profiles.active>
+            <nacos.server>139.9.138.217:8848</nacos.server>
+            <nacos.discovery.group>MZ</nacos.discovery.group>
+            <nacos.discovery.namespace>f4b2e449-3ed7-4338-8fcd-717e6066baf3</nacos.discovery.namespace>
+            <nacos.config.group>MZ</nacos.config.group>
+            <nacos.config.namespace>f4b2e449-3ed7-4338-8fcd-717e6066baf3</nacos.config.namespace>
+        </properties>
+        <activation>
+            <!-- 默认环境 -->
+            <activeByDefault>true</activeByDefault>
+        </activation>
+    </profile>
+    <profile>
+        <id>prod</id>
+        <properties>
+            <profiles.active>prod</profiles.active>
+            <nacos.server>139.9.138.217:8848</nacos.server>
+            <nacos.discovery.group>MZ</nacos.discovery.group>
+            <nacos.config.group>MZ</nacos.config.group>
+        </properties>
+    </profile>
+</profiles>
+```
+2.复制docker文件夹,替换3.4 - 3.5 无变更
+复制ruoyi-ui下的Dockerfile,nginx.conf到新工程
+3.替换配置方式:
+sentinel的
+127.0.0.1:8718 换成 139.9.138.217:8718
+127.0.0.1:8848 换成 139.9.138.217:8848
+active: dev 
+换
+active: @profiles.active@
+```yaml
+nacos:
+  discovery:
+    # 服务注册地址
+    server-addr: 127.0.0.1:8848
+  config:
+    # 配置中心地址
+    server-addr: 127.0.0.1:8848
+    # 配置文件格式
+    file-extension: yml
+    # 共享配置
+    shared-configs:
+      - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+```
+换成
+```yaml
+nacos:
+  # nacos 服务地址
+  server-addr: @nacos.server@
+  discovery:
+    # 注册组
+    group: @nacos.discovery.group@
+    namespace: @nacos.discovery.namespace@
+  config:
+    # 配置组
+    group: @nacos.config.group@
+    namespace: @nacos.config.namespace@
+    # 配置文件格式
+    file-extension: yml
+    # 共享配置
+    shared-configs:
+      - data-id: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+        group: MZ
+```
+每个需要启动的pom的build节点下添加
+```
+<resources>
+    <resource>
+        <directory>src/main/resources</directory>
+        <!--开启过滤,用指定的参数替换directory下的文件中的参数-->
+        <filtering>true</filtering>
+    </resource>
+</resources>
+```
+4.替换gen生成相关类:复制保留使用新的
+(1)com.ruoyi.common.core.constant.GenConstants 
+(2)com.ruoyi.gen.domain.GenTableColumn 
+(3)复制vm文件夹,使用新的
+
+5.添加新依赖 
+gateway添加kinfe
+```xml
+<dependency>
+    <groupId>com.github.xiaoymin</groupId>
+    <artifactId>knife4j-spring-ui</artifactId>
+    <version>3.0.3</version>
+</dependency>
+```
+添加mybaitsplus,lombok
+
+6.修改系统部门角色相关
+修改ruoyi-api-system下SysDept添加
+```
+/**行政区划id */
+private String locationId;     //->mapper添加此字段
+private String locationName;   
+```
+SysRole添加
+```
+/** 拥有分配角色能力的角色id集 */
+private String powerRids;   // 角色和用户查询详情 mapper都添加次字段
+```
+SysUser添加,部门不能为空
+```
+/** 养老机构ID */
+private String jgId; //mapper添加此字段    selectUserVo添加u.jg_id, r.power_rids,SysUserResult,SysRole对应字段
+```
+
+(1)SysDeptController.java
+方法:excludeChild,roleDeptTreeselect
+改造:deptService.selectDeptList(new SysDept());
+    改为new SysDept().setStatus("0");deptService.selectDeptList(dept);
+(2)SysMenuController.java
+方法:treeselect   
+改造: 添加menu.setStatus("0");
+(2.1)SysMenuServiceImpl
+方法selectMenuList(Long userId)
+```
+SysMenu menu = new SysMenu();
+menu.setStatus("0");
+return selectMenuList(menu, userId);
+```
+(2.2)SysMenuMapper添加selectMenuByIds
+```
+<select id="selectMenuByIds" resultMap="SysMenuResult">
+    <include refid="selectMenuVo"/>
+    WHERE menu_id in
+    <foreach collection="array" item="id" index="index" open="(" close=")" separator=",">
+        #{id}
+    </foreach>
+</select>
+```
+(3)SysDeptServiceImpl
+添加
+```
+@Autowired
+private SysDeptJlMapper sysDeptJlMapper;    
+```
+selectDeptById方法 添加locationname回显
+```
+SysDept sysDept = deptMapper.selectDeptById(deptId);
+SysDeptJl sysDeptJl = sysDeptJlMapper.selectSysDeptJlById(sysDept.getLocationId());
+if (sysDeptJl!=null){
+    sysDept.setLocationName(sysDeptJl.getName());
+}
+return sysDept;
+```
+insertDept方法 
+```
+if (dept.getParentId() == 0){
+    return deptMapper.insertDept(dept);
+}
+    SysDept info = deptMapper.selectDeptById(dept.getParentId());
+// 如果父节点不为正常状态,则不允许新增子节点
+if (!UserConstants.DEPT_NORMAL.equals(info.getStatus()))
+{
+    throw new ServiceException("部门停用,不允许新增");
+}
+if (StringUtils.isBlank(info.getAncestors())){
+    dept.setAncestors(""+dept.getParentId());
+}else{
+    dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
+}
+return deptMapper.insertDept(dept);
+```
+(4)SysRoleServiceImpl
+selectRoleList方法 注释数据权限
+```
+@Autowired
+private SysMenuMapper sysMenuMapper;
+@Autowired
+private ISysUserService sysUserService;
+if (SecurityUtils.isAdmin(SecurityUtils.getUserId())){
+    Map<String, Object> params = role.getParams();
+    params.put("ids",null);
+    role.setParams(params);
+    return roleMapper.selectRoleList(role);
+}else{
+    //查看当前人的角色
+    SysUser sysUser = sysUserService.selectUserById(SecurityUtils.getUserId());
+    List<String> ids = new ArrayList<>();
+    sysUser.getRoles().stream().forEach(r -> {
+        String powerRids = r.getPowerRids();
+        if (!StringUtils.isBlank(powerRids)) {
+            ids.addAll(Arrays.asList(powerRids.split(",")));
+        }
+    });
+    if (ids.size() == 0){
+        return new ArrayList<>();
+    }else{
+        Map<String, Object> params = role.getParams();
+        params.put("ids",ids);
+        role.setParams(params);
+        return roleMapper.selectRoleList(role);
+    }
+}
+```
+添加一个检测是否能授权角色的方法 接口和实现类都写
+```
+/**
+ * 检查角色是否存在
+ *
+ * @param role 角色信息
+ */
+public void checkRolesExist(SysRole role);
+/**
+ * 检查角色是否存在
+ *
+ * @param role 角色信息
+ */
+@Override
+public void checkRolesExist(SysRole role) {
+    // 检查是否拥有角色分配权限
+    Long[] menuIds = role.getMenuIds();
+    List<SysMenu> sysMenus = sysMenuMapper.selectMenuByIds(menuIds);
+    boolean hasRoleAuth = sysMenus.stream().anyMatch(sysMenu -> "角色分配".equals(sysMenu.getMenuName()));
+    if (hasRoleAuth){
+        String powerRids = role.getPowerRids();
+        if (!StringUtils.isBlank(powerRids)){
+            String[] ids = powerRids.split(",");
+            for (String id : ids) {
+                checkRoleAllowed(new SysRole(Long.parseLong(id)));
+            }
+            Map<String, Object> params = role.getParams();
+            params.put("ids",ids);
+            role.setParams(params);
+            SysRole sysRole = new SysRole();
+            sysRole.setParams(params);
+            List<SysRole> sysRoles = roleMapper.selectRoleList(sysRole);
+            boolean b = sysRoles.size() == ids.length;
+            if (!b){
+                throw new ServiceException("分配的角色不符合规范");
+            }
+        }
+    }else{
+        role.setPowerRids("");
+    }
+}
+```
+(4.1)SysRoleMapper修改selectRoleList
+```
+<select id="selectRoleList" parameterType="SysRole" resultMap="SysRoleResult">
+    select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly,
+    r.status, r.del_flag, r.create_time, r.remark
+    from sys_role r
+    where r.del_flag = '0'
+    <if test="params.ids != null and params.ids != ''">
+        AND r.role_id in
+        <foreach collection="params.ids" item="id" index="index" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </if>
+    <if test="roleId != null and roleId != 0">
+        AND r.role_id = #{roleId}
+    </if>
+    <if test="roleName != null and roleName != ''">
+        AND r.role_name like concat('%', #{roleName}, '%')
+    </if>
+    <if test="status != null and status != ''">
+        AND r.status = #{status}
+    </if>
+    <if test="roleKey != null and roleKey != ''">
+        AND r.role_key like concat('%', #{roleKey}, '%')
+    </if>
+    <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
+        and date_format(r.create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
+    </if>
+    <if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
+        and date_format(r.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
+    </if>
+    order by r.role_sort
+</select>
+```
+(5)SysUserServiceImpl
+checkUserAllowed方法
+```
+if ((StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) ||
+        (StringUtils.isNotNull(user.getUserId())  && SecurityUtils.getUserId().equals(user.getUserId())))
+{
+    throw new ServiceException("不允许操作该用户");
+}
+```
+insertUser方法 添加jgId
+```
+user.setJgId(IdUtils.simpleUUID());
+```
+
+(6)ruoyi-ui/src/api/system/dict/type.js
+添加
+```
+// 业务字典查询
+export function objdictList(query) {
+  return request({
+    url: '/system/dict/type/objdict',
+    method: 'get',
+    params: query
+  })
+}
+// 业务表查询
+export function objtableList(query) {
+  return request({
+    url: '/system/dict/type/objtable',
+    method: 'get',
+    params: query
+  })
+}
+// Tree数据查询
+export function gettreedata(query) {
+  return request({
+    url: '/system/dict/type/gettreedata',
+    method: 'get',
+    params: query
+  })
+}
+// 统计数据获取
+export function getstatisticaldata(query) {
+  return request({
+    url: '/system/dict/type/getstatisticaldata',
+    method: 'get',
+    params: query
+  })
+}
+```
+
+(7)assets/styles/index.scss
+```
+//表格字多悬浮的样式
+.el-tooltip__popper {
+  max-width: 500px;
+  line-height: 180%;
+  white-space: pre-wrap;
+}
+//提高警告消息的层级
+.el-message--warning{
+  z-index: 3000 !important;
+}
+```
+(7.1)vuex 的user
+```
+userData:'',
+SET_USERDATA: (state, userData) => {
+  state.userData = userData
+},
+获取用户信息
+commit('SET_USERDATA', user)
+```
+
+main.js 以及utils下的工具类
+(8)dept/index.vue
+```
+<el-row>
+  <el-col :span="12">
+    <el-form-item label="所属区划" prop="locationId" >
+      <el-input v-model="form.locationName|| '无'" :disabled="true" v-if="form.deptId"/>
+      <RegionCascaderSelect v-model="form.location" v-else></RegionCascaderSelect>
+    </el-form-item>
+  </el-col>
+</el-row>
+
+isExpandAll: false,
+重置表单:
+location:undefined,
+locationId:"",
+locationName:"",
+
+提交
+submitForm: function() {
+  this.$refs["form"].validate(valid => {
+    if (valid) {
+      if (this.form.location){
+        this.form.locationId = this.form.location[this.form.location.length-1];
+      }
+
+样式
+<style scoped>
+.formFlex {
+  display: flex;
+}
+.contenrFlex{
+  width: 100%;
+  display: flex !important;
+}
+</style>      
+```
+
+(9)user/index.vue
+去掉default-expand-all
+```
+//操作一栏判断条件增加
+<template slot-scope="scope" v-if="scope.row.userId !== 1 && scope.row.userId != user.userData.userId">
+</template>
+
+import {mapState} from "vuex";
+computed: {
+    ...mapState(["user"]),
+},
+
+deptId: [
+  { required: true, message: "用户归属部门不能为空", trigger: "blur" }
+],
+```
+(10)role/index.vue
+```
+//198行tree添加
+@check="roleNodeClick"
+
+<el-form-item label="可分配角色" v-if="hasRoleAuth">
+  <el-select v-model="form.rids" multiple placeholder="请选择角色">
+    <el-option
+      v-for="item in roleOptions"
+      :key="item.roleId"
+      :label="item.roleName"
+      :value="item.roleId"
+      :disabled="item.status == 1"
+    ></el-option>
+  </el-select>
+</el-form-item>
+
+import {getUser} from "@/api/system/user";
+// 可分配角色选项
+roleOptions: [],
+hasRoleAuth: false,
+
+roleNodeClick(data, node){
+  this.hasRoleAuth = node.checkedNodes.some(item=>item.label == '角色分配');
+},
+
+handleAdd() {
+  this.reset();
+  this.getMenuTreeselect();
+  this.open = true;
+  this.title = "添加角色";
+  getUser().then(response => {
+    this.roleOptions = response.roles;
+  });
+},
+
+
+handleUpdate(row) {
+  this.reset();
+  const roleId = row.roleId || this.ids
+  const roleMenu = this.getRoleMenuTreeselect(roleId);
+  getRole(roleId).then(response => {
+    this.form = response.data;
+    this.open = true;
+    this.hasRoleAuth = false;
+    this.$nextTick(() => {
+      roleMenu.then(res => {
+        let checkedKeys = res.checkedKeys
+        checkedKeys.forEach((v) => {
+            this.$nextTick(()=>{
+                this.$refs.menu.setChecked(v, true ,false);
+                let node = this.$refs.menu.getNode(v);
+                if (node.label == '角色分配') {
+                  this.hasRoleAuth = true;
+                }
+            })
+        })
+      });
+    });
+    this.title = "修改角色";
+    getUser().then(response => {
+      this.roleOptions = response.roles;
+      if (this.form.powerRids){
+        this.form.rids =this.form.powerRids.split(",").map(item=>parseInt(item));
+      }
+    });
+  });
+}
+
+提交
+submitForm: function() {
+  this.$refs["form"].validate(valid => {
+    if (valid) {
+      if (this.form.rids && this.form.rids.join){
+        this.form.powerRids = this.form.rids.join(",");
+      }
+```
+
+(9)去除系统原生所有修改,删除按钮,批量替换全局的el-dialog添加 v-dialog-drag 
+(10)复制module下自己的模块,如新开发就是复制system改造,添加进module的pom
+复制:SysDeptJlC相关所有层业务  deptJL  region
+复制:SysDictTypeController 所有扩展方法 139行开始
+复制:ISysDictTypeService SysDictTypeServiceImpl SysDictTypeMapper包括xml  所有扩展方法 最后一行开始
+页面按钮和接口都删除:
+用户单独授权相关接口insertAuthRole,
+角色单独赋权用户相关接口allocatedList,unallocatedList,cancelAuthUser,cancelAuthUserAll,selectAuthUserAll
+
+7.复制一份 ruoyi-api-system 添加ruoyi-api-ext模块  
+ruoyi-api-ext依赖tool工具库
+```
+<dependency>
+    <groupId>cn.hutool</groupId>
+    <artifactId>hutool-all</artifactId>
+    <version>5.5.8</version>
+</dependency>
+```
+协调common其他模块(扩展用户字段)
+GlobalExceptionHandler,SecurityUtils DictUtils AjaxResult BaseEntity 
+ExcelUtil JwtUtils DateUtils
+复制对比
+
+ruoyi-common-swagger添加
+```
+<dependency>
+    <groupId>com.github.xiaoymin</groupId>
+    <artifactId>knife4j-spring-boot-starter</artifactId>
+    <version>3.0.3</version>
+</dependency>
+```
+
 ## 平台简介
 
 若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。

+ 5 - 0
docker/copy.sh

@@ -39,3 +39,8 @@ cp ../ruoyi-modules/ruoyi-job/target/ruoyi-modules-job.jar ./ruoyi/modules/job/j
 echo "begin copy ruoyi-modules-gen "
 cp ../ruoyi-modules/ruoyi-gen/target/ruoyi-modules-gen.jar ./ruoyi/modules/gen/jar
 
+echo "begin copy ruoyi-modules-organization "
+cp ../ruoyi-modules/mz-organization/target/ruoyi-modules-organization.jar ./ruoyi/modules/organization/jar
+
+echo "begin copy ruoyi-modules-business "
+cp ../ruoyi-modules/mz-business/target/ruoyi-modules-business.jar ./ruoyi/modules/business/jar

+ 1 - 1
docker/mysql/db/readme.txt

@@ -1 +1 @@
-存放sql目录下的所有脚本,用于docker自动执行。
+存放sql目录下的所有脚本,用于docker自动执行。

+ 2 - 2
docker/nacos/conf/application.properties

@@ -1,8 +1,8 @@
 spring.datasource.platform=mysql
 db.num=1
-db.url.0=jdbc:mysql://ruoyi-mysql:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
+db.url.0=jdbc:mysql://121.36.73.159:3306/mz-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
 db.user=root
-db.password=password
+db.password=root
 
 nacos.naming.empty-service.auto-clean=true
 nacos.naming.empty-service.clean.initial-delay-ms=50000

+ 0 - 1
docker/nginx/html/dist/readme.txt

@@ -1 +0,0 @@
-存放前端ruoyi-ui构建好的静态文件,用于nginx请求访问。

+ 1 - 1
docker/ruoyi/auth/dockerfile

@@ -12,4 +12,4 @@ WORKDIR /home/ruoyi
 # 复制jar文件到路径
 COPY ./jar/ruoyi-auth.jar /home/ruoyi/ruoyi-auth.jar
 # 启动认证服务
-ENTRYPOINT ["java","-jar","ruoyi-auth.jar"]
+ENTRYPOINT ["java","-jar","-Xmx400m","-Dspring.cloud.nacos.discovery.namespace=c98864f5-8f20-4043-a618-d2f90b5da7da","ruoyi-auth.jar"]

+ 1 - 1
docker/ruoyi/auth/jar/readme.txt

@@ -1 +1 @@
-存放认证中心打包好的jar文件,用于docker启动应用。
+存放认证中心打包好的jar文件,用于docker启动应用。

+ 1 - 1
docker/ruoyi/gateway/dockerfile

@@ -12,4 +12,4 @@ WORKDIR /home/ruoyi
 # 复制jar文件到路径
 COPY ./jar/ruoyi-gateway.jar /home/ruoyi/ruoyi-gateway.jar
 # 启动网关服务
-ENTRYPOINT ["java","-jar","ruoyi-gateway.jar"]
+ENTRYPOINT ["java","-jar","-Xmx400m","-Dspring.cloud.nacos.discovery.namespace=c98864f5-8f20-4043-a618-d2f90b5da7da","ruoyi-gateway.jar"]

+ 1 - 1
docker/ruoyi/gateway/jar/readme.txt

@@ -1 +1 @@
-存放网关模块打包好的jar文件,用于docker启动应用。
+存放网关模块打包好的jar文件,用于docker启动应用。

+ 15 - 0
docker/ruoyi/modules/business/dockerfile

@@ -0,0 +1,15 @@
+# 基础镜像
+FROM  openjdk:8-jre
+# author
+MAINTAINER ruoyi
+
+# 挂载目录
+VOLUME /home/ruoyi
+# 创建目录
+RUN mkdir -p /home/ruoyi
+# 指定路径
+WORKDIR /home/ruoyi
+# 复制jar文件到路径
+COPY ./jar/ruoyi-modules-business.jar /home/ruoyi/ruoyi-modules-business.jar
+# 启动系统服务
+ENTRYPOINT ["java","-jar","-Xmx400m","-Dspring.cloud.nacos.discovery.namespace=c98864f5-8f20-4043-a618-d2f90b5da7da","ruoyi-modules-business.jar"]

+ 1 - 0
docker/ruoyi/modules/business/jar/readme.txt

@@ -0,0 +1 @@
+存放政务业务模块打包好的jar文件,用于docker启动应用。

+ 1 - 1
docker/ruoyi/modules/file/dockerfile

@@ -12,4 +12,4 @@ WORKDIR /home/ruoyi
 # 复制jar文件到路径
 COPY ./jar/ruoyi-modules-file.jar /home/ruoyi/ruoyi-modules-file.jar
 # 启动文件服务
-ENTRYPOINT ["java","-jar","ruoyi-modules-file.jar"]
+ENTRYPOINT ["java","-jar","-Xmx400m","-Dspring.cloud.nacos.discovery.namespace=c98864f5-8f20-4043-a618-d2f90b5da7da","ruoyi-modules-file.jar"]

+ 1 - 1
docker/ruoyi/modules/file/jar/readme.txt

@@ -1 +1 @@
-存放文件服务打包好的jar文件,用于docker启动应用。
+存放文件服务打包好的jar文件,用于docker启动应用。

+ 1 - 1
docker/ruoyi/modules/gen/dockerfile

@@ -12,4 +12,4 @@ WORKDIR /home/ruoyi
 # 复制jar文件到路径
 COPY ./jar/ruoyi-modules-gen.jar /home/ruoyi/ruoyi-modules-gen.jar
 # 启动代码生成服务
-ENTRYPOINT ["java","-jar","ruoyi-modules-gen.jar"]
+ENTRYPOINT ["java","-jar","-Xmx400m","-Dspring.cloud.nacos.discovery.namespace=c98864f5-8f20-4043-a618-d2f90b5da7da","ruoyi-modules-gen.jar"]

+ 1 - 1
docker/ruoyi/modules/gen/jar/readme.txt

@@ -1 +1 @@
-存放代码生成打包好的jar文件,用于docker启动应用。
+存放代码生成打包好的jar文件,用于docker启动应用。

+ 1 - 1
docker/ruoyi/modules/job/dockerfile

@@ -12,4 +12,4 @@ WORKDIR /home/ruoyi
 # 复制jar文件到路径
 COPY ./jar/ruoyi-modules-job.jar /home/ruoyi/ruoyi-modules-job.jar
 # 启动定时任务服务
-ENTRYPOINT ["java","-jar","ruoyi-modules-job.jar"]
+ENTRYPOINT ["java","-jar","-Xmx400m","-Dspring.cloud.nacos.discovery.namespace=c98864f5-8f20-4043-a618-d2f90b5da7da","ruoyi-modules-job.jar"]

+ 1 - 1
docker/ruoyi/modules/job/jar/readme.txt

@@ -1 +1 @@
-存放定时任务打包好的jar文件,用于docker启动应用。
+存放定时任务打包好的jar文件,用于docker启动应用。

+ 15 - 0
docker/ruoyi/modules/organization/dockerfile

@@ -0,0 +1,15 @@
+# 基础镜像
+FROM  openjdk:8-jre
+# author
+MAINTAINER ruoyi
+
+# 挂载目录
+VOLUME /home/ruoyi
+# 创建目录
+RUN mkdir -p /home/ruoyi
+# 指定路径
+WORKDIR /home/ruoyi
+# 复制jar文件到路径
+COPY ./jar/ruoyi-modules-organization.jar /home/ruoyi/ruoyi-modules-organization.jar
+# 启动系统服务
+ENTRYPOINT ["java","-jar","-Xmx400m","-Dspring.cloud.nacos.discovery.namespace=c98864f5-8f20-4043-a618-d2f90b5da7da","ruoyi-modules-organization.jar"]

+ 1 - 0
docker/ruoyi/modules/organization/jar/readme.txt

@@ -0,0 +1 @@
+存放机构模块打包好的jar文件,用于docker启动应用。

+ 1 - 1
docker/ruoyi/modules/system/dockerfile

@@ -12,4 +12,4 @@ WORKDIR /home/ruoyi
 # 复制jar文件到路径
 COPY ./jar/ruoyi-modules-system.jar /home/ruoyi/ruoyi-modules-system.jar
 # 启动系统服务
-ENTRYPOINT ["java","-jar","ruoyi-modules-system.jar"]
+ENTRYPOINT ["java","-jar","-Xmx400m","-Dspring.cloud.nacos.discovery.namespace=c98864f5-8f20-4043-a618-d2f90b5da7da","ruoyi-modules-system.jar"]

+ 1 - 1
docker/ruoyi/modules/system/jar/readme.txt

@@ -1 +1 @@
-存放系统模块打包好的jar文件,用于docker启动应用。
+存放系统模块打包好的jar文件,用于docker启动应用。

+ 1 - 1
docker/ruoyi/visual/monitor/jar/readme.txt

@@ -1 +1 @@
-存放监控中心打包好的jar文件,用于docker启动应用。
+存放监控中心打包好的jar文件,用于docker启动应用。

+ 28 - 0
pom.xml

@@ -41,6 +41,34 @@
         <transmittable-thread-local.version>2.12.2</transmittable-thread-local.version>
     </properties>
 
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <!-- 环境标识,需要与配置文件的名称相对应 -->
+                <profiles.active>dev</profiles.active>
+                <nacos.server>139.9.138.217:8848</nacos.server>
+                <nacos.discovery.group>MZ</nacos.discovery.group>
+                <nacos.discovery.namespace>f4b2e449-3ed7-4338-8fcd-717e6066baf3</nacos.discovery.namespace>
+                <nacos.config.group>MZ</nacos.config.group>
+                <nacos.config.namespace>f4b2e449-3ed7-4338-8fcd-717e6066baf3</nacos.config.namespace>
+            </properties>
+            <activation>
+                <!-- 默认环境 -->
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <profiles.active>prod</profiles.active>
+                <nacos.server>139.9.138.217:8848</nacos.server>
+                <nacos.discovery.group>MZ</nacos.discovery.group>
+                <nacos.config.group>MZ</nacos.config.group>
+            </properties>
+        </profile>
+    </profiles>
+
     <!-- 依赖声明 -->
     <dependencyManagement>
         <dependencies>

+ 1 - 0
ruoyi-api/pom.xml

@@ -10,6 +10,7 @@
 
     <modules>
         <module>ruoyi-api-system</module>
+        <module>ruoyi-api-ext</module>
     </modules>
 
     <artifactId>ruoyi-api</artifactId>

+ 44 - 0
ruoyi-api/ruoyi-api-ext/pom.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>com.ruoyi</groupId>
+        <artifactId>ruoyi-api</artifactId>
+        <version>3.5.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    
+    <artifactId>ruoyi-api-ext</artifactId>
+
+    <description>
+        ruoyi-api-system扩展接口模块
+    </description>
+
+    <dependencies>
+		
+        <!-- RuoYi Common Core-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.5.8</version>
+        </dependency>
+
+
+        <!-- Druid -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>${druid.version}</version>
+        </dependency>
+
+
+    </dependencies>
+
+</project>

+ 27 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/RemoteDictDataService.java

@@ -0,0 +1,27 @@
+package com.ruoyi.ext.api;
+
+import com.ruoyi.common.core.constant.SecurityConstants;
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.ext.api.factory.RemoteDictDataFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+/**
+ * 数据字典服务
+ * 
+ * @author ruoyi
+ */
+@FeignClient(contextId = "remoteDictDataService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteDictDataFallbackFactory.class)
+public interface RemoteDictDataService
+{
+    /**
+     * 根据字典类型查询字典数据信息
+     * @param dictType 字典类型
+     */
+    @GetMapping(value = "/dict/data/type/{dictType}")
+    public AjaxResult getDictDataByDictType(@PathVariable("dictType") String dictType, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+}

+ 29 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/RemoteDictTypeService.java

@@ -0,0 +1,29 @@
+package com.ruoyi.ext.api;
+
+import com.ruoyi.common.core.constant.SecurityConstants;
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.ext.api.domain.SysObjDictType;
+import com.ruoyi.ext.api.factory.RemoteDictDataFallbackFactory;
+import com.ruoyi.ext.api.factory.RemoteDictTypeFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+/**
+ * 对象字典服务
+ * 
+ * @author ruoyi
+ */
+@FeignClient(contextId = "RemoteDictTypeService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteDictTypeFallbackFactory.class)
+public interface RemoteDictTypeService
+{
+    /**
+     * 根据对象字典查询数据信息
+     * @param dictType 对象字典
+     */
+    @GetMapping(value = "/dict/type/objdict")
+    public AjaxResult objdict(SysObjDictType dictType, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+}

+ 24 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/datascope/DataScopeExt.java

@@ -0,0 +1,24 @@
+package com.ruoyi.ext.api.datascope;
+
+import java.lang.annotation.*;
+
+/**
+ * 数据权限过滤注解 扩展
+ * 
+ * @author ruoyi
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DataScopeExt
+{
+    /**
+     * 部门id字段
+     */
+    public String deptAlias() default "create_unit";
+
+    /**
+     * 用户id字段
+     */
+    public String userAlias() default "create_user_id";
+}

+ 149 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/datascope/DataScopeExtAspect.java

@@ -0,0 +1,149 @@
+package com.ruoyi.ext.api.datascope;
+
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+//import com.ruoyi.common.security.utils.SecurityUtils;
+//import com.ruoyi.system.api.domain.SysRole;
+//import com.ruoyi.system.api.domain.SysUser;
+//import com.ruoyi.system.api.model.LoginUser;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.springframework.stereotype.Component;
+
+/**
+ * 数据过滤处理
+ * 
+ * @author ruoyi
+ */
+@Aspect
+@Component
+public class DataScopeExtAspect
+{
+    /**
+     * 全部数据权限
+     */
+    public static final String DATA_SCOPE_ALL = "1";
+
+    /**
+     * 自定数据权限
+     */
+    public static final String DATA_SCOPE_CUSTOM = "2";
+
+    /**
+     * 部门数据权限
+     */
+    public static final String DATA_SCOPE_DEPT = "3";
+
+    /**
+     * 部门及以下数据权限
+     */
+    public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";
+
+    /**
+     * 仅本人数据权限
+     */
+    public static final String DATA_SCOPE_SELF = "5";
+
+    /**
+     * 数据权限过滤关键字
+     */
+    public static final String DATA_SCOPE = "dataScope";
+
+    @Before("@annotation(controllerDataScope)")
+    public void doBefore(JoinPoint point, DataScopeExt controllerDataScope) throws Throwable
+    {
+        clearDataScope(point);
+//        handleDataScope(point, controllerDataScope);
+    }
+
+//    protected void handleDataScope(final JoinPoint joinPoint, DataScopeExt controllerDataScope)
+//    {
+//        // 获取当前的用户
+//        LoginUser loginUser = SecurityUtils.getLoginUser();
+//        if (StringUtils.isNotNull(loginUser))
+//        {
+//            SysUser currentUser = loginUser.getSysUser();
+//            // 如果是超级管理员,则不过滤数据
+//            if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
+//            {
+//                dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
+//                        controllerDataScope.userAlias());
+//            }
+//        }
+//    }
+//
+//    /**
+//     * 数据范围过滤
+//     *
+//     * @param joinPoint 切点
+//     * @param user 用户
+//     * @param deptAlias 部门别名
+//     * @param userAlias 用户别名
+//     */
+//    public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias)
+//    {
+//        StringBuilder sqlString = new StringBuilder();
+//
+//        for (SysRole role : user.getRoles())
+//        {
+//            String dataScope = role.getDataScope();
+//            if (DATA_SCOPE_ALL.equals(dataScope))
+//            {
+//                sqlString = new StringBuilder();
+//                break;
+//            }
+//            else if (DATA_SCOPE_CUSTOM.equals(dataScope))
+//            {
+//                sqlString.append(StringUtils.format(
+//                        " OR {} IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias,
+//                        role.getRoleId()));
+//            }
+//            else if (DATA_SCOPE_DEPT.equals(dataScope))
+//            {
+//                sqlString.append(StringUtils.format(" OR {} = {} ", deptAlias, user.getDeptId()));
+//            }
+//            else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope))
+//            {
+//                sqlString.append(StringUtils.format(
+//                        " OR {} IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
+//                        deptAlias, user.getDeptId(), user.getDeptId()));
+//            }
+//            else if (DATA_SCOPE_SELF.equals(dataScope))
+//            {
+//                if (StringUtils.isNotBlank(userAlias))
+//                {
+//                    sqlString.append(StringUtils.format(" OR {} = {} ", userAlias, user.getUserId()));
+//                }
+//                else
+//                {
+//                    // 数据权限为仅本人且没有userAlias别名不查询任何数据
+//                    sqlString.append(" OR 1=0 ");
+//                }
+//            }
+//        }
+//
+//        if (StringUtils.isNotBlank(sqlString.toString()))
+//        {
+//            Object params = joinPoint.getArgs()[0];
+//            if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
+//            {
+//                BaseEntity baseEntity = (BaseEntity) params;
+//                baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");
+//            }
+//        }
+//    }
+
+    /**
+     * 拼接权限sql前先清空params.dataScope参数防止注入
+     */
+    private void clearDataScope(final JoinPoint joinPoint)
+    {
+        Object params = joinPoint.getArgs()[0];
+        if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
+        {
+            BaseEntity baseEntity = (BaseEntity) params;
+            baseEntity.getParams().put(DATA_SCOPE, "");
+        }
+    }
+}

+ 66 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBException.java

@@ -0,0 +1,66 @@
+package com.ruoyi.ext.api.db;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+
+public class DBException extends Exception
+{
+    private String msg;
+    public String getMsg()
+    {
+        return msg;
+    }
+    public static void saveTolog(String content, String  name)
+    {
+
+
+        String path =  System.getProperty("java.home")+System.getProperty("file.separator");
+        File filePath = new File(path);
+        if (!filePath.exists())
+        {
+            filePath.mkdirs();
+        }
+        try
+        {   FileWriter fw=null;
+            fw = new FileWriter(path + "debug.log");
+            fw.write(content);
+            fw.flush();
+            fw.close();
+            fw=null;
+        } catch (IOException e)
+        {
+            // e.printStackTrace();
+        }
+    }
+    public void setMsg(String msg)
+    {
+        this.msg = msg;
+    }
+
+    public DBException()
+    {
+        super();
+    }
+
+    public DBException(String message)
+    {
+        super(message);
+    }
+
+    public DBException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+
+    public DBException(String msg, String message, Throwable cause)
+    {
+        super(message, cause);
+        this.msg = msg;
+        if (msg.indexOf("debug")>=0)
+        {
+            saveTolog(msg,msg);
+        };
+    }
+}

+ 74 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBExecResult.java

@@ -0,0 +1,74 @@
+package com.ruoyi.ext.api.db;
+
+import java.io.Serializable;
+
+public class DBExecResult implements Serializable
+{
+	private boolean successed = false;
+	private String sqlscript = "";
+	private String message = "";
+	private String procResult[] = null;
+	public int  dbResultsize=0;
+
+	private DBResult dbResult[]=new DBResult[20];
+
+	public DBResult[] getDbResult() {
+		return dbResult;
+	}
+
+	public void setDbResult(DBResult[] dbResult) {
+		this.dbResult = dbResult;
+	}
+
+	public String getSqlscript()
+	{
+		return sqlscript;
+	}
+	public void setSqlscript(String sqlscript)
+	{
+		this.sqlscript = sqlscript;
+	}
+	public void setSqlscript(String sqlscript[])
+	{
+		for (int i=0;i<sqlscript.length;i++)
+		{
+			this.sqlscript = this.sqlscript + sqlscript[i];
+		}
+	}
+	public String getMessage()
+	{
+		return message;
+	}
+	public void setMessage(String message)
+	{
+		this.message = message;
+	}
+	public boolean isSuccessed()
+	{
+		return successed;
+	}
+	public void setSuccessed(boolean successed)
+	{
+		this.successed = successed;
+	}
+	public String[] getProcResult()
+	{
+		return procResult;
+	}
+	public void setProcResult(String[] procResult)
+	{
+		this.procResult = procResult;
+	}
+	public void setDBResult(int idx,DBResult dbResult)
+	{
+		dbResultsize++;
+		this.dbResult[idx] = dbResult;
+	}
+	public DBResult getDBResult(int idx)
+	{
+		if (dbResultsize>0 && idx<dbResultsize)
+		    return this.dbResult[idx];
+		else
+			return null;
+	}
+}

+ 81 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBFactory.java

@@ -0,0 +1,81 @@
+package com.ruoyi.ext.api.db;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.stat.DruidDataSourceStatManager;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.HashMap;
+
+@SuppressWarnings("unchecked")
+public class DBFactory {
+    private static HashMap dbImplMap = new HashMap();
+
+    private static DBImpl defaultImpl = null;
+    private static boolean dbinitialized = false;
+
+
+
+
+    private static final Log logger = LogFactory.getLog(DBFactory.class);
+
+    private DBFactory()
+    {
+        dbinit();
+    }
+
+
+
+    private static DBImpl loadDBImpl(String dsName, DruidDataSource datasource)
+    {
+        DBImpl dbAccessImpl = null;
+        dbAccessImpl = DBImpl.getInstance(dsName, datasource);
+        return dbAccessImpl;
+    }
+
+    private static synchronized void dbinit()
+    {
+        if (dbinitialized) return;
+        int i=0;
+
+        DBImpl dbAccessImpl = null;
+
+        try
+        {
+        for(DruidDataSource datasource : DruidDataSourceStatManager.getDruidDataSourceInstances()){
+
+            String poolname= datasource.getName();
+            if (i==0) {
+                defaultImpl = loadDBImpl(poolname, datasource);
+                dbImplMap.put(poolname, defaultImpl);
+            }
+            else
+            {
+                dbAccessImpl = loadDBImpl(poolname, datasource);
+                dbImplMap.put(poolname, dbAccessImpl);
+            }
+            i++;
+
+        }
+        } catch (Exception e)
+        {
+            logger.fatal("数据源初始化失败:" + e);
+        }
+
+
+        dbinitialized = true;
+    }
+
+    public static final DBImpl getDBImpl()
+    {
+        if (!dbinitialized) dbinit();
+        return defaultImpl;
+    }
+
+    public static final DBImpl getDBImpl(String dsName)
+    {
+        if (!dbinitialized) dbinit();
+        if (dsName == null || dsName.length()<=0) return defaultImpl;
+        return (DBImpl) dbImplMap.get(dsName);
+    }
+}

File diff suppressed because it is too large
+ 1395 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBImpl.java


+ 440 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBResult.java

@@ -0,0 +1,440 @@
+package com.ruoyi.ext.api.db;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.Reader;
+import java.io.Serializable;
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.Base64;
+
+@SuppressWarnings("unchecked")
+public class DBResult implements Serializable
+{
+    private static final Log logger = LogFactory.getLog(DBResult.class);
+    private String ColumnLabelList[] = null;
+    private ArrayList fieldList = new ArrayList();
+    private int columnTypeList[] = null;
+    private int recordCount = 0;
+
+    private boolean successed = false;
+
+    public ArrayList getRowList() {
+        return rowList;
+    }
+
+    public void setRowList(ArrayList rowList) {
+        this.rowList = rowList;
+    }
+
+    private String message = "";
+    private ArrayList rowList = new ArrayList();
+    private boolean hasBinary = false;
+
+    public boolean isHasBinary()
+    {
+        return hasBinary;
+    }
+
+    public String getMessage()
+    {
+        return message;
+    }
+
+    public void setMessage(String message)
+    {
+        this.message = message;
+    }
+
+    public void setSuccessed(boolean successed)
+    {
+        this.successed = successed;
+    }
+
+
+    public String[] getColumnLabelList()
+    {
+        return ColumnLabelList;
+    }
+
+
+    public int[] getColumnTypeList()
+    {
+        return columnTypeList;
+    }
+
+    public String[] getAllFieldData(String fieldName)
+    {
+        fieldName = fieldName.toUpperCase();
+
+        int colIndex = fieldList.indexOf(fieldName);
+
+        if (colIndex == -1)
+        {
+            logger.error("未发现字段:" + fieldName);
+            return null;
+        }
+
+        String fieldData[] = new String[recordCount];
+        for (int i = 0; i < rowList.size(); i++)
+        {
+            fieldData[i] = ((String[]) rowList.get(i))[colIndex];
+        }
+
+        return fieldData;
+    }
+
+
+    public int getRecordCount()
+    {
+        return recordCount;
+    }
+
+    public boolean isSuccessed()
+    {
+        return successed;
+    }
+
+
+    public String getString(int rowIndex, int colIndex)
+    {
+        return ((String[]) rowList.get(rowIndex))[colIndex];
+
+    }
+
+
+    public String getString(int rowIndex, String fieldName)
+    {
+        fieldName = fieldName.toUpperCase();
+
+        int colIndex = fieldList.indexOf(fieldName);
+
+        if (colIndex == -1)
+        {
+            logger.error("未发现字段:" + fieldName);
+            return null;
+        }
+
+        return ((String[]) rowList.get(rowIndex))[colIndex];
+
+    }
+
+    public void setString(int rowIndex, String fieldName, String value)
+    {
+        fieldName = fieldName.toUpperCase();
+
+        int colIndex = fieldList.indexOf(fieldName);
+
+        if (colIndex == -1)
+        {
+            logger.error("未发现字段:" + fieldName);
+            return;
+        }
+
+
+        ((String[]) rowList.get(rowIndex))[colIndex] = value;
+    }
+
+
+    public int getInt(int rowIndex, int colIndex)
+    {
+        String colValue = ((String[]) rowList.get(rowIndex))[colIndex];
+
+        if (colValue.length() > 0)
+            return Integer.parseInt(colValue);
+        else
+            return 0;
+    }
+
+    public int getInt(int rowIndex, String fieldName)
+    {
+        fieldName = fieldName.toUpperCase();
+        int colIndex = fieldList.indexOf(fieldName);
+
+        if (colIndex == -1)
+        {
+            logger.error("未发现字段:" + fieldName);
+            return -1;
+        }
+
+        String colValue = ((String[]) rowList.get(rowIndex))[colIndex];
+
+        if (colValue.length() > 0)
+            return Integer.parseInt(colValue);
+        else
+            return 0;
+    }
+
+
+    public DBResult()
+    {
+    }
+
+
+    public boolean pushResultSet(ResultSet rs)
+    {
+        int fieldCnt = 0;
+        byte[] binaryBytes = null;
+        String colValue = "";
+        boolean bResult = false;
+
+        Base64.Encoder base64Encoder = Base64.getEncoder();
+        java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(
+                "yyyyMMddHHmmss");
+
+
+        try
+        {
+            ResultSetMetaData rsmd = rs.getMetaData();
+            fieldCnt = rsmd.getColumnCount();
+
+            ColumnLabelList = new String[fieldCnt];
+            columnTypeList = new int[fieldCnt];
+
+            for (int i = 0; i < fieldCnt; i++)
+            {
+                ColumnLabelList[i] = rsmd.getColumnLabel(i + 1).toUpperCase();
+                columnTypeList[i] = rsmd.getColumnType(i + 1);
+                fieldList.add(ColumnLabelList[i]);
+
+                if ((columnTypeList[i] == Types.BLOB
+                        || columnTypeList[i] == Types.LONGVARBINARY || columnTypeList[i] == Types.BINARY))
+                {
+                    hasBinary = true;
+                }
+            }
+        } catch (SQLException sqle)
+        {
+            successed = false;
+            message = sqle.toString();
+        }
+
+
+        String data[] = null;
+
+        try
+        {
+            while (rs.next())
+            {
+                recordCount++;
+                data = new String[fieldCnt];
+                for (int j = 0; j < fieldCnt; j++)
+                {
+                    if (columnTypeList[j] == Types.BLOB
+                            || columnTypeList[j] == Types.LONGVARBINARY
+                            || columnTypeList[j] == Types.BINARY
+                            || columnTypeList[j] == Types.CLOB)
+                    {
+                        if (columnTypeList[j] == Types.BLOB)
+                        {
+                            Blob b = rs.getBlob(j + 1);
+                            if (b == null)
+                            {
+                                binaryBytes = null;
+                                colValue = "";
+                            } else
+                                binaryBytes = b.getBytes(1, (int) b.length());
+                        } else if (columnTypeList[j] == Types.CLOB)
+                        {
+
+                            Clob c = rs.getClob(j + 1);
+
+                            if (c == null)
+                            {
+                                colValue = "";
+                            } else
+                            {
+                                Reader inStream = c.getCharacterStream();
+                                char[] c2 = new char[(int) c.length()];
+                                inStream.read(c2);
+
+                                colValue = String.valueOf(c2);
+                                inStream.close();
+                                inStream = null;
+                            }
+
+                        } else
+                        {
+                            binaryBytes = rs.getBytes(j + 1);
+                        }
+
+                        if (binaryBytes != null
+                                && columnTypeList[j] != Types.CLOB)
+                            colValue = base64Encoder.encodeToString(binaryBytes);
+
+                    } else if (columnTypeList[j] == Types.DATE)
+                    {
+                        if (rs.getDate(j + 1) != null)
+                            colValue = formatter.format(rs.getDate(j + 1));
+                        else
+                            colValue = "";
+                    } else
+                    {
+                        colValue = rs.getString(j + 1);
+                    }
+
+                    if (colValue == null)
+                        colValue = "";
+
+                    data[j] = colValue;
+                }
+
+                rowList.add(data);
+            }
+
+        } catch (Exception e)
+        {
+            logger.fatal("buildResultSet error :" + e);
+            message = e.toString();
+        }
+
+        successed = bResult;
+        base64Encoder = null;
+        return successed;
+    }
+
+
+    public boolean pushResultSet(ResultSet rs, int rowcount)
+    {
+        int fieldCnt = 0;
+        byte[] binaryBytes = null;
+        String colValue = "";
+        boolean bResult = false;
+        int len = 0;
+
+
+        Base64.Encoder base64Encoder = Base64.getEncoder();
+        java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(
+                "yyyyMMddHHmmss");
+
+
+        try
+        {
+            ResultSetMetaData rsmd = rs.getMetaData();
+            fieldCnt = rsmd.getColumnCount();
+
+            ColumnLabelList = new String[fieldCnt];
+            columnTypeList = new int[fieldCnt];
+
+            for (int i = 0; i < fieldCnt; i++)
+            {
+                ColumnLabelList[i] = rsmd.getColumnLabel(i + 1).toUpperCase();
+                columnTypeList[i] = rsmd.getColumnType(i + 1);
+                fieldList.add(ColumnLabelList[i]);
+                if ((columnTypeList[i] == Types.BLOB
+                        || columnTypeList[i] == Types.LONGVARBINARY || columnTypeList[i] == Types.BINARY))
+                {
+                    hasBinary = true;
+                }
+            }
+        } catch (SQLException sqle)
+        {
+            successed = false;
+            message = sqle.toString();
+        }
+
+
+        String data[] = null;
+
+        try
+        {
+            while (rs.next())
+            {
+                recordCount++;
+                data = new String[fieldCnt];
+                for (int j = 0; j < fieldCnt; j++)
+                {
+                    if (columnTypeList[j] == Types.BLOB
+                            || columnTypeList[j] == Types.LONGVARBINARY
+                            || columnTypeList[j] == Types.BINARY
+                            || columnTypeList[j] == Types.CLOB)
+                    {
+                        if (columnTypeList[j] == Types.BLOB)
+                        {
+                            Blob b = rs.getBlob(j + 1);
+                            if (b == null)
+                            {
+                                binaryBytes = null;
+                                colValue = "";
+                            } else
+                                binaryBytes = b.getBytes(1, (int) b.length());
+                        } else if (columnTypeList[j] == Types.CLOB)
+                        {
+
+                            Clob c = rs.getClob(j + 1);
+
+                            if (c == null)
+                            {
+                                colValue = "";
+                            } else
+                            {
+                                Reader inStream = c.getCharacterStream();
+                                char[] c2 = new char[(int) c.length()];
+                                inStream.read(c2);
+
+                                colValue = String.valueOf(c2);
+                                inStream.close();
+                                inStream = null;
+                            }
+
+                        } else
+                        {
+                            binaryBytes = rs.getBytes(j + 1);
+                        }
+
+                        if (binaryBytes != null
+                                && columnTypeList[j] != Types.CLOB)
+                            colValue = base64Encoder.encodeToString(binaryBytes);
+
+                    } else if (columnTypeList[j] == Types.DATE)
+                    {
+                        if (rs.getDate(j + 1) != null)
+                            colValue = formatter.format(rs.getDate(j + 1));
+                        else
+                            colValue = "";
+                    } else
+                    {
+                        colValue = rs.getString(j + 1);
+                    }
+
+                    if (colValue == null)
+                        colValue = "";
+
+                    data[j] = colValue;
+                }
+
+                rowList.add(data);
+            }
+
+        } catch (Exception e)
+        {
+            logger.fatal("buildResultSet error :" + e);
+            message = e.toString();
+        }
+
+        successed = bResult;
+        base64Encoder = null;
+        return true;
+    }
+
+
+
+    public void close()
+    {
+        ColumnLabelList = null;
+        fieldList.clear();
+        fieldList = null;
+        columnTypeList = null;
+
+        rowList.clear();
+        rowList = null;
+
+
+    }
+
+
+
+
+
+}

+ 31 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/db/DBTool.java

@@ -0,0 +1,31 @@
+package com.ruoyi.ext.api.db;
+
+public class DBTool {
+    public static String getDbSystemDateTime(String dataFormat) {
+        String sql = "select DATE_FORMAT(SYSDATE(),'" + dataFormat + "') time";
+        String retStr = "";
+        DBImpl db1= DBFactory.getDBImpl("master") ;
+        try {
+            DBResult dbset=db1.getDataBySql(sql);
+            retStr=dbset.getString(0,0);
+        } catch (Exception var4) {
+            System.out.println("取数据库系统时间失败" + var4 + sql);
+
+        }
+
+        return retStr;
+    }
+    public static String getDbUUID() {
+        String retStr = "";
+        DBImpl db1= DBFactory.getDBImpl("master") ;
+        try {
+            DBResult dbset=db1.getDataBySql("select getuuid() ");
+            retStr=dbset.getString(0,0);
+        } catch (Exception var4) {
+            System.out.println("取数据库uuid失败" + var4 );
+
+        }
+
+        return retStr;
+    }
+}

+ 175 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/domain/SysDictData.java

@@ -0,0 +1,175 @@
+package com.ruoyi.ext.api.domain;
+
+import com.ruoyi.common.core.annotation.Excel;
+import com.ruoyi.common.core.annotation.Excel.ColumnType;
+import com.ruoyi.common.core.constant.UserConstants;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * 字典数据表 sys_dict_data
+ * 
+ * @author ruoyi
+ */
+public class SysDictData extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 字典编码 */
+    @Excel(name = "字典编码", cellType = ColumnType.NUMERIC)
+    private Long dictCode;
+
+    /** 字典排序 */
+    @Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
+    private Long dictSort;
+
+    /** 字典标签 */
+    @Excel(name = "字典标签")
+    private String dictLabel;
+
+    /** 字典键值 */
+    @Excel(name = "字典键值")
+    private String dictValue;
+
+    /** 字典类型 */
+    @Excel(name = "字典类型")
+    private String dictType;
+
+    /** 样式属性(其他样式扩展) */
+    private String cssClass;
+
+    /** 表格字典样式 */
+    private String listClass;
+
+    /** 是否默认(Y是 N否) */
+    @Excel(name = "是否默认", readConverterExp = "Y=是,N=否")
+    private String isDefault;
+
+    /** 状态(0正常 1停用) */
+    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    public Long getDictCode()
+    {
+        return dictCode;
+    }
+
+    public void setDictCode(Long dictCode)
+    {
+        this.dictCode = dictCode;
+    }
+
+    public Long getDictSort()
+    {
+        return dictSort;
+    }
+
+    public void setDictSort(Long dictSort)
+    {
+        this.dictSort = dictSort;
+    }
+
+    @NotBlank(message = "字典标签不能为空")
+    @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
+    public String getDictLabel()
+    {
+        return dictLabel;
+    }
+
+    public void setDictLabel(String dictLabel)
+    {
+        this.dictLabel = dictLabel;
+    }
+
+    @NotBlank(message = "字典键值不能为空")
+    @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
+    public String getDictValue()
+    {
+        return dictValue;
+    }
+
+    public void setDictValue(String dictValue)
+    {
+        this.dictValue = dictValue;
+    }
+
+    @NotBlank(message = "字典类型不能为空")
+    @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
+    public String getDictType()
+    {
+        return dictType;
+    }
+
+    public void setDictType(String dictType)
+    {
+        this.dictType = dictType;
+    }
+
+    @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
+    public String getCssClass()
+    {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass)
+    {
+        this.cssClass = cssClass;
+    }
+
+    public String getListClass()
+    {
+        return listClass;
+    }
+
+    public void setListClass(String listClass)
+    {
+        this.listClass = listClass;
+    }
+
+    public boolean getDefault()
+    {
+        return UserConstants.YES.equals(this.isDefault) ? true : false;
+    }
+
+    public String getIsDefault()
+    {
+        return isDefault;
+    }
+
+    public void setIsDefault(String isDefault)
+    {
+        this.isDefault = isDefault;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("dictCode", getDictCode())
+            .append("dictSort", getDictSort())
+            .append("dictLabel", getDictLabel())
+            .append("dictValue", getDictValue())
+            .append("dictType", getDictType())
+            .append("cssClass", getCssClass())
+            .append("listClass", getListClass())
+            .append("isDefault", getIsDefault())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("updateBy", getUpdateBy())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 98 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/domain/SysObjDictRet.java

@@ -0,0 +1,98 @@
+package com.ruoyi.ext.api.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 学员签到情况对象 e_sign_in
+ *
+ * @author CH
+ * @date 2021-05-15
+ */
+public class SysObjDictRet
+{
+    private static final long serialVersionUID = 1L;
+    private String title;
+    private Integer fieldcount;
+    private Integer count;
+    private String[] fields;
+
+
+
+    private String[] fieldwidths;
+    private String[] headers;
+    private String[][] data;
+
+    public Integer getFieldcount() {
+        return fieldcount;
+    }
+
+    public void setFieldcount(Integer fieldcount) {
+        this.fieldcount = fieldcount;
+    }
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String[] getFieldwidths() {
+        return fieldwidths;
+    }
+
+    public void setFieldwidths(String[] fieldwidths) {
+        this.fieldwidths = fieldwidths;
+    }
+
+    public String[] getHeaders() {
+        return headers;
+    }
+
+    public void setHeaders(String[] headers) {
+        this.headers = headers;
+    }
+
+
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public void setFields(String[] fields)
+    {
+        this.fields = fields;
+    }
+    public String[] getFields()
+    {
+        return fields;
+    }
+
+
+    public void setData(String[][] data)
+    {
+        this.data = data;
+    }
+    public String[][] getData()
+    {
+        return data;
+    }
+
+
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+
+            .append("count", getCount())
+            .append("fileds", getFields())
+            .append("data", getData())
+
+            .toString();
+    }
+}

+ 88 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/domain/SysObjDictType.java

@@ -0,0 +1,88 @@
+package com.ruoyi.ext.api.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 字典类型表 sys_dict_type
+ *
+ * @author ruoyi
+ */
+public class SysObjDictType implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+    private String dictType;
+    private String outType;
+    private String para1;
+    private String para2;
+    private String para3;
+    private String para4;
+    private String para5;
+    @NotBlank(message = "字典名称不能为空")
+    public String getDictType() {
+        return dictType;
+    }
+
+    public void setDictType(String dictType) {
+        this.dictType = dictType;
+    }
+
+    public String getOutType() {
+        return outType;
+    }
+
+    public void setOutType(String outType) {
+        this.outType = outType;
+    }
+
+
+    public String getPara1() {
+        return para1;
+    }
+
+    public void setPara1(String para1) {
+        this.para1 = para1;
+    }
+
+    public String getPara2() {
+        return para2;
+    }
+
+    public void setPara2(String para2) {
+        this.para2 = para2;
+    }
+
+    public String getPara3() {
+        return para3;
+    }
+
+    public void setPara3(String para3) {
+        this.para3 = para3;
+    }
+
+    public String getPara4() {
+        return para4;
+    }
+
+    public void setPara4(String para4) {
+        this.para4 = para4;
+    }
+
+    public String getPara5() {
+        return para5;
+    }
+
+    public void setPara5(String para5) {
+        this.para5 = para5;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("dictType", getDictType())
+            .toString();
+    }
+}

+ 29 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/CheckInStatus.java

@@ -0,0 +1,29 @@
+package com.ruoyi.ext.api.enums;
+
+/**
+ * @Description: TODO
+ * @author: sun
+ * @date: 2022年03月28日 10:56
+ */
+public enum CheckInStatus {
+    NO("0", "退住"), YES("1", "在住");
+
+    private final String code;
+    private final String info;
+
+    CheckInStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/ContractStatus.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.enums;
+
+/**
+ * @Description: TODO
+ * @author: sun
+ * @date: 2022年03月28日 10:56
+ */
+public enum ContractStatus {
+    NO("0", "未入住"), YES("1", "在住"), APPLY("2", "申请退住"),
+    DISCHARGE ("3", "出院登记"),REJECT("4", "审核驳回");
+//    CANCELLATION("7", "作废"), CHECKOUT("8", "正常退住(合同终止)"),
+//    EARLY("9", "提前退住(合同终止)");
+
+    private final String code;
+    private final String info;
+
+    ContractStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 29 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/DocumentTypeStatus.java

@@ -0,0 +1,29 @@
+package com.ruoyi.ext.api.enums;
+
+/**
+ * @Description: TODO
+ * @author: sun
+ * @date: 2022年04月10日 18:27
+ */
+public enum DocumentTypeStatus {
+    INLAND("01", "内地居民身份证"), OUTLAND("00", "其他");
+
+    private final String code;
+    private final String info;
+
+    DocumentTypeStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 29 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/ExamineStatus.java

@@ -0,0 +1,29 @@
+package com.ruoyi.ext.api.enums;
+
+/**
+ * @Description: TODO
+ * @author: sun
+ * @date: 2022年03月28日 10:56
+ */
+public enum ExamineStatus {
+    YES("01", "通过"), NO("02", "不通过");
+
+    private final String code;
+    private final String info;
+
+    ExamineStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 29 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/ResultStatus.java

@@ -0,0 +1,29 @@
+package com.ruoyi.ext.api.enums;
+
+/**
+ * @Description: TODO
+ * @author: sun
+ * @date: 2022年04月12日 9:55
+ */
+public enum ResultStatus {
+    FAIL(0, "失败"), OTHER(99, "成功");
+
+    private final int code;
+    private final String info;
+
+    ResultStatus(int code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public int getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 29 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/RoomManagementStatus.java

@@ -0,0 +1,29 @@
+package com.ruoyi.ext.api.enums;
+
+/**
+ * @Description: TODO
+ * @author: scott
+ * @date: 2022年04月01日 22:54
+ */
+public enum RoomManagementStatus {
+    LY("ly", "楼宇"), LC("lc", "楼层"), FJ("fj", "房间"), CW("cw", "床位");
+
+    private final String code;
+    private final String info;
+
+    RoomManagementStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 29 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/RoomStatus.java

@@ -0,0 +1,29 @@
+package com.ruoyi.ext.api.enums;
+
+/**
+ * @Description: TODO
+ * @author: sun
+ * @date: 2022年04月01日 15:54
+ */
+public enum RoomStatus {
+    NOTFULL("0", "未满"), FULL("1", "已满");
+
+    private final String code;
+    private final String info;
+
+    RoomStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 29 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/StateStatus.java

@@ -0,0 +1,29 @@
+package com.ruoyi.ext.api.enums;
+
+/**
+ * @Description: TODO
+ * @author: sun
+ * @date: 2022年03月28日 10:56
+ */
+public enum StateStatus {
+    NORMAL(0L, "正常"), DELETE(99L, "删除");
+
+    private final Long code;
+    private final String info;
+
+    StateStatus(Long code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public Long getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 30 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/SysDeptJlStatus.java

@@ -0,0 +1,30 @@
+package com.ruoyi.ext.api.enums;
+
+/**
+ * @Description: TODO
+ * @author: scott
+ * @date: 2022年04月07日 13:13
+ */
+public enum SysDeptJlStatus {
+    ID("id", "主键"), PARENTID("parent_id", "父主键"), CODE("code", "行政编码")
+    , NAME("name", "名字"), CHINESE("0", "国家父主键");
+
+    private final String code;
+    private final String info;
+
+    SysDeptJlStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 29 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/enums/WhetherStatus.java

@@ -0,0 +1,29 @@
+package com.ruoyi.ext.api.enums;
+
+/**
+ * @Description: TODO
+ * @author: sun
+ * @date: 2022年03月28日 10:56
+ */
+public enum WhetherStatus {
+    NO("0", "否"), YES("1", "是");
+
+    private final String code;
+    private final String info;
+
+    WhetherStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/factory/RemoteDictDataFallbackFactory.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.factory;
+
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.ext.api.RemoteDictDataService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 字典服务降级处理
+ * 
+ * @author ruoyi
+ */
+@Component
+public class RemoteDictDataFallbackFactory implements FallbackFactory<RemoteDictDataService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteDictDataFallbackFactory.class);
+
+    @Override
+    public RemoteDictDataService create(Throwable throwable)
+    {
+        log.error("字典服务调用失败:{}", throwable.getMessage());
+        return new RemoteDictDataService()
+        {
+            @Override
+            public AjaxResult getDictDataByDictType(String dictType, String source) {
+                return AjaxResult.error("获取字典失败:" + throwable.getMessage());
+            }
+        };
+    }
+}

+ 34 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/factory/RemoteDictTypeFallbackFactory.java

@@ -0,0 +1,34 @@
+package com.ruoyi.ext.api.factory;
+
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.ext.api.RemoteDictDataService;
+import com.ruoyi.ext.api.RemoteDictTypeService;
+import com.ruoyi.ext.api.domain.SysObjDictType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 对象字典服务降级处理
+ * 
+ * @author ruoyi
+ */
+@Component
+public class RemoteDictTypeFallbackFactory implements FallbackFactory<RemoteDictTypeService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteDictTypeFallbackFactory.class);
+
+    @Override
+    public RemoteDictTypeService create(Throwable throwable)
+    {
+        log.error("字典服务调用失败:{}", throwable.getMessage());
+        return new RemoteDictTypeService()
+        {
+            @Override
+            public AjaxResult objdict(SysObjDictType dictType, String source) {
+                return AjaxResult.error("获取字典失败:" + throwable.getMessage());
+            }
+        };
+    }
+}

File diff suppressed because it is too large
+ 163 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/utils/IDCardUtil.java


File diff suppressed because it is too large
+ 1309 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/utils/StringUtilsN.java


+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ChineseV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义中文校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { ChineseValidator.class })
+public @interface ChineseV
+{
+    String message() default "汉字不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 34 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ChineseValidator.java

@@ -0,0 +1,34 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.Arrays;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义汉字校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class ChineseValidator implements ConstraintValidator<ChineseV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(ChineseV constraintAnnotation) {
+//        pattern = "^[\\u0391-\\uFFE5]|[·]+$";
+        pattern = "[\u4e00-\u9fa5]";
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return Arrays.stream(value.split("")).allMatch(s -> compile.matcher(s).matches());
+    }
+}

+ 30 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/DateV.java

@@ -0,0 +1,30 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义时间字符串校验注解
+ * rule规则   before时间之前   after时间之后   beforeAndNow时间现在或之前  afterAndNow时间现在或之后
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { DateValidator.class })
+public @interface DateV
+{
+    String message() default "日期时间不符合规范格式";
+
+    String pattern() default "yyyyMMddHHmmss";
+
+    String rule() default "";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 91 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/DateValidator.java

@@ -0,0 +1,91 @@
+package com.ruoyi.ext.api.validate;
+
+import cn.hutool.core.date.DateUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.Date;
+
+/**
+ * 自定义时间字符串校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class DateValidator implements ConstraintValidator<DateV, String>
+{
+
+    private String pattern;
+    private String[] rules = {
+            "before",
+            "after",
+            "beforeAndNow",
+            "afterAndNow",
+    };
+    private String rule;
+    private DateV dateV;
+
+    @Override
+    public void initialize(DateV constraintAnnotation) {
+        dateV = constraintAnnotation;
+        pattern = constraintAnnotation.pattern();
+        rule = constraintAnnotation.rule();
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        boolean isHasRule = false;
+        if (!StringUtils.isBlank(rule)){
+            for (String r : rules) {
+                if (r.equals(rule)){
+                    isHasRule = true;
+                }
+            }
+        }
+        try {
+            Date date = DateUtil.parse(value, pattern);
+            if (!isHasRule){
+                long diff = date.getTime() - new Date().getTime();
+                switch (rule){
+                    case "before":
+                        if (diff >= 0){
+                            context.disableDefaultConstraintViolation();
+                            context.buildConstraintViolationWithTemplate("日期必须在现在之前");
+                            return false;
+                        }
+                        break;
+                    case "after":
+                        if (diff <= 0){
+                            context.disableDefaultConstraintViolation();
+                            context.buildConstraintViolationWithTemplate("日期必须在现在之后");
+                            return false;
+                        }
+                        break;
+                    case "beforeAndNow":
+                        if (diff > 0){
+                            context.disableDefaultConstraintViolation();
+                            context.buildConstraintViolationWithTemplate("日期必须在现在或者现在之前");
+                            return false;
+                        }
+                        break;
+                    case "afterAndNow":
+                        if (diff < 0){
+                            context.disableDefaultConstraintViolation();
+                            context.buildConstraintViolationWithTemplate("日期必须在现在或者现在之后");
+                            return false;
+                        }
+                        break;
+                }
+
+                return true;
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+}

+ 30 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/DictV.java

@@ -0,0 +1,30 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义字典校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { DictValidator.class })
+public @interface DictV
+{
+    String name() default "";
+
+    String message() default "参数不符合规范";
+
+    String type() default "";
+
+    boolean isMuti() default false;
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}

+ 67 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/DictValidator.java

@@ -0,0 +1,67 @@
+package com.ruoyi.ext.api.validate;
+
+import com.alibaba.fastjson.TypeReference;
+import com.ruoyi.common.core.constant.SecurityConstants;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.ext.api.RemoteDictDataService;
+import com.ruoyi.ext.api.domain.SysDictData;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 自定义字典校验注解实现
+ *
+ * @author ruoyi
+ */
+public class DictValidator implements ConstraintValidator<DictV, String> {
+    private String dictType;
+
+    @Autowired
+    private RemoteDictDataService remoteDictDataService;
+    private boolean muti;
+    private String message;
+    private String name;
+
+
+    @Override
+    public void initialize(DictV constraintAnnotation) {
+        dictType = constraintAnnotation.type();
+        muti = constraintAnnotation.isMuti();
+        message = constraintAnnotation.message();
+        name = constraintAnnotation.name();
+
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
+        if (StringUtils.isBlank(value)) {
+            return true;
+        }
+        if (!StringUtils.isBlank(name)){
+            constraintValidatorContext.disableDefaultConstraintViolation();
+            constraintValidatorContext.buildConstraintViolationWithTemplate(name + "参数不符合规范");
+        }
+        AjaxResult result = remoteDictDataService.getDictDataByDictType(dictType, SecurityConstants.INNER);
+        List<SysDictData> data = null;
+//        result.getData(new TypeReference<List<SysDictData>>() {
+//        });
+        Map<Object, Integer> map =
+                data.stream().collect(Collectors.toMap(SysDictData::getDictValue, item -> 0));
+
+        if (data.size() == 0) {
+            return false;
+        } else {
+            return muti ? Arrays.stream(value.split(",")).allMatch(map::containsKey) :
+                    map.containsKey(value);
+        }
+    }
+
+
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EmailV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义EMail地址校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { EmailValidator.class })
+public @interface EmailV
+{
+    String message() default "EMail地址不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EmailValidator.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义EMail地址校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class EmailValidator implements ConstraintValidator<EmailV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(EmailV constraintAnnotation) {
+        pattern = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return compile.matcher(value).matches();
+    }
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EnglishV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义英文字母校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { EnglishValidator.class })
+public @interface EnglishV
+{
+    String message() default "英文字母不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EnglishValidator.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义英文字母校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class EnglishValidator implements ConstraintValidator<EnglishV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(EnglishV constraintAnnotation) {
+        pattern = "^[A-Za-z]+$";
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return compile.matcher(value).matches();
+    }
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EnumV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义本地枚举字典校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { EnumValidator.class })
+public @interface EnumV
+{
+    String message() default "参数不正常";
+
+    String[] limitValue() default {};
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}

+ 38 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/EnumValidator.java

@@ -0,0 +1,38 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+/**
+ * 自定义本地枚举字典校验注解实现
+ * 采用  @Pattern(regexp = "^((0)|(1)|(2))$", message = "性别 取值范围为:男,女,未知") 注释也可以
+ * @author ruoyi
+ */
+public class EnumValidator implements ConstraintValidator<EnumV, String>
+{
+    private String[] dicts;
+
+
+    @Override
+    public void initialize(EnumV constraintAnnotation) {
+        dicts = constraintAnnotation.limitValue();
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext)
+    {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        for (String longValue : dicts) {
+            if (value.equals(longValue)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/FzjgV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义发证机关校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { FzjgValidator.class })
+public @interface FzjgV
+{
+    String message() default "发证机关不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/FzjgValidator.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义发证机关校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class FzjgValidator implements ConstraintValidator<FzjgV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(FzjgV constraintAnnotation) {
+        pattern = "[无]{1}$|^[藏川鄂甘赣桂贵黑沪吉冀津晋京辽鲁蒙闽宁青琼陕苏皖湘新渝豫粤云浙][A-Z0-9]{1}$";
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return compile.matcher(value).matches();
+    }
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/IdCardV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义身份证校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { IdCardValidator.class })
+public @interface IdCardV
+{
+    String message() default "身份证不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 23 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/IdCardValidator.java

@@ -0,0 +1,23 @@
+package com.ruoyi.ext.api.validate;
+
+import com.ruoyi.ext.api.utils.IDCardUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+/**
+ * 自定义身份证校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class IdCardValidator implements ConstraintValidator<IdCardV, String>
+{
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return IDCardUtil.idCardValidate(value);
+    }
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/MobileV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义手机号码校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { MobileValidator.class })
+public @interface MobileV
+{
+    String message() default "手机号码不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 34 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/MobileValidator.java

@@ -0,0 +1,34 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义手机号码校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class MobileValidator implements ConstraintValidator<MobileV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(MobileV constraintAnnotation) {
+        pattern = "^1[3|4|5|6|7|8|9][0-9]\\d{8}$";
+//        pattern = "^((\\(\\d{3}\\))|(\\d{3}\\-))?13\\d{9}$";
+
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return compile.matcher(value).matches();
+    }
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/MoneyV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义金额校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { MoneyValidator.class })
+public @interface MoneyV
+{
+    String message() default "金额不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/MoneyValidator.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义金额校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class MoneyValidator implements ConstraintValidator<MoneyV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(MoneyV constraintAnnotation) {
+        pattern = "^\\d+(\\.\\d+)?$";
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return compile.matcher(value).matches();
+    }
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/NumberOrEnglishV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义字母和数字校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { NumberOrEnglishValidator.class })
+public @interface NumberOrEnglishV
+{
+    String message() default "只能包含字母和数字";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/NumberOrEnglishValidator.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义字母和数字校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class NumberOrEnglishValidator implements ConstraintValidator<NumberOrEnglishV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(NumberOrEnglishV constraintAnnotation) {
+        pattern = "^([A-Za-z]|[0-9])+$";
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return compile.matcher(value).matches();
+    }
+}

+ 30 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ObjDictV.java

@@ -0,0 +1,30 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 对象字典校验注解
+ *
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
+@Constraint(validatedBy = {DictValidator.class})
+public @interface ObjDictV {
+    String name() default "";
+
+    String message() default "参数不符合规范";
+
+    String type() default "";
+
+    boolean isMuti() default false;
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}

+ 82 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ObjDictValidator.java

@@ -0,0 +1,82 @@
+package com.ruoyi.ext.api.validate;
+
+import com.alibaba.fastjson.TypeReference;
+import com.ruoyi.common.core.constant.SecurityConstants;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.ext.api.RemoteDictDataService;
+import com.ruoyi.ext.api.RemoteDictTypeService;
+import com.ruoyi.ext.api.db.DBResult;
+import com.ruoyi.ext.api.domain.SysDictData;
+import com.ruoyi.ext.api.domain.SysObjDictType;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+
+/**
+ * 对象字典校验注解实现
+ *
+ * @author ruoyi
+ */
+public class ObjDictValidator implements ConstraintValidator<DictV, String> {
+    private String dictType;
+
+    @Autowired
+    private RemoteDictTypeService remoteDictTypeService;
+    private boolean muti;
+    private String message;
+    private String name;
+
+
+    @Override
+    public void initialize(DictV constraintAnnotation) {
+        dictType = constraintAnnotation.type();
+        muti = constraintAnnotation.isMuti();
+        message = constraintAnnotation.message();
+        name = constraintAnnotation.name();
+
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
+        if (StringUtils.isBlank(value)) {
+            return true;
+        }
+        if (!StringUtils.isBlank(name)){
+            constraintValidatorContext.disableDefaultConstraintViolation();
+            constraintValidatorContext.buildConstraintViolationWithTemplate(name + "参数不符合规范");
+        }
+        SysObjDictType sysObjDictType = new SysObjDictType();
+        sysObjDictType.setDictType(dictType);
+        AjaxResult result = remoteDictTypeService.objdict(sysObjDictType, SecurityConstants.INNER);
+        List<DBResult> data = result.getData(new TypeReference<List<DBResult>>() {
+        });
+        Map<Object, Integer> map =
+                data.stream().collect(Collectors.toMap(new Function<DBResult, Object>() {
+                    @Override
+                    public Object apply(DBResult dbResult) {
+                        return dbResult.getInt(0,0);
+                    }
+                }, dbResult -> 1));
+
+        if (data.size() == 0) {
+            return false;
+        } else {
+            return muti ? Arrays.stream(value.split(",")).allMatch(map::containsKey) :
+                    map.containsKey(value);
+        }
+    }
+
+
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/PhoneV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义电话号码校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { PhoneValidator.class })
+public @interface PhoneV
+{
+    String message() default "电话号码不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/PhoneValidator.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义电话号码校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class PhoneValidator implements ConstraintValidator<PhoneV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(PhoneV constraintAnnotation) {
+        pattern = "^((\\(\\d{3}\\))|(\\d{3}\\-))?(\\(0\\d{2,3}\\)|0\\d{2,3}-)?[1-9]\\d{6,7}$";
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return compile.matcher(value).matches();
+    }
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/QQV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义QQ校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { QQValidator.class })
+public @interface QQV
+{
+    String message() default "QQ不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/QQValidator.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义QQ校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class QQValidator implements ConstraintValidator<QQV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(QQV constraintAnnotation) {
+        pattern = "^[1-9]\\d{4,8}$";
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return compile.matcher(value).matches();
+    }
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/UrlV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义URL地址校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { UrlValidator.class })
+public @interface UrlV
+{
+    String message() default "URL地址不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/UrlValidator.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义URL地址校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class UrlValidator implements ConstraintValidator<UrlV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(UrlV constraintAnnotation) {
+        pattern = "^http:\\/\\/[A-Za-z0-9]+\\.[A-Za-z0-9]+[\\/=\\?%\\-&_~`@[\\]\\':+!]*([^<>\\\"\\\"])*$";
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return compile.matcher(value).matches();
+    }
+}

+ 26 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ZipV.java

@@ -0,0 +1,26 @@
+package com.ruoyi.ext.api.validate;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 自定义邮政编码校验注解
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
+@Constraint(validatedBy = { ZipValidator.class })
+public @interface ZipV
+{
+    String message() default "邮政编码不符合规范格式";
+
+    Class<?>[] groups() default { };
+    Class<? extends Payload>[] payload() default { };
+}
+
+

+ 32 - 0
ruoyi-api/ruoyi-api-ext/src/main/java/com/ruoyi/ext/api/validate/ZipValidator.java

@@ -0,0 +1,32 @@
+package com.ruoyi.ext.api.validate;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.regex.Pattern;
+
+/**
+ * 自定义邮政编码校验注解实现
+ * 
+ * @author ruoyi
+ */
+public class ZipValidator implements ConstraintValidator<ZipV, String>
+{
+    String pattern;
+    Pattern compile;
+
+    @Override
+    public void initialize(ZipV constraintAnnotation) {
+        pattern = "^[1-9]\\d{5}$";
+        compile = Pattern.compile(pattern);
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (StringUtils.isBlank(value)){
+            return true;
+        }
+        return compile.matcher(value).matches();
+    }
+}

+ 4 - 0
ruoyi-api/ruoyi-api-ext/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,4 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+  com.ruoyi.ext.api.factory.RemoteDictDataFallbackFactory, \
+  com.ruoyi.ext.api.factory.RemoteDictTypeFallbackFactory, \
+  com.ruoyi.ext.api.datascope.DataScopeExtAspect

+ 6 - 0
ruoyi-api/ruoyi-api-system/pom.xml

@@ -22,6 +22,12 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>ruoyi-common-core</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-api-ext</artifactId>
+            <version>3.5.0</version>
+        </dependency>
         
     </dependencies>
 

+ 20 - 2
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java

@@ -54,6 +54,10 @@ public class SysDept extends BaseEntity
     /** 子部门 */
     private List<SysDept> children = new ArrayList<SysDept>();
 
+    /**行政区划id */
+    private String locationId;
+    private String locationName;
+
     public Long getDeptId()
     {
         return deptId;
@@ -180,6 +184,22 @@ public class SysDept extends BaseEntity
         this.children = children;
     }
 
+    public String getLocationId() {
+        return locationId;
+    }
+
+    public void setLocationId(String locationId) {
+        this.locationId = locationId;
+    }
+
+    public String getLocationName() {
+        return locationName;
+    }
+
+    public void setLocationName(String locationName) {
+        this.locationName = locationName;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -194,9 +214,7 @@ public class SysDept extends BaseEntity
             .append("status", getStatus())
             .append("delFlag", getDelFlag())
             .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
             .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
             .toString();
     }
 }

+ 0 - 2
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java

@@ -167,9 +167,7 @@ public class SysDictData extends BaseEntity
             .append("isDefault", getIsDefault())
             .append("status", getStatus())
             .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
             .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
             .append("remark", getRemark())
             .toString();
     }

+ 0 - 2
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java

@@ -85,9 +85,7 @@ public class SysDictType extends BaseEntity
             .append("dictType", getDictType())
             .append("status", getStatus())
             .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
             .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
             .append("remark", getRemark())
             .toString();
     }

+ 11 - 2
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java

@@ -59,6 +59,9 @@ public class SysRole extends BaseEntity
     /** 部门组(数据权限) */
     private Long[] deptIds;
 
+    /** 拥有分配角色能力的角色id集 */
+    private String powerRids;
+
     public SysRole()
     {
 
@@ -204,6 +207,14 @@ public class SysRole extends BaseEntity
         this.deptIds = deptIds;
     }
 
+    public String getPowerRids() {
+        return powerRids;
+    }
+
+    public void setPowerRids(String powerRids) {
+        this.powerRids = powerRids;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -217,9 +228,7 @@ public class SysRole extends BaseEntity
             .append("status", getStatus())
             .append("delFlag", getDelFlag())
             .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
             .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
             .append("remark", getRemark())
             .toString();
     }

+ 12 - 2
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java

@@ -90,6 +90,9 @@ public class SysUser extends BaseEntity
     /** 角色ID */
     private Long roleId;
 
+    /** 养老机构ID */
+    private String jgId;
+
     public SysUser()
     {
 
@@ -298,6 +301,15 @@ public class SysUser extends BaseEntity
     {
         this.roleId = roleId;
     }
+
+    public String getJgId() {
+        return jgId;
+    }
+
+    public void setJgId(String jgId) {
+        this.jgId = jgId;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -315,9 +327,7 @@ public class SysUser extends BaseEntity
             .append("loginIp", getLoginIp())
             .append("loginDate", getLoginDate())
             .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
             .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
             .append("remark", getRemark())
             .append("dept", getDept())
             .toString();

+ 7 - 0
ruoyi-auth/pom.xml

@@ -69,6 +69,13 @@
                 </executions>
             </plugin>
         </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <!--开启过滤,用指定的参数替换directory下的文件中的参数-->
+                <filtering>true</filtering>
+            </resource>
+        </resources>
     </build>
    
 </project>

+ 10 - 5
ruoyi-auth/src/main/resources/bootstrap.yml

@@ -9,17 +9,22 @@ spring:
     name: ruoyi-auth
   profiles:
     # 环境配置
-    active: dev
+    active: @profiles.active@
   cloud:
     nacos:
+      # nacos 服务地址
+      server-addr: @nacos.server@
       discovery:
-        # 服务注册地址
-        server-addr: 127.0.0.1:8848
+        # 注册组
+        group: @nacos.discovery.group@
+        namespace: @nacos.discovery.namespace@
       config:
-        # 配置中心地址
-        server-addr: 127.0.0.1:8848
+        # 配置组
+        group: @nacos.config.group@
+        namespace: @nacos.config.namespace@
         # 配置文件格式
         file-extension: yml
         # 共享配置
         shared-configs:
           - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+

+ 4 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java

@@ -16,6 +16,10 @@ import com.ruoyi.common.core.utils.poi.ExcelHandlerAdapter;
 @Target(ElementType.FIELD)
 public @interface Excel
 {
+    /**
+     * 如果是字典类型,请设置字典的type值
+     */
+    public String dictType() default "";
     /**
      * 导出时在excel中排序
      */

+ 25 - 5
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/GenConstants.java

@@ -2,7 +2,7 @@ package com.ruoyi.common.core.constant;
 
 /**
  * 代码生成通用常量
- * 
+ *
  * @author ruoyi
  */
 public class GenConstants
@@ -45,18 +45,38 @@ public class GenConstants
             "bigint", "float", "double", "decimal" };
 
     /** 页面不需要编辑字段 */
-    public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" };
+//    public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" };
+    public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag",
+            "create_time_str","create_user_id","create_unit","create_unit_name","state",
+            "jg_id",
+    };
 
     /** 页面不需要显示的列表字段 */
+//    public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by",
+//            "update_time" };
     public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by",
-            "update_time" };
+            "update_time",
+            "create_time_str","create_user_id","create_unit","create_unit_name",
+            "update_time_str","update_user_id","update_unit","update_unit_name","state",
+            "jg_id",
+    };
 
     /** 页面不需要查询字段 */
+//    public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by",
+//            "update_time", "remark" };
     public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by",
-            "update_time", "remark" };
+            "update_time", "remark",
+            "create_time_str","create_user_id","create_unit","create_unit_name",
+            "update_time_str","update_user_id","update_unit","update_unit_name","state",
+            "jg_id",
+    };
 
     /** Entity基类字段 */
-    public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" };
+//    public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" };
+    public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark",
+            "createTimeStr","createUserId","createUnit","createUnitName",
+            "updateTimeStr","updateUserId","updateUnit","updateUnitName","state",
+    };
 
     /** Tree基类字段 */
     public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors" };

+ 44 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java

@@ -8,6 +8,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
+import java.util.Calendar;
 import java.util.Date;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
@@ -176,4 +177,47 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
+
+
+    public static String YYYYMMDD = "yyyyMMdd";
+    public static String YYYYMMDDHHMMSSSSSS = "yyyyMMddHHmmssSSSS";
+
+    public static final String dateTimeSecquence()
+    {
+        return dateTimeNow(YYYYMMDDHHMMSSSSSS);
+    }
+
+    /**
+     * yyMMdd ==> yy-MM-dd
+     */
+    public static String dateStringToString(String dateStr)
+    {
+        Date date = dateTime(YYYYMMDD, dateStr);
+        return parseDateToStr(YYYY_MM_DD, date);
+    }
+    /**
+     * 根据生日计算当前周岁数
+     */
+    public static int getCurrentAge(Date birthday) {
+        // 当前时间
+        Calendar curr = Calendar.getInstance();
+        // 生日
+        Calendar born = Calendar.getInstance();
+        born.setTime(birthday);
+        // 年龄 = 当前年 - 出生年
+        int age = curr.get(Calendar.YEAR) - born.get(Calendar.YEAR);
+        if (age <= 0) {
+            return 0;
+        }
+        // 如果当前月份小于出生月份: age-1
+        // 如果当前月份等于出生月份, 且当前日小于出生日: age-1
+        int currMonth = curr.get(Calendar.MONTH);
+        int currDay = curr.get(Calendar.DAY_OF_MONTH);
+        int bornMonth = born.get(Calendar.MONTH);
+        int bornDay = born.get(Calendar.DAY_OF_MONTH);
+        if ((currMonth < bornMonth) || (currMonth == bornMonth && currDay <= bornDay)) {
+            age--;
+        }
+        return age < 0 ? 0 : age;
+    }
 }

+ 51 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java

@@ -345,6 +345,10 @@ public class ExcelUtil<T>
                         {
                             val = dataFormatHandlerAdapter(val, attr);
                         }
+                        else if (StringUtils.isNotEmpty(attr.dictType()))
+                        {
+                            val = reverseByDictType(attr.dictType(), String.valueOf(val));
+                        }
                         ReflectUtils.invokeSetter(entity, propertyName, val);
                     }
                 }
@@ -354,6 +358,47 @@ public class ExcelUtil<T>
         return list;
     }
 
+    /**
+     * 根据字典类型解析导出值 0=男,1=女,2=未知(导出)
+     * @Title convertByDictType
+     * @author yuyehong@cloudwalk.cn
+     * @date 18:17 2020/6/23
+     * @param dictType 字典类型
+     * @param dictValue 字典值
+     * @return java.lang.String
+     */
+    private String convertByDictType(String dictType, String dictValue) throws Exception {
+        try {
+            Class<?> dictUtils = Class.forName("com.ruoyi.common.security.utils.DictUtils");
+            Object dictLabel = dictUtils.getMethod("getDictLabel", String.class, String.class,
+                    String.class).invoke(dictUtils.newInstance(), dictType, dictValue.trim(), "");
+            return String.valueOf(dictLabel.toString());
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+    /**
+     * 根据字典类型反向解析值 (导入使用)
+     * 例:男=0,女=1,未知=2
+     * @Title reverseByDictType
+     * @author yuyehong@cloudwalk.cn
+     * @date 18:07 2020/6/23
+     * @param dictType 字典类型
+     * @param dictLabel 字典标签
+     * @return java.lang.String
+     */
+    private String reverseByDictType(String dictType, String dictLabel) throws Exception {
+        try {
+            Class<?> dictUtils = Class.forName("com.business.system.utils.DictUtils");
+            Object dictValue = dictUtils.getMethod("getDictValue", String.class, String.class,
+                    String.class).invoke(dictUtils.newInstance(), dictType, dictLabel.trim(), "0");
+            return String.valueOf(dictValue);
+        } catch (Exception e) {
+            throw e;
+        }
+    }
+
+
     /**
      * 对list数据源将其里面的数据导入到excel表单
      *
@@ -697,6 +742,8 @@ public class ExcelUtil<T>
                 String dateFormat = attr.dateFormat();
                 String readConverterExp = attr.readConverterExp();
                 String separator = attr.separator();
+                //修改ExcelUtil工具类中addCell,新增分支判断
+                String dictType = attr.dictType();
                 if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value))
                 {
                     cell.setCellValue(parseDateToStr(dateFormat, value));
@@ -713,6 +760,10 @@ public class ExcelUtil<T>
                 {
                     cell.setCellValue(dataFormatHandlerAdapter(value, attr));
                 }
+                else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value))
+                {
+                    cell.setCellValue(convertByDictType(dictType, String.valueOf(value)));
+                }
                 else
                 {
                     // 设置列类型

+ 15 - 0
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/AjaxResult.java

@@ -1,6 +1,9 @@
 package com.ruoyi.common.core.web.domain;
 
 import java.util.HashMap;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
 import com.ruoyi.common.core.constant.HttpStatus;
 import com.ruoyi.common.core.utils.StringUtils;
 
@@ -72,6 +75,18 @@ public class AjaxResult extends HashMap<String, Object>
         return this;
     }
 
+    /**
+     * 扩展获取data为实际对象
+     *
+     * @return
+     */
+    public <T>T getData(TypeReference<T> tTypeReference)
+    {
+        Object data = get("data");
+        String s = JSON.toJSONString(data);
+        return JSON.parseObject(s, tTypeReference);
+    }
+
     /**
      * 返回成功消息
      * 

+ 98 - 27
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseEntity.java

@@ -8,7 +8,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 
 /**
  * Entity基类
- * 
+ *
  * @author ruoyi
  */
 public class BaseEntity implements Serializable
@@ -21,20 +21,39 @@ public class BaseEntity implements Serializable
     /** 创建者 */
     private String createBy;
 
-    /** 创建时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date createTime;
+    /** 创建时间字符串 */
+    private String createTimeStr;
+
+    /** 创建者id */
+    private String createUserId;
+
+    /** 创建者部门id */
+    private String createUnit;
+
+    /** 创建者部门名称 */
+    private String createUnitName;
 
     /** 更新者 */
     private String updateBy;
 
-    /** 更新时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date updateTime;
+    /** 更新时间字符串 */
+    private String updateTimeStr;
+
+    /** 更新者id */
+    private String updateUserId;
+
+    /** 更新者部门id */
+    private String updateUnit;
+
+    /** 更新者部门名称 */
+    private String updateUnitName;
 
     /** 备注 */
     private String remark;
 
+    /** 删除状态 */
+    private Long state;
+
     /** 请求参数 */
     private Map<String, Object> params;
 
@@ -58,16 +77,6 @@ public class BaseEntity implements Serializable
         this.createBy = createBy;
     }
 
-    public Date getCreateTime()
-    {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime)
-    {
-        this.createTime = createTime;
-    }
-
     public String getUpdateBy()
     {
         return updateBy;
@@ -78,16 +87,6 @@ public class BaseEntity implements Serializable
         this.updateBy = updateBy;
     }
 
-    public Date getUpdateTime()
-    {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Date updateTime)
-    {
-        this.updateTime = updateTime;
-    }
-
     public String getRemark()
     {
         return remark;
@@ -98,6 +97,78 @@ public class BaseEntity implements Serializable
         this.remark = remark;
     }
 
+    public String getCreateTimeStr() {
+        return createTimeStr;
+    }
+
+    public void setCreateTimeStr(String createTimeStr) {
+        this.createTimeStr = createTimeStr;
+    }
+
+    public String getUpdateTimeStr() {
+        return updateTimeStr;
+    }
+
+    public void setUpdateTimeStr(String updateTimeStr) {
+        this.updateTimeStr = updateTimeStr;
+    }
+
+    public String getCreateUserId() {
+        return createUserId;
+    }
+
+    public void setCreateUserId(String createUserId) {
+        this.createUserId = createUserId;
+    }
+
+    public String getCreateUnit() {
+        return createUnit;
+    }
+
+    public void setCreateUnit(String createUnit) {
+        this.createUnit = createUnit;
+    }
+
+    public String getCreateUnitName() {
+        return createUnitName;
+    }
+
+    public void setCreateUnitName(String createUnitName) {
+        this.createUnitName = createUnitName;
+    }
+
+    public String getUpdateUserId() {
+        return updateUserId;
+    }
+
+    public void setUpdateUserId(String updateUserId) {
+        this.updateUserId = updateUserId;
+    }
+
+    public String getUpdateUnit() {
+        return updateUnit;
+    }
+
+    public void setUpdateUnit(String updateUnit) {
+        this.updateUnit = updateUnit;
+    }
+
+    public String getUpdateUnitName() {
+        return updateUnitName;
+    }
+
+    public void setUpdateUnitName(String updateUnitName) {
+        this.updateUnitName = updateUnitName;
+    }
+
+    public Long getState() {
+        return state;
+    }
+
+    public void setState(Long state) {
+        this.state = state;
+    }
+
     public Map<String, Object> getParams()
     {
         if (params == null)

+ 0 - 0
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java


Some files were not shown because too many files changed in this diff