laowo 3 éve
szülő
commit
6fa9b0fa3d
59 módosított fájl, 3627 hozzáadás és 338 törlés
  1. 4 0
      pom.xml
  2. 24 0
      src/main/java/com/usky/annotion/DataScope.java
  3. 181 0
      src/main/java/com/usky/aspect/DataScopeAspect.java
  4. 10 10
      src/main/java/com/usky/config/CorsConfig.java
  5. 23 0
      src/main/java/com/usky/config/redis/RedisProperties.java
  6. 90 63
      src/main/java/com/usky/config/shiro/ShiroConfig.java
  7. 3 3
      src/main/java/com/usky/controller/login/LoginController.java
  8. 39 0
      src/main/java/com/usky/controller/sys/DeptController.java
  9. 68 0
      src/main/java/com/usky/controller/sys/MenuController.java
  10. 60 0
      src/main/java/com/usky/controller/sys/RoleController.java
  11. 0 33
      src/main/java/com/usky/controller/sys/SysController.java
  12. 72 0
      src/main/java/com/usky/controller/sys/UserController.java
  13. 0 31
      src/main/java/com/usky/controller/user/UserController.java
  14. 111 0
      src/main/java/com/usky/entity/BaseEntity.java
  15. 7 7
      src/main/java/com/usky/entity/sys/SysDeptDTO.java
  16. 7 7
      src/main/java/com/usky/entity/sys/SysMenuDTO.java
  17. 3 3
      src/main/java/com/usky/entity/sys/SysPostDTO.java
  18. 5 4
      src/main/java/com/usky/entity/sys/SysRoleDTO.java
  19. 6 6
      src/main/java/com/usky/entity/sys/SysRoleDeptDTO.java
  20. 6 6
      src/main/java/com/usky/entity/sys/SysRoleDeptDTOPK.java
  21. 6 6
      src/main/java/com/usky/entity/sys/SysRoleMenuDTO.java
  22. 5 5
      src/main/java/com/usky/entity/sys/SysRoleMenuDTOPK.java
  23. 6 6
      src/main/java/com/usky/entity/sys/SysUserDTO.java
  24. 6 6
      src/main/java/com/usky/entity/sys/SysUserPostDTO.java
  25. 4 4
      src/main/java/com/usky/entity/sys/SysUserPostDTOPK.java
  26. 6 6
      src/main/java/com/usky/entity/sys/SysUserRoleDTO.java
  27. 5 5
      src/main/java/com/usky/entity/sys/SysUserRoleDTOPK.java
  28. 49 0
      src/main/java/com/usky/entity/sys/vo/SysDeptVO.java
  29. 57 0
      src/main/java/com/usky/entity/sys/vo/SysMenuVO.java
  30. 46 0
      src/main/java/com/usky/entity/sys/vo/SysRoleVO.java
  31. 24 9
      src/main/java/com/usky/entity/sys/vo/SysUserVO.java
  32. 55 0
      src/main/java/com/usky/entity/ztree/Ztree.java
  33. 81 6
      src/main/java/com/usky/exception/BaseException.java
  34. 25 0
      src/main/java/com/usky/exception/BusinessException.java
  35. 155 93
      src/main/java/com/usky/exception/GloableExceptionResolver.java
  36. 18 0
      src/main/java/com/usky/exception/user/CaptchaException.java
  37. 18 0
      src/main/java/com/usky/exception/user/RoleBlockedException.java
  38. 14 0
      src/main/java/com/usky/exception/user/UserBlockedException.java
  39. 18 0
      src/main/java/com/usky/exception/user/UserDeleteException.java
  40. 19 0
      src/main/java/com/usky/exception/user/UserException.java
  41. 16 0
      src/main/java/com/usky/exception/user/UserNotExistsException.java
  42. 14 0
      src/main/java/com/usky/exception/user/UserPasswordNotMatchException.java
  43. 16 0
      src/main/java/com/usky/exception/user/UserPasswordRetryLimitCountException.java
  44. 16 0
      src/main/java/com/usky/exception/user/UserPasswordRetryLimitExceedException.java
  45. 23 0
      src/main/java/com/usky/service/dept/DeptService.java
  46. 81 0
      src/main/java/com/usky/service/dept/DeptServiceImpl.java
  47. 23 0
      src/main/java/com/usky/service/menuService/MenuService.java
  48. 163 7
      src/main/java/com/usky/service/menuService/MenuServiceImpl.java
  49. 16 0
      src/main/java/com/usky/service/sys/RoleService.java
  50. 70 0
      src/main/java/com/usky/service/sys/RoleServiceImpl.java
  51. 30 0
      src/main/java/com/usky/service/user/LoginServiceImpl.java
  52. 19 0
      src/main/java/com/usky/service/user/UserService.java
  53. 52 5
      src/main/java/com/usky/service/user/UserServiceImpl.java
  54. 85 0
      src/main/java/com/usky/utils/CharsetKit.java
  55. 1005 0
      src/main/java/com/usky/utils/Convert.java
  56. 16 7
      src/main/java/com/usky/utils/ShiroUtils.java
  57. 145 0
      src/main/java/com/usky/utils/SpringUtils.java
  58. 92 0
      src/main/java/com/usky/utils/StrFormatter.java
  59. 409 0
      src/main/java/com/usky/utils/StringUtils.java

+ 4 - 0
pom.xml

@@ -140,6 +140,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-pool2</artifactId>

+ 24 - 0
src/main/java/com/usky/annotion/DataScope.java

@@ -0,0 +1,24 @@
+package com.usky.annotion;
+
+import java.lang.annotation.*;
+
+/**
+ * 数据权限过滤注解
+ * 
+ * @author 
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DataScope
+{
+    /**
+     * 部门表的别名
+     */
+    public String deptAlias() default "";
+
+    /**
+     * 用户表的别名
+     */
+    public String userAlias() default "";
+}

+ 181 - 0
src/main/java/com/usky/aspect/DataScopeAspect.java

@@ -0,0 +1,181 @@
+package com.usky.aspect;
+
+import com.usky.annotion.DataScope;
+import com.usky.entity.BaseEntity;
+import com.usky.entity.sys.SysRoleDTO;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.utils.ShiroUtils;
+import com.usky.utils.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+
+/**
+ * 数据过滤处理
+ * 
+ * @author 
+ */
+@Aspect
+@Component
+public class DataScopeAspect
+{
+    /**
+     * 全部数据权限
+     */
+    public static final String DATA_SCOPE_ALL = "1";
+
+    /**
+     * 自定数据权限
+     */
+    public static final String DATA_SCOPE_CUSTOM = "2";
+
+    /**
+     * 部门数据权限
+     */
+    public static final String DATA_SCOPE_DEPT = "3";
+
+    /**
+     * 部门及以下数据权限
+     */
+    public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";
+
+    /**
+     * 仅本人数据权限
+     */
+    public static final String DATA_SCOPE_SELF = "5";
+
+    /**
+     * 数据权限过滤关键字
+     */
+    public static final String DATA_SCOPE = "dataScope";
+
+    // 配置织入点
+    @Pointcut("@annotation(com.usky.annotion.DataScope)")
+    public void dataScopePointCut()
+    {
+    }
+
+    @Before("dataScopePointCut()")
+    public void doBefore(JoinPoint point) throws Throwable
+    {
+        clearDataScope(point);
+        handleDataScope(point);
+    }
+
+    protected void handleDataScope(final JoinPoint joinPoint)
+    {
+        // 获得注解
+        DataScope controllerDataScope = getAnnotationLog(joinPoint);
+        if (controllerDataScope == null)
+        {
+            return;
+        }
+        // 获取当前的用户
+        SysUserVO currentUser = ShiroUtils.getSysUserVo();
+        if (currentUser != null)
+        {
+            // 如果是超级管理员,则不过滤数据
+            if (!currentUser.isAdmin())
+            {
+                dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
+                        controllerDataScope.userAlias());
+            }
+        }
+    }
+
+    /**
+     * 数据范围过滤
+     * 
+     * @param joinPoint 切点
+     * @param user 用户
+     * @param deptAlias 部门别名
+     * @param userAlias 用户别名
+     */
+    public static void dataScopeFilter(JoinPoint joinPoint, SysUserVO user, String deptAlias, String userAlias)
+    {
+        StringBuilder sqlString = new StringBuilder();
+
+        for (SysRoleDTO role : user.getRoles())
+        {
+            String dataScope = role.getDataScope();
+            if (DATA_SCOPE_ALL.equals(dataScope))
+            {
+                sqlString = new StringBuilder();
+                break;
+            }
+            else if (DATA_SCOPE_CUSTOM.equals(dataScope))
+            {
+                sqlString.append(StringUtils.format(
+                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias,
+                        role.getRoleId()));
+            }
+            else if (DATA_SCOPE_DEPT.equals(dataScope))
+            {
+                sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
+            }
+            else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope))
+            {
+                sqlString.append(StringUtils.format(
+                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
+                        deptAlias, user.getDeptId(), user.getDeptId()));
+            }
+            else if (DATA_SCOPE_SELF.equals(dataScope))
+            {
+                if (StringUtils.isNotBlank(userAlias))
+                {
+                    sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId()));
+                }
+                else
+                {
+                    // 数据权限为仅本人且没有userAlias别名不查询任何数据
+                    sqlString.append(" OR 1=0 ");
+                }
+            }
+        }
+
+        if (StringUtils.isNotBlank(sqlString.toString()))
+        {
+            Object params = joinPoint.getArgs()[0];
+            if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
+            {
+                BaseEntity baseEntity = (BaseEntity) params;
+                baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");
+            }
+        }
+    }
+
+    /**
+     * 是否存在注解,如果存在就获取
+     */
+    private DataScope getAnnotationLog(JoinPoint joinPoint)
+    {
+        Signature signature = joinPoint.getSignature();
+        MethodSignature methodSignature = (MethodSignature) signature;
+        Method method = methodSignature.getMethod();
+
+        if (method != null)
+        {
+            return method.getAnnotation(DataScope.class);
+        }
+        return null;
+    }
+
+    /**
+     * 拼接权限sql前先清空params.dataScope参数防止注入
+     */
+    private void clearDataScope(final JoinPoint joinPoint)
+    {
+        Object params = joinPoint.getArgs()[0];
+        if (StringUtils.isNotNull(params) && params instanceof BaseEntity)
+        {
+            BaseEntity baseEntity = (BaseEntity) params;
+            baseEntity.getParams().put(DATA_SCOPE, "");
+        }
+    }
+}

+ 10 - 10
src/main/java/com/usky/config/CorsConfig.java

@@ -34,14 +34,14 @@ public class CorsConfig implements WebMvcConfigurer {
 
 
     }
-//    @SuppressWarnings({ "rawtypes", "unchecked" })
-//    @Bean
-//    @Order(1)//设置filter执行的顺序
-//    public FilterRegistrationBean filterRegest(){
-//        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
-//        filterRegistrationBean.setFilter(new XssFilter());
-//        filterRegistrationBean.addUrlPatterns("/*");//过滤所有的URL
-//// filterRegistrationBean.setOrder(1);/another way to set the sequence
-//        return filterRegistrationBean;
-//    }
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @Bean
+    @Order(1)//设置filter执行的顺序
+    public FilterRegistrationBean filterRegest(){
+        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
+        filterRegistrationBean.setFilter(new XssFilter());
+        filterRegistrationBean.addUrlPatterns("/*");//过滤所有的URL
+// filterRegistrationBean.setOrder(1);/another way to set the sequence
+        return filterRegistrationBean;
+    }
 }

+ 23 - 0
src/main/java/com/usky/config/redis/RedisProperties.java

@@ -0,0 +1,23 @@
+package com.usky.config.redis;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+
+@Configuration
+@ConfigurationProperties(prefix = "spring.redis")
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Order(-1)
+public class RedisProperties {
+    private String host;
+    private Integer port;
+    private String password;
+    /**
+     * 默认30天 = 2592000s
+     */
+    private Integer expire = 2592000;
+
+}

+ 90 - 63
src/main/java/com/usky/config/shiro/ShiroConfig.java

@@ -1,38 +1,36 @@
 package com.usky.config.shiro;
 
-import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
+import com.usky.config.redis.RedisProperties;
 import org.apache.shiro.authc.credential.CredentialsMatcher;
 import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
-import org.apache.shiro.cache.CacheManager;
 import org.apache.shiro.mgt.SecurityManager;
-import org.apache.shiro.realm.Realm;
-import org.apache.shiro.session.mgt.SessionManager;
-import org.apache.shiro.session.mgt.eis.SessionDAO;
 import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
 import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
 import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
 import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
