浏览代码

修改 service-file逻辑

yq 2 年之前
父节点
当前提交
37cef84ac5
共有 91 个文件被更改,包括 3427 次插入1190 次删除
  1. 2 7
      base-common/ruoyi-common-security/pom.xml
  2. 2 2
      base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/aspect/PreAuthorizeAspect.java
  3. 21 20
      base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java
  4. 12 12
      base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java
  5. 30 29
      base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
  6. 12 11
      base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/DictUtils.java
  7. 2 2
      base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java
  8. 11 2
      base-modules/service-file/pom.xml
  9. 47 48
      base-modules/service-file/src/main/java/com/ruoyi/file/controller/SysFileController.java
  10. 50 50
      base-modules/service-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java
  11. 182 170
      base-modules/service-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java
  12. 40 25
      pom.xml
  13. 7 17
      usky-common/common-cloud-starter/pom.xml
  14. 4 2
      usky-common/pom.xml
  15. 44 0
      usky-common/usky-common-core/pom.xml
  16. 2 6
      usky-common/usky-common-core/src/main/java/com/usky/common/core/bean/BaseEntity.java
  17. 24 0
      usky-common/usky-common-core/src/main/java/com/usky/common/core/constants/CacheConstants.java
  18. 141 0
      usky-common/usky-common-core/src/main/java/com/usky/common/core/constants/Constants.java
  19. 46 0
      usky-common/usky-common-core/src/main/java/com/usky/common/core/constants/SecurityConstants.java
  20. 25 0
      usky-common/usky-common-core/src/main/java/com/usky/common/core/constants/TokenConstants.java
  21. 100 0
      usky-common/usky-common-core/src/main/java/com/usky/common/core/context/SecurityContextHolder.java
  22. 5 4
      usky-common/usky-common-core/src/main/java/com/usky/common/core/handler/UnifiedExceptionHandler.java
  23. 1 1
      usky-common/usky-common-core/src/main/java/com/usky/common/core/util/GlobalUtils.java
  24. 148 55
      usky-common/usky-common-core/src/main/java/com/usky/common/core/util/IpUtils.java
  25. 1 2
      usky-common/usky-common-core/src/main/java/com/usky/common/core/util/JsonUtils.java
  26. 128 0
      usky-common/usky-common-core/src/main/java/com/usky/common/core/util/JwtUtils.java
  27. 302 0
      usky-common/usky-common-core/src/main/java/com/usky/common/core/util/ServletUtils.java
  28. 1 1
      usky-common/usky-common-core/src/main/java/com/usky/common/core/util/SpringContextUtils.java
  29. 1 1
      usky-common/usky-common-core/src/main/java/com/usky/common/core/util/SpringEnvUtils.java
  30. 28 0
      usky-common/usky-common-core/src/main/java/com/usky/common/core/util/StringUtils.java
  31. 29 0
      usky-common/usky-common-log/pom.xml
  32. 43 0
      usky-common/usky-common-log/src/main/java/com/usky/common/log/annotation/Log.java
  33. 213 0
      usky-common/usky-common-log/src/main/java/com/usky/common/log/aspect/LogAspect.java
  34. 20 0
      usky-common/usky-common-log/src/main/java/com/usky/common/log/enums/BusinessStatus.java
  35. 59 0
      usky-common/usky-common-log/src/main/java/com/usky/common/log/enums/BusinessType.java
  36. 24 0
      usky-common/usky-common-log/src/main/java/com/usky/common/log/enums/OperatorType.java
  37. 29 0
      usky-common/usky-common-log/src/main/java/com/usky/common/log/service/AsyncLogService.java
  38. 14 0
      usky-common/usky-common-log/src/main/java/com/usky/common/log/service/LogService.java
  39. 0 52
      usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/convert/BaseEnumConverterFactory.java
  40. 0 18
      usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/convert/DateStringConvert.java
  41. 0 30
      usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/convert/FormatterConfiguration.java
  42. 0 18
      usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/convert/StringDateConverter.java
  43. 0 22
      usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/multipartFile/CommonsMultipartResolverConfiguration.java
  44. 0 39
      usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/validator/ValidatorExtensionAutoConfiguration.java
  45. 0 31
      usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/utils/JdbcUtils.java
  46. 0 120
      usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/utils/ServletUtils.java
  47. 5 16
      usky-common/usky-common-mybatis/pom.xml
  48. 1 2
      usky-common/usky-common-mybatis/src/main/java/com/usky/common/mybatis/core/AbstractCrudService.java
  49. 1 1
      usky-common/usky-common-mybatis/src/main/java/com/usky/common/mybatis/core/BaseModel.java
  50. 1 1
      usky-common/usky-common-mybatis/src/main/java/com/usky/common/mybatis/core/CrudMapper.java
  51. 1 1
      usky-common/usky-common-mybatis/src/main/java/com/usky/common/mybatis/core/CrudService.java
  52. 8 0
      usky-common/usky-common-mybatis/src/main/java/com/usky/common/mybatis/test.java
  53. 32 0
      usky-common/usky-common-redis/pom.xml
  54. 1 1
      usky-common/usky-common-redis/src/main/java/com/usky/common/redis/config/EhCacheCacheConfiguration.java
  55. 4 1
      usky-common/usky-common-redis/src/main/java/com/usky/common/redis/config/RedisExtensionAutoConfiguration.java
  56. 2 2
      usky-common/usky-common-redis/src/main/java/com/usky/common/redis/core/RedisHelper.java
  57. 1 1
      usky-common/usky-common-redis/src/main/java/com/usky/common/redis/core/RedisObjectMapper.java
  58. 1 1
      usky-common/usky-common-redis/src/main/java/com/usky/common/redis/core/RedisOverdueTimeProperties.java
  59. 42 0
      usky-common/usky-common-security/pom.xml
  60. 28 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/EnableRyFeignClients.java
  61. 19 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/InnerAuth.java
  62. 20 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/Logical.java
  63. 18 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/RequiresLogin.java
  64. 27 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/RequiresPermissions.java
  65. 26 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/RequiresRoles.java
  66. 52 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/aspect/InnerAuthAspect.java
  67. 99 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/aspect/PreAuthorizeAspect.java
  68. 372 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/auth/AuthLogic.java
  69. 162 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/auth/AuthUtil.java
  70. 23 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/config/ApplicationConfig.java
  71. 35 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/config/WebMvcConfig.java
  72. 16 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/exception/InnerAuthException.java
  73. 16 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/exception/NotLoginException.java
  74. 23 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/exception/NotPermissionException.java
  75. 23 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/exception/NotRoleException.java
  76. 20 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/feign/FeignAutoConfiguration.java
  77. 52 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/feign/FeignRequestInterceptor.java
  78. 72 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/interceptor/HeaderInterceptor.java
  79. 172 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/service/TokenService.java
  80. 76 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/utils/DictUtils.java
  81. 126 0
      usky-common/usky-common-security/src/main/java/com/usky/common/security/utils/SecurityUtils.java
  82. 0 60
      usky-common/usky-common-spring/pom.xml
  83. 0 34
      usky-common/usky-common-spring/src/main/java/com/usky/common/spring/annotion/ConditionalOnPropertyNotEmpty.java
  84. 0 26
      usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/id/IdWorkerAutoConfiguration.java
  85. 0 17
      usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/id/IdWorkerConfigProperties.java
  86. 0 47
      usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/jackson/JacksonConfig.java
  87. 0 5
      usky-common/usky-common-spring/src/main/java/com/usky/common/spring/injectself/BeanSelfAware.java
  88. 0 25
      usky-common/usky-common-spring/src/main/java/com/usky/common/spring/injectself/InjectSelfBeanPostProcessor.java
  89. 0 45
      usky-common/usky-common-spring/src/main/java/com/usky/common/spring/util/ApplicationStartupUtils.java
  90. 0 83
      usky-common/usky-common-spring/src/main/java/com/usky/common/spring/util/MultipartFileUtil.java
  91. 0 24
      usky-common/usky-common-spring/src/main/java/com/usky/common/spring/util/ThreadUtils.java

+ 2 - 7
base-common/ruoyi-common-security/pom.xml

@@ -22,7 +22,7 @@
             <artifactId>spring-webmvc</artifactId>
         </dependency>
 
-        <!-- RuoYi Api System -->
+<!--        &lt;!&ndash; RuoYi Api System &ndash;&gt;-->
         <dependency>
             <groupId>com.usky</groupId>
             <artifactId>service-system-api</artifactId>
@@ -31,12 +31,7 @@
         <!-- RuoYi Common Redis-->
         <dependency>
             <groupId>com.usky</groupId>
-            <artifactId>ruoyi-common-core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.usky</groupId>
-            <artifactId>usky-common-spring</artifactId>
+            <artifactId>ruoyi-common-redis</artifactId>
         </dependency>
 
     </dependencies>

+ 2 - 2
base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/aspect/PreAuthorizeAspect.java

@@ -14,7 +14,7 @@ import com.ruoyi.common.security.auth.AuthUtil;
 
 /**
  * 基于 Spring Aop 的注解鉴权
- * 
+ *
  * @author kong
  */
 @Aspect
@@ -45,7 +45,7 @@ public class PreAuthorizeAspect
 
     /**
      * 环绕切入
-     * 
+     *
      * @param joinPoint 切面对象
      * @return 底层方法执行后的返回值
      * @throws Throwable 底层方法抛出的异常

+ 21 - 20
base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java

@@ -4,6 +4,7 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
+
 import com.usky.system.model.LoginUser;
 import org.springframework.util.PatternMatchUtils;
 import com.ruoyi.common.core.exception.auth.NotLoginException;
@@ -20,7 +21,7 @@ import com.ruoyi.common.security.utils.SecurityUtils;
 
 /**
  * Token 权限验证,逻辑实现类
- * 
+ *
  * @author ruoyi
  */
 public class AuthLogic
@@ -64,7 +65,7 @@ public class AuthLogic
 
     /**
      * 获取当前用户缓存信息, 如果未登录,则抛出异常
-     * 
+     *
      * @return 用户缓存信息
      */
     public LoginUser getLoginUser()
@@ -84,7 +85,7 @@ public class AuthLogic
 
     /**
      * 获取当前用户缓存信息, 如果未登录,则抛出异常
-     * 
+     *
      * @param token 前端传递的认证信息
      * @return 用户缓存信息
      */
@@ -95,7 +96,7 @@ public class AuthLogic
 
     /**
      * 验证当前用户有效期, 如果相差不足120分钟,自动刷新缓存
-     * 
+     *
      * @param loginUser 当前用户信息
      */
     public void verifyLoginUserExpire(LoginUser loginUser)
@@ -105,7 +106,7 @@ public class AuthLogic
 
     /**
      * 验证用户是否具备某权限
-     * 
+     *
      * @param permission 权限字符串
      * @return 用户是否具备某权限
      */
@@ -116,7 +117,7 @@ public class AuthLogic
 
     /**
      * 验证用户是否具备某权限, 如果验证未通过,则抛出异常: NotPermissionException
-     * 
+     *
      * @param permission 权限字符串
      * @return 用户是否具备某权限
      */
@@ -130,7 +131,7 @@ public class AuthLogic
 
     /**
      * 根据注解(@RequiresPermissions)鉴权, 如果验证未通过,则抛出异常: NotPermissionException
-     * 
+     *
      * @param requiresPermissions 注解对象
      */
     public void checkPermi(RequiresPermissions requiresPermissions)
@@ -164,7 +165,7 @@ public class AuthLogic
 
     /**
      * 验证用户是否含有指定权限,只需包含其中一个
-     * 
+     *
      * @param permissions 权限码数组
      */
     public void checkPermiOr(String... permissions)
@@ -185,7 +186,7 @@ public class AuthLogic
 
     /**
      * 判断用户是否拥有某个角色
-     * 
+     *
      * @param role 角色标识
      * @return 用户是否具备某角色
      */
@@ -196,7 +197,7 @@ public class AuthLogic
 
     /**
      * 判断用户是否拥有某个角色, 如果验证未通过,则抛出异常: NotRoleException
-     * 
+     *
      * @param role 角色标识
      */
     public void checkRole(String role)
@@ -209,7 +210,7 @@ public class AuthLogic
 
     /**
      * 根据注解(@RequiresRoles)鉴权
-     * 
+     *
      * @param requiresRoles 注解对象
      */
     public void checkRole(RequiresRoles requiresRoles)
@@ -226,7 +227,7 @@ public class AuthLogic
 
     /**
      * 验证用户是否含有指定角色,必须全部拥有
-     * 
+     *
      * @param roles 角色标识数组
      */
     public void checkRoleAnd(String... roles)
@@ -243,7 +244,7 @@ public class AuthLogic
 
     /**
      * 验证用户是否含有指定角色,只需包含其中一个
-     * 
+     *
      * @param roles 角色标识数组
      */
     public void checkRoleOr(String... roles)
@@ -264,7 +265,7 @@ public class AuthLogic
 
     /**
      * 根据注解(@RequiresLogin)鉴权
-     * 
+     *
      * @param at 注解对象
      */
     public void checkByAnnotation(RequiresLogin at)
@@ -274,7 +275,7 @@ public class AuthLogic
 
     /**
      * 根据注解(@RequiresRoles)鉴权
-     * 
+     *
      * @param at 注解对象
      */
     public void checkByAnnotation(RequiresRoles at)
@@ -292,7 +293,7 @@ public class AuthLogic
 
     /**
      * 根据注解(@RequiresPermissions)鉴权
-     * 
+     *
      * @param at 注解对象
      */
     public void checkByAnnotation(RequiresPermissions at)
@@ -310,7 +311,7 @@ public class AuthLogic
 
     /**
      * 获取当前账号的角色列表
-     * 
+     *
      * @return 角色列表
      */
     public Set<String> getRoleList()
@@ -328,7 +329,7 @@ public class AuthLogic
 
     /**
      * 获取当前账号的权限列表
-     * 
+     *
      * @return 权限列表
      */
     public Set<String> getPermiList()
@@ -346,7 +347,7 @@ public class AuthLogic
 
     /**
      * 判断是否包含权限
-     * 
+     *
      * @param authorities 权限列表
      * @param permission 权限字符串
      * @return 用户是否具备某权限
@@ -359,7 +360,7 @@ public class AuthLogic
 
     /**
      * 判断是否包含角色
-     * 
+     *
      * @param roles 角色列表
      * @param role 角色
      * @return 用户是否具备某角色权限

+ 12 - 12
base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java

@@ -6,7 +6,7 @@ import com.usky.system.model.LoginUser;
 
 /**
  * Token 权限验证工具类
- * 
+ *
  * @author ruoyi
  */
 public class AuthUtil
@@ -26,7 +26,7 @@ public class AuthUtil
 
     /**
      * 会话注销,根据指定Token
-     * 
+     *
      * @param tokenValue 指定token
      */
     public static void logoutByToken(String token)
@@ -60,7 +60,7 @@ public class AuthUtil
 
     /**
      * 当前账号是否含有指定角色标识, 返回truefalse
-     * 
+     *
      * @param role 角色标识
      * @return 是否含有指定角色标识
      */
@@ -71,7 +71,7 @@ public class AuthUtil
 
     /**
      * 当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
-     * 
+     *
      * @param role 角色标识
      */
     public static void checkRole(String role)
@@ -81,7 +81,7 @@ public class AuthUtil
 
     /**
      * 根据注解传入参数鉴权, 如果验证未通过,则抛出异常: NotRoleException
-     * 
+     *
      * @param requiresRoles 角色权限注解
      */
     public static void checkRole(RequiresRoles requiresRoles)
@@ -91,7 +91,7 @@ public class AuthUtil
 
     /**
      * 当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
-     * 
+     *
      * @param roles 角色标识数组
      */
     public static void checkRoleAnd(String... roles)
@@ -101,7 +101,7 @@ public class AuthUtil
 
     /**
      * 当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
-     * 
+     *
      * @param roles 角色标识数组
      */
     public static void checkRoleOr(String... roles)
@@ -111,7 +111,7 @@ public class AuthUtil
 
     /**
      * 当前账号是否含有指定权限, 返回truefalse
-     * 
+     *
      * @param permission 权限码
      * @return 是否含有指定权限
      */
@@ -122,7 +122,7 @@ public class AuthUtil
 
     /**
      * 当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
-     * 
+     *
      * @param permission 权限码
      */
     public static void checkPermi(String permission)
@@ -132,7 +132,7 @@ public class AuthUtil
 
     /**
      * 根据注解传入参数鉴权, 如果验证未通过,则抛出异常: NotPermissionException
-     * 
+     *
      * @param requiresPermissions 权限注解
      */
     public static void checkPermi(RequiresPermissions requiresPermissions)
@@ -142,7 +142,7 @@ public class AuthUtil
 
     /**
      * 当前账号是否含有指定权限 [指定多个,必须全部验证通过]
-     * 
+     *
      * @param permissions 权限码数组
      */
     public static void checkPermiAnd(String... permissions)
@@ -152,7 +152,7 @@ public class AuthUtil
 
     /**
      * 当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
-     * 
+     *
      * @param permissions 权限码数组
      */
     public static void checkPermiOr(String... permissions)

+ 30 - 29
base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java

@@ -6,7 +6,7 @@ import java.util.concurrent.TimeUnit;
 import javax.servlet.http.HttpServletRequest;
 
 import com.ruoyi.common.core.utils.SpringUtils;