-import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.crazycake.shiro.RedisCacheManager;
+import org.crazycake.shiro.RedisManager;
+import org.crazycake.shiro.RedisSessionDAO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.core.annotation.Order;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
- *
  * @author laowo
  */
 @Configuration
 @Order(-1)
 public class ShiroConfig {
-    //shiroFilter
+    @Autowired
+    private RedisProperties redisProperties;
+
     @Bean
-    public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager securityManager) {
+    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
         ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
         shiroFilterFactoryBean.setSecurityManager(securityManager);
         //登录
@@ -56,38 +54,29 @@ public class ShiroConfig {
         return shiroFilterFactoryBean;
     }
 
-    //安全管理器
-    @Bean
-    public SecurityManager securityManager(@Qualifier("myRealm") Realm myRealm, @Qualifier("sessionManager") SessionManager sessionManager) {
+    @Bean(name = "securityManager")
+    public SecurityManager securityManager(@Qualifier("myRealm") MyRealm myRealm) {
         DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
-        securityManager.setSessionManager(sessionManager);
+        // 设置realm.
         securityManager.setRealm(myRealm);
+        securityManager.setCacheManager(redisCacheManager());
+        // 自定义session管理 使用redis
+        securityManager.setSessionManager(sessionManager());
         return securityManager;
     }
 
-    //缓存管理
-    @Bean(name = "mycacheManager")
-    public CacheManager mycacheManager() {
-        return new MyRedisCacheManager();
-    }
-
-
-
-
     @Bean(name = "myRealm")
-    public Realm myRealm(@Qualifier("mycacheManager") CacheManager mycacheManager) {
-        MyRealm myRealm = new MyRealm();
-        //告诉realm密码匹配方式
-        myRealm.setCredentialsMatcher(credentialsMatcher());
-        myRealm.setAuthorizationCacheName("perms");
-        myRealm.setAuthorizationCachingEnabled(true);
-        myRealm.setAuthenticationCachingEnabled(false);
-        //设置缓存管理器
-        myRealm.setCacheManager(mycacheManager);
-        return myRealm;
+    public MyRealm shiroRealm(@Qualifier("credentialsMatcher") CredentialsMatcher credentialsMatcher) {
+        MyRealm shiroRealm = new MyRealm();
+        shiroRealm.setCredentialsMatcher(credentialsMatcher);
+        return shiroRealm;
     }
 
-
+    /**
+     * 凭证匹配器
+     *
+     * @return
+     */
     @Bean
     public CredentialsMatcher credentialsMatcher() {
         HashedCredentialsMatcher hashedMatcher = new HashedCredentialsMatcher();
@@ -96,52 +85,90 @@ public class ShiroConfig {
         return hashedMatcher;
     }
 
-    /**
-     * 注解支持
-     */
-    @Bean
-    @ConditionalOnMissingBean
-    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
-        DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
-        defaultAAP.setProxyTargetClass(true);
-        return defaultAAP;
-    }
 
     @Bean
-    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") SecurityManager securityManager) {
         AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
         authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
         return authorizationAttributeSourceAdvisor;
     }
 
-    @Bean
-    public ShiroDialect shiroDialect() {
-        return new ShiroDialect();
+    /**
+     * 配置shiro redisManager
+     *
+     * @return
+     */
+    public RedisManager redisManager() {
+        RedisManager redisManager = new RedisManager();
+        redisManager.setHost("47.111.81.118:6379");
+        redisManager.setDatabase(1);
+        redisManager.setTimeout(0);
+        redisManager.setPassword(redisProperties.getPassword());
+        return redisManager;
     }
 
     /**
-     * 会话管理器
+     * cacheManager 缓存 redis实现
+     * 使用的是shiro-redis开源插件
      *
      * @return
      */
     @Bean
-    public SessionManager sessionManager(@Qualifier("redisSessionDAO") SessionDAO redisSessionDAO) {
+    public RedisCacheManager redisCacheManager() {
+        RedisCacheManager redisCacheManager = new RedisCacheManager();
+        redisCacheManager.setRedisManager(redisManager());
+        redisCacheManager.setPrincipalIdFieldName("userId");
+        return redisCacheManager;
+    }
+
+
+    /**
+     * RedisSessionDAO shiro sessionDao层的实现 通过redis
+     * 使用的是shiro-redis开源插件
+     */
+//    @Bean
+    public RedisSessionDAO redisSessionDAO() {
+        RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
+        redisSessionDAO.setRedisManager(redisManager());
+        return redisSessionDAO;
+    }
+
+    /**
+     * shiro session的管理
+     */
+    @Bean
+    public DefaultWebSessionManager sessionManager() {
         DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
-        sessionManager.setSessionDAO(redisSessionDAO);
-        //设置会话过期时间
-        sessionManager.setGlobalSessionTimeout(3 * 60 * 1000); //默认半小时
-        sessionManager.setDeleteInvalidSessions(true); //默认自定调用SessionDAO的delete方法删除会话
-        //设置会话定时检查
-        sessionManager.setSessionValidationInterval(180000); //默认一小时
-        sessionManager.setSessionValidationSchedulerEnabled(true);
+        sessionManager.setGlobalSessionTimeout(redisProperties.getExpire());
+        sessionManager.setSessionDAO(redisSessionDAO());
         return sessionManager;
     }
 
-    @Bean(name = "redisSessionDAO")
-    public SessionDAO redisSessionDAO() {
-        ShiroRedisSessionDao redisDAO = new ShiroRedisSessionDao();
-        return redisDAO;
-    }
+//    /**
+//     * cookie对象;
+//     *
+//     * @return
+//     */
+//    public SimpleCookie rememberMeCookie() {
+//        // 这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
+//        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
+//        // 记住我cookie生效时间30天 ,单位秒。 注释掉,默认永久不过期 2018-07-15
+//        simpleCookie.setMaxAge(redisProperties.getExpire());
+//        return simpleCookie;
+//    }
+//
+//    /**
+//     * cookie管理对象;记住我功能
+//     *
+//     * @return
+//     */
+//    public CookieRememberMeManager rememberMeManager() {
+//        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
+//        cookieRememberMeManager.setCookie(rememberMeCookie());
+//        //rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
+//        cookieRememberMeManager.setCipherKey(Base64.decode("1QWLxg+NYmxraMoxAXu/Iw=="));
+//        return cookieRememberMeManager;
+//    }
 
 
 }

+ 3 - 3
src/main/java/com/usky/controller/login/LoginController.java

@@ -29,14 +29,14 @@ public class LoginController {
     @PostMapping("login")
     @ApiOperation(value = "用户登录")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "username", value = "登录名", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "loginName", value = "登录名", required = true, paramType = "query"),
             @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query")
     })
-    public Result<?> login(String username, String password) {
+    public Result<?> login(String loginName, String password) {
         try {
             //获取登录用户
             Subject subject = SecurityUtils.getSubject();
-            AuthenticationToken token = new UsernamePasswordToken(username, password);
+            AuthenticationToken token = new UsernamePasswordToken(loginName, password);
             subject.login(token);
             return Result.OK("登录成功");
         } catch (AuthenticationException e) {

+ 39 - 0
src/main/java/com/usky/controller/sys/DeptController.java

@@ -0,0 +1,39 @@
+package com.usky.controller.sys;
+
+import com.usky.entity.sys.SysDeptDTO;
+import com.usky.entity.sys.SysUserDTO;
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.ztree.Ztree;
+import com.usky.service.dept.DeptService;
+import com.usky.service.user.UserService;
+import com.usky.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/26 15:50
+ * @description TODO
+ **/
+@RestController
+@Api(tags = "系统-部门管理")
+@RequestMapping("/system/dept")
+public class DeptController {
+    @Autowired
+    private DeptService deptService;
+
+    @ApiOperation(value = "系统-部门数据加载")
+    @GetMapping("list")
+    public Result<List<Ztree>> list() {
+        List<Ztree> data = deptService.list(new SysDeptVO());
+        return Result.OK(data);
+    }
+}

+ 68 - 0
src/main/java/com/usky/controller/sys/MenuController.java

@@ -0,0 +1,68 @@
+package com.usky.controller.sys;
+
+
+import com.usky.entity.sys.SysUserDTO;
+import com.usky.entity.sys.vo.SysMenuVO;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.service.menuService.MenuService;
+import com.usky.utils.Result;
+import com.usky.utils.ShiroUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/25 15:23
+ * @description TODO
+ **/
+@RestController
+@Api(tags = "系统-菜单")
+@RequestMapping("sys/menu")
+public class MenuController {
+    private final String prefix = "sys/menu";
+
+    @ApiOperation(value = "菜单-页面鉴权")
+    @RequiresPermissions("system:menu:view")
+    @GetMapping()
+    public String menu() {
+        return prefix + "/menu";
+    }
+
+    @Autowired
+    private MenuService menuService;
+
+    @GetMapping("indexMenu")
+    @ApiOperation(value = "首页菜单加载")
+    public Result<List<SysMenuVO>> queryMenu() {
+        SysUserVO sysUserVo = ShiroUtils.getSysUserVo();
+        List<SysMenuVO> data = menuService.queryMenuList(sysUserVo);
+        return Result.OK(data);
+    }
+
+    @ApiOperation(value = "菜单管理")
+    @RequiresPermissions("system:menu:list")
+    @PostMapping("/list")
+    @ResponseBody
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "menuName", value = "菜单名称", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "visible", value = "菜单状态(0显示 1隐藏)", required = false, paramType = "query"),
+
+    })
+    public Result<List<SysMenuVO>> list(@RequestParam(value = "menuName",required = false) String menuName,
+                                        @RequestParam(value = "visible",required = false) String visible
+    ) {
+        Integer userId = ShiroUtils.getUserVOId();
+        List<SysMenuVO> menuList = menuService.list(new SysMenuVO(), menuName, visible, userId);
+        return Result.OK(menuList);
+    }
+
+
+}

+ 60 - 0
src/main/java/com/usky/controller/sys/RoleController.java

@@ -0,0 +1,60 @@
+package com.usky.controller.sys;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/27 14:37
+ * @description TODO
+ **/
+
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.sys.vo.SysRoleVO;
+import com.usky.service.sys.RoleService;
+import com.usky.utils.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "系统-角色管理")
+@RestController
+@RequestMapping("sys/role")
+public class RoleController {
+
+    private String prefix = "system/role";
+    @Autowired
+    private RoleService roleService;
+
+    @RequiresPermissions("system:role:view")
+    @GetMapping()
+    @ApiOperation(value = "页面权限")
+    public String role() {
+        return prefix + "/role";
+    }
+
+
+    @ApiOperation(value = "角色查询")
+    @PostMapping("list")
+    @RequiresPermissions("system:role:list")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roleName", value = "角色名称", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "角色状态 0正常 1 停用", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "startTime", value = "开始时间", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "pageSize", value = "页数据条数", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "pageNo", value = "当前页", required = false, paramType = "query"),
+    })
+    public Page<SysRoleVO> list(
+            @RequestParam(value = "roleName", required = false) String roleName,
+            @RequestParam(value = "status", required = false) String status,
+            @RequestParam(value = "startTime", required = false) String startTime,
+            @RequestParam(value = "endTime", required = false) String endTime,
+            @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize,
+            @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo) {
+        Page<SysRoleVO> data = roleService.list(new SysDeptVO(), roleName, status, startTime, endTime, pageSize, pageNo);
+        return data;
+    }
+}

+ 0 - 33
src/main/java/com/usky/controller/sys/SysController.java

@@ -1,33 +0,0 @@
-package com.usky.controller.sys;
-
-import com.usky.entity.sys.SysDeptDTO;
-import com.usky.service.sys.SysService;
-import com.usky.utils.Result;
-import io.swagger.annotations.Api;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-/**
- * @author laowo
- * @version v1.0
- * @date 2021/8/19 14:49
- * @description TODO
- **/
-@RestController
-@RequestMapping("sys")
-@Api(tags = "系统管理")
-public class SysController {
-
-    @Autowired
-    private SysService sysService;
-
-    @GetMapping("test")
-    public Result<List<SysDeptDTO>> test() {
-        List<SysDeptDTO> data = sysService.test();
-        return Result.OK(data);
-    }
-}

+ 72 - 0
src/main/java/com/usky/controller/sys/UserController.java

@@ -0,0 +1,72 @@
+package com.usky.controller.sys;
+
+import com.usky.entity.sys.SysUserDTO;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.service.user.UserService;
+import com.usky.utils.Page;
+import com.usky.utils.Result;
+import com.usky.utils.ShiroUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/20 15:12
+ * @description TODO
+ **/
+@Api(tags = "系统-用户管理")
+@RestController
+@RequestMapping("sys/user")
+public class UserController {
+    @Autowired
+    private UserService userService;
+
+    @ApiOperation(value = "系统-用户添加")
+    @PostMapping("addUser")
+    public Result<?> addUser(SysUserDTO user) {
+        userService.addUser(user);
+        return Result.OK();
+    }
+
+
+    @ApiOperation(value = "用户查询")
+    @PostMapping("list")
+    @ApiImplicitParams({
+            //     @ApiImplicitParam(name = "loginName", value = "登录名", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "loginName", value = "登录名", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "账户状态 0正常 1 停用", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "phonenumber", value = "手机号", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "startTime", value = "开始时间", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "deptId", value = "部门id", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "pageSize", value = "页数据条数", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "pageNo", value = "当前页", required = false, paramType = "query"),
+    })
+      @RequiresPermissions("system:user:list")
+    public Page<SysUserVO> list(
+            @RequestParam(value = "status", required = false) Integer status,
+            @RequestParam(value = "loginName", required = false) String loginName,
+            @RequestParam(value = "phonenumber", required = false) String phonenumber,
+            @RequestParam(value = "startTime", required = false) String startTime,
+            @RequestParam(value = "endTime", required = false) String endTime,
+            @RequestParam(value = "deptId", required = false) Integer deptId,
+            @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize,
+            @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo
+    ) {
+        SysUserVO sysUserVO = new SysUserVO();
+        return userService.list(sysUserVO,status, loginName, phonenumber, startTime, endTime, deptId, pageSize, pageNo);
+    }
+
+
+}

+ 0 - 31
src/main/java/com/usky/controller/user/UserController.java

@@ -1,31 +0,0 @@
-package com.usky.controller.user;
-
-import com.usky.entity.sys.SysUserDTO;
-import com.usky.service.user.UserService;
-import com.usky.utils.Result;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author laowo
- * @version v1.0
- * @date 2021/8/20 15:12
- * @description TODO
- **/
-@Api(tags = "用户管理")
-@RestController
-@RequestMapping("sys/user")
-public class UserController {
-    @Autowired
-    private UserService userService;
-    @ApiOperation(value = "系统-用户添加")
-    @PostMapping("addUser")
-    public Result<?> addUser(SysUserDTO user) {
-        userService.addUser(user);
-        return Result.OK();
-    }
-}

+ 111 - 0
src/main/java/com/usky/entity/BaseEntity.java

@@ -0,0 +1,111 @@
+package com.usky.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class BaseEntity implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 搜索值 */
+    private String searchValue;
+
+    /** 创建者 */
+    private String createBy;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /** 更新者 */
+    private String updateBy;
+
+    /** 更新时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /** 备注 */
+    private String remark;
+
+    /** 请求参数 */
+    private Map<String, Object> params;
+
+    public String getSearchValue()
+    {
+        return searchValue;
+    }
+
+    public void setSearchValue(String searchValue)
+    {
+        this.searchValue = searchValue;
+    }
+
+    public String getCreateBy()
+    {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy)
+    {
+        this.createBy = createBy;
+    }
+
+    public Date getCreateTime()
+    {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime)
+    {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateBy()
+    {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy)
+    {
+        this.updateBy = updateBy;
+    }
+
+    public Date getUpdateTime()
+    {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime)
+    {
+        this.updateTime = updateTime;
+    }
+
+    public String getRemark()
+    {
+        return remark;
+    }
+
+    public void setRemark(String remark)
+    {
+        this.remark = remark;
+    }
+
+    public Map<String, Object> getParams()
+    {
+        if (params == null)
+        {
+            params = new HashMap<>();
+        }
+        return params;
+    }
+
+    public void setParams(Map<String, Object> params)
+    {
+        this.params = params;
+    }
+}

+ 7 - 7
src/main/java/com/usky/entity/sys/SysDeptDTO.java

@@ -19,9 +19,9 @@ import java.util.Objects;
 @ApiModel(value = "部门DTO")
 public class SysDeptDTO {
     @ApiModelProperty("部门id")
-    private long deptId;
+    private Integer deptId;
     @ApiModelProperty("父级部门id")
-    private Long parentId;
+    private Integer parentId;
     @ApiModelProperty("祖级部门")
     private String ancestors;
     @ApiModelProperty("部门名称")
@@ -49,21 +49,21 @@ public class SysDeptDTO {
 
     @Id
     @Column(name = "dept_id", nullable = false)
-    public long getDeptId() {
+    public Integer getDeptId() {
         return deptId;
     }
 
-    public void setDeptId(long deptId) {
+    public void setDeptId(Integer deptId) {
         this.deptId = deptId;
     }
 
     @Basic
     @Column(name = "parent_id", nullable = true)
-    public Long getParentId() {
+    public Integer getParentId() {
         return parentId;
     }
 
-    public void setParentId(Long parentId) {
+    public void setParentId(Integer parentId) {
         this.parentId = parentId;
     }
 
@@ -192,7 +192,7 @@ public class SysDeptDTO {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         SysDeptDTO that = (SysDeptDTO) o;
-        return deptId == that.deptId && Objects.equals(parentId, that.parentId) && Objects.equals(ancestors, that.ancestors) && Objects.equals(deptName, that.deptName) && Objects.equals(orderNum, that.orderNum) && Objects.equals(leader, that.leader) && Objects.equals(phone, that.phone) && Objects.equals(email, that.email) && Objects.equals(status, that.status) && Objects.equals(delFlag, that.delFlag) && Objects.equals(createBy, that.createBy) && Objects.equals(createTime, that.createTime) && Objects.equals(updateBy, that.updateBy) && Objects.equals(updateTime, that.updateTime);
+        return Objects.equals(deptId, that.deptId) && Objects.equals(parentId, that.parentId) && Objects.equals(ancestors, that.ancestors) && Objects.equals(deptName, that.deptName) && Objects.equals(orderNum, that.orderNum) && Objects.equals(leader, that.leader) && Objects.equals(phone, that.phone) && Objects.equals(email, that.email) && Objects.equals(status, that.status) && Objects.equals(delFlag, that.delFlag) && Objects.equals(createBy, that.createBy) && Objects.equals(createTime, that.createTime) && Objects.equals(updateBy, that.updateBy) && Objects.equals(updateTime, that.updateTime);
     }
 
     @Override

+ 7 - 7
src/main/java/com/usky/entity/sys/SysMenuDTO.java

@@ -18,11 +18,11 @@ import java.util.Objects;
 @ApiModel(value = "系统-菜单DTO")
 public class SysMenuDTO {
     @ApiModelProperty("菜单id")
-    private long menuId;
+    private Integer menuId;
     @ApiModelProperty("菜单名称")
     private String menuName;
     @ApiModelProperty("父级id")
-    private Long parentId;
+    private Integer parentId;
     @ApiModelProperty("菜单显示排序")
     private Integer orderNum;
     @ApiModelProperty("请求地址")
@@ -52,11 +52,11 @@ public class SysMenuDTO {
 
     @Id
     @Column(name = "menu_id", nullable = false)
-    public long getMenuId() {
+    public Integer getMenuId() {
         return menuId;
     }
 
-    public void setMenuId(long menuId) {
+    public void setMenuId(Integer menuId) {
         this.menuId = menuId;
     }
 
@@ -72,11 +72,11 @@ public class SysMenuDTO {
 
     @Basic
     @Column(name = "parent_id", nullable = true)
-    public Long getParentId() {
+    public Integer getParentId() {
         return parentId;
     }
 
-    public void setParentId(Long parentId) {
+    public void setParentId(Integer parentId) {
         this.parentId = parentId;
     }
 
@@ -215,7 +215,7 @@ public class SysMenuDTO {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         SysMenuDTO that = (SysMenuDTO) o;
-        return menuId == that.menuId && Objects.equals(menuName, that.menuName) && Objects.equals(parentId, that.parentId) && Objects.equals(orderNum, that.orderNum) && Objects.equals(url, that.url) && Objects.equals(target, that.target) && Objects.equals(menuType, that.menuType) && Objects.equals(visible, that.visible) && Objects.equals(isRefresh, that.isRefresh) && Objects.equals(perms, that.perms) && Objects.equals(icon, that.icon) && Objects.equals(createBy, that.createBy) && Objects.equals(createTime, that.createTime) && Objects.equals(updateBy, that.updateBy) && Objects.equals(updateTime, that.updateTime) && Objects.equals(remark, that.remark);
+        return Objects.equals(menuId, that.menuId) && Objects.equals(menuName, that.menuName) && Objects.equals(parentId, that.parentId) && Objects.equals(orderNum, that.orderNum) && Objects.equals(url, that.url) && Objects.equals(target, that.target) && Objects.equals(menuType, that.menuType) && Objects.equals(visible, that.visible) && Objects.equals(isRefresh, that.isRefresh) && Objects.equals(perms, that.perms) && Objects.equals(icon, that.icon) && Objects.equals(createBy, that.createBy) && Objects.equals(createTime, that.createTime) && Objects.equals(updateBy, that.updateBy) && Objects.equals(updateTime, that.updateTime) && Objects.equals(remark, that.remark);
     }
 
     @Override

+ 3 - 3
src/main/java/com/usky/entity/sys/SysPostDTO.java

@@ -19,7 +19,7 @@ import java.util.Objects;
 @ApiModel(value = "系统-岗位信息DTO")
 public class SysPostDTO {
     @ApiModelProperty("岗位id")
-    private long postId;
+    private Integer postId;
     @ApiModelProperty("岗位编码")
     private String postCode;
     @ApiModelProperty("岗位名称")
@@ -41,11 +41,11 @@ public class SysPostDTO {
 
     @Id
     @Column(name = "post_id", nullable = false)
-    public long getPostId() {
+    public Integer getPostId() {
         return postId;
     }
 
-    public void setPostId(long postId) {
+    public void setPostId(Integer postId) {
         this.postId = postId;
     }
 

+ 5 - 4
src/main/java/com/usky/entity/sys/SysRoleDTO.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import javax.persistence.*;
+import java.io.Serializable;
 import java.sql.Timestamp;
 import java.util.Objects;
 
@@ -16,9 +17,9 @@ import java.util.Objects;
 @Entity
 @Table(name = "sys_role", schema = "jx_cover", catalog = "")
 @ApiModel(value = "角色DTO")
-public class SysRoleDTO {
+public class SysRoleDTO implements Serializable {
     @ApiModelProperty("角色id")
-    private long roleId;
+    private Integer roleId;
     @ApiModelProperty("角色名称")
     private String roleName;
     @ApiModelProperty("角色权限字符")
@@ -44,11 +45,11 @@ public class SysRoleDTO {
 
     @Id
     @Column(name = "role_id", nullable = false)
-    public long getRoleId() {
+    public Integer getRoleId() {
         return roleId;
     }
 
-    public void setRoleId(long roleId) {
+    public void setRoleId(Integer roleId) {
         this.roleId = roleId;
     }
 

+ 6 - 6
src/main/java/com/usky/entity/sys/SysRoleDeptDTO.java

@@ -15,26 +15,26 @@ import java.util.Objects;
 @Table(name = "sys_role_dept", schema = "jx_cover", catalog = "")
 @IdClass(SysRoleDeptDTOPK.class)
 public class SysRoleDeptDTO {
-    private long roleId;
-    private long deptId;
+    private Integer roleId;
+    private Integer deptId;
 
     @Id
     @Column(name = "role_id", nullable = false)
-    public long getRoleId() {
+    public Integer getRoleId() {
         return roleId;
     }
 
-    public void setRoleId(long roleId) {
+    public void setRoleId(Integer roleId) {
         this.roleId = roleId;
     }
 
     @Id
     @Column(name = "dept_id", nullable = false)
-    public long getDeptId() {
+    public Integer getDeptId() {
         return deptId;
     }
 
-    public void setDeptId(long deptId) {
+    public void setDeptId(Integer deptId) {
         this.deptId = deptId;
     }
 

+ 6 - 6
src/main/java/com/usky/entity/sys/SysRoleDeptDTOPK.java

@@ -17,27 +17,27 @@ import java.util.Objects;
 @ApiModel(value = "角色部门DTO")
 public class SysRoleDeptDTOPK implements Serializable {
     @ApiModelProperty("角色id")
-    private long roleId;
+    private Integer roleId;
     @ApiModelProperty("部门id")
-    private long deptId;
+    private Integer deptId;
 
     @Column(name = "role_id", nullable = false)
     @Id
-    public long getRoleId() {
+    public Integer getRoleId() {
         return roleId;
     }
 
-    public void setRoleId(long roleId) {
+    public void setRoleId(Integer roleId) {
         this.roleId = roleId;
     }
 
     @Column(name = "dept_id", nullable = false)
     @Id
-    public long getDeptId() {
+    public Integer getDeptId() {
         return deptId;
     }
 
-    public void setDeptId(long deptId) {
+    public void setDeptId(Integer deptId) {
         this.deptId = deptId;
     }
 

+ 6 - 6
src/main/java/com/usky/entity/sys/SysRoleMenuDTO.java

@@ -13,26 +13,26 @@ import java.util.Objects;
 @Table(name = "sys_role_menu", schema = "jx_cover", catalog = "")
 @IdClass(SysRoleMenuDTOPK.class)
 public class SysRoleMenuDTO {
-    private long roleId;
-    private long menuId;
+    private Integer roleId;
+    private Integer menuId;
 
     @Id
     @Column(name = "role_id", nullable = false)
-    public long getRoleId() {
+    public Integer getRoleId() {
         return roleId;
     }
 
-    public void setRoleId(long roleId) {
+    public void setRoleId(Integer roleId) {
         this.roleId = roleId;
     }
 
     @Id
     @Column(name = "menu_id", nullable = false)
-    public long getMenuId() {
+    public Integer getMenuId() {
         return menuId;
     }
 
-    public void setMenuId(long menuId) {
+    public void setMenuId(Integer menuId) {
         this.menuId = menuId;
     }
 

+ 5 - 5
src/main/java/com/usky/entity/sys/SysRoleMenuDTOPK.java

@@ -17,9 +17,9 @@ import java.util.Objects;
 @ApiModel(value = "角色-菜单DTO")
 public class SysRoleMenuDTOPK implements Serializable {
     @ApiModelProperty("角色id")
-    private long roleId;
+    private Integer roleId;
     @ApiModelProperty("菜单ID")
-    private long menuId;
+    private Integer menuId;
 
     @Column(name = "role_id", nullable = false)
     @Id
@@ -27,17 +27,17 @@ public class SysRoleMenuDTOPK implements Serializable {
         return roleId;
     }
 
-    public void setRoleId(long roleId) {
+    public void setRoleId(Integer roleId) {
         this.roleId = roleId;
     }
 
     @Column(name = "menu_id", nullable = false)
     @Id
-    public long getMenuId() {
+    public Integer getMenuId() {
         return menuId;
     }
 
-    public void setMenuId(long menuId) {
+    public void setMenuId(Integer menuId) {
         this.menuId = menuId;
     }
 

+ 6 - 6
src/main/java/com/usky/entity/sys/SysUserDTO.java

@@ -18,8 +18,8 @@ import java.util.Objects;
 @Table(name = "sys_user", schema = "jx_cover", catalog = "")
 public class SysUserDTO implements Serializable {
     private static final long serialVersionUID = 1L;
-    private long userId;
-    private Long deptId;
+    private Integer userId;
+    private Integer deptId;
     private String loginName;
     private String userName;
     private String userType;
@@ -42,21 +42,21 @@ public class SysUserDTO implements Serializable {
 
     @Id
     @Column(name = "user_id", nullable = false)
-    public long getUserId() {
+    public Integer getUserId() {
         return userId;
     }
 
-    public void setUserId(long userId) {
+    public void setUserId(Integer userId) {
         this.userId = userId;
     }
 
     @Basic
     @Column(name = "dept_id", nullable = true)
-    public Long getDeptId() {
+    public Integer getDeptId() {
         return deptId;
     }
 
-    public void setDeptId(Long deptId) {
+    public void setDeptId(Integer deptId) {
         this.deptId = deptId;
     }
 

+ 6 - 6
src/main/java/com/usky/entity/sys/SysUserPostDTO.java

@@ -13,26 +13,26 @@ import java.util.Objects;
 @Table(name = "sys_user_post", schema = "jx_cover", catalog = "")
 @IdClass(SysUserPostDTOPK.class)
 public class SysUserPostDTO {
-    private long userId;
-    private long postId;
+    private Integer userId;
+    private Integer postId;
 
     @Id
     @Column(name = "user_id", nullable = false)
-    public long getUserId() {
+    public Integer getUserId() {
         return userId;
     }
 
-    public void setUserId(long userId) {
+    public void setUserId(Integer userId) {
         this.userId = userId;
     }
 
     @Id
     @Column(name = "post_id", nullable = false)
-    public long getPostId() {
+    public Integer getPostId() {
         return postId;
     }
 
-    public void setPostId(long postId) {
+    public void setPostId(Integer postId) {
         this.postId = postId;
     }
 

+ 4 - 4
src/main/java/com/usky/entity/sys/SysUserPostDTOPK.java

@@ -17,9 +17,9 @@ import java.util.Objects;
 @ApiModel(value = "系统-用户岗位表")
 public class SysUserPostDTOPK implements Serializable {
     @ApiModelProperty("用户id")
-    private long userId;
+    private Integer userId;
     @ApiModelProperty("岗位id")
-    private long postId;
+    private Integer postId;
 
     @Column(name = "user_id", nullable = false)
     @Id
@@ -27,7 +27,7 @@ public class SysUserPostDTOPK implements Serializable {
         return userId;
     }
 
-    public void setUserId(long userId) {
+    public void setUserId(Integer userId) {
         this.userId = userId;
     }
 
@@ -37,7 +37,7 @@ public class SysUserPostDTOPK implements Serializable {
         return postId;
     }
 
-    public void setPostId(long postId) {
+    public void setPostId(Integer postId) {
         this.postId = postId;
     }
 

+ 6 - 6
src/main/java/com/usky/entity/sys/SysUserRoleDTO.java

@@ -13,26 +13,26 @@ import java.util.Objects;
 @Table(name = "sys_user_role", schema = "jx_cover", catalog = "")
 @IdClass(SysUserRoleDTOPK.class)
 public class SysUserRoleDTO {
-    private long userId;
-    private long roleId;
+    private Integer userId;
+    private Integer roleId;
 
     @Id
     @Column(name = "user_id", nullable = false)
-    public long getUserId() {
+    public Integer getUserId() {
         return userId;
     }
 
-    public void setUserId(long userId) {
+    public void setUserId(Integer userId) {
         this.userId = userId;
     }
 
     @Id
     @Column(name = "role_id", nullable = false)
-    public long getRoleId() {
+    public Integer getRoleId() {
         return roleId;
     }
 
-    public void setRoleId(long roleId) {
+    public void setRoleId(Integer roleId) {
         this.roleId = roleId;
     }
 

+ 5 - 5
src/main/java/com/usky/entity/sys/SysUserRoleDTOPK.java

@@ -17,9 +17,9 @@ import java.util.Objects;
 @ApiModel(value = "系统-用户角色表")
 public class SysUserRoleDTOPK implements Serializable {
     @ApiModelProperty("用户id")
-    private long userId;
+    private Integer userId;
     @ApiModelProperty("角色id")
-    private long roleId;
+    private Integer roleId;
 
     @Column(name = "user_id", nullable = false)
     @Id
@@ -27,17 +27,17 @@ public class SysUserRoleDTOPK implements Serializable {
         return userId;
     }
 
-    public void setUserId(long userId) {
+    public void setUserId(Integer userId) {
         this.userId = userId;
     }
 
     @Column(name = "role_id", nullable = false)
     @Id
-    public long getRoleId() {
+    public Integer getRoleId() {
         return roleId;
     }
 
-    public void setRoleId(long roleId) {
+    public void setRoleId(Integer roleId) {
         this.roleId = roleId;
     }
 

+ 49 - 0
src/main/java/com/usky/entity/sys/vo/SysDeptVO.java

@@ -0,0 +1,49 @@
+package com.usky.entity.sys.vo;
+
+import com.usky.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 14:03
+ * @description TODO
+ **/
+@Data
+public class SysDeptVO extends BaseEntity {
+    @ApiModelProperty("部门id")
+    private Integer deptId;
+    @ApiModelProperty("父级部门id")
+    private Integer parentId;
+    @ApiModelProperty("祖级部门")
+    private String ancestors;
+    @ApiModelProperty("部门名称")
+    private String deptName;
+    @ApiModelProperty("显示排序")
+    private Integer orderNum;
+    @ApiModelProperty("负责人")
+    private String leader;
+    @ApiModelProperty("联系方式")
+    private String phone;
+    @ApiModelProperty("联系邮箱")
+    private String email;
+    @ApiModelProperty("部门状态 0 正常 1停用")
+    private String status;
+    @ApiModelProperty("删除标记 0未删除 1 已删除")
+    private String delFlag;
+    @ApiModelProperty("创建人")
+    private String createBy;
+    @ApiModelProperty("创建时间")
+    private Timestamp createTime;
+    @ApiModelProperty("更新人")
+    private String updateBy;
+    @ApiModelProperty("更新时间")
+    private Timestamp updateTime;
+
+}

+ 57 - 0
src/main/java/com/usky/entity/sys/vo/SysMenuVO.java

@@ -0,0 +1,57 @@
+package com.usky.entity.sys.vo;
+
+import com.usky.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 14:03
+ * @description TODO
+ **/
+@Data
+@ApiModel(value = "系统-菜单VO")
+public class SysMenuVO extends BaseEntity implements Serializable {
+    @ApiModelProperty("菜单id")
+    private Integer menuId;
+    @ApiModelProperty("菜单名称")
+    private String menuName;
+    @ApiModelProperty("父级id")
+    private Integer parentId;
+    @ApiModelProperty("菜单显示排序")
+    private Integer orderNum;
+    @ApiModelProperty("请求地址")
+    private String url;
+    @ApiModelProperty("打开方式menuItem页签 menuBlank新窗口")
+    private String target;
+    @ApiModelProperty("菜单类型(M目录 C菜单 F按钮)")
+    private String menuType;
+    @ApiModelProperty("菜单状态(0显示 1隐藏)")
+    private String visible;
+    @ApiModelProperty("是否刷新(0刷新 1不刷新)")
+    private String isRefresh;
+    @ApiModelProperty("权限标识")
+    private String perms;
+    @ApiModelProperty("菜单图标")
+    private String icon;
+    @ApiModelProperty("创建人")
+    private String createBy;
+    @ApiModelProperty("创建时间")
+    private Timestamp createTime;
+    @ApiModelProperty("更新人")
+    private String updateBy;
+    @ApiModelProperty("更新时间")
+    private Timestamp updateTime;
+    @ApiModelProperty("备注")
+    private String remark;
+    /** 子菜单 */
+    private List<SysMenuVO> children = new ArrayList<SysMenuVO>();
+
+}

+ 46 - 0
src/main/java/com/usky/entity/sys/vo/SysRoleVO.java

@@ -0,0 +1,46 @@
+package com.usky.entity.sys.vo;
+
+import com.usky.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 14:03
+ * @description TODO
+ **/
+@ApiModel(value = "角色VO")
+@Data
+public class SysRoleVO extends BaseEntity implements Serializable {
+    @ApiModelProperty("角色id")
+    private Integer roleId;
+    @ApiModelProperty("角色名称")
+    private String roleName;
+    @ApiModelProperty("角色权限字符")
+    private String roleKey;
+    @ApiModelProperty("角色显示排序")
+    private int roleSort;
+    @ApiModelProperty("数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)")
+    private String dataScope;
+    @ApiModelProperty("角色状态(0正常 1停用)")
+    private String status;
+    @ApiModelProperty("删除标志(0代表存在 1代表删除)")
+    private String delFlag;
+    @ApiModelProperty("创建人")
+    private String createBy;
+    @ApiModelProperty("创建时间")
+    private Timestamp createTime;
+    @ApiModelProperty("更新人")
+    private String updateBy;
+    @ApiModelProperty("更新时间")
+    private Timestamp updateTime;
+    @ApiModelProperty("备注")
+    private String remark;
+}

+ 24 - 9
src/main/java/com/usky/entity/sys/vo/SysUserVO.java

@@ -1,11 +1,15 @@
 package com.usky.entity.sys.vo;
 
+import com.usky.entity.BaseEntity;
+import com.usky.entity.sys.SysRoleDTO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.persistence.*;
+import java.io.Serializable;
 import java.sql.Timestamp;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -14,13 +18,13 @@ import java.util.Objects;
  * @date 2021/8/19 14:03
  * @description TODO
  **/
-@ApiModel("系统-用户DTO")
+@ApiModel("系统-用户VO")
 @Data
-public class SysUserVO {
+public class SysUserVO extends BaseEntity implements Serializable {
     @ApiModelProperty("用户id")
-    private long userId;
+    private Integer userId;
     @ApiModelProperty("部门id")
-    private Long deptId;
+    private Integer deptId;
     @ApiModelProperty("登录名")
     private String loginName;
     @ApiModelProperty("用户名")
@@ -59,13 +63,24 @@ public class SysUserVO {
     private Timestamp updateTime;
     @ApiModelProperty("备注")
     private String remark;
-    public boolean isAdmin()
-    {
+    @ApiModelProperty("部门名称")
+    private String deptName;
+    @ApiModelProperty("部门领导")
+    private String leader;
+
+    public boolean isAdmin() {
         return isAdmin(this.userId);
     }
 
-    public static boolean isAdmin(Long userId)
-    {
-        return userId != null && 1L == userId;
+    public static boolean isAdmin(Integer userId) {
+        return userId != null && 1 == userId;
     }
+
+    private List<SysRoleDTO> roles;
+
+    /** 角色组 */
+    private Long[] roleIds;
+
+    /** 岗位组 */
+    private Long[] postIds;
 }

+ 55 - 0
src/main/java/com/usky/entity/ztree/Ztree.java

@@ -0,0 +1,55 @@
+package com.usky.entity.ztree;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "ztreeVO")
+public class Ztree implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 节点ID
+     */
+    @ApiModelProperty("节点id")
+    private Integer id;
+
+    /**
+     * 节点父ID
+     */
+    @ApiModelProperty("父节点id")
+    private Integer pId;
+
+    /**
+     * 节点名称
+     */
+    @ApiModelProperty("节点名称")
+    private String name;
+
+    /**
+     * 节点标题
+     */
+    @ApiModelProperty("节点标题")
+    private String title;
+
+    /**
+     * 是否勾选
+     */
+    @ApiModelProperty("是否勾选")
+    private boolean checked = false;
+
+    /**
+     * 是否展开
+     */
+    @ApiModelProperty("是否展开")
+    private boolean open = false;
+
+    /**
+     * 是否能勾选
+     */
+    @ApiModelProperty("是否能勾选")
+    private boolean nocheck = false;
+}

+ 81 - 6
src/main/java/com/usky/exception/BaseException.java

@@ -1,25 +1,100 @@
 package com.usky.exception;
 
+import com.usky.utils.SpringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+import sun.misc.MessageUtils;
+
 public class BaseException extends RuntimeException
 {
     private static final long serialVersionUID = 1L;
 
-    protected final String message;
+    /**
+     * 所属模块
+     */
+    private String module;
+
+    /**
+     * 错误码
+     */
+    private String code;
+
+    /**
+     * 错误码对应的参数
+     */
+    private Object[] args;
+
+    /**
+     * 错误消息
+     */
+    private String defaultMessage;
+
+    public BaseException(String module, String code, Object[] args, String defaultMessage)
+    {
+        this.module = module;
+        this.code = code;
+        this.args = args;
+        this.defaultMessage = defaultMessage;
+    }
+
+    public BaseException(String module, String code, Object[] args)
+    {
+        this(module, code, args, null);
+    }
 
-    public BaseException(String message)
+    public BaseException(String module, String defaultMessage)
     {
-        this.message = message;
+        this(module, null, null, defaultMessage);
     }
 
-    public BaseException(String message, Throwable e)
+    public BaseException(String code, Object[] args)
     {
-        super(message, e);
-        this.message = message;
+        this(null, code, args, null);
+    }
+
+    public BaseException(String defaultMessage)
+    {
+        this(null, null, null, defaultMessage);
     }
 
     @Override
     public String getMessage()
     {
+        String message = null;
+        if (!StringUtils.isEmpty(code))
+        {
+            message = message(code, args);
+        }
+        if (message == null)
+        {
+            message = defaultMessage;
+        }
         return message;
     }
+
+    public String getModule()
+    {
+        return module;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public Object[] getArgs()
+    {
+        return args;
+    }
+
+    public String getDefaultMessage()
+    {
+        return defaultMessage;
+    }
+    public static String message(String code, Object... args)
+    {
+        MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
+        return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
+    }
 }

+ 25 - 0
src/main/java/com/usky/exception/BusinessException.java

@@ -0,0 +1,25 @@
+package com.usky.exception;
+
+public class BusinessException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    protected final String message;
+
+    public BusinessException(String message)
+    {
+        this.message = message;
+    }
+
+    public BusinessException(String message, Throwable e)
+    {
+        super(message, e);
+        this.message = message;
+    }
+
+    @Override
+    public String getMessage()
+    {
+        return message;
+    }
+}

+ 155 - 93
src/main/java/com/usky/exception/GloableExceptionResolver.java

@@ -3,23 +3,14 @@ package com.usky.exception;
 import com.usky.utils.Result;
 import com.usky.utils.ServletUtils;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.shiro.authz.UnauthenticatedException;
-import org.apache.shiro.authz.UnauthorizedException;
-import org.springframework.http.HttpStatus;
+import org.apache.shiro.authz.AuthorizationException;
+import org.apache.shiro.util.PermissionUtils;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * @author laowo
@@ -31,99 +22,170 @@ import java.util.Map;
 @Slf4j
 public class GloableExceptionResolver {
 
-    @ExceptionHandler(UnauthorizedException.class)
-    public void calUnauthorizedException(UnauthorizedException e) {
-        PrintWriter writer = null;
-        try {
-            //判断是否是ajax
-            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-            HttpServletRequest request = requestAttributes.getRequest();
-            HttpServletResponse response = requestAttributes.getResponse();
-            String header = request.getHeader("X-Requested-With");
-            if (StringUtils.isNoneBlank(header) && "XMLHttpRequest".equalsIgnoreCase(header)) {
-                response.setCharacterEncoding("UTF-8");
-                response.setContentType("application/json; charset=utf-8");
-                writer = response.getWriter();
-                writer.write("{\"status\":401,\"message\":\"无权访问\"}");
-            } else {
-                String contextPath = request.getContextPath();
-                if ("/".equals(contextPath))
-                    contextPath = "";
-                response.sendRedirect(request.getContextPath() + "/page/toDenied");
-            }
-        } catch (IOException io) {
-            io.printStackTrace();
-        } finally {
-            if (writer != null)
-                writer.close();
-        }
-    }
+//    @ExceptionHandler(UnauthorizedException.class)
+//    public void calUnauthorizedException(UnauthorizedException e) {
+//        PrintWriter writer = null;
+//        try {
+//            //判断是否是ajax
+//            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+//            HttpServletRequest request = requestAttributes.getRequest();
+//            HttpServletResponse response = requestAttributes.getResponse();
+//            String header = request.getHeader("X-Requested-With");
+//            if (StringUtils.isNoneBlank(header) && "XMLHttpRequest".equalsIgnoreCase(header)) {
+//                response.setCharacterEncoding("UTF-8");
+//                response.setContentType("application/json; charset=utf-8");
+//                writer = response.getWriter();
+//                writer.write("{\"status\":401,\"message\":\"无权访问\"}");
+//            } else {
+//                String contextPath = request.getContextPath();
+//                if ("/".equals(contextPath))
+//                    contextPath = "";
+//                response.sendRedirect(request.getContextPath() + "/page/toDenied");
+//            }
+//        } catch (IOException io) {
+//            io.printStackTrace();
+//        } finally {
+//            if (writer != null)
+//                writer.close();
+//        }
+//    }
+//
+//    @ExceptionHandler(UnauthenticatedException.class)
+//    public void calUnauthorizedException(UnauthenticatedException e) {
+//        PrintWriter writer = null;
+//        try {
+//            //判断是否是异步请求
+//            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+//            HttpServletRequest request = requestAttributes.getRequest();
+//            HttpServletResponse response = requestAttributes.getResponse();
+//            String header = request.getHeader("X-Requested-With");
+//            if (StringUtils.isNoneBlank(header) && "XMLHttpRequest".equalsIgnoreCase(header)) {
+//                response.setCharacterEncoding("UTF-8");
+//                response.setContentType("application/json; charset=utf-8");
+//                writer = response.getWriter();
+//                writer.write("{\"status\":302,\"message\":\"请前去登录\"}");
+//            } else {
+//                String contextPath = request.getContextPath();
+//                if ("/".equals(contextPath))
+//                    contextPath = "";
+//                response.sendRedirect(request.getContextPath() + "/login/");
+//            }
+//        } catch (IOException io) {
+//            io.printStackTrace();
+//        } finally {
+//            if (writer != null)
+//                writer.close();
+//        }
+//    }
+//
+//
+//    @ExceptionHandler(BaseException.class)
+//    public Object businessException(HttpServletRequest request, BaseException e) {
+//        log.error(e.getMessage(), e);
+//        if (ServletUtils.isAjaxRequest(request)) {
+//            return Result.error(e.getMessage());
+//        } else {
+//
+//            //  ModelAndView modelAndView = new ModelAndView(); //TODO 异常页面跳转设置
+//            //  modelAndView.addObject("errorMessage", e.getMessage());
+//            //  modelAndView.setViewName("error/business");
+//            //  return modelAndView;
+//
+//            return null;
+//        }
+//    }
+//
+//    @ExceptionHandler(UnavailableSecurityManagerException.class)
+//    @ResponseBody
+//    public Object UnavailableSecurityManagerException(HttpServletRequest request, BaseException e) {
+//        log.error(e.getMessage(), e);
+//        if (ServletUtils.isAjaxRequest(request)) {
+//            return Result.error("用户信息异常,请重新登录");
+//        } else {
+//
+//            //  ModelAndView modelAndView = new ModelAndView(); //TODO 异常页面跳转设置
+//            //  modelAndView.addObject("errorMessage", e.getMessage());
+//            //  modelAndView.setViewName("error/business");
+//            //  return modelAndView;
+//
+//            return null;
+//        }
+//    }
+//
+//
 
-    @ExceptionHandler(UnauthenticatedException.class)
-    public void calUnauthorizedException(UnauthenticatedException e) {
-        PrintWriter writer = null;
-        try {
-            //判断是否是异步请求
-            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-            HttpServletRequest request = requestAttributes.getRequest();
-            HttpServletResponse response = requestAttributes.getResponse();
-            String header = request.getHeader("X-Requested-With");
-            if (StringUtils.isNoneBlank(header) && "XMLHttpRequest".equalsIgnoreCase(header)) {
-                response.setCharacterEncoding("UTF-8");
-                response.setContentType("application/json; charset=utf-8");
-                writer = response.getWriter();
-                writer.write("{\"status\":302,\"message\":\"请前去登录\"}");
-            } else {
-                String contextPath = request.getContextPath();
-                if ("/".equals(contextPath))
-                    contextPath = "";
-                response.sendRedirect(request.getContextPath() + "/login/");
-            }
-        } catch (IOException io) {
-            io.printStackTrace();
-        } finally {
-            if (writer != null)
-                writer.close();
+    /**
+     * 权限校验失败 如果请求为ajax返回json,普通请求跳转页面
+     */
+    @ExceptionHandler(AuthorizationException.class)
+    public Object handleAuthorizationException(HttpServletRequest request, AuthorizationException e)
+    {
+        log.error(e.getMessage(), e);
+        if (ServletUtils.isAjaxRequest(request))
+        {
+            return Result.error("权限错误!");
+        }
+        else
+        {
+//            ModelAndView modelAndView = new ModelAndView();
+//            modelAndView.setViewName("error/unauth");
+//            return modelAndView;
+            return Result.error("权限错误!");
         }
     }
 
 
-    @ExceptionHandler(BaseException.class)
-    public Object businessException(HttpServletRequest request, BaseException e) {
-        log.error(e.getMessage(), e);
-        if (ServletUtils.isAjaxRequest(request)) {
-            return Result.error(e.getMessage());
-        } else {
 
-            //  ModelAndView modelAndView = new ModelAndView(); //TODO 异常页面跳转设置
-            //  modelAndView.addObject("errorMessage", e.getMessage());
-            //  modelAndView.setViewName("error/business");
-            //  return modelAndView;
+    /**
+     * 请求方式不支持
+     */
+    @ExceptionHandler({ HttpRequestMethodNotSupportedException.class })
+    public Result handleException(HttpRequestMethodNotSupportedException e)
+    {
+        log.error(e.getMessage(), e);
+        return Result.error("不支持' " + e.getMethod() + "'请求");
+    }
 
-            return null;
-        }
+    /**
+     * 拦截未知的运行时异常
+     */
+    @ExceptionHandler(RuntimeException.class)
+    public Result notFount(RuntimeException e)
+    {
+        log.error("运行时异常:", e);
+        return Result.error("运行时异常:" + e.getMessage());
     }
 
     /**
-     * 处理所有未知的异常
+     * 系统异常
      */
-  /*  @ExceptionHandler(Exception.class)
-    @ResponseStatus(HttpStatus.BAD_REQUEST)
-    @ResponseBody
-    public Map<String, String> validationExceptionHandler(Exception exception) {
-        Map<String, String> map = new HashMap<>(1);
-        map.put("message", "请求失败,系统异常");
-        return map;
-    }*/
+    @ExceptionHandler(Exception.class)
+    public Result handleException(Exception e)
+    {
+        log.error(e.getMessage(), e);
+        return Result.error("服务器错误,请联系管理员");
+    }
 
     /**
-     * 处理IO异常
+     * 业务异常
      */
-//    @ExceptionHandler(IOException.class)
-//    @ResponseStatus(HttpStatus.BAD_REQUEST)
-//    public Map<String, String> validationExceptionHandler(IOException exception) {
-//        Map<String, String> map = new HashMap<>(1);
-//        map.put("message", "IO异常");
-//        return map;
-//    }
+    @ExceptionHandler(BusinessException.class)
+    public Object businessException(HttpServletRequest request, BusinessException e)
+    {
+        log.error(e.getMessage(), e);
+        if (ServletUtils.isAjaxRequest(request))
+        {
+            return Result.error(e.getMessage());
+        }
+        else
+        {
+           // ModelAndView modelAndView = new ModelAndView();
+           // modelAndView.addObject("errorMessage", e.getMessage());
+           // modelAndView.setViewName("error/business");
+           // return modelAndView;
+            return Result.error(e.getMessage());
+        }
+    }
+
+
 }

+ 18 - 0
src/main/java/com/usky/exception/user/CaptchaException.java

@@ -0,0 +1,18 @@
+package com.usky.exception.user;
+
+import com.usky.exception.BaseException;
+
+/**
+ * 验证码错误异常类
+ * 
+ * @author 
+ */
+public class CaptchaException extends BaseException
+{
+    private static final long serialVersionUID = 1L;
+
+    public CaptchaException()
+    {
+        super("验证码错误");
+    }
+}

+ 18 - 0
src/main/java/com/usky/exception/user/RoleBlockedException.java

@@ -0,0 +1,18 @@
+package com.usky.exception.user;
+
+import com.usky.exception.BaseException;
+
+/**
+ * 角色锁定异常类
+ * 
+ * @author 
+ */
+public class RoleBlockedException extends BaseException
+{
+    private static final long serialVersionUID = 1L;
+
+    public RoleBlockedException()
+    {
+        super("角色错误");
+    }
+}

+ 14 - 0
src/main/java/com/usky/exception/user/UserBlockedException.java

@@ -0,0 +1,14 @@
+package com.usky.exception.user;
+
+/**
+ * 用户锁定异常类
+ *
+ * @author 
+ */
+public class UserBlockedException extends UserException {
+    private static final long serialVersionUID = 1L;
+
+    public UserBlockedException() {
+        super("账户已锁定");
+    }
+}

+ 18 - 0
src/main/java/com/usky/exception/user/UserDeleteException.java

@@ -0,0 +1,18 @@
+package com.usky.exception.user;
+
+import com.usky.exception.BaseException;
+
+/**
+ * 用户账号已被删除
+ * 
+ * @author 
+ */
+public class UserDeleteException extends BaseException
+{
+    private static final long serialVersionUID = 1L;
+
+    public UserDeleteException()
+    {
+        super("用户账户已删除");
+    }
+}

+ 19 - 0
src/main/java/com/usky/exception/user/UserException.java

@@ -0,0 +1,19 @@
+package com.usky.exception.user;
+
+
+import com.usky.exception.BaseException;
+
+/**
+ * 用户信息异常类
+ * 
+ * @author 
+ */
+public class UserException extends BaseException
+{
+    private static final long serialVersionUID = 1L;
+
+    public UserException(String message)
+    {
+        super(message);
+    }
+}

+ 16 - 0
src/main/java/com/usky/exception/user/UserNotExistsException.java

@@ -0,0 +1,16 @@
+package com.usky.exception.user;
+
+import com.usky.exception.BaseException;
+
+/**
+ * 用户不存在异常类
+ *
+ * @author 
+ */
+public class UserNotExistsException extends BaseException {
+    private static final long serialVersionUID = 1L;
+
+    public UserNotExistsException() {
+        super("用户不存在");
+    }
+}

+ 14 - 0
src/main/java/com/usky/exception/user/UserPasswordNotMatchException.java

@@ -0,0 +1,14 @@
+package com.usky.exception.user;
+
+/**
+ * 用户密码不正确或不符合规范异常类
+ *
+ * @author 
+ */
+public class UserPasswordNotMatchException extends UserException {
+    private static final long serialVersionUID = 1L;
+
+    public UserPasswordNotMatchException() {
+        super("用户名或密码错误!");
+    }
+}

+ 16 - 0
src/main/java/com/usky/exception/user/UserPasswordRetryLimitCountException.java

@@ -0,0 +1,16 @@
+package com.usky.exception.user;
+
+/**
+ * 用户错误记数异常类
+ * 
+ * @author 
+ */
+public class UserPasswordRetryLimitCountException extends UserException
+{
+    private static final long serialVersionUID = 1L;
+
+    public UserPasswordRetryLimitCountException(int retryLimitCount)
+    {
+        super("user.password.retry.limit.count");
+    }
+}

+ 16 - 0
src/main/java/com/usky/exception/user/UserPasswordRetryLimitExceedException.java

@@ -0,0 +1,16 @@
+package com.usky.exception.user;
+
+/**
+ * 用户错误最大次数异常类
+ * 
+ * @author 
+ */
+public class UserPasswordRetryLimitExceedException extends UserException
+{
+    private static final long serialVersionUID = 1L;
+
+    public UserPasswordRetryLimitExceedException(int retryLimitCount)
+    {
+        super("user.password.retry.limit.exceed");
+    }
+}

+ 23 - 0
src/main/java/com/usky/service/dept/DeptService.java

@@ -0,0 +1,23 @@
+package com.usky.service.dept;
+
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.ztree.Ztree;
+
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/26 15:52
+ * @description TODO
+ **/
+public interface DeptService {
+    /**
+     * 部门树加载
+     *
+     * @return
+     * @param sysDeptVO
+     */
+    public List<Ztree> list(SysDeptVO sysDeptVO);
+}
+

+ 81 - 0
src/main/java/com/usky/service/dept/DeptServiceImpl.java

@@ -0,0 +1,81 @@
+package com.usky.service.dept;
+
+import com.usky.annotion.DataScope;
+import com.usky.dao.impl.BaseDaoImpl;
+import com.usky.entity.mqtt.TbDeviceInfoDTO;
+import com.usky.entity.sys.SysDeptDTO;
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.ztree.Ztree;
+import com.usky.utils.ListUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.transform.Transformers;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/26 16:13
+ * @description TODO
+ **/
+@Service
+public class DeptServiceImpl extends BaseDaoImpl implements DeptService {
+    @Override
+    @DataScope(deptAlias = "t")
+    public List<Ztree> list(SysDeptVO sysDeptVO) {
+        String dataScope = (String) sysDeptVO.getParams().get("dataScope");
+        System.out.println("dataScope = " + dataScope);
+        StringBuffer sb = new StringBuffer();
+        sb.append("SELECT t.dept_id AS deptId,t.parent_id AS parentId,t.ancestors,t.dept_name AS deptName,t.order_num AS orderNum,t.leader,t.phone,t.email,t.`status`,t.del_flag AS delFlag,t.create_by AS createBy  FROM sys_dept t where t.del_flag = '0'");
+        if (StringUtils.isNotBlank(dataScope)){
+            sb.append(dataScope);
+            sb.append(" order by t.parent_id, t.order_num");
+        }else {
+            sb.append(" order by t.parent_id, t.order_num");
+        }
+        List<SysDeptDTO> list = getSession().createSQLQuery(sb.toString()).setResultTransformer(Transformers.aliasToBean(SysDeptDTO.class)).list();
+        List<Ztree> ztrees = initZtree(list);
+        return ztrees;
+    }
+
+    /**
+     * 对象转部门树
+     *
+     * @param deptList 部门列表
+     * @return 树结构列表
+     */
+    public List<Ztree> initZtree(List<SysDeptDTO> deptList) {
+        return initZtree(deptList, null);
+    }
+
+    /**
+     * 对象转部门树
+     *
+     * @param deptList     部门列表
+     * @param roleDeptList 角色已存在菜单列表
+     * @return 树结构列表
+     */
+    public List<Ztree> initZtree(List<SysDeptDTO> deptList, List<String> roleDeptList) {
+
+        List<Ztree> ztrees = new ArrayList<Ztree>();
+        boolean isCheck = ListUtil.isNotBlank(roleDeptList);
+        for (SysDeptDTO dept : deptList) {
+            if ("0".equals(dept.getStatus())) {
+                Ztree ztree = new Ztree();
+                ztree.setId(dept.getDeptId());
+                ztree.setPId(dept.getParentId());
+                ztree.setName(dept.getDeptName());
+                ztree.setTitle(dept.getDeptName());
+                if (isCheck) {
+                    ztree.setChecked(roleDeptList.contains(dept.getDeptId() + dept.getDeptName()));
+                }
+                ztrees.add(ztree);
+            }
+        }
+        return ztrees;
+    }
+
+
+}

+ 23 - 0
src/main/java/com/usky/service/menuService/MenuService.java

@@ -1,5 +1,11 @@
 package com.usky.service.menuService;
 
+
+
+import com.usky.entity.sys.vo.SysMenuVO;
+import com.usky.entity.sys.vo.SysUserVO;
+
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -16,4 +22,21 @@ public interface MenuService {
      * @return
      */
     public Set<String> qyeryPermsByUserId(long userId);
+
+    /**
+     * 根据当前用户查询菜单
+     * @param user
+     * @return
+     */
+    List<SysMenuVO> queryMenuList(SysUserVO user);
+
+    /**
+     * 根据用户查询菜单
+     * @param sysMenuVO
+     * @param menuName
+     * @param visible
+     * @param userId
+     * @return
+     */
+    List<SysMenuVO> list(SysMenuVO sysMenuVO, String menuName, String visible, Integer userId);
 }

+ 163 - 7
src/main/java/com/usky/service/menuService/MenuServiceImpl.java

@@ -1,17 +1,15 @@
 package com.usky.service.menuService;
 
+import com.usky.annotion.DataScope;
 import com.usky.dao.impl.BaseDaoImpl;
-import com.usky.entity.sys.SysMenuDTO;
-import com.usky.entity.sys.SysRoleDTO;
+
+import com.usky.entity.sys.vo.SysMenuVO;
+import com.usky.entity.sys.vo.SysUserVO;
 import org.apache.commons.lang3.StringUtils;
-import org.aspectj.lang.annotation.SuppressAjWarnings;
 import org.hibernate.transform.Transformers;
 import org.springframework.stereotype.Service;
 
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 /**
  * @author laowo
@@ -45,4 +43,162 @@ public class MenuServiceImpl extends BaseDaoImpl implements MenuService {
         }
         return permsSet;
     }
+
+    @Override
+    @SuppressWarnings("all")
+    @DataScope(deptAlias = "d")
+    public List<SysMenuVO> queryMenuList(SysUserVO user) {
+        String sql = null;
+
+        List<SysMenuVO> menus = new LinkedList<SysMenuVO>();
+        // 管理员显示所有菜单信息
+        if (user.isAdmin()) {
+            sql = "SELECT DISTINCT\n" +
+                    "\tm.menu_id AS menuId,\n" +
+                    "\tm.parent_id AS parentId,\n" +
+                    "\tm.menu_name AS menuName,\n" +
+                    "\tm.url,\n" +
+                    "\tm.visible,\n" +
+                    "\tm.is_refresh as isRefresh,\n" +
+                    "\tifnull( m.perms, '' ) AS perms,\n" +
+                    "\tm.target,\n" +
+                    "\tm.menu_type AS menuType,\n" +
+                    "\tm.icon,\n" +
+                    "\tm.order_num AS orderNum\n" +
+                    //    "\tm.create_time AS createTime \n" +
+                    "FROM\n" +
+                    "\tsys_menu m\n" +
+                    "\tLEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id\n" +
+                    "\tLEFT JOIN sys_user_role ur ON rm.role_id = ur.role_id\n" +
+                    "\tLEFT JOIN sys_role ro ON ur.role_id = ro.role_id \n" +
+                    "WHERE\n" +
+                    "\t m.menu_type in ('M', 'C') and m.visible = 0  AND ro.status = 0\n" +
+                    "\t\n" +
+                    "ORDER BY\n" +
+                    "\tm.parent_id,\n" +
+                    "\tm.order_num";
+            menus = getSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(SysMenuVO.class)).list();
+        } else {
+            String dataScope = (String) user.getParams().get("dataScope");
+            sql = "SELECT DISTINCT\n" +
+                    "\tm.menu_id AS menuId,\n" +
+                    "\tm.parent_id AS parentId,\n" +
+                    "\tm.menu_name AS menuName,\n" +
+                    "\tm.url,\n" +
+                    "\tm.visible,\n" +
+                    "\tm.is_refresh as isRefresh,\n" +
+                    "\tifnull( m.perms, '' ) AS perms,\n" +
+                    "\tm.target,\n" +
+                    "\tm.menu_type AS menuType,\n" +
+                    "\tm.icon,\n" +
+                    "\tm.order_num AS orderNum,\n" +
+                    "\tm.create_time AS createTime \n" +
+                    "FROM\n" +
+                    "\tsys_menu m\n" +
+                    "\tLEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id\n" +
+                    "\tLEFT JOIN sys_user_role ur ON rm.role_id = ur.role_id\n" +
+                    "\tLEFT JOIN sys_role ro ON ur.role_id = ro.role_id \n" +
+                    "WHERE\n" +
+                    "\tur.user_id = " + user.getUserId() + " and m.menu_type in ('M', 'C') and m.visible = 0  AND ro.status = 0 ORDER BY\n" +
+                    "\tm.parent_id,\n" +
+                    "\tm.order_num";
+
+
+            menus = getSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(SysMenuVO.class)).list();
+        }
+        return getChildPerms(menus, 0);
+    }
+
+    @Override
+    public List<SysMenuVO> list(SysMenuVO sysMenuVO, String menuName, String visible, Integer userId) {
+        List<SysMenuVO> menuList = null;
+        if (SysUserVO.isAdmin(userId))
+        //管理员查看全部菜单
+        {
+            StringBuffer sb = new StringBuffer();
+            sb.append("select menu_id AS menuId, menu_name AS menuName, parent_id AS parentId, order_num AS orderNum, url, target, menu_type AS menuType, visible, is_refresh, ifnull(perms,'') as perms, icon, create_by AS createBy, create_time AS createTime from sys_menu where 1 = 1");
+            if (StringUtils.isNotBlank(menuName)) {
+                sb.append(" and menu_name like '%" + menuName + "%'");
+            }
+            if (StringUtils.isNotBlank(visible)) {
+                sb.append(" and visible='" + visible + "'");
+            }
+            sb.append(" order by parent_id, order_num");
+            menuList = getSession().createSQLQuery(sb.toString()).setResultTransformer(Transformers.aliasToBean(SysMenuVO.class)).list();
+        } else {
+            StringBuffer sb = new StringBuffer();
+            //根据用户id查询菜单
+            sb.append("select distinct m.menu_id AS menuId, m.parent_id AS parentId, m.menu_name AS menuName, m.url, m.visible, m.is_refresh AS isRefresh, ifnull(m.perms,'') as perms, m.target, m.menu_type AS menuType, m.icon, m.order_num AS orderNum, m.create_time AS createTime from sys_menu m\n" +
+                    "\t\tleft join sys_role_menu rm on m.menu_id = rm.menu_id\n" +
+                    "\t\tleft join sys_user_role ur on rm.role_id = ur.role_id\n" +
+                    "\t\tLEFT JOIN sys_role ro on ur.role_id = ro.role_id where ur.user_id = " + userId + "");
+            if (StringUtils.isNotBlank(menuName)) {
+                sb.append(" and menu_name like '%" + menuName + "%'");
+            }
+            if (StringUtils.isNotBlank(visible)) {
+                sb.append(" and visible='" + visible + "'");
+            }
+            sb.append(" order by parent_id, order_num");
+            menuList = getSession().createSQLQuery(sb.toString()).setResultTransformer(Transformers.aliasToBean(SysMenuVO.class)).list();
+        }
+        return menuList;
+    }
+    /**
+     * 根据父节点的ID获取所有子节点
+     *
+     * @param list     分类表
+     * @param parentId 传入的父节点ID
+     * @return String
+     */
+    public List<SysMenuVO> getChildPerms(List<SysMenuVO> list, int parentId) {
+        List<SysMenuVO> returnList = new ArrayList<SysMenuVO>();
+        for (Iterator<SysMenuVO> iterator = list.iterator(); iterator.hasNext(); ) {
+            SysMenuVO t = (SysMenuVO) iterator.next();
+            // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
+            if (t.getParentId() == parentId) {
+                recursionFn(list, t);
+                returnList.add(t);
+            }
+        }
+        return returnList;
+    }
+
+    /**
+     * 递归列表
+     *
+     * @param list
+     * @param t
+     */
+    private void recursionFn(List<SysMenuVO> list, SysMenuVO t) {
+        // 得到子节点列表
+        List<SysMenuVO> childList = getChildList(list, t);
+        t.setChildren(childList);
+        for (SysMenuVO tChild : childList) {
+            if (hasChild(list, tChild)) {
+                recursionFn(list, tChild);
+            }
+        }
+    }
+
+    /**
+     * 得到子节点列表
+     */
+    private List<SysMenuVO> getChildList(List<SysMenuVO> list, SysMenuVO t) {
+        List<SysMenuVO> tlist = new ArrayList<SysMenuVO>();
+        Iterator<SysMenuVO> it = list.iterator();
+        while (it.hasNext()) {
+            SysMenuVO n = (SysMenuVO) it.next();
+            if (n.getParentId() == t.getMenuId()) {
+                tlist.add(n);
+            }
+        }
+        return tlist;
+    }
+
+    /**
+     * 判断是否有子节点
+     */
+    private boolean hasChild(List<SysMenuVO> list, SysMenuVO t) {
+        return getChildList(list, t).size() > 0 ? true : false;
+    }
 }

+ 16 - 0
src/main/java/com/usky/service/sys/RoleService.java

@@ -0,0 +1,16 @@
+package com.usky.service.sys;
+
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.sys.vo.SysRoleVO;
+import com.usky.utils.Page;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/27 15:30
+ * @description TODO
+ **/
+public interface RoleService {
+    public Page<SysRoleVO> list(SysDeptVO sysDeptVO, String roleName, String status, String startTime, String endTime, Integer pageSize, Integer pageNo);
+
+}

+ 70 - 0
src/main/java/com/usky/service/sys/RoleServiceImpl.java

@@ -0,0 +1,70 @@
+package com.usky.service.sys;
+
+import com.usky.annotion.DataScope;
+import com.usky.dao.impl.BaseDaoImpl;
+import com.usky.entity.BaseEntity;
+import com.usky.entity.sys.SysDeptDTO;
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.sys.vo.SysRoleVO;
+import com.usky.utils.Page;
+
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.query.NativeQuery;
+import org.hibernate.transform.Transformers;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/27 15:30
+ * @description TODO
+ **/
+@Service
+public class RoleServiceImpl extends BaseDaoImpl implements RoleService {
+    @Override
+    @DataScope(deptAlias = "d")
+    public Page<SysRoleVO> list(SysDeptVO sysDeptVO, String roleName, String status, String startTime, String endTime, Integer pageSize, Integer pageNo) {
+        String dataScope = (String) sysDeptVO.getParams().get("dataScope");
+        StringBuffer sb = new StringBuffer();
+        sb.append("SELECT DISTINCT\n" +
+                "\tr.role_id AS roleId,\n" +
+                "\tr.role_name AS roleName,\n" +
+                "\tr.role_key AS roleKey,\n" +
+                "\tr.role_sort AS roleSort,\n" +
+                "\tr.data_scope AS dataScope ,\n" +
+                "\tr.STATUS as status,\n" +
+                "\tr.del_flag AS delFlag,\n" +
+                "\tr.create_time AS createTime,\n" +
+                "\tr.remark \n" +
+                "FROM\n" +
+                "\tsys_role r\n" +
+                "\tLEFT JOIN sys_user_role ur ON ur.role_id = r.role_id\n" +
+                "\tLEFT JOIN sys_user u ON u.user_id = ur.user_id\n" +
+                "\tLEFT JOIN sys_dept d ON u.dept_id = d.dept_id where r.del_flag = '0' ");
+        if (StringUtils.isNotBlank(status)) {
+            sb.append(" and r.status = '" + startTime + "'");
+        }
+        if (StringUtils.isNotBlank(roleName)) {
+            sb.append(" and r.role_name like '%" + roleName + "%'");
+        }
+        if (StringUtils.isNotBlank(startTime)) {
+            sb.append(" and r.create_time >='" + startTime + "'");
+        }
+        if (StringUtils.isNotBlank(endTime)) {
+            sb.append(" and r.create_time <='" + endTime + "'");
+        }
+        if (StringUtils.isNotBlank(dataScope)) {
+            sb.append(dataScope);
+        }
+        List totalCount = getSession().createSQLQuery(sb.toString()).list();
+        Page<SysRoleVO> result = new Page<>(totalCount.size(), pageSize);
+        NativeQuery query = getSession().createSQLQuery(sb.toString());
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        List<SysRoleVO> list = query.setResultTransformer(Transformers.aliasToBean(SysRoleVO.class)).list();
+        result.setPageList(list);
+        return result;
+    }
+}

+ 30 - 0
src/main/java/com/usky/service/user/LoginServiceImpl.java

@@ -33,8 +33,38 @@ public class LoginServiceImpl extends BaseDaoImpl implements LoginService {
         if (ListUtil.isBlank(list)) {
             throw new UserPasswordNotMatchException();
         }
+        List<SysRoleDTO> sysRoleDTOS = queryRoleByLoginName(username);
         List<SysUserVO> sysUserVOS = BeanHelp.copyWithCollection(list, SysUserVO.class);
+        for (SysUserVO sysUserVO : sysUserVOS) {
+            sysUserVO.setRoles(sysRoleDTOS);
+        }
+        //查询用户角色
+
         return sysUserVOS.get(0);
     }
 
+    /**
+     * 根据用户名查询用户角色
+     *
+     * @return
+     */
+    @SuppressWarnings("all")
+    public List<SysRoleDTO> queryRoleByLoginName(String username) {
+        List<SysRoleDTO> list = getSession().createSQLQuery("\tSELECT\n" +
+                "\tr.role_id AS roleId,\n" +
+                "\tr.role_name AS roleName,\n" +
+                "\tr.role_key AS roleKey,\n" +
+                "\tr.role_sort AS roleSort,\n" +
+                "\tr.data_scope AS dataScope,\n" +
+                "\tr.`status`\n" +
+                "FROM\n" +
+                "\tsys_role r\n" +
+                "\tJOIN sys_user_role ur ON r.role_id = ur.role_id\n" +
+                "\tJOIN sys_user u ON ur.user_id = u.user_id \n" +
+                "WHERE u.login_name = '" + username + "' ORDER BY role_sort").
+                setResultTransformer(Transformers.aliasToBean(SysRoleDTO.class)).list();
+        return list;
+    }
+
+
 }

+ 19 - 0
src/main/java/com/usky/service/user/UserService.java

@@ -1,7 +1,10 @@
 package com.usky.service.user;
 
 import com.usky.entity.sys.SysUserDTO;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.utils.Page;
 
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -22,4 +25,20 @@ public interface UserService {
      * @return
      */
     Set<String> queryRoleKeys(long userId);
+
+    /**
+     * 用户查询
+     *
+     * @param status
+     * @param loginName
+     * @param phonenumber
+     * @param startTime
+     * @param endTime
+     * @param deptId
+     * @param pageSize
+     * @param pageNo
+     * @param sysUserVO
+     * @return
+     */
+    Page<SysUserVO> list(SysUserVO sysUserVO,Integer status, String loginName, String phonenumber, String startTime, String endTime, Integer deptId, Integer pageSize, Integer pageNo);
 }

+ 52 - 5
src/main/java/com/usky/service/user/UserServiceImpl.java

@@ -1,18 +1,20 @@
 package com.usky.service.user;
 
+import com.usky.annotion.DataScope;
 import com.usky.dao.impl.BaseDaoImpl;
 import com.usky.entity.sys.SysRoleDTO;
 import com.usky.entity.sys.SysUserDTO;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.utils.Page;
 import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.crypto.hash.Md5Hash;
+import org.hibernate.query.NativeQuery;
 import org.hibernate.transform.Transformers;
 import org.springframework.stereotype.Service;
 
 import java.sql.Timestamp;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 /**
  * @author laowo
@@ -42,7 +44,7 @@ public class UserServiceImpl extends BaseDaoImpl implements UserService {
                 "\tr.role_id AS roleId,\n" +
                 "\tr.role_name AS roleName,\n" +
                 "\tr.role_key AS roleKey,\n" +
-                "\tr.role_sort AS role_sort,\n" +
+                "\tr.role_sort AS roleSort,\n" +
                 "\tr.data_scope AS dataScope,\n" +
                 "\tr.STATUS AS `status`,\n" +
                 "\tr.del_flag AS delFlag,\n" +
@@ -63,4 +65,49 @@ public class UserServiceImpl extends BaseDaoImpl implements UserService {
         }
         return permsSet;
     }
+
+
+    @Override
+    @DataScope(deptAlias = "d",userAlias = "u")
+    public Page<SysUserVO> list(SysUserVO sysUserVO, Integer status, String loginName, String phonenumber, String startTime, String endTime, Integer deptId, Integer pageSize, Integer pageNo) {
+        Map<String, Object> params = sysUserVO.getParams();
+        String dataScope = (String) params.get("dataScope");
+        StringBuilder sb = new StringBuilder();
+        sb.append("select u.user_id as userId, u.dept_id as deptId, u.login_name as loginName, u.user_name as userName, u.user_type as userType, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag as delFlag, u.login_ip as loginIp, u.login_date as loginDate, u.create_by as createBy, u.create_time as createTime, u.remark, d.dept_name as deptName, d.leader from sys_user u left join sys_dept d on u.dept_id = d.dept_id where u.del_flag = '0'");
+        if (null != status && status != 0) {
+            sb.append("  AND u.status = " + status + "");
+        }
+        if (StringUtils.isNotBlank(loginName)) {
+            sb.append("AND u.login_name like '%" + loginName + "%'");
+        }
+        if (StringUtils.isNotBlank(phonenumber)) {
+            sb.append(" AND u.phonenumber like '%" + phonenumber + "%'");
+        }
+        if (StringUtils.isNotBlank(startTime)) {
+            sb.append(" AND u.create_time >= " + startTime + "");
+        }
+        if (StringUtils.isNotBlank(endTime)) {
+            sb.append("  AND u.create_time <= " + endTime + "");
+        }
+        if (null != deptId && deptId != 0) {
+            sb.append("AND (u.dept_id = " + deptId + " OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE FIND_IN_SET (" + deptId + ",ancestors) ))");
+        }
+        if (StringUtils.isNotBlank(dataScope)){
+            sb.append(" ").append(dataScope);
+        }
+        List list = getSession().createSQLQuery(sb.toString()).list();
+
+        Page<SysUserVO> result = new Page<>(list.size(), pageSize);
+        NativeQuery sqlQuery = getSession().createSQLQuery(sb.toString());
+        sqlQuery.setFirstResult((pageNo - 1) * pageSize);
+        sqlQuery.setMaxResults(pageSize);
+        List<SysUserVO> sysUserVOList = sqlQuery.setResultTransformer(Transformers.aliasToBean(SysUserVO.class)).list();
+        result.setPageList(sysUserVOList);
+        result.setPageNo(pageNo);
+        return result;
+    }
+
+
+
+
 }

+ 85 - 0
src/main/java/com/usky/utils/CharsetKit.java

@@ -0,0 +1,85 @@
+package com.usky.utils;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 字符集工具类
+ * 
+ * @author 
+ */
+public class CharsetKit
+{
+    /** ISO-8859-1 */
+    public static final String ISO_8859_1 = "ISO-8859-1";
+    /** UTF-8 */
+    public static final String UTF_8 = "UTF-8";
+    /** GBK */
+    public static final String GBK = "GBK";
+
+    /** ISO-8859-1 */
+    public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
+    /** UTF-8 */
+    public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
+    /** GBK */
+    public static final Charset CHARSET_GBK = Charset.forName(GBK);
+
+    /**
+     * 转换为Charset对象
+     * 
+     * @param charset 字符集,为空则返回默认字符集
+     * @return Charset
+     */
+    public static Charset charset(String charset)
+    {
+        return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
+    }
+
+    /**
+     * 转换字符串的字符集编码
+     * 
+     * @param source 字符串
+     * @param srcCharset 源字符集,默认ISO-8859-1
+     * @param destCharset 目标字符集,默认UTF-8
+     * @return 转换后的字符集
+     */
+    public static String convert(String source, String srcCharset, String destCharset)
+    {
+        return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
+    }
+
+    /**
+     * 转换字符串的字符集编码
+     * 
+     * @param source 字符串
+     * @param srcCharset 源字符集,默认ISO-8859-1
+     * @param destCharset 目标字符集,默认UTF-8
+     * @return 转换后的字符集
+     */
+    public static String convert(String source, Charset srcCharset, Charset destCharset)
+    {
+        if (null == srcCharset)
+        {
+            srcCharset = StandardCharsets.ISO_8859_1;
+        }
+
+        if (null == destCharset)
+        {
+            destCharset = StandardCharsets.UTF_8;
+        }
+
+        if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
+        {
+            return source;
+        }
+        return new String(source.getBytes(srcCharset), destCharset);
+    }
+
+    /**
+     * @return 系统字符集编码
+     */
+    public static String systemCharset()
+    {
+        return Charset.defaultCharset().name();
+    }
+}

+ 1005 - 0
src/main/java/com/usky/utils/Convert.java

@@ -0,0 +1,1005 @@
+package com.usky.utils;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.text.NumberFormat;
+import java.util.Set;
+
+/**
+ * 类型转换器
+ * 
+ * @author 
+ */
+public class Convert
+{
+    /**
+     * 转换为字符串<br>
+     * 如果给定的值为null,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static String toStr(Object value, String defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof String)
+        {
+            return (String) value;
+        }
+        return value.toString();
+    }
+
+    /**
+     * 转换为字符串<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static String toStr(Object value)
+    {
+        return toStr(value, null);
+    }
+
+    /**
+     * 转换为字符<br>
+     * 如果给定的值为null,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Character toChar(Object value, Character defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Character)
+        {
+            return (Character) value;
+        }
+
+        final String valueStr = toStr(value, null);
+        return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
+    }
+
+    /**
+     * 转换为字符<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Character toChar(Object value)
+    {
+        return toChar(value, null);
+    }
+
+    /**
+     * 转换为byte<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Byte toByte(Object value, Byte defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Byte)
+        {
+            return (Byte) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).byteValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Byte.parseByte(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为byte<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Byte toByte(Object value)
+    {
+        return toByte(value, null);
+    }
+
+    /**
+     * 转换为Short<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Short toShort(Object value, Short defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Short)
+        {
+            return (Short) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).shortValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Short.parseShort(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Short<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Short toShort(Object value)
+    {
+        return toShort(value, null);
+    }
+
+    /**
+     * 转换为Number<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Number toNumber(Object value, Number defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Number)
+        {
+            return (Number) value;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return NumberFormat.getInstance().parse(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Number<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Number toNumber(Object value)
+    {
+        return toNumber(value, null);
+    }
+
+    /**
+     * 转换为int<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Integer toInt(Object value, Integer defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Integer)
+        {
+            return (Integer) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).intValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Integer.parseInt(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为int<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Integer toInt(Object value)
+    {
+        return toInt(value, null);
+    }
+
+    /**
+     * 转换为Integer数组<br>
+     * 
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Integer[] toIntArray(String str)
+    {
+        return toIntArray(",", str);
+    }
+
+    /**
+     * 转换为Long数组<br>
+     * 
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Long[] toLongArray(String str)
+    {
+        return toLongArray(",", str);
+    }
+
+    /**
+     * 转换为Integer数组<br>
+     * 
+     * @param split 分隔符
+     * @param split 被转换的值
+     * @return 结果
+     */
+    public static Integer[] toIntArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Integer[] {};
+        }
+        String[] arr = str.split(split);
+        final Integer[] ints = new Integer[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Integer v = toInt(arr[i], 0);
+            ints[i] = v;
+        }
+        return ints;
+    }
+
+    /**
+     * 转换为Long数组<br>
+     * 
+     * @param split 分隔符
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static Long[] toLongArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Long[] {};
+        }
+        String[] arr = str.split(split);
+        final Long[] longs = new Long[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Long v = toLong(arr[i], null);
+            longs[i] = v;
+        }
+        return longs;
+    }
+
+    /**
+     * 转换为String数组<br>
+     * 
+     * @param str 被转换的值
+     * @return 结果
+     */
+    public static String[] toStrArray(String str)
+    {
+        return toStrArray(",", str);
+    }
+
+    /**
+     * 转换为String数组<br>
+     * 
+     * @param split 分隔符
+     * @param split 被转换的值
+     * @return 结果
+     */
+    public static String[] toStrArray(String split, String str)
+    {
+        return str.split(split);
+    }
+
+    /**
+     * 转换为long<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Long toLong(Object value, Long defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Long)
+        {
+            return (Long) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).longValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 支持科学计数法
+            return new BigDecimal(valueStr.trim()).longValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为long<br>
+     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Long toLong(Object value)
+    {
+        return toLong(value, null);
+    }
+
+    /**
+     * 转换为double<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Double toDouble(Object value, Double defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Double)
+        {
+            return (Double) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).doubleValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 支持科学计数法
+            return new BigDecimal(valueStr.trim()).doubleValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为double<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Double toDouble(Object value)
+    {
+        return toDouble(value, null);
+    }
+
+    /**
+     * 转换为Float<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Float toFloat(Object value, Float defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Float)
+        {
+            return (Float) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).floatValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Float.parseFloat(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Float<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Float toFloat(Object value)
+    {
+        return toFloat(value, null);
+    }
+
+    /**
+     * 转换为boolean<br>
+     * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Boolean toBool(Object value, Boolean defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Boolean)
+        {
+            return (Boolean) value;
+        }
+        String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        valueStr = valueStr.trim().toLowerCase();
+        switch (valueStr)
+        {
+            case "true":
+                return true;
+            case "false":
+                return false;
+            case "yes":
+                return true;
+            case "ok":
+                return true;
+            case "no":
+                return false;
+            case "1":
+                return true;
+            case "0":
+                return false;
+            default:
+                return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为boolean<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static Boolean toBool(Object value)
+    {
+        return toBool(value, null);
+    }
+
+    /**
+     * 转换为Enum对象<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 
+     * @param clazz Enum的Class
+     * @param value 值
+     * @param defaultValue 默认值
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (clazz.isAssignableFrom(value.getClass()))
+        {
+            @SuppressWarnings("unchecked")
+            E myE = (E) value;
+            return myE;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Enum.valueOf(clazz, valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为Enum对象<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 
+     * @param clazz Enum的Class
+     * @param value 值
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value)
+    {
+        return toEnum(clazz, value, null);
+    }
+
+    /**
+     * 转换为BigInteger<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static BigInteger toBigInteger(Object value, BigInteger defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigInteger)
+        {
+            return (BigInteger) value;
+        }
+        if (value instanceof Long)
+        {
+            return BigInteger.valueOf((Long) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigInteger(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为BigInteger<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static BigInteger toBigInteger(Object value)
+    {
+        return toBigInteger(value, null);
+    }
+
+    /**
+     * 转换为BigDecimal<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigDecimal)
+        {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Long)
+        {
+            return new BigDecimal((Long) value);
+        }
+        if (value instanceof Double)
+        {
+            return new BigDecimal((Double) value);
+        }
+        if (value instanceof Integer)
+        {
+            return new BigDecimal((Integer) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigDecimal(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 转换为BigDecimal<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @return 结果
+     */
+    public static BigDecimal toBigDecimal(Object value)
+    {
+        return toBigDecimal(value, null);
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     * 
+     * @param obj 对象
+     * @return 字符串
+     */
+    public static String utf8Str(Object obj)
+    {
+        return str(obj, CharsetKit.CHARSET_UTF_8);
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     * 
+     * @param obj 对象
+     * @param charsetName 字符集
+     * @return 字符串
+     */
+    public static String str(Object obj, String charsetName)
+    {
+        return str(obj, Charset.forName(charsetName));
+    }
+
+    /**
+     * 将对象转为字符串<br>
+     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
+     * 
+     * @param obj 对象
+     * @param charset 字符集
+     * @return 字符串
+     */
+    public static String str(Object obj, Charset charset)
+    {
+        if (null == obj)
+        {
+            return null;
+        }
+
+        if (obj instanceof String)
+        {
+            return (String) obj;
+        }
+        else if (obj instanceof byte[])
+        {
+            return str((byte[]) obj, charset);
+        }
+        else if (obj instanceof Byte[])
+        {
+            byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj);
+            return str(bytes, charset);
+        }
+        else if (obj instanceof ByteBuffer)
+        {
+            return str((ByteBuffer) obj, charset);
+        }
+        return obj.toString();
+    }
+
+    /**
+     * 将byte数组转为字符串
+     * 
+     * @param bytes byte数组
+     * @param charset 字符集
+     * @return 字符串
+     */
+    public static String str(byte[] bytes, String charset)
+    {
+        return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+    }
+
+    /**
+     * 解码字节码
+     * 
+     * @param data 字符串
+     * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
+     * @return 解码后的字符串
+     */
+    public static String str(byte[] data, Charset charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        if (null == charset)
+        {
+            return new String(data);
+        }
+        return new String(data, charset);
+    }
+
+    /**
+     * 将编码的byteBuffer数据转换为字符串
+     * 
+     * @param data 数据
+     * @param charset 字符集,如果为空使用当前系统字符集
+     * @return 字符串
+     */
+    public static String str(ByteBuffer data, String charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        return str(data, Charset.forName(charset));
+    }
+
+    /**
+     * 将编码的byteBuffer数据转换为字符串
+     * 
+     * @param data 数据
+     * @param charset 字符集,如果为空使用当前系统字符集
+     * @return 字符串
+     */
+    public static String str(ByteBuffer data, Charset charset)
+    {
+        if (null == charset)
+        {
+            charset = Charset.defaultCharset();
+        }
+        return charset.decode(data).toString();
+    }
+
+    // ----------------------------------------------------------------------- 全角半角转换
+    /**
+     * 半角转全角
+     * 
+     * @param input String.
+     * @return 全角字符串.
+     */
+    public static String toSBC(String input)
+    {
+        return toSBC(input, null);
+    }
+
+    /**
+     * 半角转全角
+     * 
+     * @param input String
+     * @param notConvertSet 不替换的字符集合
+     * @return 全角字符串.
+     */
+    public static String toSBC(String input, Set<Character> notConvertSet)
+    {
+        char c[] = input.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 跳过不替换的字符
+                continue;
+            }
+
+            if (c[i] == ' ')
+            {
+                c[i] = '\u3000';
+            }
+            else if (c[i] < '\177')
+            {
+                c[i] = (char) (c[i] + 65248);
+
+            }
+        }
+        return new String(c);
+    }
+
+    /**
+     * 全角转半角
+     * 
+     * @param input String.
+     * @return 半角字符串
+     */
+    public static String toDBC(String input)
+    {
+        return toDBC(input, null);
+    }
+
+    /**
+     * 替换全角为半角
+     * 
+     * @param text 文本
+     * @param notConvertSet 不替换的字符集合
+     * @return 替换后的字符
+     */
+    public static String toDBC(String text, Set<Character> notConvertSet)
+    {
+        char c[] = text.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 跳过不替换的字符
+                continue;
+            }
+
+            if (c[i] == '\u3000')
+            {
+                c[i] = ' ';
+            }
+            else if (c[i] > '\uFF00' && c[i] < '\uFF5F')
+            {
+                c[i] = (char) (c[i] - 65248);
+            }
+        }
+        String returnString = new String(c);
+
+        return returnString;
+    }
+
+    /**
+     * 数字金额大写转换 先写个完整的然后将如零拾替换成零
+     * 
+     * @param n 数字
+     * @return 中文大写数字
+     */
+    public static String digitUppercase(double n)
+    {
+        String[] fraction = { "角", "分" };
+        String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
+        String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } };
+
+        String head = n < 0 ? "负" : "";
+        n = Math.abs(n);
+
+        String s = "";
+        for (int i = 0; i < fraction.length; i++)
+        {
+            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
+        }
+        if (s.length() < 1)
+        {
+            s = "整";
+        }
+        int integerPart = (int) Math.floor(n);
+
+        for (int i = 0; i < unit[0].length && integerPart > 0; i++)
+        {
+            String p = "";
+            for (int j = 0; j < unit[1].length && n > 0; j++)
+            {
+                p = digit[integerPart % 10] + unit[1][j] + p;
+                integerPart = integerPart / 10;
+            }
+            s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
+        }
+        return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
+    }
+}

+ 16 - 7
src/main/java/com/usky/utils/ShiroUtils.java

@@ -2,6 +2,8 @@ package com.usky.utils;
 
 import com.usky.entity.sys.SysUserDTO;
 import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.exception.BusinessException;
+import com.usky.exception.user.UserException;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.crypto.SecureRandomNumberGenerator;
 import org.apache.shiro.session.Session;
@@ -26,9 +28,10 @@ public class ShiroUtils {
     public static SysUserDTO getSysUser() {
         SysUserDTO user = null;
         Object obj = getSubject().getPrincipal();
-        if (null != null) {
-            user = new SysUserDTO();
-            BeanUtils.copyProperties(user,obj);
+        if (obj != null) {
+            //user = new SysUserDTO();
+            //BeanUtils.copyProperties(user,obj);
+            user = (SysUserDTO) getSubject().getPrincipal();
         }
         return user;
     }
@@ -36,9 +39,12 @@ public class ShiroUtils {
     public static SysUserVO getSysUserVo() {
         SysUserVO user = null;
         Object obj = getSubject().getPrincipal();
-        if (null != null) {
-            user = new SysUserVO();
-            BeanUtils.copyProperties(user,obj);
+        if (obj != null) {
+          //  user = new SysUserVO();
+          //  BeanUtils.copyProperties(user, obj);
+            user = (SysUserVO) getSubject().getPrincipal();
+        }else {
+            throw new BusinessException("用户未登录");
         }
         return user;
     }
@@ -52,9 +58,12 @@ public class ShiroUtils {
         subject.runAs(newPrincipalCollection);
     }
 
-    public static Long getUserId() {
+    public static Integer getUserId() {
         return getSysUser().getUserId();
     }
+    public static Integer getUserVOId() {
+        return getSysUserVo().getUserId();
+    }
 
     public static String getLoginName() {
         return getSysUser().getLoginName();

+ 145 - 0
src/main/java/com/usky/utils/SpringUtils.java

@@ -0,0 +1,145 @@
+package com.usky.utils;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * spring工具类 方便在非spring管理环境中获取bean
+ *
+ */
+@Component
+public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware
+{
+    /** Spring应用上下文环境 */
+    private static ConfigurableListableBeanFactory beanFactory;
+
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
+    {
+        SpringUtils.beanFactory = beanFactory;
+    }
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
+    {
+        SpringUtils.applicationContext = applicationContext;
+    }
+
+    /**
+     * 获取对象
+     *
+     * @param name
+     * @return Object 一个以所给名字注册的bean的实例
+     * @throws BeansException
+     *
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getBean(String name) throws BeansException
+    {
+        return (T) beanFactory.getBean(name);
+    }
+
+    /**
+     * 获取类型为requiredType的对象
+     *
+     * @param clz
+     * @return
+     * @throws BeansException
+     *
+     */
+    public static <T> T getBean(Class<T> clz) throws BeansException
+    {
+        T result = (T) beanFactory.getBean(clz);
+        return result;
+    }
+
+    /**
+     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
+     *
+     * @param name
+     * @return boolean
+     */
+    public static boolean containsBean(String name)
+    {
+        return beanFactory.containsBean(name);
+    }
+
+    /**
+     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
+     *
+     * @param name
+     * @return boolean
+     * @throws NoSuchBeanDefinitionException
+     *
+     */
+    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.isSingleton(name);
+    }
+
+    /**
+     * @param name
+     * @return Class 注册对象的类型
+     * @throws NoSuchBeanDefinitionException
+     *
+     */
+    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.getType(name);
+    }
+
+    /**
+     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
+     *
+     * @param name
+     * @return
+     * @throws NoSuchBeanDefinitionException
+     *
+     */
+    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.getAliases(name);
+    }
+
+    /**
+     * 获取aop代理对象
+     * 
+     * @param invoker
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getAopProxy(T invoker)
+    {
+        return (T) AopContext.currentProxy();
+    }
+
+    /**
+     * 获取当前的环境配置,无配置返回null
+     *
+     * @return 当前的环境配置
+     */
+    public static String[] getActiveProfiles()
+    {
+        return applicationContext.getEnvironment().getActiveProfiles();
+    }
+
+//    /**
+//     * 获取当前的环境配置,当有多个环境配置时,只获取第一个
+//     *
+//     * @return 当前的环境配置
+//     */
+//    public static String getActiveProfile()
+//    {
+//        final String[] activeProfiles = getActiveProfiles();
+//        return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null;
+//    }
+}

+ 92 - 0
src/main/java/com/usky/utils/StrFormatter.java

@@ -0,0 +1,92 @@
+package com.usky.utils;
+
+
+
+/**
+ * 字符串格式化
+ * 
+ * @author 
+ */
+public class StrFormatter
+{
+    public static final String EMPTY_JSON = "{}";
+    public static final char C_BACKSLASH = '\\';
+    public static final char C_DELIM_START = '{';
+    public static final char C_DELIM_END = '}';
+
+    /**
+     * 格式化字符串<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     * 
+     * @param strPattern 字符串模板
+     * @param argArray 参数列表
+     * @return 结果
+     */
+    public static String format(final String strPattern, final Object... argArray)
+    {
+        if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
+        {
+            return strPattern;
+        }
+        final int strPatternLength = strPattern.length();
+
+        // 初始化定义好的长度以获得更好的性能
+        StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
+
+        int handledPosition = 0;
+        int delimIndex;// 占位符所在位置
+        for (int argIndex = 0; argIndex < argArray.length; argIndex++)
+        {
+            delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
+            if (delimIndex == -1)
+            {
+                if (handledPosition == 0)
+                {
+                    return strPattern;
+                }
+                else
+                { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
+                    sbuf.append(strPattern, handledPosition, strPatternLength);
+                    return sbuf.toString();
+                }
+            }
+            else
+            {
+                if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
+                {
+                    if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
+                    {
+                        // 转义符之前还有一个转义符,占位符依旧有效
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                        handledPosition = delimIndex + 2;
+                    }
+                    else
+                    {
+                        // 占位符被转义
+                        argIndex--;
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(C_DELIM_START);
+                        handledPosition = delimIndex + 1;
+                    }
+                }
+                else
+                {
+                    // 正常占位符
+                    sbuf.append(strPattern, handledPosition, delimIndex);
+                    sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                    handledPosition = delimIndex + 2;
+                }
+            }
+        }
+        // 加入最后一个占位符后所有的字符
+        sbuf.append(strPattern, handledPosition, strPattern.length());
+
+        return sbuf.toString();
+    }
+}

+ 409 - 0
src/main/java/com/usky/utils/StringUtils.java

@@ -0,0 +1,409 @@
+package com.usky.utils;
+
+
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * 字符串工具类
+ * 
+ * @author 
+ */
+public class StringUtils extends org.apache.commons.lang3.StringUtils
+{
+    /** 空字符串 */
+    private static final String NULLSTR = "";
+
+    /** 下划线 */
+    private static final char SEPARATOR = '_';
+
+    /**
+     * 获取参数不为空值
+     * 
+     * @param value defaultValue 要判断的value
+     * @return value 返回值
+     */
+    public static <T> T nvl(T value, T defaultValue)
+    {
+        return value != null ? value : defaultValue;
+    }
+
+    /**
+     * * 判断一个Collection是否为空, 包含List,Set,Queue
+     * 
+     * @param coll 要判断的Collection
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Collection<?> coll)
+    {
+        return isNull(coll) || coll.isEmpty();
+    }
+
+    /**
+     * * 判断一个Collection是否非空,包含List,Set,Queue
+     * 
+     * @param coll 要判断的Collection
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Collection<?> coll)
+    {
+        return !isEmpty(coll);
+    }
+
+    /**
+     * * 判断一个对象数组是否为空
+     * 
+     * @param objects 要判断的对象数组
+     ** @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Object[] objects)
+    {
+        return isNull(objects) || (objects.length == 0);
+    }
+
+    /**
+     * * 判断一个对象数组是否非空
+     * 
+     * @param objects 要判断的对象数组
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Object[] objects)
+    {
+        return !isEmpty(objects);
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     * 
+     * @param map 要判断的Map
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(Map<?, ?> map)
+    {
+        return isNull(map) || map.isEmpty();
+    }
+
+    /**
+     * * 判断一个Map是否为空
+     * 
+     * @param map 要判断的Map
+     * @return true:非空 false:空
+     */
+    public static boolean isNotEmpty(Map<?, ?> map)
+    {
+        return !isEmpty(map);
+    }
+
+    /**
+     * * 判断一个字符串是否为空串
+     * 
+     * @param str String
+     * @return true:为空 false:非空
+     */
+    public static boolean isEmpty(String str)
+    {
+        return isNull(str) || NULLSTR.equals(str.trim());
+    }
+
+    /**
+     * * 判断一个字符串是否为非空串
+     * 
+     * @param str String
+     * @return true:非空串 false:空串
+     */
+    public static boolean isNotEmpty(String str)
+    {
+        return !isEmpty(str);
+    }
+
+    /**
+     * * 判断一个对象是否为空
+     * 
+     * @param object Object
+     * @return true:为空 false:非空
+     */
+    public static boolean isNull(Object object)
+    {
+        return object == null;
+    }
+
+    /**
+     * * 判断一个对象是否非空
+     * 
+     * @param object Object
+     * @return true:非空 false:空
+     */
+    public static boolean isNotNull(Object object)
+    {
+        return !isNull(object);
+    }
+
+    /**
+     * * 判断一个对象是否是数组类型(Java基本型别的数组)
+     * 
+     * @param object 对象
+     * @return true:是数组 false:不是数组
+     */
+    public static boolean isArray(Object object)
+    {
+        return isNotNull(object) && object.getClass().isArray();
+    }
+
+    /**
+     * 去空格
+     */
+    public static String trim(String str)
+    {
+        return (str == null ? "" : str.trim());
+    }
+
+    /**
+     * 截取字符串
+     * 
+     * @param str 字符串
+     * @param start 开始
+     * @return 结果
+     */
+    public static String substring(final String str, int start)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (start > str.length())
+        {
+            return NULLSTR;
+        }
+
+        return str.substring(start);
+    }
+
+    /**
+     * 截取字符串
+     * 
+     * @param str 字符串
+     * @param start 开始
+     * @param end 结束
+     * @return 结果
+     */
+    public static String substring(final String str, int start, int end)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (end < 0)
+        {
+            end = str.length() + end;
+        }
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (end > str.length())
+        {
+            end = str.length();
+        }
+
+        if (start > end)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (end < 0)
+        {
+            end = 0;
+        }
+
+        return str.substring(start, end);
+    }
+
+    /**
+     * 格式化文本, {} 表示占位符<br>
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
+     * 例:<br>
+     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     * 
+     * @param template 文本模板,被替换的部分用 {} 表示
+     * @param params 参数值
+     * @return 格式化后的文本
+     */
+    public static String format(String template, Object... params)
+    {
+        if (isEmpty(params) || isEmpty(template))
+        {
+            return template;
+        }
+        return StrFormatter.format(template, params);
+    }
+
+    /**
+     * 驼峰转下划线命名
+     */
+    public static String toUnderScoreCase(String str)
+    {
+        if (str == null)
+        {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        // 前置字符是否大写
+        boolean preCharIsUpperCase = true;
+        // 当前字符是否大写
+        boolean curreCharIsUpperCase = true;
+        // 下一字符是否大写
+        boolean nexteCharIsUpperCase = true;
+        for (int i = 0; i < str.length(); i++)
+        {
+            char c = str.charAt(i);
+            if (i > 0)
+            {
+                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
+            }
+            else
+            {
+                preCharIsUpperCase = false;
+            }
+
+            curreCharIsUpperCase = Character.isUpperCase(c);
+
+            if (i < (str.length() - 1))
+            {
+                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
+            }
+
+            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+        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;
+    }
+
+    /**
+     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
+     * 
+     * @param name 转换前的下划线大写方式命名的字符串
+     * @return 转换后的驼峰式命名的字符串
+     */
+    public static String convertToCamelCase(String name)
+    {
+        StringBuilder result = new StringBuilder();
+        // 快速检查
+        if (name == null || name.isEmpty())
+        {
+            // 没必要转换
+            return "";
+        }
+        else if (!name.contains("_"))
+        {
+            // 不含下划线,仅将首字母大写
+            return name.substring(0, 1).toUpperCase() + name.substring(1);
+        }
+        // 用下划线将原始字符串分割
+        String[] camels = name.split("_");
+        for (String camel : camels)
+        {
+            // 跳过原始字符串中开头、结尾的下换线或双重下划线
+            if (camel.isEmpty())
+            {
+                continue;
+            }
+            // 首字母大写
+            result.append(camel.substring(0, 1).toUpperCase());
+            result.append(camel.substring(1).toLowerCase());
+        }
+        return result.toString();
+    }
+
+    /**
+     * 驼峰式命名法
+     * 例如:user_name->userName
+     */
+    public static String toCamelCase(String s)
+    {
+        if (s == null)
+        {
+            return null;
+        }
+        if (s.indexOf(SEPARATOR) == -1)
+        {
+            return s;
+        }
+        s = s.toLowerCase();
+        StringBuilder sb = new StringBuilder(s.length());
+        boolean upperCase = false;
+        for (int i = 0; i < s.length(); i++)
+        {
+            char c = s.charAt(i);
+
+            if (c == SEPARATOR)
+            {
+                upperCase = true;
+            }
+            else if (upperCase)
+            {
+                sb.append(Character.toUpperCase(c));
+                upperCase = false;
+            }
+            else
+            {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T cast(Object obj)
+    {
+        return (T) obj;
+    }
+}