-import com.usky.common.spring.config.redis.RedisHelper;
+import com.ruoyi.common.redis.service.RedisService;
 import com.usky.system.model.LoginUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -21,14 +21,14 @@ import com.ruoyi.common.security.utils.SecurityUtils;
 
 /**
  * token验证处理
- * 
+ *
  * @author ruoyi
  */
 @Component
 public class TokenService
 {
 
-    private RedisHelper redisService = SpringUtils.getBean(RedisHelper.class);
+    private RedisService redisService = SpringUtils.getBean(RedisService.class);
 
 
 
@@ -47,29 +47,30 @@ public class TokenService
      */
     public Map<String, Object> createToken(LoginUser loginUser)
     {
-        String token = IdUtils.fastUUID();
-        Long userId = loginUser.getSysUser().getUserId();
-        String userName = loginUser.getSysUser().getUserName();
-        Integer tenantId = loginUser.getSysUser().getTenantId();
-        loginUser.setToken(token);
-        loginUser.setUserid(userId);
-        loginUser.setUsername(userName);
-        loginUser.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest()));
-        refreshToken(loginUser);
-
-        // Jwt存储信息
-        Map<String, Object> claimsMap = new HashMap<String, Object>();
-        claimsMap.put(SecurityConstants.USER_KEY, token);
-        claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
-        claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
-        claimsMap.put(SecurityConstants.DETAILS_TENANT_ID, tenantId);
-
-        // 接口返回信息
-        Map<String, Object> rspMap = new HashMap<String, Object>();
-        rspMap.put("access_token", JwtUtils.createToken(claimsMap));
-        rspMap.put("expires_in", expireTime);
-        rspMap.put("tenantId",tenantId);
-        return rspMap;
+//        String token = IdUtils.fastUUID();
+//        Long userId = loginUser.getSysUser().getUserId();
+//        String userName = loginUser.getSysUser().getUserName();
+//        Integer tenantId = loginUser.getSysUser().getTenantId();
+//        loginUser.setToken(token);
+//        loginUser.setUserid(userId);
+//        loginUser.setUsername(userName);
+//        loginUser.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest()));
+//        refreshToken(loginUser);
+//
+//        // Jwt存储信息
+//        Map<String, Object> claimsMap = new HashMap<String, Object>();
+//        claimsMap.put(SecurityConstants.USER_KEY, token);
+//        claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
+//        claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
+//        claimsMap.put(SecurityConstants.DETAILS_TENANT_ID, tenantId);
+//
+//        // 接口返回信息
+//        Map<String, Object> rspMap = new HashMap<String, Object>();
+//        rspMap.put("access_token", JwtUtils.createToken(claimsMap));
+//        rspMap.put("expires_in", expireTime);
+//        rspMap.put("tenantId",tenantId);
+//        return rspMap;
+        return null;
     }
 
     /**
@@ -107,7 +108,7 @@ public class TokenService
             if (StringUtils.isNotEmpty(token))
             {
                 String userkey = JwtUtils.getUserKey(token);
-                user = (LoginUser)redisService.get(getTokenKey(userkey));
+                user = (LoginUser)redisService.getCacheMap(getTokenKey(userkey));
                 return user;
             }
         }
@@ -136,7 +137,7 @@ public class TokenService
         if (StringUtils.isNotEmpty(token))
         {
             String userkey = JwtUtils.getUserKey(token);
-            redisService.delete(getTokenKey(userkey));
+            redisService.deleteObject(getTokenKey(userkey));
         }
     }
 
@@ -166,7 +167,7 @@ public class TokenService
         loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
         // 根据uuid将loginUser缓存
         String userKey = getTokenKey(loginUser.getToken());
-        redisService.set(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+        redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
     }
 
     private String getTokenKey(String token)

+ 12 - 11
base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/DictUtils.java

@@ -5,36 +5,37 @@ import java.util.List;
 import com.ruoyi.common.core.constant.Constants;
 import com.ruoyi.common.core.utils.SpringUtils;
 import com.ruoyi.common.core.utils.StringUtils;
-import com.usky.common.spring.config.redis.RedisHelper;
+
+import com.ruoyi.common.redis.service.RedisService;
 import com.usky.system.domain.SysDictDataVO;
 
 /**
  * 字典工具类
- * 
+ *
  * @author ruoyi
  */
 public class DictUtils
 {
     /**
      * 设置字典缓存
-     * 
+     *
      * @param key 参数键
      * @param dictDatas 字典数据列表
      */
     public static void setDictCache(String key, List<SysDictDataVO> dictDatas)
     {
-        SpringUtils.getBean(RedisHelper.class).set(getCacheKey(key), dictDatas);
+        SpringUtils.getBean(RedisService.class).setCacheObject(getCacheKey(key), dictDatas);
     }
 
     /**
      * 获取字典缓存
-     * 
+     *
      * @param key 参数键
      * @return dictDatas 字典数据列表
      */
     public static List<SysDictDataVO> getDictCache(String key)
     {
-        Object cacheObj = SpringUtils.getBean(RedisHelper.class).get(getCacheKey(key));
+        Object cacheObj = SpringUtils.getBean(RedisService.class).getCacheObject(getCacheKey(key));
         if (StringUtils.isNotNull(cacheObj))
         {
             return StringUtils.cast(cacheObj);
@@ -44,12 +45,12 @@ public class DictUtils
 
     /**
      * 删除指定字典缓存
-     * 
+     *
      * @param key 字典键
      */
     public static void removeDictCache(String key)
     {
-        SpringUtils.getBean(RedisHelper.class).delete(getCacheKey(key));
+        SpringUtils.getBean(RedisService.class).deleteObject(getCacheKey(key));
     }
 
     /**
@@ -57,13 +58,13 @@ public class DictUtils
      */
     public static void clearDictCache()
     {
-        Collection<String> keys = SpringUtils.getBean(RedisHelper.class).keys(Constants.SYS_DICT_KEY + "*");
-        SpringUtils.getBean(RedisHelper.class).delete(keys);
+        Collection<String> keys = SpringUtils.getBean(RedisService.class).keys(Constants.SYS_DICT_KEY + "*");
+        SpringUtils.getBean(RedisService.class).deleteObject(keys);
     }
 
     /**
      * 设置cache key
-     * 
+     *
      * @param configKey 参数键
      * @return 缓存键key
      */

+ 2 - 2
base-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java

@@ -12,7 +12,7 @@ import com.ruoyi.common.core.utils.StringUtils;
 
 /**
  * 权限获取工具类
- * 
+ *
  * @author ruoyi
  */
 public class SecurityUtils
@@ -89,7 +89,7 @@ public class SecurityUtils
 
     /**
      * 是否为管理员
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */

+ 11 - 2
base-modules/service-file/pom.xml

@@ -59,13 +59,22 @@
             <groupId>com.usky</groupId>
             <artifactId>service-system-api</artifactId>
         </dependency>
-        
+
+
         <!-- RuoYi Common Swagger -->
         <dependency>
             <groupId>com.usky</groupId>
             <artifactId>ruoyi-common-swagger</artifactId>
         </dependency>
-        
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 47 - 48
base-modules/service-file/src/main/java/com/ruoyi/file/controller/SysFileController.java

@@ -1,48 +1,47 @@
-//package com.ruoyi.file.controller;
-//
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.web.bind.annotation.PostMapping;
-//import org.springframework.web.bind.annotation.RestController;
-//import org.springframework.web.multipart.MultipartFile;
-//import com.ruoyi.common.core.domain.R;
-//import com.ruoyi.common.core.utils.file.FileUtils;
-//import com.ruoyi.file.service.ISysFileService;
-//import com.ruoyi.system.api.domain.SysFile;
-//
-///**
-// * 文件请求处理
-// *
-// * @author ruoyi
-// */
-//@RestController
-//public class SysFileController
-//{
-//    private static final Logger log = LoggerFactory.getLogger(SysFileController.class);
-//
-//    @Autowired
-//    private ISysFileService sysFileService;
-//
-//    /**
-//     * 文件上传请求
-//     */
-//    @PostMapping("upload")
-//    public R<SysFile> upload(MultipartFile file)
-//    {
-//        try
-//        {
-//            // 上传并返回访问地址
-//            String url = sysFileService.uploadFile(file);
-//            SysFile sysFile = new SysFile();
-//            sysFile.setName(FileUtils.getName(url));
-//            sysFile.setUrl(url);
-//            return R.ok(sysFile);
-//        }
-//        catch (Exception e)
-//        {
-//            log.error("上传文件失败", e);
-//            return R.fail(e.getMessage());
-//        }
-//    }
-//}
+package com.ruoyi.file.controller;
+
+import com.ruoyi.common.core.domain.R;
+import com.usky.system.domain.SysFileVO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import com.ruoyi.file.service.ISysFileService;
+import com.ruoyi.common.core.utils.file.FileUtils;
+
+/**
+ * 文件请求处理
+ * @author ruoyi
+ */
+@RestController
+public class SysFileController
+{
+    private static final Logger log = LoggerFactory.getLogger(SysFileController.class);
+
+    @Autowired
+    private ISysFileService sysFileService;
+
+    /**
+     * 文件上传请求
+     */
+    @PostMapping("upload")
+    public R<SysFileVO> upload(MultipartFile file)
+    {
+        try
+        {
+            // 上传并返回访问地址
+            String url = sysFileService.uploadFile(file);
+            SysFileVO sysFile = new SysFileVO();
+            sysFile.setName(FileUtils.getName(url));
+            sysFile.setUrl(url);
+            return R.ok(sysFile);
+        }
+        catch (Exception e)
+        {
+            log.error("上传文件失败", e);
+            return R.fail(e.getMessage());
+        }
+    }
+}

+ 50 - 50
base-modules/service-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java

@@ -1,50 +1,50 @@
-//package com.ruoyi.file.service;
-//
-//import org.springframework.beans.factory.annotation.Value;
-//import org.springframework.context.annotation.Primary;
-//import org.springframework.stereotype.Service;
-//import org.springframework.web.multipart.MultipartFile;
-//import com.ruoyi.file.utils.FileUploadUtils;
-//
-///**
-// * 本地文件存储
-// *
-// * @author ruoyi
-// */
-//@Primary
-//@Service
-//public class LocalSysFileServiceImpl implements ISysFileService
-//{
-//    /**
-//     * 资源映射路径 前缀
-//     */
-//    @Value("${file.prefix}")
-//    public String localFilePrefix;
-//
-//    /**
-//     * 域名或本机访问地址
-//     */
-//    @Value("${file.domain}")
-//    public String domain;
-//
-//    /**
-//     * 上传文件存储在本地的根路径
-//     */
-//    @Value("${file.path}")
-//    private String localFilePath;
-//
-//    /**
-//     * 本地文件上传接口
-//     *
-//     * @param file 上传的文件
-//     * @return 访问地址
-//     * @throws Exception
-//     */
-//    @Override
-//    public String uploadFile(MultipartFile file) throws Exception
-//    {
-//        String name = FileUploadUtils.upload(localFilePath, file);
-//        String url = domain + localFilePrefix + name;
-//        return url;
-//    }
-//}
+package com.ruoyi.file.service;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import com.ruoyi.file.utils.FileUploadUtils;
+
+/**
+ * 本地文件存储
+ *
+ * @author ruoyi
+ */
+@Primary
+@Service
+public class LocalSysFileServiceImpl implements ISysFileService
+{
+    /**
+     * 资源映射路径 前缀
+     */
+    @Value("${file.prefix}")
+    public String localFilePrefix;
+
+    /**
+     * 域名或本机访问地址
+     */
+    @Value("${file.domain}")
+    public String domain;
+
+    /**
+     * 上传文件存储在本地的根路径
+     */
+    @Value("${file.path}")
+    private String localFilePath;
+
+    /**
+     * 本地文件上传接口
+     *
+     * @param file 上传的文件
+     * @return 访问地址
+     * @throws Exception
+     */
+    @Override
+    public String uploadFile(MultipartFile file) throws Exception
+    {
+        String name = FileUploadUtils.upload(localFilePath, file);
+        String url = domain + localFilePrefix + name;
+        return url;
+    }
+}

+ 182 - 170
base-modules/service-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java

@@ -1,11 +1,21 @@
 package com.ruoyi.file.utils;
 
+
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Paths;
+import java.util.Date;
 import java.util.Objects;
+
+import com.ruoyi.common.core.exception.file.FileNameLengthLimitExceededException;
+import com.ruoyi.common.core.exception.file.InvalidExtensionException;
 import org.apache.commons.io.FilenameUtils;
-import org.springframework.util.MimeTypeUtils;
+import com.ruoyi.common.core.exception.file.FileSizeLimitExceededException;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.utils.file.MimeTypeUtils;
+import com.ruoyi.common.core.utils.uuid.Seq;
+import org.apache.commons.lang3.time.DateFormatUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 
@@ -16,175 +26,177 @@ import org.springframework.web.multipart.MultipartFile;
  */
 public class FileUploadUtils
 {
-//    /**
-//     * 默认大小 50M
-//     */
-//    public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
-//
-//    /**
-//     * 默认的文件名最大长度 100
-//     */
-//    public static final int DEFAULT_FILE_NAME_LENGTH = 100;
-//
-//    /**
-//     * 根据文件路径上传
-//     *
-//     * @param baseDir 相对应用的基目录
-//     * @param file 上传的文件
-//     * @return 文件名称
-//     * @throws IOException
-//     */
-//    public static final String upload(String baseDir, MultipartFile file) throws IOException
-//    {
-//        try
-//        {
-//            return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
-//        }
-//        catch (Exception e)
-//        {
-//            throw new IOException(e.getMessage(), e);
-//        }
-//    }
-//
-//    /**
-//     * 文件上传
-//     *
-//     * @param baseDir 相对应用的基目录
-//     * @param file 上传的文件
-//     * @param allowedExtension 上传文件类型
-//     * @return 返回上传成功的文件名
-//     * @throws FileSizeLimitExceededException 如果超出最大大小
-//     * @throws FileNameLengthLimitExceededException 文件名太长
-//     * @throws IOException 比如读写文件出错时
-//     * @throws InvalidExtensionException 文件校验异常
-//     */
-//    public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
-//            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
-//            InvalidExtensionException
-//    {
-//        int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
-//        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
-//        {
-//            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
-//        }
-//
-//        assertAllowed(file, allowedExtension);
-//
-//        String fileName = extractFilename(file);
-//
-//        String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
-//        file.transferTo(Paths.get(absPath));
-//        return getPathFileName(fileName);
-//    }
-//
-//    /**
-//     * 编码文件名
-//     */
-//    public static final String extractFilename(MultipartFile file)
-//    {
+    /**
+     * 默认大小 50M
+     */
+    public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
+
+    /**
+     * 默认的文件名最大长度 100
+     */
+    public static final int DEFAULT_FILE_NAME_LENGTH = 100;
+
+    /**
+     * 根据文件路径上传
+     *
+     * @param baseDir 相对应用的基目录
+     * @param file 上传的文件
+     * @return 文件名称
+     * @throws IOException
+     */
+    public static final String upload(String baseDir, MultipartFile file) throws IOException
+    {
+        try
+        {
+            return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+        }
+        catch (Exception e)
+        {
+            throw new IOException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 文件上传
+     *
+     * @param baseDir 相对应用的基目录
+     * @param file 上传的文件
+     * @param allowedExtension 上传文件类型
+     * @return 返回上传成功的文件名
+     * @throws FileSizeLimitExceededException 如果超出最大大小
+     * @throws FileNameLengthLimitExceededException 文件名太长
+     * @throws IOException 比如读写文件出错时
+     * @throws InvalidExtensionException 文件校验异常
+     */
+    public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
+            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+            InvalidExtensionException
+    {
+        int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
+        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
+        {
+            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+        }
+
+        assertAllowed(file, allowedExtension);
+
+        String fileName = extractFilename(file);
+
+        String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
+        file.transferTo(Paths.get(absPath));
+        return getPathFileName(fileName);
+    }
+
+    /**
+     * 编码文件名
+     */
+    public static final String extractFilename(MultipartFile file)
+    {
 //        return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
 //                FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file));
-//    }
-//
-//    private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
-//    {
-//        File desc = new File(uploadDir + File.separator + fileName);
-//
-//        if (!desc.exists())
-//        {
-//            if (!desc.getParentFile().exists())
-//            {
-//                desc.getParentFile().mkdirs();
-//            }
-//        }
-//        return desc.isAbsolute() ? desc : desc.getAbsoluteFile();
-//    }
-//
-//    private static final String getPathFileName(String fileName) throws IOException
-//    {
-//        String pathFileName = "/" + fileName;
-//        return pathFileName;
-//    }
-//
-//    /**
-//     * 文件大小校验
-//     *
-//     * @param file 上传的文件
-//     * @throws FileSizeLimitExceededException 如果超出最大大小
-//     * @throws InvalidExtensionException 文件校验异常
-//     */
-//    public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
-//            throws FileSizeLimitExceededException, InvalidExtensionException
-//    {
-//        long size = file.getSize();
-//        if (size > DEFAULT_MAX_SIZE)
-//        {
-//            throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
-//        }
-//
-//        String fileName = file.getOriginalFilename();
-//        String extension = getExtension(file);
-//        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
-//        {
-//            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
-//            {
-//                throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
-//                        fileName);
-//            }
-//            else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
-//            {
-//                throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
-//                        fileName);
-//            }
-//            else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
-//            {
-//                throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
-//                        fileName);
-//            }
-//            else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
-//            {
-//                throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
-//                        fileName);
-//            }
-//            else
-//            {
-//                throw new InvalidExtensionException(allowedExtension, extension, fileName);
-//            }
-//        }
-//    }
-//
-//    /**
-//     * 判断MIME类型是否是允许的MIME类型
-//     *
-//     * @param extension 上传文件类型
-//     * @param allowedExtension 允许上传文件类型
-//     * @return true/false
-//     */
-//    public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
-//    {
-//        for (String str : allowedExtension)
-//        {
-//            if (str.equalsIgnoreCase(extension))
-//            {
-//                return true;
-//            }
-//        }
-//        return false;
-//    }
-//
-//    /**
-//     * 获取文件名的后缀
-//     *
-//     * @param file 表单文件
-//     * @return 后缀名
-//     */
-//    public static final String getExtension(MultipartFile file)
-//    {
-//        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
-//        if (StringUtils.isEmpty(extension))
-//        {
-//            extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
-//        }
-//        return extension;
-//    }
+        String datePath = DateFormatUtils.format(new Date(), "yyyyMM");
+        return StringUtils.format("{}/{}.{}",datePath , Seq.getId(Seq.uploadSeqType), getExtension(file));
+    }
+
+    private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
+    {
+        File desc = new File(uploadDir + File.separator + fileName);
+
+        if (!desc.exists())
+        {
+            if (!desc.getParentFile().exists())
+            {
+                desc.getParentFile().mkdirs();
+            }
+        }
+        return desc.isAbsolute() ? desc : desc.getAbsoluteFile();
+    }
+
+    private static final String getPathFileName(String fileName) throws IOException
+    {
+        String pathFileName = "/" + fileName;
+        return pathFileName;
+    }
+
+    /**
+     * 文件大小校验
+     *
+     * @param file 上传的文件
+     * @throws FileSizeLimitExceededException 如果超出最大大小
+     * @throws InvalidExtensionException 文件校验异常
+     */
+    public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
+            throws FileSizeLimitExceededException, InvalidExtensionException
+    {
+        long size = file.getSize();
+        if (size > DEFAULT_MAX_SIZE)
+        {
+            throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE/1024/1024);
+        }
+
+        String fileName = file.getOriginalFilename();
+        String extension = getExtension(file);
+        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
+        {
+            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else
+            {
+                throw new InvalidExtensionException(allowedExtension, extension, fileName);
+            }
+        }
+    }
+
+    /**
+     * 判断MIME类型是否是允许的MIME类型
+     *
+     * @param extension 上传文件类型
+     * @param allowedExtension 允许上传文件类型
+     * @return true/false
+     */
+    public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
+    {
+        for (String str : allowedExtension)
+        {
+            if (str.equalsIgnoreCase(extension))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 获取文件名的后缀
+     *
+     * @param file 表单文件
+     * @return 后缀名
+     */
+    public static final String getExtension(MultipartFile file)
+    {
+        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+        if (StringUtils.isEmpty(extension))
+        {
+            extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
+        }
+        return extension;
+    }
 }

+ 40 - 25
pom.xml

@@ -266,13 +266,6 @@
                 <version>${ruoyi.version}</version>
             </dependency>
 
-            <!-- 系统接口 -->
-            <dependency>
-                <groupId>com.usky</groupId>
-                <artifactId>service-system-api</artifactId>
-                <version>${ruoyi.version}</version>
-            </dependency>
-
             <!-- cloud启动器 -->
             <dependency>
                 <groupId>com.usky</groupId>
@@ -294,24 +287,6 @@
 <!--                <version>${commons-lang3.version}</version>-->
 <!--            </dependency>-->
 
-            <dependency>
-                <groupId>com.usky</groupId>
-                <artifactId>usky-common-core</artifactId>
-                <version>${usky.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.usky</groupId>
-                <artifactId>usky-common-mvc</artifactId>
-                <version>${usky.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.usky</groupId>
-                <artifactId>usky-common-spring</artifactId>
-                <version>${usky.version}</version>
-            </dependency>
-
             <dependency>
                 <groupId>commons-beanutils</groupId>
                 <artifactId>commons-beanutils</artifactId>
@@ -343,6 +318,37 @@
                 <version>${usky.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.usky</groupId>
+                <artifactId>usky-common-core</artifactId>
+                <version>${usky.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.usky</groupId>
+                <artifactId>usky-common-redis</artifactId>
+                <version>${usky.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.usky</groupId>
+                <artifactId>usky-common-security</artifactId>
+                <version>${usky.version}</version>
+            </dependency>
+
+
+            <dependency>
+                <groupId>com.usky</groupId>
+                <artifactId>usky-common-log</artifactId>
+                <version>${usky.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.usky</groupId>
+                <artifactId>usky-common-mybatis</artifactId>
+                <version>${usky.version}</version>
+            </dependency>
+
+
         </dependencies>
     </dependencyManagement>
 
@@ -413,4 +419,13 @@
 <!--        </profile>-->
 <!--    </profiles>-->
 
+    <distributionManagement>
+        <repository>
+            <id>nexus-uskycloud</id>
+            <name>maven-releases</name>
+            <url>http://101.133.214.75:8081/repository/maven-releases/</url>
+            <uniqueVersion>true</uniqueVersion>
+        </repository>
+    </distributionManagement>
+
 </project>

+ 7 - 17
usky-common/common-cloud-starter/pom.xml

@@ -41,16 +41,6 @@
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
-        </dependency>
-
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-generator</artifactId>
@@ -68,24 +58,24 @@
         </dependency>
 
         <dependency>
-            <groupId>com.usky</groupId>
-            <artifactId>usky-common-core</artifactId>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>6.0.18.Final</version>
         </dependency>
 
         <dependency>
             <groupId>com.usky</groupId>
-            <artifactId>usky-common-mvc</artifactId>
+            <artifactId>usky-common-security</artifactId>
         </dependency>
 
         <dependency>
-            <groupId>org.hibernate</groupId>
-            <artifactId>hibernate-validator</artifactId>
-            <version>6.0.18.Final</version>
+            <groupId>com.usky</groupId>
+            <artifactId>usky-common-mybatis</artifactId>
         </dependency>
 
         <dependency>
             <groupId>com.usky</groupId>
-            <artifactId>ruoyi-common-security</artifactId>
+            <artifactId>usky-common-log</artifactId>
         </dependency>
 
 

+ 4 - 2
usky-common/pom.xml

@@ -52,8 +52,10 @@
 
     <modules>
         <module>usky-common-core</module>
-        <module>usky-common-mvc</module>
-        <module>usky-common-spring</module>
         <module>common-cloud-starter</module>
+        <module>usky-common-log</module>
+        <module>usky-common-security</module>
+        <module>usky-common-mybatis</module>
+        <module>usky-common-redis</module>
     </modules>
 </project>

+ 44 - 0
usky-common/usky-common-core/pom.xml

@@ -53,6 +53,50 @@
             <artifactId>jackson-datatype-jsr310</artifactId>
         </dependency>
 
+        <!-- Java Servlet -->
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+
+
+        <!-- SpringCloud Loadbalancer -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>transmittable-thread-local</artifactId>
+        </dependency>
+
+        <!-- Jwt -->
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 2 - 6
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/domain/BaseEntity.java → usky-common/usky-common-core/src/main/java/com/usky/common/core/bean/BaseEntity.java

@@ -1,6 +1,5 @@
-package com.usky.common.mvc.domain;
+package com.usky.common.core.bean;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 
 import java.io.Serializable;
@@ -11,14 +10,13 @@ import java.util.Map;
 /**
  * Entity基类
  * 
- * @author yq
+ * @author ruoyi
  */
 public class BaseEntity implements Serializable
 {
     private static final long serialVersionUID = 1L;
 
     /** 搜索值 */
-    @TableField(exist = false)
     private String searchValue;
 
     /** 创建者 */
@@ -36,11 +34,9 @@ public class BaseEntity implements Serializable
     private Date updateTime;
 
     /** 备注 */
-    @TableField(exist = false)
     private String remark;
 
     /** 请求参数 */
-    @TableField(exist = false)
     private Map<String, Object> params;
 
     public String getSearchValue()

+ 24 - 0
usky-common/usky-common-core/src/main/java/com/usky/common/core/constants/CacheConstants.java

@@ -0,0 +1,24 @@
+package com.usky.common.core.constants;
+
+/**
+ * 缓存的key 常量
+ * 
+ * @author ruoyi
+ */
+public class CacheConstants
+{
+    /**
+     * 缓存有效期,默认720(分钟)
+     */
+    public final static long EXPIRATION = 7200;
+
+    /**
+     * 缓存刷新时间,默认120(分钟)
+     */
+    public final static long REFRESH_TIME = 120;
+
+    /**
+     * 权限缓存前缀
+     */
+    public final static String LOGIN_TOKEN_KEY = "login_tokens:";
+}

+ 141 - 0
usky-common/usky-common-core/src/main/java/com/usky/common/core/constants/Constants.java

@@ -0,0 +1,141 @@
+package com.usky.common.core.constants;
+
+/**
+ * 通用常量信息
+ * 
+ * @author ruoyi
+ */
+public class Constants
+{
+    /**
+     * UTF-8 字符集
+     */
+    public static final String UTF8 = "UTF-8";
+
+    /**
+     * GBK 字符集
+     */
+    public static final String GBK = "GBK";
+
+    /**
+     * RMI 远程方法调用
+     */
+    public static final String LOOKUP_RMI = "rmi:";
+
+    /**
+     * LDAP 远程方法调用
+     */
+    public static final String LOOKUP_LDAP = "ldap:";
+
+    /**
+     * LDAPS 远程方法调用
+     */
+    public static final String LOOKUP_LDAPS = "ldaps:";
+
+    /**
+     * http请求
+     */
+    public static final String HTTP = "http://";
+
+    /**
+     * https请求
+     */
+    public static final String HTTPS = "https://";
+
+    /**
+     * 成功标记
+     */
+    public static final Integer SUCCESS = 200;
+
+    /**
+     * 失败标记
+     */
+    public static final Integer FAIL = 500;
+
+    /**
+     * 登录成功状态
+     */
+    public static final String LOGIN_SUCCESS_STATUS = "0";
+
+    /**
+     * 登录失败状态
+     */
+    public static final String LOGIN_FAIL_STATUS = "1";
+
+    /**
+     * 登录成功
+     */
+    public static final String LOGIN_SUCCESS = "Success";
+
+    /**
+     * 注销
+     */
+    public static final String LOGOUT = "Logout";
+
+    /**
+     * 注册
+     */
+    public static final String REGISTER = "Register";
+
+    /**
+     * 登录失败
+     */
+    public static final String LOGIN_FAIL = "Error";
+
+    /**
+     * 当前记录起始索引
+     */
+    public static final String PAGE_NUM = "pageNum";
+
+    /**
+     * 每页显示记录数
+     */
+    public static final String PAGE_SIZE = "pageSize";
+
+    /**
+     * 排序列
+     */
+    public static final String ORDER_BY_COLUMN = "orderByColumn";
+
+    /**
+     * 排序的方向 "desc" 或者 "asc".
+     */
+    public static final String IS_ASC = "isAsc";
+
+    /**
+     * 验证码 redis key
+     */
+    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
+
+    /**
+     * 验证码有效期(分钟)
+     */
+    public static final long CAPTCHA_EXPIRATION = 2;
+
+
+    /**
+     * 参数管理 cache key
+     */
+    public static final String SYS_CONFIG_KEY = "sys_config:";
+
+    /**
+     * 字典管理 cache key
+     */
+    public static final String SYS_DICT_KEY = "sys_dict:";
+
+    /**
+     * 资源映射路径 前缀
+     */
+    public static final String RESOURCE_PREFIX = "/profile";
+
+    /**
+     * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
+     */
+    public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
+
+    /**
+     * 定时任务违规的字符
+     */
+    public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
+            "org.springframework", "org.apache", "com.ruoyi.common.core.utils.file" };
+}

+ 46 - 0
usky-common/usky-common-core/src/main/java/com/usky/common/core/constants/SecurityConstants.java

@@ -0,0 +1,46 @@
+package com.usky.common.core.constants;
+
+/**
+ * 权限相关通用常量
+ * 
+ * @author ruoyi
+ */
+public class SecurityConstants
+{
+    /**
+     * 用户ID字段
+     */
+    public static final String DETAILS_USER_ID = "user_id";
+
+    /**
+     * 用户名字段
+     */
+    public static final String DETAILS_USERNAME = "username";
+
+    /**
+     * 授权信息字段
+     */
+    public static final String AUTHORIZATION_HEADER = "authorization";
+
+    /**
+     * 请求来源
+     */
+    public static final String FROM_SOURCE = "from-source";
+
+    /**
+     * 内部请求
+     */
+    public static final String INNER = "inner";
+
+    /**
+     * 用户标识
+     */
+    public static final String USER_KEY = "user_key";
+
+    /**
+     * 登录用户
+     */
+    public static final String LOGIN_USER = "login_user";
+
+    public static final String DETAILS_TENANT_ID = "";
+}

+ 25 - 0
usky-common/usky-common-core/src/main/java/com/usky/common/core/constants/TokenConstants.java

@@ -0,0 +1,25 @@
+package com.usky.common.core.constants;
+
+/**
+ * Token的Key常量
+ * 
+ * @author ruoyi
+ */
+public class TokenConstants
+{
+    /**
+     * 令牌自定义标识
+     */
+    public static final String AUTHENTICATION = "Authorization";
+
+    /**
+     * 令牌前缀
+     */
+    public static final String PREFIX = "Bearer ";
+
+    /**
+     * 令牌秘钥
+     */
+    public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
+
+}

+ 100 - 0
usky-common/usky-common-core/src/main/java/com/usky/common/core/context/SecurityContextHolder.java

@@ -0,0 +1,100 @@
+package com.usky.common.core.context;
+
+
+
+import com.alibaba.ttl.TransmittableThreadLocal;
+import com.usky.common.core.constants.SecurityConstants;
+import com.usky.common.core.util.Convert;
+import com.usky.common.core.util.StringUtils;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 获取当前线程变量中的 用户id、用户名称、Token等信息 
+ * 注意: 必须在网关通过请求头的方法传入,同时在HeaderInterceptor拦截器设置值。 否则这里无法获取
+ *
+ * @author ruoyi
+ */
+public class SecurityContextHolder
+{
+    private static final TransmittableThreadLocal<Map<String, Object>> THREAD_LOCAL = new TransmittableThreadLocal<>();
+
+    public static void set(String key, Object value)
+    {
+        Map<String, Object> map = getLocalMap();
+        map.put(key, value == null ? StringUtils.EMPTY : value);
+    }
+
+    public static String get(String key)
+    {
+        Map<String, Object> map = getLocalMap();
+        return Convert.toStr(map.getOrDefault(key, StringUtils.EMPTY));
+    }
+
+    public static <T> T get(String key, Class<T> clazz)
+    {
+        Map<String, Object> map = getLocalMap();
+        return StringUtils.cast(map.getOrDefault(key, null));
+    }
+
+    public static Map<String, Object> getLocalMap()
+    {
+        Map<String, Object> map = THREAD_LOCAL.get();
+        if (map == null)
+        {
+            map = new ConcurrentHashMap<String, Object>();
+            THREAD_LOCAL.set(map);
+        }
+        return map;
+    }
+
+    public static void setLocalMap(Map<String, Object> threadLocalMap)
+    {
+        THREAD_LOCAL.set(threadLocalMap);
+    }
+
+    public static Long getUserId()
+    {
+        return Convert.toLong(get(SecurityConstants.DETAILS_USER_ID), 0L);
+    }
+
+    public static Integer getTenantId()
+    {
+        return Convert.toInt(get(SecurityConstants.DETAILS_TENANT_ID), 0);
+    }
+
+    public static void setTenantId(String tenantId) {
+       set(SecurityConstants.DETAILS_TENANT_ID,tenantId);
+    }
+
+    public static void setUserId(String account)
+    {
+        set(SecurityConstants.DETAILS_USER_ID, account);
+    }
+
+    public static String getUserName()
+    {
+        return get(SecurityConstants.DETAILS_USERNAME);
+    }
+
+    public static void setUserName(String username)
+    {
+        set(SecurityConstants.DETAILS_USERNAME, username);
+    }
+
+    public static String getUserKey()
+    {
+        return get(SecurityConstants.USER_KEY);
+    }
+
+    public static void setUserKey(String userKey)
+    {
+        set(SecurityConstants.USER_KEY, userKey);
+    }
+
+    public static void remove()
+    {
+        THREAD_LOCAL.remove();
+    }
+}

+ 5 - 4
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/handler/UnifiedExceptionHandler.java → usky-common/usky-common-core/src/main/java/com/usky/common/core/handler/UnifiedExceptionHandler.java

@@ -1,12 +1,12 @@
-package com.usky.common.mvc.handler;
+package com.usky.common.core.handler;
 
+import com.google.common.base.Throwables;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.exception.*;
-import com.google.common.base.Throwables;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.dao.DuplicateKeyException;
+
 import org.springframework.http.HttpStatus;
 import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.util.CollectionUtils;
@@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.servlet.NoHandlerFoundException;
+import org.yaml.snakeyaml.constructor.DuplicateKeyException;
 
 import javax.validation.ConstraintViolation;
 import javax.validation.ConstraintViolationException;
@@ -36,7 +37,7 @@ import static com.usky.common.core.exception.ErrorMessageConsts.SYS_ERROR_LOG_ME
  * @author chenpeng
  * Create time 20181130日 下午4:41:27
  * @see ErrorCode
- * @see com.usky.common.core.exception.BusinessException
+ * @see BusinessException
  */
 @ControllerAdvice
 public class UnifiedExceptionHandler {

+ 1 - 1
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/util/GlobalUtils.java → usky-common/usky-common-core/src/main/java/com/usky/common/core/util/GlobalUtils.java

@@ -1,4 +1,4 @@
-package com.usky.common.spring.util;
+package com.usky.common.core.util;
 
 /**
  * @author barry chen

+ 148 - 55
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/utils/IpUtils.java → usky-common/usky-common-core/src/main/java/com/usky/common/core/util/IpUtils.java

@@ -1,78 +1,104 @@
-package com.usky.common.mvc.utils;
+package com.usky.common.core.util;
 
-import javax.servlet.http.HttpServletRequest;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.Objects;
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * 获取IP方法
- *
+ * 
  * @author ruoyi
  */
-public final class IpUtils {
-
-    private IpUtils() {
-    }
-
-    public static String getIpAddr(HttpServletRequest request) {
-        if (request == null) {
+public class IpUtils
+{
+    /**
+     * 获取客户端IP
+     * 
+     * @param request 请求对象
+     * @return IP地址
+     */
+    public static String getIpAddr(HttpServletRequest request)
+    {
+        if (request == null)
+        {
             return "unknown";
         }
         String ip = request.getHeader("x-forwarded-for");
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
             ip = request.getHeader("Proxy-Client-IP");
         }
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
             ip = request.getHeader("X-Forwarded-For");
         }
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
             ip = request.getHeader("WL-Proxy-Client-IP");
         }
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
             ip = request.getHeader("X-Real-IP");
         }
 
-        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
             ip = request.getRemoteAddr();
         }
 
-        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
     }
 
-    public static boolean internalIp(String ip) {
+    /**
+     * 检查是否为内部IP地址
+     * 
+     * @param ip IP地址
+     * @return 结果
+     */
+    public static boolean internalIp(String ip)
+    {
         byte[] addr = textToNumericFormatV4(ip);
         return internalIp(addr) || "127.0.0.1".equals(ip);
     }
 
-    private static boolean internalIp(byte[] addr) {
-        if (Objects.isNull(addr) || addr.length < 2) {
+    /**
+     * 检查是否为内部IP地址
+     * 
+     * @param addr byte地址
+     * @return 结果
+     */
+    private static boolean internalIp(byte[] addr)
+    {
+        if (Objects.isNull(addr) || addr.length < 2)
+        {
             return true;
         }
         final byte b0 = addr[0];
         final byte b1 = addr[1];
         // 10.x.x.x/8
-        final byte section1 = 0x0A;
+        final byte SECTION_1 = 0x0A;
         // 172.16.x.x/12
-        final byte section2 = (byte) 0xAC;
-        final byte section3 = (byte) 0x10;
-        final byte section4 = (byte) 0x1F;
+        final byte SECTION_2 = (byte) 0xAC;
+        final byte SECTION_3 = (byte) 0x10;
+        final byte SECTION_4 = (byte) 0x1F;
         // 192.168.x.x/16
-        final byte section5 = (byte) 0xC0;
-        final byte section6 = (byte) 0xA8;
-        switch (b0) {
-            case section1:
+        final byte SECTION_5 = (byte) 0xC0;
+        final byte SECTION_6 = (byte) 0xA8;
+        switch (b0)
+        {
+            case SECTION_1:
                 return true;
-            case section2:
-                if (b1 >= section3 && b1 <= section4) {
+            case SECTION_2:
+                if (b1 >= SECTION_3 && b1 <= SECTION_4)
+                {
                     return true;
                 }
-            case section5:
-                switch (b1) {
-                    case section6:
+            case SECTION_5:
+                switch (b1)
+                {
+                    case SECTION_6:
                         return true;
-                    default:
-                        return false;
                 }
             default:
                 return false;
@@ -81,24 +107,29 @@ public final class IpUtils {
 
     /**
      * 将IPv4地址转换成字节
-     *
+     * 
      * @param text IPv4地址
      * @return byte 字节
      */
-    public static byte[] textToNumericFormatV4(String text) {
-        if (text.length() == 0) {
+    public static byte[] textToNumericFormatV4(String text)
+    {
+        if (text.length() == 0)
+        {
             return null;
         }
 
         byte[] bytes = new byte[4];
         String[] elements = text.split("\\.", -1);
-        try {
+        try
+        {
             long l;
             int i;
-            switch (elements.length) {
+            switch (elements.length)
+            {
                 case 1:
                     l = Long.parseLong(elements[0]);
-                    if ((l < 0L) || (l > 4294967295L)) {
+                    if ((l < 0L) || (l > 4294967295L))
+                    {
                         return null;
                     }
                     bytes[0] = (byte) (int) (l >> 24 & 0xFF);
@@ -108,12 +139,14 @@ public final class IpUtils {
                     break;
                 case 2:
                     l = Integer.parseInt(elements[0]);
-                    if ((l < 0L) || (l > 255L)) {
+                    if ((l < 0L) || (l > 255L))
+                    {
                         return null;
                     }
                     bytes[0] = (byte) (int) (l & 0xFF);
                     l = Integer.parseInt(elements[1]);
-                    if ((l < 0L) || (l > 16777215L)) {
+                    if ((l < 0L) || (l > 16777215L))
+                    {
                         return null;
                     }
                     bytes[1] = (byte) (int) (l >> 16 & 0xFF);
@@ -121,24 +154,29 @@ public final class IpUtils {
                     bytes[3] = (byte) (int) (l & 0xFF);
                     break;
                 case 3:
-                    for (i = 0; i < 2; ++i) {
+                    for (i = 0; i < 2; ++i)
+                    {
                         l = Integer.parseInt(elements[i]);
-                        if ((l < 0L) || (l > 255L)) {
+                        if ((l < 0L) || (l > 255L))
+                        {
                             return null;
                         }
                         bytes[i] = (byte) (int) (l & 0xFF);
                     }
                     l = Integer.parseInt(elements[2]);
-                    if ((l < 0L) || (l > 65535L)) {
+                    if ((l < 0L) || (l > 65535L))
+                    {
                         return null;
                     }
                     bytes[2] = (byte) (int) (l >> 8 & 0xFF);
                     bytes[3] = (byte) (int) (l & 0xFF);
                     break;
                 case 4:
-                    for (i = 0; i < 4; ++i) {
+                    for (i = 0; i < 4; ++i)
+                    {
                         l = Integer.parseInt(elements[i]);
-                        if ((l < 0L) || (l > 255L)) {
+                        if ((l < 0L) || (l > 255L))
+                        {
                             return null;
                         }
                         bytes[i] = (byte) (int) (l & 0xFF);
@@ -147,25 +185,80 @@ public final class IpUtils {
                 default:
                     return null;
             }
-        } catch (NumberFormatException e) {
+        }
+        catch (NumberFormatException e)
+        {
             return null;
         }
         return bytes;
     }
 
-    public static String getHostIp() {
-        try {
+    /**
+     * 获取IP地址
+     * 
+     * @return 本地IP地址
+     */
+    public static String getHostIp()
+    {
+        try
+        {
             return InetAddress.getLocalHost().getHostAddress();
-        } catch (UnknownHostException e) {
+        }
+        catch (UnknownHostException e)
+        {
         }
         return "127.0.0.1";
     }
 
-    public static String getHostName() {
-        try {
+    /**
+     * 获取主机名
+     * 
+     * @return 本地主机名
+     */
+    public static String getHostName()
+    {
+        try
+        {
             return InetAddress.getLocalHost().getHostName();
-        } catch (UnknownHostException e) {
+        }
+        catch (UnknownHostException e)
+        {
         }
         return "未知";
     }
-}
+
+    /**
+     * 从多级反向代理中获得第一个非unknown IP地址
+     *
+     * @param ip 获得的IP地址
+     * @return 第一个非unknown IP地址
+     */
+    public static String getMultistageReverseProxyIp(String ip)
+    {
+        // 多级反向代理检测
+        if (ip != null && ip.indexOf(",") > 0)
+        {
+            final String[] ips = ip.trim().split(",");
+            for (String subIp : ips)
+            {
+                if (false == isUnknown(subIp))
+                {
+                    ip = subIp;
+                    break;
+                }
+            }
+        }
+        return ip;
+    }
+
+    /**
+     * 检测给定字符串是否为未知,多用于检测HTTP请求相关
+     *
+     * @param checkString 被检测的字符串
+     * @return 是否未知
+     */
+    public static boolean isUnknown(String checkString)
+    {
+        return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
+    }
+}

+ 1 - 2
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/util/JsonUtils.java → usky-common/usky-common-core/src/main/java/com/usky/common/core/util/JsonUtils.java

@@ -1,10 +1,9 @@
-package com.usky.common.spring.util;
+package com.usky.common.core.util;
 
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.usky.common.core.util.JsonMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 

+ 128 - 0
usky-common/usky-common-core/src/main/java/com/usky/common/core/util/JwtUtils.java

@@ -0,0 +1,128 @@
+package com.usky.common.core.util;
+
+import com.usky.common.core.constants.SecurityConstants;
+import com.usky.common.core.constants.TokenConstants;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+import java.util.Map;
+
+/**
+ * Jwt工具类
+ *
+ * @author ruoyi
+ */
+public class JwtUtils
+{
+    public static String secret = TokenConstants.SECRET;
+
+    /**
+     * 从数据声明生成令牌
+     *
+     * @param claims 数据声明
+     * @return 令牌
+     */
+    public static String createToken(Map<String, Object> claims)
+    {
+        String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();
+        return token;
+    }
+
+    /**
+     * 从令牌中获取数据声明
+     *
+     * @param token 令牌
+     * @return 数据声明
+     */
+    public static Claims parseToken(String token)
+    {
+        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
+    }
+
+    /**
+     * 根据令牌获取用户标识
+     * 
+     * @param token 令牌
+     * @return 用户ID
+     */
+    public static String getUserKey(String token)
+    {
+        Claims claims = parseToken(token);
+        return getValue(claims, SecurityConstants.USER_KEY);
+    }
+
+    public static String getTenantId(Claims claims)
+    {
+        return getValue(claims, SecurityConstants.DETAILS_TENANT_ID);
+    }
+
+    /**
+     * 根据令牌获取用户标识
+     * 
+     * @param claims 身份信息
+     * @return 用户ID
+     */
+    public static String getUserKey(Claims claims)
+    {
+        return getValue(claims, SecurityConstants.USER_KEY);
+    }
+
+    /**
+     * 根据令牌获取用户ID
+     * 
+     * @param token 令牌
+     * @return 用户ID
+     */
+    public static String getUserId(String token)
+    {
+        Claims claims = parseToken(token);
+        return getValue(claims, SecurityConstants.DETAILS_USER_ID);
+    }
+
+    /**
+     * 根据身份信息获取用户ID
+     * 
+     * @param claims 身份信息
+     * @return 用户ID
+     */
+    public static String getUserId(Claims claims)
+    {
+        return getValue(claims, SecurityConstants.DETAILS_USER_ID);
+    }
+
+    /**
+     * 根据令牌获取用户名
+     * 
+     * @param token 令牌
+     * @return 用户名
+     */
+    public static String getUserName(String token)
+    {
+        Claims claims = parseToken(token);
+        return getValue(claims, SecurityConstants.DETAILS_USERNAME);
+    }
+
+    /**
+     * 根据身份信息获取用户名
+     * 
+     * @param claims 身份信息
+     * @return 用户名
+     */
+    public static String getUserName(Claims claims)
+    {
+        return getValue(claims, SecurityConstants.DETAILS_USERNAME);
+    }
+
+    /**
+     * 根据身份信息获取键值
+     * 
+     * @param claims 身份信息
+     * @param key 键
+     * @return
+     */
+    public static String getValue(Claims claims, String key)
+    {
+        return Convert.toStr(claims.get(key), "");
+    }
+}

+ 302 - 0
usky-common/usky-common-core/src/main/java/com/usky/common/core/util/ServletUtils.java

@@ -0,0 +1,302 @@
+package com.usky.common.core.util;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.Enumeration;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.net.HttpHeaders;
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.constants.Constants;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import reactor.core.publisher.Mono;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+/**
+ * 客户端工具类
+ * 
+ * @author ruoyi
+ */
+public class ServletUtils
+{
+    /**
+     * 获取String参数
+     */
+    public static String getParameter(String name)
+    {
+        return getRequest().getParameter(name);
+    }
+
+    /**
+     * 获取String参数
+     */
+    public static String getParameter(String name, String defaultValue)
+    {
+        return Convert.toStr(getRequest().getParameter(name), defaultValue);
+    }
+
+    /**
+     * 获取Integer参数
+     */
+    public static Integer getParameterToInt(String name)
+    {
+        return Convert.toInt(getRequest().getParameter(name));
+    }
+
+    /**
+     * 获取Integer参数
+     */
+    public static Integer getParameterToInt(String name, Integer defaultValue)
+    {
+        return Convert.toInt(getRequest().getParameter(name), defaultValue);
+    }
+
+    /**
+     * 获取Boolean参数
+     */
+    public static Boolean getParameterToBool(String name)
+    {
+        return Convert.toBool(getRequest().getParameter(name));
+    }
+
+    /**
+     * 获取Boolean参数
+     */
+    public static Boolean getParameterToBool(String name, Boolean defaultValue)
+    {
+        return Convert.toBool(getRequest().getParameter(name), defaultValue);
+    }
+
+    /**
+     * 获取request
+     */
+    public static HttpServletRequest getRequest()
+    {
+        try
+        {
+            return getRequestAttributes().getRequest();
+        }
+        catch (Exception e)
+        {
+            return null;
+        }
+    }
+
+    /**
+     * 获取response
+     */
+    public static HttpServletResponse getResponse()
+    {
+        try
+        {
+            return getRequestAttributes().getResponse();
+        }
+        catch (Exception e)
+        {
+            return null;
+        }
+    }
+
+    /**
+     * 获取session
+     */
+    public static HttpSession getSession()
+    {
+        return getRequest().getSession();
+    }
+
+    public static ServletRequestAttributes getRequestAttributes()
+    {
+        try
+        {
+            RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+            return (ServletRequestAttributes) attributes;
+        }
+        catch (Exception e)
+        {
+            return null;
+        }
+    }
+
+    public static String getHeader(HttpServletRequest request, String name)
+    {
+        String value = request.getHeader(name);
+        if (StringUtils.isEmpty(value))
+        {
+            return StringUtils.EMPTY;
+        }
+        return urlDecode(value);
+    }
+
+    public static Map<String, String> getHeaders(HttpServletRequest request)
+    {
+        Map<String, String> map = new LinkedHashMap<>();
+        Enumeration<String> enumeration = request.getHeaderNames();
+        if (enumeration != null)
+        {
+            while (enumeration.hasMoreElements())
+            {
+                String key = enumeration.nextElement();
+                String value = request.getHeader(key);
+                map.put(key, value);
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 将字符串渲染到客户端
+     * 
+     * @param response 渲染对象
+     * @param string 待渲染的字符串
+     */
+    public static void renderString(HttpServletResponse response, String string)
+    {
+        try
+        {
+            response.setStatus(200);
+            response.setContentType("application/json");
+            response.setCharacterEncoding("utf-8");
+            response.getWriter().print(string);
+        }
+        catch (IOException e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 是否是Ajax异步请求
+     * 
+     * @param request
+     */
+    public static boolean isAjaxRequest(HttpServletRequest request)
+    {
+        String accept = request.getHeader("accept");
+        if (accept != null && accept.contains("application/json"))
+        {
+            return true;
+        }
+
+        String xRequestedWith = request.getHeader("X-Requested-With");
+        if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest"))
+        {
+            return true;
+        }
+
+        String uri = request.getRequestURI();
+        if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml"))
+        {
+            return true;
+        }
+
+        String ajax = request.getParameter("__ajax");
+        return StringUtils.inStringIgnoreCase(ajax, "json", "xml");
+    }
+
+    /**
+     * 内容编码
+     * 
+     * @param str 内容
+     * @return 编码后的内容
+     */
+    public static String urlEncode(String str)
+    {
+        try
+        {
+            return URLEncoder.encode(str, Constants.UTF8);
+        }
+        catch (UnsupportedEncodingException e)
+        {
+            return StringUtils.EMPTY;
+        }
+    }
+
+    /**
+     * 内容解码
+     * 
+     * @param str 内容
+     * @return 解码后的内容
+     */
+    public static String urlDecode(String str)
+    {
+        try
+        {
+            return URLDecoder.decode(str, Constants.UTF8);
+        }
+        catch (UnsupportedEncodingException e)
+        {
+            return StringUtils.EMPTY;
+        }
+    }
+
+    /**
+     * 设置webflux模型响应
+     *
+     * @param response ServerHttpResponse
+     * @param value 响应内容
+     * @return Mono<Void>
+     */
+    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value)
+    {
+        return webFluxResponseWriter(response, HttpStatus.OK, value, 500);
+    }
+
+    /**
+     * 设置webflux模型响应
+     *
+     * @param response ServerHttpResponse
+     * @param code 响应状态码
+     * @param value 响应内容
+     * @return Mono<Void>
+     */
+    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value, int code)
+    {
+        return webFluxResponseWriter(response, HttpStatus.OK, value, code);
+    }
+
+    /**
+     * 设置webflux模型响应
+     *
+     * @param response ServerHttpResponse
+     * @param status http状态码
+     * @param code 响应状态码
+     * @param value 响应内容
+     * @return Mono<Void>
+     */
+    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, HttpStatus status, Object value, int code)
+    {
+        return webFluxResponseWriter(response, MediaType.APPLICATION_JSON_VALUE, status, value, code);
+    }
+
+    /**
+     * 设置webflux模型响应
+     *
+     * @param response ServerHttpResponse
+     * @param contentType content-type
+     * @param status http状态码
+     * @param code 响应状态码
+     * @param value 响应内容
+     * @return Mono<Void>
+     */
+    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code)
+    {
+        response.setStatusCode(status);
+        response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType);
+        ApiResult<Object> result = ApiResult.error("异常", value.toString());
+        DataBuffer dataBuffer = response.bufferFactory().wrap(JSONObject.toJSONString(result).getBytes());
+        return response.writeWith(Mono.just(dataBuffer));
+    }
+}

+ 1 - 1
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/util/SpringContextUtils.java → usky-common/usky-common-core/src/main/java/com/usky/common/core/util/SpringContextUtils.java

@@ -1,4 +1,4 @@
-package com.usky.common.spring.util;
+package com.usky.common.core.util;
 
 import org.springframework.aop.framework.AopContext;
 import org.springframework.beans.BeansException;

+ 1 - 1
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/util/SpringEnvUtils.java → usky-common/usky-common-core/src/main/java/com/usky/common/core/util/SpringEnvUtils.java

@@ -1,4 +1,4 @@
-package com.usky.common.spring.util;
+package com.usky.common.core.util;
 
 import java.util.Optional;
 

+ 28 - 0
usky-common/usky-common-core/src/main/java/com/usky/common/core/util/StringUtils.java

@@ -52,4 +52,32 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils {
         return sb.toString();
     }
 
+
+    /**
+     * 是否包含字符串
+     *
+     * @param str 验证字符串
+     * @param strs 字符串组
+     * @return 包含返回true
+     */
+    public static boolean inStringIgnoreCase(String str, String... strs)
+    {
+        if (str != null && strs != null)
+        {
+            for (String s : strs)
+            {
+                if (str.equalsIgnoreCase(trim(s)))
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    public static <T> T cast(Object obj)
+    {
+        return (T) obj;
+    }
+
 }

+ 29 - 0
usky-common/usky-common-log/pom.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>usky-common</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>usky-common-log</artifactId>
+
+
+    <dependencies>
+
+        <!-- RuoYi Api System -->
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-system-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>usky-common-security</artifactId>
+        </dependency>
+
+    </dependencies>
+</project>

+ 43 - 0
usky-common/usky-common-log/src/main/java/com/usky/common/log/annotation/Log.java

@@ -0,0 +1,43 @@
+package com.usky.common.log.annotation;
+
+import com.usky.common.log.enums.BusinessType;
+import com.usky.common.log.enums.OperatorType;
+
+import java.lang.annotation.*;
+
+/**
+ * 自定义操作日志记录注解
+ * 
+ * @author ruoyi
+ *
+ */
+@Target({ ElementType.PARAMETER, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Log
+{
+    /**
+     * 模块
+     */
+    public String title() default "";
+
+    /**
+     * 功能
+     */
+    public BusinessType businessType() default BusinessType.OTHER;
+
+    /**
+     * 操作人类别
+     */
+    public OperatorType operatorType() default OperatorType.MANAGE;
+
+    /**
+     * 是否保存请求的参数
+     */
+    public boolean isSaveRequestData() default true;
+
+    /**
+     * 是否保存响应的参数
+     */
+    public boolean isSaveResponseData() default true;
+}

+ 213 - 0
usky-common/usky-common-log/src/main/java/com/usky/common/log/aspect/LogAspect.java

@@ -0,0 +1,213 @@
+package com.usky.common.log.aspect;//package com.ruoyi.common.log.aspect;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Objects;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.fastjson.JSON;
+import com.usky.common.core.util.IpUtils;
+import com.usky.common.core.util.ServletUtils;
+import com.usky.common.core.util.StringUtils;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessStatus;
+import com.usky.common.log.service.AsyncLogService;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.system.domain.SysOperLogVO;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Aspect;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 操作日志记录处理
+ *
+ * @author ruoyi
+ */
+@Aspect
+@Component
+public class LogAspect
+{
+    private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
+
+    @Autowired
+    private AsyncLogService asyncLogService;
+
+    /**
+     * 处理完请求后执行
+     *
+     * @param joinPoint 切点
+     */
+    @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
+    public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult)
+    {
+        handleLog(joinPoint, controllerLog, null, jsonResult);
+    }
+
+    /**
+     * 拦截异常操作
+     *
+     * @param joinPoint 切点
+     * @param e 异常
+     */
+    @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
+    public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e)
+    {
+        handleLog(joinPoint, controllerLog, e, null);
+    }
+
+    protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult)
+    {
+        try
+        {
+            // *========数据库日志=========*//
+            SysOperLogVO operLog = new SysOperLogVO();
+            operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
+            // 请求的地址
+            String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
+            operLog.setOperIp(ip);
+            operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
+            String username = SecurityUtils.getUsername();
+            if (StringUtils.isNotBlank(username))
+            {
+                operLog.setOperName(username);
+            }
+
+            if (e != null)
+            {
+                operLog.setStatus(BusinessStatus.FAIL.ordinal());
+                operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
+            }
+            // 设置方法名称
+            String className = joinPoint.getTarget().getClass().getName();
+            String methodName = joinPoint.getSignature().getName();
+            operLog.setMethod(className + "." + methodName + "()");
+            // 设置请求方式
+            operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
+            // 处理设置注解上的参数
+            getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
+            // 保存数据库
+            asyncLogService.saveSysLog(operLog);
+        }
+        catch (Exception exp)
+        {
+            // 记录本地异常日志
+            log.error("==前置通知异常==");
+            log.error("异常信息:{}", exp.getMessage());
+            exp.printStackTrace();
+        }
+    }
+
+    /**
+     * 获取注解中对方法的描述信息 用于Controller层注解
+     *
+     * @param log 日志
+     * @param operLog 操作日志
+     * @throws Exception
+     */
+    public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLogVO operLog, Object jsonResult) throws Exception
+    {
+        // 设置action动作
+        operLog.setBusinessType(log.businessType().ordinal());
+        // 设置标题
+        operLog.setTitle(log.title());
+        // 设置操作人类别
+        operLog.setOperatorType(log.operatorType().ordinal());
+        // 是否需要保存request,参数和值
+        if (log.isSaveRequestData())
+        {
+            // 获取参数的信息,传入到数据库中。
+            setRequestValue(joinPoint, operLog);
+        }
+        // 是否需要保存response,参数和值
+        if (log.isSaveResponseData() && Objects.nonNull(jsonResult))
+        {
+            operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000));
+        }
+    }
+
+    /**
+     * 获取请求的参数,放到log中
+     *
+     * @param operLog 操作日志
+     * @throws Exception 异常
+     */
+    private void setRequestValue(JoinPoint joinPoint, SysOperLogVO operLog) throws Exception
+    {
+        String requestMethod = operLog.getRequestMethod();
+        if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))
+        {
+            String params = argsArrayToString(joinPoint.getArgs());
+            operLog.setOperParam(StringUtils.substring(params, 0, 2000));
+        }
+    }
+
+    /**
+     * 参数拼装
+     */
+    private String argsArrayToString(Object[] paramsArray)
+    {
+        String params = "";
+        if (paramsArray != null && paramsArray.length > 0)
+        {
+            for (Object o : paramsArray)
+            {
+                if (Objects.nonNull(o) && !isFilterObject(o))
+                {
+                    try
+                    {
+                        Object jsonObj = JSON.toJSON(o);
+                        params += jsonObj.toString() + " ";
+                    }
+                    catch (Exception e)
+                    {
+                    }
+                }
+            }
+        }
+        return params.trim();
+    }
+
+    /**
+     * 判断是否需要过滤的对象。
+     *
+     * @param o 对象信息。
+     * @return 如果是需要过滤的对象,则返回true;否则返回false
+     */
+    @SuppressWarnings("rawtypes")
+    public boolean isFilterObject(final Object o)
+    {
+        Class<?> clazz = o.getClass();
+        if (clazz.isArray())
+        {
+            return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
+        }
+        else if (Collection.class.isAssignableFrom(clazz))
+        {
+            Collection collection = (Collection) o;
+            for (Object value : collection)
+            {
+                return value instanceof MultipartFile;
+            }
+        }
+        else if (Map.class.isAssignableFrom(clazz))
+        {
+            Map map = (Map) o;
+            for (Object value : map.entrySet())
+            {
+                Map.Entry entry = (Map.Entry) value;
+                return entry.getValue() instanceof MultipartFile;
+            }
+        }
+        return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
+                || o instanceof BindingResult;
+    }
+}

+ 20 - 0
usky-common/usky-common-log/src/main/java/com/usky/common/log/enums/BusinessStatus.java

@@ -0,0 +1,20 @@
+package com.usky.common.log.enums;
+
+/**
+ * 操作状态
+ * 
+ * @author ruoyi
+ *
+ */
+public enum BusinessStatus
+{
+    /**
+     * 成功
+     */
+    SUCCESS,
+
+    /**
+     * 失败
+     */
+    FAIL,
+}

+ 59 - 0
usky-common/usky-common-log/src/main/java/com/usky/common/log/enums/BusinessType.java

@@ -0,0 +1,59 @@
+package com.usky.common.log.enums;
+
+/**
+ * 业务操作类型
+ * 
+ * @author ruoyi
+ */
+public enum BusinessType
+{
+    /**
+     * 其它
+     */
+    OTHER,
+
+    /**
+     * 新增
+     */
+    INSERT,
+
+    /**
+     * 修改
+     */
+    UPDATE,
+
+    /**
+     * 删除
+     */
+    DELETE,
+
+    /**
+     * 授权
+     */
+    GRANT,
+
+    /**
+     * 导出
+     */
+    EXPORT,
+
+    /**
+     * 导入
+     */
+    IMPORT,
+
+    /**
+     * 强退
+     */
+    FORCE,
+
+    /**
+     * 生成代码
+     */
+    GENCODE,
+
+    /**
+     * 清空数据
+     */
+    CLEAN,
+}

+ 24 - 0
usky-common/usky-common-log/src/main/java/com/usky/common/log/enums/OperatorType.java

@@ -0,0 +1,24 @@
+package com.usky.common.log.enums;
+
+/**
+ * 操作人类别
+ * 
+ * @author ruoyi
+ */
+public enum OperatorType
+{
+    /**
+     * 其它
+     */
+    OTHER,
+
+    /**
+     * 后台用户
+     */
+    MANAGE,
+
+    /**
+     * 手机端用户
+     */
+    MOBILE
+}

+ 29 - 0
usky-common/usky-common-log/src/main/java/com/usky/common/log/service/AsyncLogService.java

@@ -0,0 +1,29 @@
+package com.usky.common.log.service;//package com.ruoyi.common.log.service;
+
+import com.usky.system.RemoteLogService;
+import com.usky.system.domain.SysOperLogVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import sun.security.util.SecurityConstants;
+
+/**
+ * 异步调用日志服务
+ *
+ * @author ruoyi
+ */
+@Service
+public class AsyncLogService
+{
+    @Autowired
+    private RemoteLogService remoteLogService;
+
+    /**
+     * 保存系统日志记录
+     */
+    @Async
+    public void saveSysLog(SysOperLogVO sysOperLog)
+    {
+        remoteLogService.saveLog(sysOperLog);
+    }
+}

+ 14 - 0
usky-common/usky-common-log/src/main/java/com/usky/common/log/service/LogService.java

@@ -0,0 +1,14 @@
+package com.usky.common.log.service;
+
+import com.usky.system.domain.SysOperLogVO;
+
+/**
+ * 日志服务
+ * @author yq
+ * @date 2022/7/1 10:57
+ */
+public interface LogService {
+
+
+    void saveSysLog(SysOperLogVO sysOperLog);
+}

+ 0 - 52
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/convert/BaseEnumConverterFactory.java

@@ -1,52 +0,0 @@
-package com.usky.common.mvc.config.convert;
-
-
-import com.usky.common.core.enums.IEnum;
-import com.usky.common.core.util.StringUtils;
-import lombok.SneakyThrows;
-import org.springframework.core.convert.converter.Converter;
-import org.springframework.core.convert.converter.ConverterFactory;
-
-import java.lang.reflect.Method;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-public class BaseEnumConverterFactory implements ConverterFactory<String, IEnum> {
-
-    private static final Map<Class, Converter> converterMap = new WeakHashMap<>();
-
-    private static final String ENUM_CONVERT_METHOD_NAME = "parse";
-
-    @SneakyThrows
-    @Override
-    public <T extends IEnum> Converter<String, T> getConverter(Class<T> targetType) {
-
-        Converter result = converterMap.get(targetType);
-        if (result == null) {
-            result = new StringToIEumConverter<T>(targetType);
-            converterMap.put(targetType, result);
-        }
-        return result;
-    }
-
-    private static class StringToIEumConverter<T extends IEnum> implements Converter<String, T> {
-
-        private final Class<T> targerType;
-
-        public StringToIEumConverter(Class<T> targerType) {
-            this.targerType = targerType;
-        }
-
-        @SneakyThrows
-        @Override
-        public T convert(String source) {
-            if (StringUtils.isEmpty(source)) {
-                return null;
-            }
-            Method method = targerType.getDeclaredMethod(ENUM_CONVERT_METHOD_NAME, String.class);
-            Object o = method.invoke(null, source);
-            return (T) o;
-        }
-    }
-
-}

+ 0 - 18
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/convert/DateStringConvert.java

@@ -1,18 +0,0 @@
-package com.usky.common.mvc.config.convert;
-
-
-import com.usky.common.core.util.DateUtils;
-import org.springframework.core.convert.converter.Converter;
-
-import java.util.Date;
-
-/**
- * @author barry chen
- * @date 2020/11/19 4:13 下午
- */
-public class DateStringConvert implements Converter<Date, String> {
-    @Override
-    public String convert(Date source) {
-        return DateUtils.format(source);
-    }
-}

+ 0 - 30
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/convert/FormatterConfiguration.java

@@ -1,30 +0,0 @@
-package com.usky.common.mvc.config.convert;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.format.FormatterRegistry;
-import org.springframework.format.support.FormattingConversionService;
-import org.springframework.http.converter.ObjectToStringHttpMessageConverter;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-/**
- * @author chen
- */
-@Configuration
-public class FormatterConfiguration implements WebMvcConfigurer {
-
-    @Override
-    public void addFormatters(FormatterRegistry registry) {
-        registry.addConverterFactory(new BaseEnumConverterFactory());
-        registry.addConverter(new StringDateConverter());
-    }
-
-    @Bean
-    public ObjectToStringHttpMessageConverter objectToStringHttpMessageConverter() {
-        FormattingConversionService conversionService = new FormattingConversionService();
-        conversionService.addConverter(new StringDateConverter());
-        conversionService.addConverter(new DateStringConvert());
-        ObjectToStringHttpMessageConverter httpMessageconverter = new ObjectToStringHttpMessageConverter(conversionService);
-        return httpMessageconverter;
-    }
-}

+ 0 - 18
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/convert/StringDateConverter.java

@@ -1,18 +0,0 @@
-package com.usky.common.mvc.config.convert;
-
-
-import com.usky.common.core.util.DateUtils;
-import org.springframework.core.convert.converter.Converter;
-
-import java.util.Date;
-
-/**
- * @author barry chen
- * @date 2020/9/18 3:02 下午
- */
-public class StringDateConverter implements Converter<String, Date> {
-    @Override
-    public Date convert(String source) {
-        return DateUtils.parseDate(source);
-    }
-}

+ 0 - 22
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/multipartFile/CommonsMultipartResolverConfiguration.java

@@ -1,22 +0,0 @@
-package com.usky.common.mvc.config.multipartFile;
-
-import org.springframework.boot.autoconfigure.web.servlet.MultipartProperties;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.multipart.commons.CommonsMultipartResolver;
-
-@Configuration
-@EnableConfigurationProperties(MultipartProperties.class)
-public class CommonsMultipartResolverConfiguration {
-    @Bean
-    public CommonsMultipartResolver commonsMultipartResolver(MultipartProperties multipartProperties) {
-        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
-        resolver.setDefaultEncoding("UTF-8");
-        resolver.setResolveLazily(true);
-        resolver.setMaxInMemorySize(Long.valueOf(multipartProperties.getFileSizeThreshold().toBytes()).intValue());
-        resolver.setMaxUploadSize(Long.valueOf(multipartProperties.getMaxRequestSize().toBytes()).intValue());
-        resolver.setMaxUploadSizePerFile(Long.valueOf(multipartProperties.getMaxFileSize().toBytes()).intValue());
-        return resolver;
-    }
-}

+ 0 - 39
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/config/validator/ValidatorExtensionAutoConfiguration.java

@@ -1,39 +0,0 @@
-//package com.usky.common.mvc.config.validator;
-//
-//
-//
-//import org.hibernate.validator.HibernateValidator;
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
-//
-//import javax.validation.Validation;
-//import javax.validation.Validator;
-//import javax.validation.ValidatorFactory;
-//
-///**
-// * <p>Bean 验证器配置</p>
-// *
-// * @author chenpeng
-// * Create at May 30, 2019 at 15:36:05 GMT+8
-// */
-//@Configuration
-//public class ValidatorExtensionAutoConfiguration {
-//
-//    @Bean
-//    public MethodValidationPostProcessor methodValidationPostProcessor() {
-//        MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
-//        postProcessor.setValidator(validator());
-//        return postProcessor;
-//    }
-//
-//    @Bean
-//    public Validator validator() {
-//        ValidatorFactory validatorFactory = Validation
-//                .byProvider(HibernateValidator.class)
-//                .configure()
-//                .failFast(false)
-//                .buildValidatorFactory();
-//        return validatorFactory.getValidator();
-//    }
-//}

+ 0 - 31
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/utils/JdbcUtils.java

@@ -1,31 +0,0 @@
-package com.usky.common.mvc.utils;
-
-import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
-import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
-
-import java.util.List;
-
-/**
- * @author barry chen
- * @date 2020/12/10 4:41 下午
- */
-public final class JdbcUtils {
-    private JdbcUtils() {
-    }
-
-    /**
-     * 批量执行sql. 可用于insert/update/delete
-     *
-     * @param jdbctemplate
-     * @param sql
-     * @param entityList
-     * @return
-     */
-    public static int[] batchUpdate(NamedParameterJdbcTemplate jdbctemplate, String sql, List<?> entityList) {
-        BeanPropertySqlParameterSource[] notifyParamArray = new BeanPropertySqlParameterSource[entityList.size()];
-        for (int i = 0; i < entityList.size(); i++) {
-            notifyParamArray[i] = new BeanPropertySqlParameterSource(entityList.get(i));
-        }
-        return jdbctemplate.batchUpdate(sql, notifyParamArray);
-    }
-}

+ 0 - 120
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/utils/ServletUtils.java

@@ -1,120 +0,0 @@
-package com.usky.common.mvc.utils;
-
-import com.usky.common.core.util.Convert;
-import com.usky.common.core.util.StringUtils;
-import org.springframework.web.context.request.RequestAttributes;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import java.io.IOException;
-
-/**
- * 客户端工具类
- *
- * @author ruoyi
- */
-public class ServletUtils {
-    /**
-     * 获取String参数
-     */
-    public static String getParameter(String name) {
-        return getRequest().getParameter(name);
-    }
-
-    /**
-     * 获取String参数
-     */
-    public static String getParameter(String name, String defaultValue) {
-        return Convert.toStr(getRequest().getParameter(name), defaultValue);
-    }
-
-    /**
-     * 获取Integer参数
-     */
-    public static Integer getParameterToInt(String name) {
-        return Convert.toInt(getRequest().getParameter(name));
-    }
-
-    /**
-     * 获取Integer参数
-     */
-    public static Integer getParameterToInt(String name, Integer defaultValue) {
-        return Convert.toInt(getRequest().getParameter(name), defaultValue);
-    }
-
-    /**
-     * 获取request
-     */
-    public static HttpServletRequest getRequest() {
-        return getRequestAttributes().getRequest();
-    }
-
-    /**
-     * 获取response
-     */
-    public static HttpServletResponse getResponse() {
-        return getRequestAttributes().getResponse();
-    }
-
-    /**
-     * 获取session
-     */
-    public static HttpSession getSession() {
-        return getRequest().getSession();
-    }
-
-    public static ServletRequestAttributes getRequestAttributes() {
-        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
-        return (ServletRequestAttributes) attributes;
-    }
-
-    /**
-     * 将字符串渲染到客户端
-     *
-     * @param response 渲染对象
-     * @param string   待渲染的字符串
-     * @return null
-     */
-    public static String renderString(HttpServletResponse response, String string) {
-        try {
-            response.setStatus(200);
-            response.setContentType("application/json");
-            response.setCharacterEncoding("utf-8");
-            response.getWriter().print(string);
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    /**
-     * 是否是Ajax异步请求
-     *
-     * @param request
-     */
-    public static boolean isAjaxRequest(HttpServletRequest request) {
-        String accept = request.getHeader("accept");
-        if (accept != null && accept.indexOf("application/json") != -1) {
-            return true;
-        }
-
-        String xRequestedWith = request.getHeader("X-Requested-With");
-        if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) {
-            return true;
-        }
-
-        String uri = request.getRequestURI();
-        if (StringUtils.equalsAnyIgnoreCase(uri, ".json", ".xml")) {
-            return true;
-        }
-
-        String ajax = request.getParameter("__ajax");
-        if (StringUtils.equalsAnyIgnoreCase(ajax, "json", "xml")) {
-            return true;
-        }
-        return false;
-    }
-}

+ 5 - 16
usky-common/usky-common-mvc/pom.xml → usky-common/usky-common-mybatis/pom.xml

@@ -9,20 +9,11 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>usky-common-mvc</artifactId>
+    <artifactId>usky-common-mybatis</artifactId>
+
 
 
     <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-logging</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
 
         <dependency>
             <groupId>com.baomidou</groupId>
@@ -30,15 +21,13 @@
         </dependency>
 
         <dependency>
-            <groupId>com.usky</groupId>
-            <artifactId>usky-common-core</artifactId>
-            <version>${parent.version}</version>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
         </dependency>
 
-
         <dependency>
             <groupId>com.usky</groupId>
-            <artifactId>usky-common-spring</artifactId>
+            <artifactId>usky-common-core</artifactId>
             <version>${parent.version}</version>
         </dependency>
     </dependencies>

+ 1 - 2
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/base/AbstractCrudService.java → usky-common/usky-common-mybatis/src/main/java/com/usky/common/mybatis/core/AbstractCrudService.java

@@ -1,4 +1,4 @@
-package com.usky.common.mvc.base;
+package com.usky.common.mybatis.core;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.bean.UnifiedUser;
 
-
 import java.util.Date;
 import java.util.Optional;
 

+ 1 - 1
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/base/BaseModel.java → usky-common/usky-common-mybatis/src/main/java/com/usky/common/mybatis/core/BaseModel.java

@@ -1,4 +1,4 @@
-package com.usky.common.mvc.base;
+package com.usky.common.mybatis.core;
 
 import lombok.Data;
 

+ 1 - 1
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/base/CrudMapper.java → usky-common/usky-common-mybatis/src/main/java/com/usky/common/mybatis/core/CrudMapper.java

@@ -1,4 +1,4 @@
-package com.usky.common.mvc.base;
+package com.usky.common.mybatis.core;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 

+ 1 - 1
usky-common/usky-common-mvc/src/main/java/com/usky/common/mvc/base/CrudService.java → usky-common/usky-common-mybatis/src/main/java/com/usky/common/mybatis/core/CrudService.java

@@ -1,4 +1,4 @@
-package com.usky.common.mvc.base;
+package com.usky.common.mybatis.core;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;

+ 8 - 0
usky-common/usky-common-mybatis/src/main/java/com/usky/common/mybatis/test.java

@@ -0,0 +1,8 @@
+package com.usky.common.mybatis;
+
+/**
+ * @author yq
+ * @date 2022/7/1 13:01
+ */
+public class test {
+}

+ 32 - 0
usky-common/usky-common-redis/pom.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>usky-common</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>usky-common-redis</artifactId>
+    <dependencies>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>usky-common-core</artifactId>
+            <version>${parent.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.ehcache</groupId>
+            <artifactId>ehcache</artifactId>
+            <version>2.10.5</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 1 - 1
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/redis/EhCacheCacheConfiguration.java → usky-common/usky-common-redis/src/main/java/com/usky/common/redis/config/EhCacheCacheConfiguration.java

@@ -1,4 +1,4 @@
-package com.usky.common.spring.config.redis;
+package com.usky.common.redis.config;
 
 import org.springframework.boot.autoconfigure.cache.CacheProperties;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

+ 4 - 1
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/redis/RedisExtensionAutoConfiguration.java → usky-common/usky-common-redis/src/main/java/com/usky/common/redis/config/RedisExtensionAutoConfiguration.java

@@ -1,8 +1,11 @@
-package com.usky.common.spring.config.redis;
+package com.usky.common.redis.config;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.usky.common.redis.core.RedisHelper;
+import com.usky.common.redis.core.RedisObjectMapper;
+import com.usky.common.redis.core.RedisOverdueTimeProperties;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.cache.CacheProperties;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

+ 2 - 2
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/redis/RedisHelper.java → usky-common/usky-common-redis/src/main/java/com/usky/common/redis/core/RedisHelper.java

@@ -1,4 +1,4 @@
-package com.usky.common.spring.config.redis;
+package com.usky.common.redis.core;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -25,7 +25,7 @@ public final class RedisHelper {
 
     private RedisTemplate<String, Object> redisTemplate;
 
-    RedisHelper(RedisTemplate<String, Object> redisTemplate) {
+    public RedisHelper(RedisTemplate<String, Object> redisTemplate) {
         this.redisTemplate = redisTemplate;
     }
 

+ 1 - 1
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/redis/RedisObjectMapper.java → usky-common/usky-common-redis/src/main/java/com/usky/common/redis/core/RedisObjectMapper.java

@@ -1,4 +1,4 @@
-package com.usky.common.spring.config.redis;
+package com.usky.common.redis.core;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;

+ 1 - 1
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/redis/RedisOverdueTimeProperties.java → usky-common/usky-common-redis/src/main/java/com/usky/common/redis/core/RedisOverdueTimeProperties.java

@@ -1,4 +1,4 @@
-package com.usky.common.spring.config.redis;
+package com.usky.common.redis.core;
 
 import com.google.common.collect.Maps;
 import org.springframework.boot.context.properties.ConfigurationProperties;

+ 42 - 0
usky-common/usky-common-security/pom.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>usky-common</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>usky-common-security</artifactId>
+
+
+    <dependencies>
+
+        <!-- Spring Web -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+        </dependency>
+
+        <!-- RuoYi Api System -->
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-system-api</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common Redis-->
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>usky-common-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>usky-common-redis</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 28 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/EnableRyFeignClients.java

@@ -0,0 +1,28 @@
+package com.usky.common.security.annotation;
+
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+import java.lang.annotation.*;
+
+/**
+ * 自定义feign注解
+ * 添加basePackages路径
+ * 
+ * @author ruoyi
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@EnableFeignClients
+public @interface EnableRyFeignClients
+{
+    String[] value() default {};
+
+    String[] basePackages() default { "com.ruoyi" };
+
+    Class<?>[] basePackageClasses() default {};
+
+    Class<?>[] defaultConfiguration() default {};
+
+    Class<?>[] clients() default {};
+}

+ 19 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/InnerAuth.java

@@ -0,0 +1,19 @@
+package com.usky.common.security.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 内部认证注解
+ * 
+ * @author ruoyi
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface InnerAuth
+{
+    /**
+     * 是否校验用户信息
+     */
+    boolean isUser() default false;
+}

+ 20 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/Logical.java

@@ -0,0 +1,20 @@
+package com.usky.common.security.annotation;
+
+/**
+ * 权限注解的验证模式
+ * 
+ * @author ruoyi
+ *
+ */
+public enum Logical
+{
+    /**
+     * 必须具有所有的元素
+     */
+    AND,
+
+    /**
+     * 只需具有其中一个元素
+     */
+    OR
+}

+ 18 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/RequiresLogin.java

@@ -0,0 +1,18 @@
+package com.usky.common.security.annotation;
+
+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({ ElementType.METHOD, ElementType.TYPE })
+public @interface RequiresLogin
+{
+}

+ 27 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/RequiresPermissions.java

@@ -0,0 +1,27 @@
+package com.usky.common.security.annotation;
+
+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({ ElementType.METHOD, ElementType.TYPE })
+public @interface RequiresPermissions
+{
+    /**
+     * 需要校验的权限码
+     */
+    String[] value() default {};
+
+    /**
+     * 验证模式:AND | OR,默认AND
+     */
+    Logical logical() default Logical.AND;
+}

+ 26 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/annotation/RequiresRoles.java

@@ -0,0 +1,26 @@
+package com.usky.common.security.annotation;
+
+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({ ElementType.METHOD, ElementType.TYPE })
+public @interface RequiresRoles
+{
+    /**
+     * 需要校验的角色标识
+     */
+    String[] value() default {};
+
+    /**
+     * 验证逻辑:AND | OR,默认AND
+     */
+    Logical logical() default Logical.AND;
+}

+ 52 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/aspect/InnerAuthAspect.java

@@ -0,0 +1,52 @@
+package com.usky.common.security.aspect;
+
+
+import com.usky.common.core.constants.SecurityConstants;
+import com.usky.common.core.util.ServletUtils;
+import com.usky.common.core.util.StringUtils;
+import com.usky.common.security.annotation.InnerAuth;
+import com.usky.common.security.exception.InnerAuthException;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.core.Ordered;
+import org.springframework.stereotype.Component;
+
+/**
+ * 内部服务调用验证处理
+ * 
+ * @author ruoyi
+ */
+@Aspect
+@Component
+public class InnerAuthAspect implements Ordered
+{
+    @Around("@annotation(innerAuth)")
+    public Object innerAround(ProceedingJoinPoint point, InnerAuth innerAuth) throws Throwable
+    {
+        String source = ServletUtils.getRequest().getHeader(SecurityConstants.FROM_SOURCE);
+        // 内部请求验证
+        if (!StringUtils.equals(SecurityConstants.INNER, source))
+        {
+            throw new InnerAuthException("没有内部访问权限,不允许访问");
+        }
+
+        String userid = ServletUtils.getRequest().getHeader(SecurityConstants.DETAILS_USER_ID);
+        String username = ServletUtils.getRequest().getHeader(SecurityConstants.DETAILS_USERNAME);
+        // 用户信息验证
+        if (innerAuth.isUser() && (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)))
+        {
+            throw new InnerAuthException("没有设置用户信息,不允许访问 ");
+        }
+        return point.proceed();
+    }
+
+    /**
+     * 确保在权限认证aop执行前执行
+     */
+    @Override
+    public int getOrder()
+    {
+        return Ordered.HIGHEST_PRECEDENCE + 1;
+    }
+}

+ 99 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/aspect/PreAuthorizeAspect.java

@@ -0,0 +1,99 @@
+package com.usky.common.security.aspect;
+
+
+import com.usky.common.security.annotation.RequiresLogin;
+import com.usky.common.security.annotation.RequiresPermissions;
+import com.usky.common.security.annotation.RequiresRoles;
+import com.usky.common.security.auth.AuthUtil;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+
+/**
+ * 基于 Spring Aop 的注解鉴权
+ * 
+ * @author kong
+ */
+@Aspect
+@Component
+public class PreAuthorizeAspect
+{
+    /**
+     * 构建
+     */
+    public PreAuthorizeAspect()
+    {
+    }
+
+    /**
+     * 定义AOP签名 (切入所有使用鉴权注解的方法)
+     */
+    public static final String POINTCUT_SIGN = " @annotation(com.usky.common.security.annotation.RequiresLogin) || "
+            + "@annotation(com.usky.common.security.annotation.RequiresPermissions) || "
+            + "@annotation(com.usky.common.security.annotation.RequiresRoles)";
+
+    /**
+     * 声明AOP签名
+     */
+    @Pointcut(POINTCUT_SIGN)
+    public void pointcut()
+    {
+    }
+
+    /**
+     * 环绕切入
+     * 
+     * @param joinPoint 切面对象
+     * @return 底层方法执行后的返回值
+     * @throws Throwable 底层方法抛出的异常
+     */
+    @Around("pointcut()")
+    public Object around(ProceedingJoinPoint joinPoint) throws Throwable
+    {
+        // 注解鉴权
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        checkMethodAnnotation(signature.getMethod());
+        try
+        {
+            // 执行原有逻辑
+            Object obj = joinPoint.proceed();
+            return obj;
+        }
+        catch (Throwable e)
+        {
+            throw e;
+        }
+    }
+
+    /**
+     * 对一个Method对象进行注解检查
+     */
+    public void checkMethodAnnotation(Method method)
+    {
+        // 校验 @RequiresLogin 注解
+        RequiresLogin requiresLogin = method.getAnnotation(RequiresLogin.class);
+        if (requiresLogin != null)
+        {
+            AuthUtil.checkLogin();
+        }
+
+        // 校验 @RequiresRoles 注解
+        RequiresRoles requiresRoles = method.getAnnotation(RequiresRoles.class);
+        if (requiresRoles != null)
+        {
+            AuthUtil.checkRole(requiresRoles);
+        }
+
+        // 校验 @RequiresPermissions 注解
+        RequiresPermissions requiresPermissions = method.getAnnotation(RequiresPermissions.class);
+        if (requiresPermissions != null)
+        {
+            AuthUtil.checkPermi(requiresPermissions);
+        }
+    }
+}

+ 372 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/auth/AuthLogic.java

@@ -0,0 +1,372 @@
+package com.usky.common.security.auth;
+
+import com.usky.common.core.util.SpringContextUtils;
+import com.usky.common.security.annotation.Logical;
+import com.usky.common.security.annotation.RequiresLogin;
+import com.usky.common.security.annotation.RequiresPermissions;
+import com.usky.common.security.annotation.RequiresRoles;
+import com.usky.common.security.exception.NotLoginException;
+import com.usky.common.security.exception.NotPermissionException;
+import com.usky.common.security.exception.NotRoleException;
+import com.usky.common.security.service.TokenService;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.system.model.LoginUser;
+import org.springframework.util.PatternMatchUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Token 权限验证,逻辑实现类
+ * 
+ * @author ruoyi
+ */
+public class AuthLogic
+{
+    /** 所有权限标识 */
+    private static final String ALL_PERMISSION = "*:*:*";
+
+    /** 管理员角色权限标识 */
+    private static final String SUPER_ADMIN = "admin";
+
+    public TokenService tokenService = SpringContextUtils.getBean(TokenService.class);
+
+    /**
+     * 会话注销
+     */
+    public void logout()
+    {
+        String token = SecurityUtils.getToken();
+        if (token == null)
+        {
+            return;
+        }
+        logoutByToken(token);
+    }
+
+    /**
+     * 会话注销,根据指定Token
+     */
+    public void logoutByToken(String token)
+    {
+        tokenService.delLoginUser(token);
+    }
+
+    /**
+     * 检验用户是否已经登录,如未登录,则抛出异常
+     */
+    public void checkLogin()
+    {
+        getLoginUser();
+    }
+
+    /**
+     * 获取当前用户缓存信息, 如果未登录,则抛出异常
+     * 
+     * @return 用户缓存信息
+     */
+    public LoginUser getLoginUser()
+    {
+        String token = SecurityUtils.getToken();
+        if (token == null)
+        {
+            throw new NotLoginException("未提供token");
+        }
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if (loginUser == null)
+        {
+            throw new NotLoginException("无效的token");
+        }
+        return loginUser;
+    }
+
+    /**
+     * 获取当前用户缓存信息, 如果未登录,则抛出异常
+     * 
+     * @param token 前端传递的认证信息
+     * @return 用户缓存信息
+     */
+    public LoginUser getLoginUser(String token)
+    {
+        return tokenService.getLoginUser(token);
+    }
+
+    /**
+     * 验证当前用户有效期, 如果相差不足120分钟,自动刷新缓存
+     * 
+     * @param loginUser 当前用户信息
+     */
+    public void verifyLoginUserExpire(LoginUser loginUser)
+    {
+        tokenService.verifyToken(loginUser);
+    }
+
+    /**
+     * 验证用户是否具备某权限
+     * 
+     * @param permission 权限字符串
+     * @return 用户是否具备某权限
+     */
+    public boolean hasPermi(String permission)
+    {
+        return hasPermi(getPermiList(), permission);
+    }
+
+    /**
+     * 验证用户是否具备某权限, 如果验证未通过,则抛出异常: NotPermissionException
+     * 
+     * @param permission 权限字符串
+     * @return 用户是否具备某权限
+     */
+    public void checkPermi(String permission)
+    {
+        if (!hasPermi(getPermiList(), permission))
+        {
+            throw new NotPermissionException(permission);
+        }
+    }
+
+    /**
+     * 根据注解(@RequiresPermissions)鉴权, 如果验证未通过,则抛出异常: NotPermissionException
+     * 
+     * @param requiresPermissions 注解对象
+     */
+    public void checkPermi(RequiresPermissions requiresPermissions)
+    {
+        if (requiresPermissions.logical() == Logical.AND)
+        {
+            checkPermiAnd(requiresPermissions.value());
+        }
+        else
+        {
+            checkPermiOr(requiresPermissions.value());
+        }
+    }
+
+    /**
+     * 验证用户是否含有指定权限,必须全部拥有
+     *
+     * @param permissions 权限列表
+     */
+    public void checkPermiAnd(String... permissions)
+    {
+        Set<String> permissionList = getPermiList();
+        for (String permission : permissions)
+        {
+            if (!hasPermi(permissionList, permission))
+            {
+                throw new NotPermissionException(permission);
+            }
+        }
+    }
+
+    /**
+     * 验证用户是否含有指定权限,只需包含其中一个
+     * 
+     * @param permissions 权限码数组
+     */
+    public void checkPermiOr(String... permissions)
+    {
+        Set<String> permissionList = getPermiList();
+        for (String permission : permissions)
+        {
+            if (hasPermi(permissionList, permission))
+            {
+                return;
+            }
+        }
+        if (permissions.length > 0)
+        {
+            throw new NotPermissionException(permissions);
+        }
+    }
+
+    /**
+     * 判断用户是否拥有某个角色
+     * 
+     * @param role 角色标识
+     * @return 用户是否具备某角色
+     */
+    public boolean hasRole(String role)
+    {
+        return hasRole(getRoleList(), role);
+    }
+
+    /**
+     * 判断用户是否拥有某个角色, 如果验证未通过,则抛出异常: NotRoleException
+     * 
+     * @param role 角色标识
+     */
+    public void checkRole(String role)
+    {
+        if (!hasRole(role))
+        {
+            throw new NotRoleException(role);
+        }
+    }
+
+    /**
+     * 根据注解(@RequiresRoles)鉴权
+     * 
+     * @param requiresRoles 注解对象
+     */
+    public void checkRole(RequiresRoles requiresRoles)
+    {
+        if (requiresRoles.logical() == Logical.AND)
+        {
+            checkRoleAnd(requiresRoles.value());
+        }
+        else
+        {
+            checkRoleOr(requiresRoles.value());
+        }
+    }
+
+    /**
+     * 验证用户是否含有指定角色,必须全部拥有
+     * 
+     * @param roles 角色标识数组
+     */
+    public void checkRoleAnd(String... roles)
+    {
+        Set<String> roleList = getRoleList();
+        for (String role : roles)
+        {
+            if (!hasRole(roleList, role))
+            {
+                throw new NotRoleException(role);
+            }
+        }
+    }
+
+    /**
+     * 验证用户是否含有指定角色,只需包含其中一个
+     * 
+     * @param roles 角色标识数组
+     */
+    public void checkRoleOr(String... roles)
+    {
+        Set<String> roleList = getRoleList();
+        for (String role : roles)
+        {
+            if (hasRole(roleList, role))
+            {
+                return;
+            }
+        }
+        if (roles.length > 0)
+        {
+            throw new NotRoleException(roles);
+        }
+    }
+
+    /**
+     * 根据注解(@RequiresLogin)鉴权
+     * 
+     * @param at 注解对象
+     */
+    public void checkByAnnotation(RequiresLogin at)
+    {
+        this.checkLogin();
+    }
+
+    /**
+     * 根据注解(@RequiresRoles)鉴权
+     * 
+     * @param at 注解对象
+     */
+    public void checkByAnnotation(RequiresRoles at)
+    {
+        String[] roleArray = at.value();
+        if (at.logical() == Logical.AND)
+        {
+            this.checkRoleAnd(roleArray);
+        }
+        else
+        {
+            this.checkRoleOr(roleArray);
+        }
+    }
+
+    /**
+     * 根据注解(@RequiresPermissions)鉴权
+     * 
+     * @param at 注解对象
+     */
+    public void checkByAnnotation(RequiresPermissions at)
+    {
+        String[] permissionArray = at.value();
+        if (at.logical() == Logical.AND)
+        {
+            this.checkPermiAnd(permissionArray);
+        }
+        else
+        {
+            this.checkPermiOr(permissionArray);
+        }
+    }
+
+    /**
+     * 获取当前账号的角色列表
+     * 
+     * @return 角色列表
+     */
+    public Set<String> getRoleList()
+    {
+        try
+        {
+            LoginUser loginUser = getLoginUser();
+            return loginUser.getRoles();
+        }
+        catch (Exception e)
+        {
+            return new HashSet<>();
+        }
+    }
+
+    /**
+     * 获取当前账号的权限列表
+     * 
+     * @return 权限列表
+     */
+    public Set<String> getPermiList()
+    {
+        try
+        {
+            LoginUser loginUser = getLoginUser();
+            return loginUser.getPermissions();
+        }
+        catch (Exception e)
+        {
+            return new HashSet<>();
+        }
+    }
+
+    /**
+     * 判断是否包含权限
+     * 
+     * @param authorities 权限列表
+     * @param permission 权限字符串
+     * @return 用户是否具备某权限
+     */
+    public boolean hasPermi(Collection<String> authorities, String permission)
+    {
+        return authorities.stream().filter(StringUtils::hasText)
+                .anyMatch(x -> ALL_PERMISSION.contains(x) || PatternMatchUtils.simpleMatch(x, permission));
+    }
+
+    /**
+     * 判断是否包含角色
+     * 
+     * @param roles 角色列表
+     * @param role 角色
+     * @return 用户是否具备某角色权限
+     */
+    public boolean hasRole(Collection<String> roles, String role)
+    {
+        return roles.stream().filter(StringUtils::hasText)
+                .anyMatch(x -> SUPER_ADMIN.contains(x) || PatternMatchUtils.simpleMatch(x, role));
+    }
+}

+ 162 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/auth/AuthUtil.java

@@ -0,0 +1,162 @@
+package com.usky.common.security.auth;
+
+import com.usky.common.security.annotation.RequiresPermissions;
+import com.usky.common.security.annotation.RequiresRoles;
+import com.usky.system.model.LoginUser;
+
+/**
+ * Token 权限验证工具类
+ * 
+ * @author ruoyi
+ */
+public class AuthUtil
+{
+    /**
+     * 底层的 AuthLogic 对象
+     */
+    public static AuthLogic authLogic = new AuthLogic();
+
+    /**
+     * 会话注销
+     */
+    public static void logout()
+    {
+        authLogic.logout();
+    }
+
+    /**
+     * 会话注销,根据指定Token
+     * 
+     * @param tokenValue 指定token
+     */
+    public static void logoutByToken(String token)
+    {
+        authLogic.logoutByToken(token);
+    }
+
+    /**
+     * 检验当前会话是否已经登录,如未登录,则抛出异常
+     */
+    public static void checkLogin()
+    {
+        authLogic.checkLogin();
+    }
+
+    /**
+     * 获取当前登录用户信息
+     */
+    public static LoginUser getLoginUser(String token)
+    {
+        return authLogic.getLoginUser(token);
+    }
+
+    /**
+     * 验证当前用户有效期
+     */
+    public static void verifyLoginUserExpire(LoginUser loginUser)
+    {
+        authLogic.verifyLoginUserExpire(loginUser);
+    }
+
+    /**
+     * 当前账号是否含有指定角色标识, 返回truefalse
+     * 
+     * @param role 角色标识
+     * @return 是否含有指定角色标识
+     */
+    public static boolean hasRole(String role)
+    {
+        return authLogic.hasRole(role);
+    }
+
+    /**
+     * 当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
+     * 
+     * @param role 角色标识
+     */
+    public static void checkRole(String role)
+    {
+        authLogic.checkRole(role);
+    }
+
+    /**
+     * 根据注解传入参数鉴权, 如果验证未通过,则抛出异常: NotRoleException
+     * 
+     * @param requiresRoles 角色权限注解
+     */
+    public static void checkRole(RequiresRoles requiresRoles)
+    {
+        authLogic.checkRole(requiresRoles);
+    }
+
+    /**
+     * 当前账号是否含有指定角色标识 [指定多个,必须全部验证通过]
+     * 
+     * @param roles 角色标识数组
+     */
+    public static void checkRoleAnd(String... roles)
+    {
+        authLogic.checkRoleAnd(roles);
+    }
+
+    /**
+     * 当前账号是否含有指定角色标识 [指定多个,只要其一验证通过即可]
+     * 
+     * @param roles 角色标识数组
+     */
+    public static void checkRoleOr(String... roles)
+    {
+        authLogic.checkRoleOr(roles);
+    }
+
+    /**
+     * 当前账号是否含有指定权限, 返回truefalse
+     * 
+     * @param permission 权限码
+     * @return 是否含有指定权限
+     */
+    public static boolean hasPermi(String permission)
+    {
+        return authLogic.hasPermi(permission);
+    }
+
+    /**
+     * 当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
+     * 
+     * @param permission 权限码
+     */
+    public static void checkPermi(String permission)
+    {
+        authLogic.checkPermi(permission);
+    }
+
+    /**
+     * 根据注解传入参数鉴权, 如果验证未通过,则抛出异常: NotPermissionException
+     * 
+     * @param requiresPermissions 权限注解
+     */
+    public static void checkPermi(RequiresPermissions requiresPermissions)
+    {
+        authLogic.checkPermi(requiresPermissions);
+    }
+
+    /**
+     * 当前账号是否含有指定权限 [指定多个,必须全部验证通过]
+     * 
+     * @param permissions 权限码数组
+     */
+    public static void checkPermiAnd(String... permissions)
+    {
+        authLogic.checkPermiAnd(permissions);
+    }
+
+    /**
+     * 当前账号是否含有指定权限 [指定多个,只要其一验证通过即可]
+     * 
+     * @param permissions 权限码数组
+     */
+    public static void checkPermiOr(String... permissions)
+    {
+        authLogic.checkPermiOr(permissions);
+    }
+}

+ 23 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/config/ApplicationConfig.java

@@ -0,0 +1,23 @@
+package com.usky.common.security.config;
+
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+
+import java.util.TimeZone;
+
+/**
+ * 系统配置
+ *
+ * @author ruoyi
+ */
+public class ApplicationConfig
+{
+    /**
+     * 时区配置
+     */
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization()
+    {
+        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
+    }
+}

+ 35 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/config/WebMvcConfig.java

@@ -0,0 +1,35 @@
+package com.usky.common.security.config;
+
+import com.usky.common.security.interceptor.HeaderInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * 拦截器配置
+ *
+ * @author ruoyi
+ */
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer
+{
+    /** 不需要拦截地址 */
+    public static final String[] excludeUrls = { "/login", "/logout", "/refresh" };
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry)
+    {
+        registry.addInterceptor(getHeaderInterceptor())
+                .addPathPatterns("/**")
+                .excludePathPatterns(excludeUrls)
+                .order(-10);
+    }
+
+    /**
+     * 自定义请求头拦截器
+     */
+    public HeaderInterceptor getHeaderInterceptor()
+    {
+        return new HeaderInterceptor();
+    }
+}

+ 16 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/exception/InnerAuthException.java

@@ -0,0 +1,16 @@
+package com.usky.common.security.exception;
+
+/**
+ * 内部认证异常
+ * 
+ * @author ruoyi
+ */
+public class InnerAuthException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public InnerAuthException(String message)
+    {
+        super(message);
+    }
+}

+ 16 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/exception/NotLoginException.java

@@ -0,0 +1,16 @@
+package com.usky.common.security.exception;
+
+/**
+ * 未能通过的登录认证异常
+ * 
+ * @author ruoyi
+ */
+public class NotLoginException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public NotLoginException(String message)
+    {
+        super(message);
+    }
+}

+ 23 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/exception/NotPermissionException.java

@@ -0,0 +1,23 @@
+package com.usky.common.security.exception;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 未能通过的权限认证异常
+ * 
+ * @author ruoyi
+ */
+public class NotPermissionException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public NotPermissionException(String permission)
+    {
+        super(permission);
+    }
+
+    public NotPermissionException(String[] permissions)
+    {
+        super(StringUtils.join(permissions, ","));
+    }
+}

+ 23 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/exception/NotRoleException.java

@@ -0,0 +1,23 @@
+package com.usky.common.security.exception;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 未能通过的角色认证异常
+ * 
+ * @author ruoyi
+ */
+public class NotRoleException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public NotRoleException(String role)
+    {
+        super(role);
+    }
+
+    public NotRoleException(String[] roles)
+    {
+        super(StringUtils.join(roles, ","));
+    }
+}

+ 20 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/feign/FeignAutoConfiguration.java

@@ -0,0 +1,20 @@
+package com.usky.common.security.feign;
+
+import feign.RequestInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Feign 配置注册
+ *
+ * @author ruoyi
+ **/
+@Configuration
+public class FeignAutoConfiguration
+{
+    @Bean
+    public RequestInterceptor requestInterceptor()
+    {
+        return new FeignRequestInterceptor();
+    }
+}

+ 52 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/feign/FeignRequestInterceptor.java

@@ -0,0 +1,52 @@
+package com.usky.common.security.feign;
+
+
+import com.usky.common.core.constants.SecurityConstants;
+import com.usky.common.core.util.IpUtils;
+import com.usky.common.core.util.ServletUtils;
+import com.usky.common.core.util.StringUtils;
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * feign 请求拦截器
+ * 
+ * @author ruoyi
+ */
+@Component
+public class FeignRequestInterceptor implements RequestInterceptor
+{
+    @Override
+    public void apply(RequestTemplate requestTemplate)
+    {
+        HttpServletRequest httpServletRequest = ServletUtils.getRequest();
+        if (Objects.nonNull(httpServletRequest))
+        {
+            Map<String, String> headers = ServletUtils.getHeaders(httpServletRequest);
+            // 传递用户信息请求头,防止丢失
+            String userId = headers.get(SecurityConstants.DETAILS_USER_ID);
+            if (StringUtils.isNotEmpty(userId))
+            {
+                requestTemplate.header(SecurityConstants.DETAILS_USER_ID, userId);
+            }
+            String userName = headers.get(SecurityConstants.DETAILS_USERNAME);
+            if (StringUtils.isNotEmpty(userName))
+            {
+                requestTemplate.header(SecurityConstants.DETAILS_USERNAME, userName);
+            }
+            String authentication = headers.get(SecurityConstants.AUTHORIZATION_HEADER);
+            if (StringUtils.isNotEmpty(authentication))
+            {
+                requestTemplate.header(SecurityConstants.AUTHORIZATION_HEADER, authentication);
+            }
+
+            // 配置客户端IP
+            requestTemplate.header("X-Forwarded-For", IpUtils.getIpAddr(ServletUtils.getRequest()));
+        }
+    }
+}

+ 72 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/interceptor/HeaderInterceptor.java

@@ -0,0 +1,72 @@
+package com.usky.common.security.interceptor;
+
+import com.usky.common.core.constants.SecurityConstants;
+import com.usky.common.core.context.SecurityContextHolder;
+import com.usky.common.core.util.JwtUtils;
+import com.usky.common.core.util.ServletUtils;
+import com.usky.common.core.util.StringUtils;
+import com.usky.common.security.auth.AuthUtil;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.system.model.LoginUser;
+import io.jsonwebtoken.Claims;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.AsyncHandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Objects;
+
+/**
+ * 自定义请求头拦截器,将Header数据封装到线程变量中方便获取
+ * 注意:此拦截器会同时验证当前用户有效期自动刷新有效期
+ *
+ * @author ruoyi
+ */
+public class HeaderInterceptor implements AsyncHandlerInterceptor
+{
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
+    {
+        if (!(handler instanceof HandlerMethod))
+        {
+            return true;
+        }
+
+        SecurityContextHolder.setUserId(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USER_ID));
+        SecurityContextHolder.setUserName(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USERNAME));
+        SecurityContextHolder.setUserKey(ServletUtils.getHeader(request, SecurityConstants.USER_KEY));
+        SecurityContextHolder.setTenantId(ServletUtils.getHeader(request, SecurityConstants.DETAILS_TENANT_ID));
+
+        String token = SecurityUtils.getToken();
+        if (StringUtils.isNotEmpty(token))
+        {
+            Claims claims = JwtUtils.parseToken(token);
+            String userKey = JwtUtils.getUserKey(claims);
+            String userId = JwtUtils.getUserId(claims);
+            String userName = JwtUtils.getUserName(claims);
+            String tenantId = JwtUtils.getTenantId(claims);
+
+            SecurityContextHolder.setUserId(userId);
+            SecurityContextHolder.setUserName(userName);
+            SecurityContextHolder.setUserKey(userKey);
+            SecurityContextHolder.setTenantId(tenantId);
+
+            //TODO 2022-05-03 gez 每次请求都要从rdis获取用户信息,并刷新时间,这个代码拉低每次请求效率
+            // 如果不影响其它业务模块,考虑去掉这块逻辑
+            LoginUser loginUser = AuthUtil.getLoginUser(token);
+            if (Objects.nonNull(loginUser))
+            {
+                AuthUtil.verifyLoginUserExpire(loginUser);
+                SecurityContextHolder.set(SecurityConstants.LOGIN_USER, loginUser);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
+            throws Exception
+    {
+        SecurityContextHolder.remove();
+    }
+}

+ 172 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/service/TokenService.java

@@ -0,0 +1,172 @@
+package com.usky.common.security.service;
+
+import com.usky.common.core.constants.CacheConstants;
+import com.usky.common.core.constants.SecurityConstants;
+import com.usky.common.core.util.*;
+import com.usky.common.redis.core.RedisHelper;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.system.model.LoginUser;
+import org.springframework.cloud.commons.util.IdUtils;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * token验证处理
+ * 
+ * @author ruoyi
+ */
+@Component
+public class TokenService
+{
+
+    private RedisHelper redisService = SpringContextUtils.getBean(RedisHelper.class);
+
+
+
+    protected static final long MILLIS_SECOND = 1000;
+
+    protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
+
+    private final static long expireTime = CacheConstants.EXPIRATION;
+
+    private final static String ACCESS_TOKEN = CacheConstants.LOGIN_TOKEN_KEY;
+
+    private final static Long MILLIS_MINUTE_TEN = CacheConstants.REFRESH_TIME * MILLIS_MINUTE;
+
+    /**
+     * 创建令牌
+     */
+    public Map<String, Object> createToken(LoginUser loginUser)
+    {
+        String token = UUIDUtils.uuid();
+        Long userId = loginUser.getSysUser().getUserId();
+        String userName = loginUser.getSysUser().getUserName();
+        Integer tenantId = loginUser.getSysUser().getTenantId();
+        loginUser.setToken(token);
+        loginUser.setUserid(userId);
+        loginUser.setUsername(userName);
+        loginUser.setIpaddr(IpUtils.getIpAddr(ServletUtils.getRequest()));
+        refreshToken(loginUser);
+
+        // Jwt存储信息
+        Map<String, Object> claimsMap = new HashMap<String, Object>();
+        claimsMap.put(SecurityConstants.USER_KEY, token);
+        claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
+        claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
+        claimsMap.put(SecurityConstants.DETAILS_TENANT_ID, tenantId);
+
+        // 接口返回信息
+        Map<String, Object> rspMap = new HashMap<String, Object>();
+        rspMap.put("access_token", JwtUtils.createToken(claimsMap));
+        rspMap.put("expires_in", expireTime);
+        rspMap.put("tenantId",tenantId);
+        return rspMap;
+    }
+
+    /**
+     * 获取用户身份信息
+     *
+     * @return 用户信息
+     */
+    public LoginUser getLoginUser()
+    {
+        return getLoginUser(ServletUtils.getRequest());
+    }
+
+    /**
+     * 获取用户身份信息
+     *
+     * @return 用户信息
+     */
+    public LoginUser getLoginUser(HttpServletRequest request)
+    {
+        // 获取请求携带的令牌
+        String token = SecurityUtils.getToken(request);
+        return getLoginUser(token);
+    }
+
+    /**
+     * 获取用户身份信息
+     *
+     * @return 用户信息
+     */
+    public LoginUser getLoginUser(String token)
+    {
+        LoginUser user = null;
+        try
+        {
+            if (StringUtils.isNotEmpty(token))
+            {
+                String userkey = JwtUtils.getUserKey(token);
+                user = (LoginUser)redisService.get(getTokenKey(userkey));
+                return user;
+            }
+        }
+        catch (Exception e)
+        {
+        }
+        return user;
+    }
+
+    /**
+     * 设置用户身份信息
+     */
+    public void setLoginUser(LoginUser loginUser)
+    {
+        if (Objects.nonNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken()))
+        {
+            refreshToken(loginUser);
+        }
+    }
+
+    /**
+     * 删除用户缓存信息
+     */
+    public void delLoginUser(String token)
+    {
+        if (StringUtils.isNotEmpty(token))
+        {
+            String userkey = JwtUtils.getUserKey(token);
+            redisService.delete(getTokenKey(userkey));
+        }
+    }
+
+    /**
+     * 验证令牌有效期,相差不足120分钟,自动刷新缓存
+     *
+     * @param loginUser
+     */
+    public void verifyToken(LoginUser loginUser)
+    {
+        long expireTime = loginUser.getExpireTime();
+        long currentTime = System.currentTimeMillis();
+        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
+        {
+            refreshToken(loginUser);
+        }
+    }
+
+    /**
+     * 刷新令牌有效期
+     *
+     * @param loginUser 登录信息
+     */
+    public void refreshToken(LoginUser loginUser)
+    {
+        loginUser.setLoginTime(System.currentTimeMillis());
+        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
+        // 根据uuid将loginUser缓存
+        String userKey = getTokenKey(loginUser.getToken());
+        redisService.set(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+    }
+
+    private String getTokenKey(String token)
+    {
+        return ACCESS_TOKEN + token;
+    }
+}

+ 76 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/utils/DictUtils.java

@@ -0,0 +1,76 @@
+package com.usky.common.security.utils;
+
+import com.usky.common.core.constants.Constants;
+import com.usky.common.core.util.SpringContextUtils;
+import com.usky.common.core.util.StringUtils;
+import com.usky.common.redis.core.RedisHelper;
+import com.usky.system.domain.SysDictDataVO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 字典工具类
+ * 
+ * @author ruoyi
+ */
+public class DictUtils
+{
+    /**
+     * 设置字典缓存
+     * 
+     * @param key 参数键
+     * @param dictDatas 字典数据列表
+     */
+    public static void setDictCache(String key, List<SysDictDataVO> dictDatas)
+    {
+        SpringContextUtils.getBean(RedisHelper.class).set(getCacheKey(key), dictDatas);
+    }
+
+    /**
+     * 获取字典缓存
+     * 
+     * @param key 参数键
+     * @return dictDatas 字典数据列表
+     */
+    public static List<SysDictDataVO> getDictCache(String key)
+    {
+        Object cacheObj = SpringContextUtils.getBean(RedisHelper.class).get(getCacheKey(key));
+        if (Objects.nonNull(cacheObj))
+        {
+            return StringUtils.cast(cacheObj);
+        }
+        return null;
+    }
+
+    /**
+     * 删除指定字典缓存
+     * 
+     * @param key 字典键
+     */
+    public static void removeDictCache(String key)
+    {
+        SpringContextUtils.getBean(RedisHelper.class).delete(getCacheKey(key));
+    }
+
+    /**
+     * 清空字典缓存
+     */
+    public static void clearDictCache()
+    {
+        Collection<String> keys = SpringContextUtils.getBean(RedisHelper.class).keys(Constants.SYS_DICT_KEY + "*");
+        SpringContextUtils.getBean(RedisHelper.class).delete(keys);
+    }
+
+    /**
+     * 设置cache key
+     * 
+     * @param configKey 参数键
+     * @return 缓存键key
+     */
+    public static String getCacheKey(String configKey)
+    {
+        return Constants.SYS_DICT_KEY + configKey;
+    }
+}

+ 126 - 0
usky-common/usky-common-security/src/main/java/com/usky/common/security/utils/SecurityUtils.java

@@ -0,0 +1,126 @@
+package com.usky.common.security.utils;
+
+
+import com.usky.common.core.constants.SecurityConstants;
+import com.usky.common.core.constants.TokenConstants;
+import com.usky.common.core.context.SecurityContextHolder;
+import com.usky.common.core.util.ServletUtils;
+import com.usky.common.core.util.StringUtils;
+import com.usky.system.model.LoginUser;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 权限获取工具类
+ * 
+ * @author ruoyi
+ */
+public class SecurityUtils
+{
+    /**
+     * 获取用户ID
+     */
+    public static Long getUserId()
+    {
+        return SecurityContextHolder.getUserId();
+    }
+
+    /**
+     * 获取租户ID
+     */
+     public static Integer getTenantId() {
+         return SecurityContextHolder.getTenantId();
+     }
+
+    /**
+     * 获取用户名称
+     */
+    public static String getUsername()
+    {
+        return SecurityContextHolder.getUserName();
+    }
+
+    /**
+     * 获取用户key
+     */
+    public static String getUserKey()
+    {
+        return SecurityContextHolder.getUserKey();
+    }
+
+    /**
+     * 获取登录用户信息
+     */
+    public static LoginUser getLoginUser()
+    {
+        return SecurityContextHolder.get(SecurityConstants.LOGIN_USER, LoginUser.class);
+    }
+
+    /**
+     * 获取请求token
+     */
+    public static String getToken()
+    {
+        return getToken(ServletUtils.getRequest());
+    }
+
+    /**
+     * 根据request获取请求token
+     */
+    public static String getToken(HttpServletRequest request)
+    {
+        // 从header获取token标识
+        String token = request.getHeader(TokenConstants.AUTHENTICATION);
+        return replaceTokenPrefix(token);
+    }
+
+    /**
+     * 裁剪token前缀
+     */
+    public static String replaceTokenPrefix(String token)
+    {
+        // 如果前端设置了令牌前缀,则裁剪掉前缀
+        if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX))
+        {
+            token = token.replaceFirst(TokenConstants.PREFIX, "");
+        }
+        return token;
+    }
+
+    /**
+     * 是否为管理员
+     * 
+     * @param userId 用户ID
+     * @return 结果
+     */
+    public static boolean isAdmin(Long userId)
+    {
+        return userId != null && 1L == userId;
+    }
+
+    /**
+     * 生成BCryptPasswordEncoder密码
+     *
+     * @param password 密码
+     * @return 加密字符串
+     */
+    public static String encryptPassword(String password)
+    {
+        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+        return passwordEncoder.encode(password);
+    }
+
+    /**
+     * 判断密码是否相同
+     *
+     * @param rawPassword 真实密码
+     * @param encodedPassword 加密后字符
+     * @return 结果
+     */
+    public static boolean matchesPassword(String rawPassword, String encodedPassword)
+    {
+        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+        return passwordEncoder.matches(rawPassword, encodedPassword);
+    }
+}

+ 0 - 60
usky-common/usky-common-spring/pom.xml

@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>usky-common</artifactId>
-        <groupId>com.usky</groupId>
-        <version>0.0.1</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>usky-common-spring</artifactId>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>com.usky</groupId>
-            <artifactId>usky-common-core</artifactId>
-            <version>${parent.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-logging</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-openfeign</artifactId>
-        </dependency>
-
-        <!-- SpringCloud Loadbalancer -->
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>net.sf.ehcache</groupId>
-            <artifactId>ehcache</artifactId>
-            <version>2.10.5</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-pool2</artifactId>
-            <version>2.0</version>
-        </dependency>
-    </dependencies>
-
-</project>

+ 0 - 34
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/annotion/ConditionalOnPropertyNotEmpty.java

@@ -1,34 +0,0 @@
-package com.usky.common.spring.annotion;
-
-import org.springframework.context.annotation.Condition;
-import org.springframework.context.annotation.ConditionContext;
-import org.springframework.context.annotation.Conditional;
-import org.springframework.core.type.AnnotatedTypeMetadata;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.util.Map;
-
-/**
- * 由于 @ConditionalOnProperty 没有提供"当proper存在且为任意值时,触发条件"的特性, 所以使用该注解实现.
- * 当 value 对应的proper"被配置且有值不为空"时, 会被触发.
- */
-@Target({ElementType.TYPE, ElementType.METHOD})
-@Retention(RetentionPolicy.RUNTIME)
-@Conditional(ConditionalOnPropertyNotEmpty.OnPropertyNotEmptyCondition.class)
-public @interface ConditionalOnPropertyNotEmpty {
-    String value();
-
-    class OnPropertyNotEmptyCondition implements Condition {
-
-        @Override
-        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
-            Map<String, Object> attrs = metadata.getAnnotationAttributes(ConditionalOnPropertyNotEmpty.class.getName());
-            String propertyName = (String) attrs.get("value");
-            String val = context.getEnvironment().getProperty(propertyName);
-            return val != null && !val.trim().isEmpty();
-        }
-    }
-}

+ 0 - 26
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/id/IdWorkerAutoConfiguration.java

@@ -1,26 +0,0 @@
-package com.usky.common.spring.config.id;
-
-
-import com.usky.common.core.util.id.IdWorkerContainer;
-import com.usky.common.spring.annotion.ConditionalOnPropertyNotEmpty;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-@ConditionalOnPropertyNotEmpty("id.workerId")
-@Configuration
-@EnableConfigurationProperties(IdWorkerConfigProperties.class)
-public class IdWorkerAutoConfiguration {
-
-    @Autowired
-    private IdWorkerConfigProperties properties;
-
-    @Bean
-    @Primary
-    public IdWorkerContainer idWorkerContainer() {
-        Long workerId = properties.getWorkerId();
-        return new IdWorkerContainer(workerId);
-    }
-}

+ 0 - 17
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/id/IdWorkerConfigProperties.java

@@ -1,17 +0,0 @@
-package com.usky.common.spring.config.id;
-
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-/**
- * <p>分布式 ID 自动配置 properties </p>
- *
- * @author chenpeng
- * Create at February 12, 2019 at 11:20:20 GMT+8
- */
-@Data
-@ConfigurationProperties(prefix = "id")
-public class IdWorkerConfigProperties {
-
-    private Long workerId;
-}

+ 0 - 47
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/config/jackson/JacksonConfig.java

@@ -1,47 +0,0 @@
-package com.usky.common.spring.config.jackson;
-
-
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
-import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
-import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
-import com.usky.common.core.util.JacksonComponent;
-import com.usky.common.core.util.JsonMapper;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
-
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
-import java.time.format.DateTimeFormatter;
-import java.util.Date;
-
-@Configuration
-public class JacksonConfig {
-
-    @Value("${spring.jackson.data-format:yyyy-MM-dd HH:mm:ss}")
-    private String pattern;
-
-    @Bean
-    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
-        return new Jackson2ObjectMapperBuilderCustomizer() {
-            @Override
-            public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
-                jacksonObjectMapperBuilder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(JsonMapper.DEFAULT_LOCAL_DATE_TIME_SERIALIZER_PATTERN)));
-                jacksonObjectMapperBuilder.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(JsonMapper.DEFAULT_LOCAL_DATE_SERIALIZER_PATTERN)));
-
-                jacksonObjectMapperBuilder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(
-                        DateTimeFormatter.ofPattern(JsonMapper.DEFAULT_LOCAL_DATE_TIME_DESERIALIZER_PATTERN + "[" + pattern + "]")
-                                .withZone(ZoneOffset.UTC)));
-                jacksonObjectMapperBuilder.deserializerByType(LocalDate.class, new LocalDateDeserializer(
-                        DateTimeFormatter.ofPattern(JsonMapper.DEFAULT_LOCAL_DATE_DESERIALIZER_PATTERN)
-                                .withZone(ZoneOffset.UTC)));
-                jacksonObjectMapperBuilder.deserializerByType(Date.class, new JacksonComponent.DateJsonDeserializer());
-            }
-        };
-    }
-
-}

+ 0 - 5
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/injectself/BeanSelfAware.java

@@ -1,5 +0,0 @@
-package com.usky.common.spring.injectself;
-
-public interface BeanSelfAware {
-    void setSelf(Object bean);
-}

+ 0 - 25
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/injectself/InjectSelfBeanPostProcessor.java

@@ -1,25 +0,0 @@
-package com.usky.common.spring.injectself;
-
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.stereotype.Component;
-
-@Component
-public class InjectSelfBeanPostProcessor implements BeanPostProcessor {
-
-    @Override
-    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
-        return bean;
-    }
-
-    @Override
-    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-        if (bean instanceof BeanSelfAware) {
-            BeanSelfAware myBean = (BeanSelfAware) bean;
-            myBean.setSelf(bean);
-            return myBean;
-        }
-        return bean;
-    }
-
-}

+ 0 - 45
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/util/ApplicationStartupUtils.java

@@ -1,45 +0,0 @@
-package com.usky.common.spring.util;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.context.ApplicationContext;
-
-import java.net.InetAddress;
-
-/**
- * 应用启动工具类
- *
- * @author chenpeng
- * Create at December 2, 2018 at 21:18:11 GMT+8
- */
-public final class ApplicationStartupUtils {
-
-
-    // private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationStartupUtils.class);
-
-    private static final String PROP_LOGGING_CONFIG_KEY = "logging.config";
-    private static final String PROFILE_VULE_SEPARATOR = ",";
-
-    private ApplicationStartupUtils() {
-
-    }
-
-    /**
-     * <p>应用启动方法</p>
-     *
-     * @author chenpeng
-     * Create at May 29, 2019 at 15:21:53 GMT+8
-     */
-    public static void startup(Class<?> clazz, String[] args) {
-        // 设置系统参数 本机IP
-        System.setProperty("local-ip", getLocalIp());
-        ApplicationContext context = SpringApplication.run(clazz, args);
-    }
-
-    private static String getLocalIp() {
-        try {
-            return InetAddress.getLocalHost().getHostAddress();
-        } catch (Exception ex) {
-            return "";
-        }
-    }
-}

+ 0 - 83
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/util/MultipartFileUtil.java

@@ -1,83 +0,0 @@
-package com.usky.common.spring.util;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.fileupload.FileItem;
-import org.apache.commons.fileupload.FileItemFactory;
-import org.apache.commons.fileupload.disk.DiskFileItemFactory;
-import org.apache.commons.io.IOUtils;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author yangqiang
- * @date 2020-11-06
- */
-@Slf4j
-public final class MultipartFileUtil {
-
-    private MultipartFileUtil() {
-    }
-
-    public static List<CommonsMultipartFile> getCommonsMultipartFileList(byte[] aByte, String fileName, String name) {
-        List<CommonsMultipartFile> multipartFiles = new ArrayList<>();
-        FileItemFactory factory = new DiskFileItemFactory(16, null);
-        FileItem item = factory.createItem(name, "text/plain", true, fileName);
-        OutputStream os = null;
-        ByteArrayInputStream fis = null;
-        int bytesRead;
-        try {
-            fis = new ByteArrayInputStream(aByte);
-            os = item.getOutputStream();
-            while ((bytesRead = fis.read(aByte, 0, aByte.length)) != -1) {
-                os.write(aByte, 0, bytesRead);
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                if (os != null) {
-                    os.close();
-                }
-                if (fis != null) {
-                    fis.close();
-                }
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        CommonsMultipartFile commonsMultipartFile = new CommonsMultipartFile(item);
-        multipartFiles.add(commonsMultipartFile);
-        return multipartFiles;
-    }
-
-    public static CommonsMultipartFile from(File file, String itemName) {
-        FileItemFactory factory = new DiskFileItemFactory(16, null);
-        FileItem item = factory.createItem(itemName, "text/plain", true, file.getName());
-        OutputStream os = null;
-        FileInputStream fis = null;
-        int bytesRead;
-        try {
-            fis = new FileInputStream(file);
-            os = item.getOutputStream();
-            IOUtils.copy(fis, os);
-        } catch (IOException e) {
-            log.error("convert file to multipartFile error. ", e);
-        } finally {
-            try {
-                if (os != null) {
-                    os.close();
-                }
-                if (fis != null) {
-                    fis.close();
-                }
-            } catch (IOException e) {
-                log.error("convert file to multipartFile, occur error when close stream.", e);
-            }
-        }
-        CommonsMultipartFile commonsMultipartFile = new CommonsMultipartFile(item);
-        return commonsMultipartFile;
-    }
-}

+ 0 - 24
usky-common/usky-common-spring/src/main/java/com/usky/common/spring/util/ThreadUtils.java

@@ -1,24 +0,0 @@
-package com.usky.common.spring.util;
-
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author barry chen
- * @date 2020/11/27 4:20 下午
- */
-public final class ThreadUtils extends org.apache.commons.lang3.ThreadUtils {
-    private static final Logger LOG = LoggerFactory.getLogger(ThreadUtils.class);
-
-    private ThreadUtils() {
-    }
-
-    public static void sleep(Long millis) {
-        try {
-            Thread.sleep(millis);
-        } catch (InterruptedException e) {
-            LOG.error("thread sleep error", ExceptionUtils.getStackTrace(e));
-        }
-    }
-}