Browse Source

调整前备份

laowo 3 years ago
commit
72719921ef
100 changed files with 10543 additions and 0 deletions
  1. 21 0
      src/main/java/com/usky/Application.java
  2. 33 0
      src/main/java/com/usky/annotion/AutoLog.java
  3. 24 0
      src/main/java/com/usky/annotion/DataScope.java
  4. 185 0
      src/main/java/com/usky/aspect/AutoLogAspect.java
  5. 181 0
      src/main/java/com/usky/aspect/DataScopeAspect.java
  6. 46 0
      src/main/java/com/usky/config/CorsConfig.java
  7. 91 0
      src/main/java/com/usky/config/HibernateConfig.java
  8. 72 0
      src/main/java/com/usky/config/RemoveDruidAdConfig.java
  9. 45 0
      src/main/java/com/usky/config/Swagger2Configuration.java
  10. 159 0
      src/main/java/com/usky/config/mqtt/config/MqttAutoConfiguration.java
  11. 139 0
      src/main/java/com/usky/config/mqtt/config/MqttProperties.java
  12. 68 0
      src/main/java/com/usky/config/redis/RedisConfig.java
  13. 91 0
      src/main/java/com/usky/config/shiro/JwtFilter.java
  14. 28 0
      src/main/java/com/usky/config/shiro/JwtToken.java
  15. 221 0
      src/main/java/com/usky/config/shiro/ShiroConfig.java
  16. 212 0
      src/main/java/com/usky/config/shiro/ShiroRealm.java
  17. 22 0
      src/main/java/com/usky/config/sms/SmsConfig.java
  18. 24 0
      src/main/java/com/usky/config/sms/SmsConstants.java
  19. 41 0
      src/main/java/com/usky/config/sms/SmsProperties.java
  20. 62 0
      src/main/java/com/usky/config/webScoket/HttpAuthHandler.java
  21. 59 0
      src/main/java/com/usky/config/webScoket/MyInterceptor.java
  22. 27 0
      src/main/java/com/usky/config/webScoket/WebSocketConfig.java
  23. 97 0
      src/main/java/com/usky/config/webScoket/WsSessionManager.java
  24. 103 0
      src/main/java/com/usky/constant/CommonConstant.java
  25. 210 0
      src/main/java/com/usky/controller/build/BuildController.java
  26. 78 0
      src/main/java/com/usky/controller/login/LoginController.java
  27. 115 0
      src/main/java/com/usky/controller/sys/DeptController.java
  28. 129 0
      src/main/java/com/usky/controller/sys/MenuController.java
  29. 195 0
      src/main/java/com/usky/controller/sys/RoleController.java
  30. 201 0
      src/main/java/com/usky/controller/sys/UserController.java
  31. 13 0
      src/main/java/com/usky/dao/BaseDao.java
  32. 27 0
      src/main/java/com/usky/dao/impl/BaseDaoImpl.java
  33. 42 0
      src/main/java/com/usky/emu/ResponeCodeEnum.java
  34. 111 0
      src/main/java/com/usky/entity/BaseEntity.java
  35. 117 0
      src/main/java/com/usky/entity/build/TbBuildingEntity.java
  36. 36 0
      src/main/java/com/usky/entity/build/TbBuildingVoEntity.java
  37. 96 0
      src/main/java/com/usky/entity/build/TbFloorEntity.java
  38. 33 0
      src/main/java/com/usky/entity/build/TbFloorVoEntity.java
  39. 95 0
      src/main/java/com/usky/entity/build/TbRoomEntity.java
  40. 33 0
      src/main/java/com/usky/entity/build/TbRoomVoEntity.java
  41. 160 0
      src/main/java/com/usky/entity/mqtt/TbDeviceAlarmsDTO.java
  42. 182 0
      src/main/java/com/usky/entity/mqtt/TbDeviceDTO.java
  43. 149 0
      src/main/java/com/usky/entity/mqtt/TbDeviceInfoDTO.java
  44. 45 0
      src/main/java/com/usky/entity/mqtt/vo/TbDeviceAlarmsVO.java
  45. 45 0
      src/main/java/com/usky/entity/mqtt/vo/TbDeviceInfoVO.java
  46. 47 0
      src/main/java/com/usky/entity/mqtt/vo/TbDeviceVO.java
  47. 49 0
      src/main/java/com/usky/entity/mqtt/vo/TbDeviceVOTop.java
  48. 202 0
      src/main/java/com/usky/entity/sys/SysDeptDTO.java
  49. 226 0
      src/main/java/com/usky/entity/sys/SysMenuDTO.java
  50. 179 0
      src/main/java/com/usky/entity/sys/SysRoleDTO.java
  51. 54 0
      src/main/java/com/usky/entity/sys/SysRoleDeptDTO.java
  52. 52 0
      src/main/java/com/usky/entity/sys/SysRoleMenuDTO.java
  53. 268 0
      src/main/java/com/usky/entity/sys/SysUserDTO.java
  54. 52 0
      src/main/java/com/usky/entity/sys/SysUserRoleDTO.java
  55. 206 0
      src/main/java/com/usky/entity/sys/log/SysLogDTO.java
  56. 49 0
      src/main/java/com/usky/entity/sys/vo/SysDeptVO.java
  57. 62 0
      src/main/java/com/usky/entity/sys/vo/SysMenuVO.java
  58. 67 0
      src/main/java/com/usky/entity/sys/vo/SysRoleVO.java
  59. 91 0
      src/main/java/com/usky/entity/sys/vo/SysUserVO.java
  60. 55 0
      src/main/java/com/usky/entity/ztree/Ztree.java
  61. 16 0
      src/main/java/com/usky/exception/GetUserInfoFromTokenException.java
  62. 94 0
      src/main/java/com/usky/exception/GloableExceptionResolver.java
  63. 17 0
      src/main/java/com/usky/exception/user/UserUnExist.java
  64. 530 0
      src/main/java/com/usky/filter/HTMLFilter.java
  65. 22 0
      src/main/java/com/usky/filter/XssEncode.java
  66. 36 0
      src/main/java/com/usky/filter/XssFilter.java
  67. 101 0
      src/main/java/com/usky/filter/XssHttpServletRequestWrapper.java
  68. 83 0
      src/main/java/com/usky/mqtthandler/Mqtt2MessageHandler.java
  69. 104 0
      src/main/java/com/usky/service/build/BuildService.java
  70. 263 0
      src/main/java/com/usky/service/build/BuildServiceImpl.java
  71. 7 0
      src/main/java/com/usky/service/log/LogService.java
  72. 19 0
      src/main/java/com/usky/service/log/LogServiceImpl.java
  73. 22 0
      src/main/java/com/usky/service/mqtt/MqttService.java
  74. 103 0
      src/main/java/com/usky/service/mqtt/MqttServiceImpl.java
  75. 56 0
      src/main/java/com/usky/service/sys/RoleService.java
  76. 208 0
      src/main/java/com/usky/service/sys/RoleServiceImpl.java
  77. 54 0
      src/main/java/com/usky/service/sys/dept/DeptService.java
  78. 131 0
      src/main/java/com/usky/service/sys/dept/DeptServiceImpl.java
  79. 90 0
      src/main/java/com/usky/service/sys/menuService/MenuService.java
  80. 253 0
      src/main/java/com/usky/service/sys/menuService/MenuServiceImpl.java
  81. 18 0
      src/main/java/com/usky/service/sys/user/LoginService.java
  82. 64 0
      src/main/java/com/usky/service/sys/user/LoginServiceImpl.java
  83. 96 0
      src/main/java/com/usky/service/sys/user/UserService.java
  84. 249 0
      src/main/java/com/usky/service/sys/user/UserServiceImpl.java
  85. 22 0
      src/main/java/com/usky/task/Dhtask.java
  86. 17 0
      src/main/java/com/usky/task/ScheduledConfig.java
  87. 30 0
      src/main/java/com/usky/utils/AuthorizationUtils.java
  88. 74 0
      src/main/java/com/usky/utils/BeanHelp.java
  89. 85 0
      src/main/java/com/usky/utils/CharsetKit.java
  90. 35 0
      src/main/java/com/usky/utils/CipherUtils.java
  91. 28 0
      src/main/java/com/usky/utils/ConfigUtil.java
  92. 1005 0
      src/main/java/com/usky/utils/Convert.java
  93. 26 0
      src/main/java/com/usky/utils/DaoResult.java
  94. 23 0
      src/main/java/com/usky/utils/DialectForInkfish.java
  95. 314 0
      src/main/java/com/usky/utils/HttpUtils.java
  96. 58 0
      src/main/java/com/usky/utils/IPUtils.java
  97. 53 0
      src/main/java/com/usky/utils/JsonUtil.java
  98. 71 0
      src/main/java/com/usky/utils/JsonUtils.java
  99. 207 0
      src/main/java/com/usky/utils/JwtUtil.java
  100. 37 0
      src/main/java/com/usky/utils/ListUtil.java

+ 21 - 0
src/main/java/com/usky/Application.java

@@ -0,0 +1,21 @@
+package com.usky;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/9/9 15:02
+ * @description TODO
+ **/
+@SpringBootApplication
+@EnableTransactionManagement
+@EnableScheduling
+public class Application {
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+}

+ 33 - 0
src/main/java/com/usky/annotion/AutoLog.java

@@ -0,0 +1,33 @@
+package com.usky.annotion;
+
+import com.usky.constant.CommonConstant;
+
+import java.lang.annotation.*;
+
+/**
+ * 系统日志注解
+ * @author laowo
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface AutoLog {
+
+	/**
+	 * 日志内容
+	 * @return
+	 */
+	String value() default "";
+
+	/**
+	 * 日志类型
+	 * @return 0:操作日志;1:登录日志;2:定时任务;
+	 */
+	int logType() default CommonConstant.LOG_TYPE_2;
+	
+	/**
+	 * 操作日志类型
+	 * @return (1查询,2添加,3修改,4删除)
+	 */
+	int operateType() default 0;
+}

+ 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 "";
+}

+ 185 - 0
src/main/java/com/usky/aspect/AutoLogAspect.java

@@ -0,0 +1,185 @@
+package com.usky.aspect;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.PropertyFilter;
+import com.usky.annotion.AutoLog;
+import com.usky.constant.CommonConstant;
+import com.usky.entity.sys.log.SysLogDTO;
+import com.usky.service.log.LogService;
+import com.usky.utils.IPUtils;
+import com.usky.utils.SpringContextUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.sql.Timestamp;
+
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2020/11/10 14:41
+ * @description 系统日志切面类
+ **/
+@Aspect
+@Component
+public class AutoLogAspect {
+    @Resource
+    private LogService logService;
+    @Pointcut("@annotation(com.usky.annotion.AutoLog)")
+    public void logPointCut() {
+    }
+    @Around("logPointCut()")
+    public Object around(ProceedingJoinPoint point) throws Throwable {
+        long beginTime = System.currentTimeMillis();
+        //执行方法
+        Object result = point.proceed();
+        //执行时长(毫秒)
+        long time = System.currentTimeMillis() - beginTime;
+
+        //保存日志
+        saveSysLog(point, time, result);
+
+        return result;
+    }
+
+    private void saveSysLog(ProceedingJoinPoint joinPoint, long time, Object obj) {
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+        SysLogDTO dto = new SysLogDTO();
+        AutoLog syslog = method.getAnnotation(AutoLog.class);
+        if(syslog != null){
+            //update-begin-author:taoyan date:
+            String content = syslog.value();
+            //注解上的描述,操作日志内容
+            dto.setLogType(syslog.logType());
+            dto.setLogContent(content);
+        }
+
+        //请求的方法名
+        String className = joinPoint.getTarget().getClass().getName();
+        String methodName = signature.getName();
+        dto.setMethod(className + "." + methodName + "()");
+
+
+        //设置操作类型
+        if (dto.getLogType() == CommonConstant.LOG_TYPE_2) {
+            dto.setOperateType(getOperateType(methodName, syslog.operateType()));
+        }
+
+        //获取request
+        HttpServletRequest request = SpringContextUtils.getHttpServletRequest();
+        //请求的参数
+        dto.setRequestType(request.getMethod());
+        dto.setRequestParam(getReqestParams(request,joinPoint));
+        //设置IP地址
+        dto.setIp(IPUtils.getIpAddr(request));
+        //获取登录用户信息 TODO 添加用户数据后启用
+
+      // LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+      // if(sysUser!=null){
+      //     dto.setUserid(sysUser.getUsername());
+      //     dto.setUsername(sysUser.getRealname());
+
+      // }
+        //耗时
+        dto.setCostTime(time);
+        dto.setCreateTime(new Timestamp(System.currentTimeMillis()));
+        //保存系统日志
+        logService.addLog(dto);
+    }
+
+
+    /**
+     * 获取操作类型
+     */
+    private int getOperateType(String methodName,int operateType) {
+        if (operateType > 0) {
+            return operateType;
+        }
+        if (methodName.startsWith("list")) {
+            return CommonConstant.OPERATE_TYPE_1;
+        }
+        if (methodName.startsWith("add")) {
+            return CommonConstant.OPERATE_TYPE_2;
+        }
+        if (methodName.startsWith("edit")) {
+            return CommonConstant.OPERATE_TYPE_3;
+        }
+        if (methodName.startsWith("delete")) {
+            return CommonConstant.OPERATE_TYPE_4;
+        }
+        if (methodName.startsWith("import")) {
+            return CommonConstant.OPERATE_TYPE_5;
+        }
+        if (methodName.startsWith("export")) {
+            return CommonConstant.OPERATE_TYPE_6;
+        }
+        return CommonConstant.OPERATE_TYPE_1;
+    }
+
+    /**
+     * 请求参数获取
+     * @param request
+     * @param joinPoint
+     * @return
+     */
+    private String getReqestParams(HttpServletRequest request, JoinPoint joinPoint) {
+        String httpMethod = request.getMethod();
+        String params = "";
+        if ("POST".equals(httpMethod) || "PUT".equals(httpMethod) || "PATCH".equals(httpMethod)) {
+            Object[] paramsArray = joinPoint.getArgs();
+            // java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)
+            //  https://my.oschina.net/mengzhang6/blog/2395893
+            Object[] arguments  = new Object[paramsArray.length];
+            for (int i = 0; i < paramsArray.length; i++) {
+                if (paramsArray[i] instanceof BindingResult || paramsArray[i] instanceof ServletRequest || paramsArray[i] instanceof ServletResponse || paramsArray[i] instanceof MultipartFile) {
+                    //ServletRequest不能序列化,从入参里排除,否则报异常:java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)
+                    //ServletResponse不能序列化 从入参里排除,否则报异常:java.lang.IllegalStateException: getOutputStream() has already been called for this response
+                    continue;
+                }
+                arguments[i] = paramsArray[i];
+            }
+            //update-begin-author:taoyan date:20200724 for:日志数据太长的直接过滤掉
+            PropertyFilter profilter = new PropertyFilter() {
+                @Override
+                public boolean apply(Object o, String name, Object value) {
+                    if(value!=null && value.toString().length()>500){
+                        return false;
+                    }
+                    return true;
+                }
+            };
+            params = JSONObject.toJSONString(arguments, profilter);
+            //update-end-author:taoyan date:20200724 for:日志数据太长的直接过滤掉
+        } else {
+            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+            Method method = signature.getMethod();
+            // 请求的方法参数值
+            Object[] args = joinPoint.getArgs();
+            // 请求的方法参数名称
+            LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
+            String[] paramNames = u.getParameterNames(method);
+            if (args != null && paramNames != null) {
+                for (int i = 0; i < args.length; i++) {
+                    params += "  " + paramNames[i] + ": " + args[i];
+                }
+            }
+        }
+        return params;
+    }
+
+
+}

+ 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, "");
+        }
+    }
+}

+ 46 - 0
src/main/java/com/usky/config/CorsConfig.java

@@ -0,0 +1,46 @@
+package com.usky.config;
+
+
+import com.usky.filter.XssFilter;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2020/11/11 9:04
+ * @description TODO
+ **/
+@Configuration
+public class CorsConfig implements WebMvcConfigurer {
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**").allowedOrigins("*").allowCredentials(true)
+                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").maxAge(3600);
+    }
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        /*静态资源的位置*/
+        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
+        registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/");
+        /*放行swagger*/
+        registry.addResourceHandler("/webjars/**")
+                .addResourceLocations("classpath:/META-INF/resources/webjars/");
+        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
+    }
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    @Bean
+    @Order(-1)//设置filter执行的顺序
+    public FilterRegistrationBean filterRegest() {
+        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
+        filterRegistrationBean.setFilter(new XssFilter());
+        filterRegistrationBean.addUrlPatterns("/*");//过滤所有的URL
+        return filterRegistrationBean;
+    }
+}

+ 91 - 0
src/main/java/com/usky/config/HibernateConfig.java

@@ -0,0 +1,91 @@
+package com.usky.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.support.http.StatViewServlet;
+import com.alibaba.druid.support.http.WebStatFilter;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.orm.hibernate5.HibernateTemplate;
+import org.springframework.orm.hibernate5.HibernateTransactionManager;
+import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+@Configuration
+@EnableJpaRepositories
+@EnableTransactionManagement
+public class HibernateConfig {
+    @Autowired
+    private SessionFactory sessionFactory;
+
+    @ConfigurationProperties(prefix = "spring.datasource.druid")
+    @Bean
+    public DataSource dataSource() {
+        return new DruidDataSource();
+    }
+
+
+    @Bean
+    public LocalSessionFactoryBean localSessionFactoryBean() {
+        Properties properties = new Properties();
+        properties.setProperty("hibernate.show_sql", "true");
+        properties.setProperty("hibernate.hbm2ddl.auto", "update");
+        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
+        LocalSessionFactoryBean lsb = new LocalSessionFactoryBean();
+        lsb.setDataSource(dataSource());
+//        lsb.setAnnotatedClasses(Student.class);这里demo可以这么写,但我们项目不可能就一个实体类,所以用下面的setPackagesToScan方法
+        lsb.setPackagesToScan("com.usky.entity");
+        lsb.setHibernateProperties(properties);
+        return lsb;
+    }
+    @Bean
+    public HibernateTemplate hibernateTemplate() {
+        HibernateTemplate hibernateTemplate = new HibernateTemplate();
+        hibernateTemplate.setSessionFactory(sessionFactory);
+        return hibernateTemplate;
+    }
+    @Bean
+    public HibernateTransactionManager hibernateTransactionManager() {
+        HibernateTransactionManager ts = new HibernateTransactionManager();
+        ts.setSessionFactory(sessionFactory);
+        return ts;
+    }
+    @Bean
+    public ServletRegistrationBean statViewServlet() {
+        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
+        // 添加IP白名单
+     //   servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
+        // 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高
+     //   servletRegistrationBean.addInitParameter("deny", "127.0.0.1");
+        // 添加控制台管理用户
+        servletRegistrationBean.addInitParameter("loginUsername", "admin");
+        servletRegistrationBean.addInitParameter("loginPassword", "admin");
+        // 是否能够重置数据
+        servletRegistrationBean.addInitParameter("resetEnable", "true");
+        return servletRegistrationBean;
+    }
+
+    /**
+     * 配置服务过滤器
+     * @return 返回过滤器配置对象
+     */
+    @Bean
+    public FilterRegistrationBean statFilter() {
+        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
+        // 添加过滤规则
+        filterRegistrationBean.addUrlPatterns("/*");
+        // 忽略过滤格式
+        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,");
+        return filterRegistrationBean;
+    }
+}
+
+

+ 72 - 0
src/main/java/com/usky/config/RemoveDruidAdConfig.java

@@ -0,0 +1,72 @@
+package com.usky.config;
+
+
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
+import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
+import com.alibaba.druid.util.Utils;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.*;
+import java.io.IOException;
+
+
+@Configuration
+@ConditionalOnWebApplication
+@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
+@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled",
+        havingValue = "true", matchIfMissing = true)
+public class RemoveDruidAdConfig {
+ 
+    /**
+     * 方法名: removeDruidAdFilterRegistrationBean
+     * 方法描述:  除去页面底部的广告
+     * @param properties
+     * @return org.springframework.boot.web.servlet.FilterRegistrationBean
+     * @throws
+     */
+    @Bean
+    public FilterRegistrationBean removeDruidAdFilterRegistrationBean(DruidStatProperties properties)
+    {
+        // 获取web监控页面的参数
+        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
+        // 提取common.js的配置路径
+        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
+        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
+ 
+        final String filePath = "support/http/resources/js/common.js";
+ 
+        //创建filter进行过滤
+        Filter filter = new Filter() {
+            @Override
+            public void init(FilterConfig filterConfig) throws ServletException {
+            }
+ 
+            @Override
+            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+                    throws IOException, ServletException {
+                chain.doFilter(request, response);
+                // 重置缓冲区,响应头不会被重置
+                response.resetBuffer();
+                // 获取common.js
+                String text = Utils.readFromResource(filePath);
+                // 正则替换banner, 除去底部的广告信息
+                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
+                text = text.replaceAll("powered.*?shrek.wang</a>", "");
+                response.getWriter().write(text);
+            }
+ 
+            @Override
+            public void destroy() {
+            }
+        };
+        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
+        registrationBean.setFilter(filter);
+        registrationBean.addUrlPatterns(commonJsPattern);
+        return registrationBean;
+    }
+}

+ 45 - 0
src/main/java/com/usky/config/Swagger2Configuration.java

@@ -0,0 +1,45 @@
+package com.usky.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+@EnableSwagger2
+@EnableKnife4j
+public class Swagger2Configuration {
+    @Value("${swagger.enable}")
+    private boolean enable;
+
+    @Bean
+    public Docket buildDocket() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(buildApiInf())
+                .enable(enable)
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.usky.controller"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo buildApiInf() {
+        return new ApiInfoBuilder()
+                .title("系统管理模块 v1.0")
+                .version("1.0.0")
+                .description("springboot swagger2")
+                //   .termsOfServiceUrl("网址链接")
+                .contact(new Contact("上海永天科技", "http://www.chinausky.com/", "blibaba@foxmail.com"))
+                .build();
+
+    }
+
+}

+ 159 - 0
src/main/java/com/usky/config/mqtt/config/MqttAutoConfiguration.java

@@ -0,0 +1,159 @@
+package com.usky.config.mqtt.config;
+import com.usky.config.mqtt.config.MqttProperties.Config;
+import com.usky.config.mqtt.config.MqttProperties.Will;
+import com.usky.utils.MD5Utils;
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.beans.factory.support.AbstractBeanDefinition;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.DefaultListableBeanFactory;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.channel.DirectChannel;
+import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
+import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
+import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
+import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
+import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
+import org.springframework.messaging.MessageChannel;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * mqtt配置
+ * @author laowo
+ */
+@Log4j2
+@Configuration
+@EnableConfigurationProperties(MqttProperties.class)
+public class MqttAutoConfiguration implements ApplicationContextAware, BeanPostProcessor {
+
+    private ConfigurableApplicationContext applicationContext;
+    @Autowired
+    private MqttProperties mqttProperties;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = (ConfigurableApplicationContext) applicationContext;
+        mqttProperties.getConfig().forEach((chnnelName, config) -> init(chnnelName, config));
+
+    }
+
+    /**
+     * 初始化
+     *
+     * @param channelName
+     * @param config
+     */
+    private void init(String channelName, Config config) {
+        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getBeanFactory();
+        // 默认开启consumer
+        if (!Boolean.FALSE.equals(config.getConsumerEnable())) {
+            // 通道信息
+            beanFactory.registerBeanDefinition(channelName, mqttChannel());
+            log.info("初始化mqtt, channel {}, 配置 {} ", channelName, config);
+            MessageChannel mqttChannel = beanFactory.getBean(channelName, MessageChannel.class);
+            beanFactory.registerBeanDefinition(channelName + "MqttChannelAdapter", channelAdapter(config, mqttChannel));
+            log.info("初始化mqtt Channel Adapter");
+        }
+
+        // 默认开启consumer
+        if (!Boolean.FALSE.equals(config.getProducerEnable())) {
+            String handlerBeanName = channelName + MD5Utils.MqttUtils.CHANNEL_NAME_SUFFIX;
+            beanFactory.registerBeanDefinition(handlerBeanName, mqttOutbound(config));
+            log.info("初始化mqtt MqttPahoMessageHandler");
+
+            MD5Utils.MqttUtils.put(channelName, beanFactory.getBean(handlerBeanName, MqttPahoMessageHandler.class));
+        }
+    }
+
+    /**
+     * mqtt工厂
+     *
+     * @param config
+     * @param isConsumer
+     * @return
+     */
+    private MqttPahoClientFactory mqttClientFactory(Config config, boolean isConsumer) {
+        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
+        MqttConnectOptions options = new MqttConnectOptions();
+        options.setServerURIs(config.getUrl());
+        options.setCleanSession(true);
+        options.setKeepAliveInterval(config.getKepAliveInterval());
+        options.setPassword(config.getPassword().toCharArray());
+        options.setUserName(config.getUsername());
+        options.setConnectionTimeout(config.getTimeout());
+
+        Will will = null;
+        if (isConsumer && config.getConsumerWill() != null) {
+            will = config.getConsumerWill();
+        } else if (!isConsumer && config.getProducerWill() != null) {
+            will = config.getProducerWill();
+        }
+        if (will != null) {
+            try {
+                options.setWill(will.getTopic(), will.getPayload().getBytes("utf-8"), will.getQos(),
+                        will.getRetained());
+            } catch (UnsupportedEncodingException e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+
+        factory.setConnectionOptions(options);
+        return factory;
+    }
+
+    /**
+     * 初始化通道
+     *
+     * @return
+     */
+    private AbstractBeanDefinition mqttChannel() {
+        BeanDefinitionBuilder messageChannelBuilder = BeanDefinitionBuilder.genericBeanDefinition(DirectChannel.class);
+        messageChannelBuilder.setScope(BeanDefinition.SCOPE_SINGLETON);
+        return messageChannelBuilder.getBeanDefinition();
+    }
+
+    /**
+     * mqtt消息驱动转换器
+     *
+     * @param config
+     * @param mqttChannel
+     * @return
+     */
+    private AbstractBeanDefinition channelAdapter(Config config, MessageChannel mqttChannel) {
+        BeanDefinitionBuilder messageProducerBuilder = BeanDefinitionBuilder
+                .genericBeanDefinition(MqttPahoMessageDrivenChannelAdapter.class);
+        messageProducerBuilder.setScope(BeanDefinition.SCOPE_SINGLETON);
+        messageProducerBuilder.addConstructorArgValue(config.getConsumerClientId());
+        messageProducerBuilder.addConstructorArgValue(mqttClientFactory(config, true));
+        messageProducerBuilder.addConstructorArgValue(config.getTopics());
+        messageProducerBuilder.addPropertyValue("converter", new DefaultPahoMessageConverter());
+        messageProducerBuilder.addPropertyValue("qos", config.getQos());
+        messageProducerBuilder.addPropertyValue("outputChannel", mqttChannel);
+
+        return messageProducerBuilder.getBeanDefinition();
+    }
+
+    /**
+     * 消息发送客户端
+     *
+     * @param config
+     * @return
+     */
+    private AbstractBeanDefinition mqttOutbound(Config config) {
+        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MqttPahoMessageHandler.class);
+        builder.addConstructorArgValue(config.getProducerClientId());
+        builder.addConstructorArgValue(mqttClientFactory(config, false));
+        builder.addPropertyValue("async", config.getAsync());
+
+        return builder.getBeanDefinition();
+    }
+}

+ 139 - 0
src/main/java/com/usky/config/mqtt/config/MqttProperties.java

@@ -0,0 +1,139 @@
+package com.usky.config.mqtt.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Map;
+
+/**
+ * mqtt配置
+ * @author laowo
+ */
+@Data
+@ConfigurationProperties(prefix = "mqtt")
+@Configuration
+public class MqttProperties {
+	/**
+	 * 本机ip作为clientid的后缀
+	 */
+	private static String hostAddress;
+
+	/**
+	 * 所有的配置
+	 */
+	private final Map<String, Config> config;
+
+	static {
+		try {
+			InetAddress address = InetAddress.getLocalHost();
+			hostAddress = "_ip_" + address.getHostAddress();
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Data
+	public static class Config {
+		/**
+		 * 是否开启consumer,默认true开启
+		 */
+		private Boolean consumerEnable;
+		/**
+		 * 是否开启producer,默认true开启
+		 */
+		private Boolean producerEnable;
+		/**
+		 * 数组tcp://ip:port
+		 */
+		private String[] url;
+		/**
+		 * 超时时间,单位:秒
+		 */
+		private int timeout;
+		/**
+		 * 心跳时间,秒
+		 */
+		private int kepAliveInterval;
+		/**
+		 * qos设置,和topic一一对应
+		 */
+		private int[] qos;
+		/**
+		 * 主题,和qos一一对应
+		 */
+		private String[] topics;
+		/**
+		 * 账号
+		 */
+		private String username;
+		/**
+		 * 密码
+		 */
+		private String password;
+		/**
+		 * clientId后是否添加本机ip
+		 */
+		private Boolean clientIdAppendIp;
+		/**
+		 * consumer clientId
+		 */
+		private String consumerClientId;
+		/**
+		 * producer clientId
+		 */
+		private String producerClientId;
+		/**
+		 * 是否异步发送消息
+		 */
+		private Boolean async;
+		/**
+		 * consumer遗嘱配置
+		 */
+		private Will consumerWill;
+		/**
+		 * producer遗嘱配置
+		 */
+		private Will producerWill;
+
+		/**
+		 * 重写获取消费者客户端id
+		 * 
+		 * @return
+		 */
+		public String getConsumerClientId() {
+			return clientIdAppendIp == null || !clientIdAppendIp ? consumerClientId : consumerClientId + hostAddress;
+		}
+
+		/**
+		 * 重写获生产者客户端id
+		 * 
+		 * @return
+		 */
+		public String getProducerClientId() {
+			return clientIdAppendIp == null || !clientIdAppendIp ? producerClientId : producerClientId + hostAddress;
+		}
+	}
+
+	@Data
+	public static class Will {
+		/**
+		 * 遗嘱qos设置
+		 */
+		private int qos;
+		/**
+		 * 遗嘱主题
+		 */
+		private String topic;
+		/**
+		 * 遗嘱内容
+		 */
+		private String payload;
+		/**
+		 * 是否发送保留消息
+		 */
+		private Boolean retained;
+	}
+}

+ 68 - 0
src/main/java/com/usky/config/redis/RedisConfig.java

@@ -0,0 +1,68 @@
+package com.usky.config.redis;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import javax.annotation.Resource;
+
+/**
+ * 开启缓存支持
+ *
+ * @Return:
+ */
+@Slf4j
+@Configuration
+public class RedisConfig extends CachingConfigurerSupport {
+
+    @Resource
+    private LettuceConnectionFactory lettuceConnectionFactory;
+
+    /**
+     * RedisTemplate配置
+     *
+     * @param lettuceConnectionFactory
+     * @return
+     */
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
+        log.info(" --- redis config init --- ");
+        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = jacksonSerializer();
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
+        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
+        RedisSerializer<?> stringSerializer = new StringRedisSerializer();
+        // key序列化
+        redisTemplate.setKeySerializer(stringSerializer);
+        // value序列化
+        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+        // Hash key序列化
+        redisTemplate.setHashKeySerializer(stringSerializer);
+        // Hash value序列化
+        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
+        redisTemplate.afterPropertiesSet();
+        return redisTemplate;
+    }
+
+    private Jackson2JsonRedisSerializer jacksonSerializer() {
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.setVisibility(PropertyAccessor.ALL, Visibility.ANY);
+        objectMapper.enableDefaultTyping(DefaultTyping.NON_FINAL);
+        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+        return jackson2JsonRedisSerializer;
+    }
+
+
+
+
+}

+ 91 - 0
src/main/java/com/usky/config/shiro/JwtFilter.java

@@ -0,0 +1,91 @@
+package com.usky.config.shiro;
+
+import com.usky.constant.CommonConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @Description: 鉴权登录拦截器
+ * @Author: Scott
+ * @Date: 2018/10/7
+ **/
+@Slf4j
+public class JwtFilter extends BasicHttpAuthenticationFilter {
+
+    private boolean allowOrigin = true;
+
+    public JwtFilter() {
+    }
+
+    public JwtFilter(boolean allowOrigin) {
+        this.allowOrigin = allowOrigin;
+    }
+
+    /**
+     * 执行登录认证
+     *
+     * @param request
+     * @param response
+     * @param mappedValue
+     * @return
+     */
+    @Override
+    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
+        try {
+            executeLogin(request, response);
+            return true;
+        } catch (Exception e) {
+            throw new AuthenticationException("Token失效,请重新登录", e);
+        }
+    }
+
+    /**
+     *
+     */
+    @Override
+    protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
+        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+       // String token = httpServletRequest.getHeader(CommonConstant.X_ACCESS_TOKEN);
+        String token = httpServletRequest.getHeader("token");
+        if (token == null) {
+            token = httpServletRequest.getParameter("token");
+        }
+        JwtToken jwtToken = new JwtToken(token);
+        // 提交给realm进行登入,如果错误他会抛出异常并被捕获
+        getSubject(request, response).login(jwtToken);
+        // 如果没有抛出异常则代表登入成功,返回true
+        return true;
+    }
+
+//    /**
+//     * 对跨域提供支持
+//     */
+//    @Override
+//    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
+//        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+//        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+//        if (allowOrigin) {
+//            httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));
+//            httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");
+//            httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
+//            //update-begin-author:scott date:20200907 for:issues/I1TAAP 前后端分离,shiro过滤器配置引起的跨域问题
+//            // 是否允许发送Cookie,默认Cookie不包括在CORS请求之中。设为true时,表示服务器允许Cookie包含在请求中。
+//            httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
+//            //update-end-author:scott date:20200907 for:issues/I1TAAP 前后端分离,shiro过滤器配置引起的跨域问题
+//        }
+//        // 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态
+//        if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
+//            httpServletResponse.setStatus(HttpStatus.OK.value());
+//            return false;
+//        }
+//        return super.preHandle(request, response);
+//    }
+}

+ 28 - 0
src/main/java/com/usky/config/shiro/JwtToken.java

@@ -0,0 +1,28 @@
+package com.usky.config.shiro;
+ 
+import org.apache.shiro.authc.AuthenticationToken;
+
+/**
+ * @Author Scott
+ * @create 2018-07-12 15:19
+ * @desc
+ **/
+public class JwtToken implements AuthenticationToken {
+	
+	private static final long serialVersionUID = 1L;
+	private String token;
+ 
+    public JwtToken(String token) {
+        this.token = token;
+    }
+ 
+    @Override
+    public Object getPrincipal() {
+        return token;
+    }
+ 
+    @Override
+    public Object getCredentials() {
+        return token;
+    }
+}

+ 221 - 0
src/main/java/com/usky/config/shiro/ShiroConfig.java

@@ -0,0 +1,221 @@
+/**
+ * MIT License
+ * Copyright (c) 2018 yadong.zhang
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+package com.usky.config.shiro;
+
+import com.usky.constant.CommonConstant;
+import org.apache.shiro.authc.credential.CredentialsMatcher;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+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.crazycake.shiro.RedisCacheManager;
+import org.crazycake.shiro.RedisManager;
+import org.crazycake.shiro.RedisSessionDAO;
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.core.annotation.Order;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import javax.servlet.Filter;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Shiro配置类
+ *
+ * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
+ * @version 1.0
+ * @website https://www.zhyd.me
+ * @date 2018/4/24 14:37
+ * @since 1.0
+ */
+@Configuration
+@Order(-1)
+public class ShiroConfig {
+    @Resource
+    LettuceConnectionFactory lettuceConnectionFactory;
+
+    @Bean
+    public MethodInvokingFactoryBean methodInvokingFactoryBean(@Qualifier("MysecurityManager") DefaultWebSecurityManager securityManager) {
+        MethodInvokingFactoryBean bean = new MethodInvokingFactoryBean();
+        bean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");
+        bean.setArguments(securityManager);
+        return bean;
+    }
+
+    @Bean(name = "lifecycleBeanPostProcessor")
+    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
+        return new LifecycleBeanPostProcessor();
+    }
+
+    @Bean(name = "shiroFilter")
+    public ShiroFilterFactoryBean shirFilter(@Qualifier("MysecurityManager") DefaultWebSecurityManager securityManager) {
+        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+        // 必须设置 SecurityManager
+        shiroFilterFactoryBean.setSecurityManager(securityManager);
+        // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
+        //       shiroFilterFactoryBean.setLoginUrl("");
+        // 登录成功后要跳转的链接
+        //  shiroFilterFactoryBean.setSuccessUrl("");
+        // 未授权界面;
+        shiroFilterFactoryBean.setUnauthorizedUrl("/error/403");
+        LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
+        filterChainDefinitionMap.put("/doc.html", "anon");
+        filterChainDefinitionMap.put("/sys/login", "anon");
+        filterChainDefinitionMap.put("/**/*.js", "anon");
+        filterChainDefinitionMap.put("/**/*.css", "anon");
+        filterChainDefinitionMap.put("/**/*.html", "anon");
+        filterChainDefinitionMap.put("/**/*.svg", "anon");
+        filterChainDefinitionMap.put("/**/*.pdf", "anon");
+        filterChainDefinitionMap.put("/**/*.jpg", "anon");
+        filterChainDefinitionMap.put("/**/*.png", "anon");
+        filterChainDefinitionMap.put("/**/*.ico", "anon");
+        filterChainDefinitionMap.put("/**/*.ttf", "anon");
+        filterChainDefinitionMap.put("/**/*.woff", "anon");
+        filterChainDefinitionMap.put("/**/*.woff2", "anon");
+        filterChainDefinitionMap.put("/druid/**", "anon");
+        filterChainDefinitionMap.put("/swagger-ui.html", "anon");
+        filterChainDefinitionMap.put("/swagger**/**", "anon");
+        filterChainDefinitionMap.put("/webjars/**", "anon");
+        filterChainDefinitionMap.put("/v2/**", "anon");
+
+        Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
+        //如果cloudServer为空 则说明是单体 需要加载跨域配置
+
+        filterMap.put("jwt", new JwtFilter(true));
+        shiroFilterFactoryBean.setFilters(filterMap);
+        // <!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边
+        filterChainDefinitionMap.put("/**", "jwt");
+        //    filterChainDefinitionMap.put("/**", "authc");
+        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
+        return shiroFilterFactoryBean;
+    }
+
+    @Bean
+    @DependsOn("lifecycleBeanPostProcessor")
+    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
+        DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
+        creator.setProxyTargetClass(true);
+        return creator;
+    }
+
+    @Bean(name = "MysecurityManager")
+    public DefaultWebSecurityManager securityManager(@Qualifier("shiroRealm") ShiroRealm authRealm) {
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+        // 设置realm.
+        securityManager.setRealm(authRealm);
+        securityManager.setCacheManager(redisCacheManager());
+        // 自定义session管理 使用redis
+        securityManager.setSessionManager(sessionManager());
+        return securityManager;
+    }
+
+    @Bean(name = "shiroRealm")
+    public ShiroRealm shiroRealm(@Qualifier("credentialsMatcher") CredentialsMatcher matcher) {
+        ShiroRealm shiroRealm = new ShiroRealm();
+        shiroRealm.setCredentialsMatcher(credentialsMatcher());
+        return shiroRealm;
+    }
+
+    /**
+     * 凭证匹配器
+     */
+    @Bean(name = "credentialsMatcher")
+    public CredentialsMatcher credentialsMatcher() {
+        HashedCredentialsMatcher hashedMatcher = new HashedCredentialsMatcher();
+        hashedMatcher.setHashAlgorithmName("md5");
+//        hashedMatcher.setHashIterations(1);
+        return hashedMatcher;
+    }
+
+    /**
+     * 开启shiro aop注解支持.
+     * 使用代理方式;所以需要开启代码支持;
+     *
+     * @param securityManager
+     * @return
+     */
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
+        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
+        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
+        return authorizationAttributeSourceAdvisor;
+    }
+
+    @Bean
+    public RedisManager redisManager() {
+        RedisManager manager;
+        RedisManager redisManager = new RedisManager();
+        redisManager.setHost(lettuceConnectionFactory.getHostName());
+        redisManager.setPort(lettuceConnectionFactory.getPort());
+        redisManager.setDatabase(1);
+        redisManager.setTimeout(0);
+        if (!StringUtils.isEmpty(lettuceConnectionFactory.getPassword())) {
+            redisManager.setPassword(lettuceConnectionFactory.getPassword());
+        }
+        manager = redisManager;
+
+        return manager;
+    }
+
+    /**
+     * cacheManager 缓存 redis实现
+     * 使用的是shiro-redis开源插件
+     *
+     * @return
+     */
+    @Bean
+    public RedisCacheManager redisCacheManager() {
+        RedisCacheManager redisCacheManager = new RedisCacheManager();
+        redisCacheManager.setPrincipalIdFieldName("userId");
+        redisCacheManager.setRedisManager(redisManager());
+        return redisCacheManager;
+    }
+
+    /**
+     * RedisSessionDAO shiro sessionDao层的实现 通过redis
+     * 使用的是shiro-redis开源插件
+     */
+//    @Bean
+    public RedisSessionDAO redisSessionDAO() {
+        RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
+        redisSessionDAO.setRedisManager(redisManager());
+        return redisSessionDAO;
+    }
+
+    @Bean
+    public DefaultWebSessionManager sessionManager() {
+        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
+        sessionManager.setGlobalSessionTimeout(2592000 * 1000L);
+        sessionManager.setSessionDAO(redisSessionDAO());
+        return sessionManager;
+    }
+
+}

+ 212 - 0
src/main/java/com/usky/config/shiro/ShiroRealm.java

@@ -0,0 +1,212 @@
+package com.usky.config.shiro;
+
+import com.usky.constant.CommonConstant;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.service.sys.menuService.MenuService;
+import com.usky.service.sys.user.LoginService;
+import com.usky.service.sys.user.UserService;
+import com.usky.utils.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.cache.Cache;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.apache.shiro.util.ByteSource;
+import org.apache.shiro.util.SimpleByteSource;
+import org.springframework.context.annotation.Lazy;
+
+import javax.annotation.Resource;
+import java.util.Set;
+
+/**
+ * @Description: 用户登录鉴权和获取用户授权
+ * @Author: Scott
+ * @Date: 2019-4-23 8:13
+ * @Version: 1.1
+ */
+@Slf4j
+public class ShiroRealm extends AuthorizingRealm {
+
+    @Resource
+    @Lazy
+    private LoginService loginService;
+    @Resource
+    @Lazy
+    private UserService userService;
+    @Resource
+    @Lazy
+    private MenuService menuService;
+    @Resource
+    @Lazy
+    private RedisUtil redisUtil;
+    @Override
+    public boolean supports(AuthenticationToken token) {
+        return token instanceof JwtToken;
+    }
+
+    /**
+     * 权限信息认证(包括角色以及权限)是用户访问controller的时候才进行验证(redis存储的此处权限信息)
+     * 触发检测用户权限时才会调用此方法,例如checkRole,checkPermission
+     * @param principals 身份信息
+     * @return AuthorizationInfo 权限信息
+     */
+
+
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+        // 角色列表
+        Set<String> roles;
+        // 功能列表
+        Set<String> menus;
+        log.info("===============Shiro权限认证开始============ [ roles、permissions]==========");
+        SysUserVO sysUser = null;
+        if (principals != null) {
+             sysUser = (SysUserVO) principals.getPrimaryPrincipal();
+        }else {
+            throw new AuthenticationException("token为空!");
+        }
+        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
+        if (sysUser.isAdmin()) {
+            info.addRole("admin");
+            info.addStringPermission("*:*:*");
+        } else {
+            roles = userService.queryRoleKeys(sysUser.getUserId());
+            menus = menuService.qyeryPermsByUserId(sysUser.getUserId());
+            // 角色加入AuthorizationInfo认证对象
+            info.setRoles(roles);
+            // 权限加入AuthorizationInfo认证对象
+            info.setStringPermissions(menus);
+        }
+        log.info("===============Shiro权限认证成功==============");
+        return info;
+    }
+
+    /**
+     * 用户信息认证是在用户进行登录的时候进行验证(不存redis)
+     * 也就是说验证用户输入的账号和密码是否正确,错误抛出异常
+     *
+     * @param auth 用户登录的账号密码信息
+     * @return 返回封装了用户信息的 AuthenticationInfo 实例
+     * @throws AuthenticationException
+     */
+//    @Override
+//    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
+//        String username = ((UsernamePasswordToken) auth).getUsername();
+//        //获取用户
+    //    SysUserVO user = loginService.findUserByUsername(username);
+//        if (user == null) {
+//            return null;
+//        } else {
+//            //封装AuthenticationInfo
+//            ByteSource bsSalt = new SimpleByteSource(user.getSalt());
+//            return new SimpleAuthenticationInfo(user, user.getPassword(), bsSalt, getName());
+//        }
+//    }
+
+    /**
+     * 用户信息认证是在用户进行登录的时候进行验证(不存redis)
+     * 也就是说验证用户输入的账号和密码是否正确,错误抛出异常
+     *
+     * @param auth 用户登录的账号密码信息
+     * @return 返回封装了用户信息的 AuthenticationInfo 实例
+     * @throws AuthenticationException
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
+        log.debug("===============Shiro身份认证开始============doGetAuthenticationInfo==========");
+        String token = (String) auth.getCredentials();
+        if (token == null) {
+            log.info("————————身份认证失败——————————IP地址:  "+ oConvertUtils.getIpAddrByRequest(SpringContextUtils.getHttpServletRequest()));
+            throw new AuthenticationException("token为空!");
+        }
+        // 校验token有效性
+        SysUserVO loginUser = this.checkUserTokenIsEffect(token);
+        return new SimpleAuthenticationInfo(loginUser, loginUser.getPassword(), getName());
+    }
+
+    /**
+     * 校验token的有效性
+     * @param token
+     */
+    public SysUserVO checkUserTokenIsEffect(String token) throws AuthenticationException {
+        // 解密获得username,用于和数据库进行对比
+        String username = JwtUtil.getUsername(token);
+        if (username == null) {
+            throw new AuthenticationException("token非法无效!");
+        }
+        // 查询用户信息
+        log.debug("———校验token是否有效————checkUserTokenIsEffect——————— "+ token);
+     //   LoginUser loginUser = commonAPI.getUserByName(username);
+        SysUserVO loginUser = loginService.findUserByUsername(username);
+        if (loginUser == null) {
+            throw new AuthenticationException("用户不存在!");
+        }
+        // 判断用户状态
+        if (!loginUser.getStatus().equals("0")) {
+            throw new AuthenticationException("账号已停用,请联系管理员!");
+        }
+        // 校验token是否超时失效 & 或者账号密码是否错误
+        if (!jwtTokenRefresh(token, username, loginUser.getPassword())) {
+            throw new AuthenticationException("Token失效,请重新登录!");
+        }
+
+        return loginUser;
+    }
+
+    /**
+     * JWTToken刷新生命周期 (实现: 用户在线操作不掉线功能)
+     * 1、登录成功后将用户的JWT生成的Token作为k、v存储到cache缓存里面(这时候k、v值一样),缓存有效期设置为Jwt有效时间的2倍
+     * 2、当该用户再次请求时,通过JWTFilter层层校验之后会进入到doGetAuthenticationInfo进行身份验证
+     * 3、当该用户这次请求jwt生成的token值已经超时,但该token对应cache中的k还是存在,则表示该用户一直在操作只是JWT的token失效了,程序会给token对应的k映射的v值重新生成JWTToken并覆盖v值,该缓存生命周期重新计算
+     * 4、当该用户这次请求jwt在生成的token值已经超时,并在cache中不存在对应的k,则表示该用户账户空闲超时,返回用户信息已失效,请重新登录。
+     * 注意: 前端请求Header中设置Authorization保持不变,校验有效性以缓存中的token为准。
+     *       用户过期时间 = Jwt有效时间 * 2。
+     *
+     * @param userName
+     * @param passWord
+     * @return
+     */
+    public boolean jwtTokenRefresh(String token, String userName, String passWord) {
+        String cacheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token));
+        if (oConvertUtils.isNotEmpty(cacheToken)) {
+            // 校验token有效性
+            if (!JwtUtil.verify(cacheToken, userName, passWord)) {
+                String newAuthorization = JwtUtil.sign(userName, passWord);
+                // 设置超时时间
+                redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization);
+                redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME *2 / 1000);
+                log.debug("——————————用户在线操作,更新token保证不掉线—————————jwtTokenRefresh——————— "+ token);
+            }
+            return true;
+        }
+        return false;
+    }
+
+
+
+    /**
+     * 清除当前用户的权限认证缓存
+     *
+     * @param principals 权限信息
+     */
+    @Override
+    public void clearCache(PrincipalCollection principals) {
+        super.clearCache(principals);
+    }
+    /**
+         * 清理所有用户授权信息缓存
+         */
+    public void clearAllCachedAuthorizationInfo()
+    {
+        Cache<Object, AuthorizationInfo> cache = getAuthorizationCache();
+        if (cache != null)
+        {
+            for (Object key : cache.keys())
+            {
+                cache.remove(key);
+            }
+        }
+    }
+}

+ 22 - 0
src/main/java/com/usky/config/sms/SmsConfig.java

@@ -0,0 +1,22 @@
+package com.usky.config.sms;
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.profile.DefaultProfile;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+@EnableConfigurationProperties(SmsProperties.class)
+public class SmsConfig {
+
+    @Bean
+    public IAcsClient acsClient(SmsProperties prop){
+        // 发送短信的客户端
+        DefaultProfile profile = DefaultProfile.getProfile(
+                prop.getRegionID(), prop.getAccessKeyID(), prop.getAccessKeySecret());
+        return new DefaultAcsClient(profile);
+    }
+}

+ 24 - 0
src/main/java/com/usky/config/sms/SmsConstants.java

@@ -0,0 +1,24 @@
+package com.usky.config.sms;
+
+
+public final class SmsConstants {
+    /**
+     * 请求参数
+     */
+    public static final String SMS_PARAM_REGION_ID = "RegionId";
+    public static final String SMS_PARAM_KEY_PHONE = "PhoneNumbers";
+    public static final String SMS_PARAM_KEY_SIGN_NAME = "SignName";
+    public static final String SMS_PARAM_KEY_TEMPLATE_CODE = "TemplateCode";
+    public static final String SMS_PARAM_KEY_TEMPLATE_PARAM= "TemplateParam";
+
+    /**
+     * 响应结果
+     */
+    public static final String SMS_RESPONSE_KEY_CODE = "Code";
+    public static final String SMS_RESPONSE_KEY_MESSAGE = "Message";
+
+    /**
+     * 状态
+     */
+    public static final String OK = "OK";
+}

+ 41 - 0
src/main/java/com/usky/config/sms/SmsProperties.java

@@ -0,0 +1,41 @@
+package com.usky.config.sms;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "sms")
+public class SmsProperties {
+    /**
+     * 账号
+     */
+    String accessKeyID;
+    /**
+     * 密钥
+     */
+    String accessKeySecret;
+    /**
+     * 短信签名
+     */
+    String signName;
+    /**
+     * 短信模板
+     */
+    String verifyCodeTemplate;
+    /**
+     * 发送短信请求的域名
+     */
+    String domain;
+    /**
+     * API版本
+     */
+    String version;
+    /**
+     * API类型
+     */
+    String action;
+    /**
+     * 区域
+     */
+    String regionID;
+}

+ 62 - 0
src/main/java/com/usky/config/webScoket/HttpAuthHandler.java

@@ -0,0 +1,62 @@
+package com.usky.config.webScoket;
+
+import com.usky.utils.TimeUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.CloseStatus;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.handler.TextWebSocketHandler;
+
+@Component
+@Slf4j
+public class HttpAuthHandler extends TextWebSocketHandler {
+    /**
+     * socket 建立成功事件
+     *
+     * @param session
+     * @throws Exception
+     */
+    @Override
+    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+        String id = session.getId();
+        System.out.println("id = " + id);
+        //  String query = session.getUri().getQuery();
+        if (null != id) {
+            WsSessionManager.add(id, session);
+        }
+    }
+    /**
+     * 接收消息事件
+     *
+     * @param session
+     * @param message
+     * @throws Exception
+     */
+    @Override
+    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+        // 获得客户端传来的消息
+        String payload = message.getPayload();
+        Object token = session.getAttributes().get("token");
+        System.out.println("server 接收到 " + token + " 发送的 " + payload);
+        //  WsSessionManager.sendMessageToAll(new TextMessage("server 发送给 " + token + " 消息 " + payload + " " + LocalDateTime.now().toString()));
+    }
+    /**
+     * socket 断开连接时
+     *
+     * @param session
+     * @param status
+     * @throws Exception
+     */
+    @Override
+    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
+        //    String query = session.getUri().getQuery();
+        String id = session.getId();
+        // 用户退出,移除缓存
+        WsSessionManager.remove(id);
+        log.info("===================连接断开,当前时间{}===========", TimeUtil.getTime());
+
+    }
+
+
+}

+ 59 - 0
src/main/java/com/usky/config/webScoket/MyInterceptor.java

@@ -0,0 +1,59 @@
+package com.usky.config.webScoket;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.WebSocketHandler;
+import org.springframework.web.socket.server.HandshakeInterceptor;
+
+import java.util.Map;
+
+
+/**
+ * @author laowo
+ */
+@Component
+@Slf4j
+public class MyInterceptor implements HandshakeInterceptor {
+
+    /**
+     * 握手前
+     *
+     * @param request
+     * @param response
+     * @param wsHandler
+     * @param attributes
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
+   //  if (request instanceof ServletServerHttpRequest) {
+   //      ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
+   //      HttpSession session = servletRequest.getServletRequest().getSession(false);
+   //      if (session.getAttribute("keys") != null) {
+   //          String key = (String) session.getAttribute("keys");
+   //          key = "123456";
+   //      } else {
+   //          return false;
+   //      }
+   //  }
+     return true;
+    }
+
+    /**
+     * 握手后
+     *
+     * @param request
+     * @param response
+     * @param wsHandler
+     * @param exception
+     */
+    @Override
+    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
+
+        log.info("================webSocket连接建立=============");
+    }
+
+}

+ 27 - 0
src/main/java/com/usky/config/webScoket/WebSocketConfig.java

@@ -0,0 +1,27 @@
+package com.usky.config.webScoket;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+
+/**
+ * @author buhao
+ * @version WebSocketConfig.java, v 0.1 2019-10-17 15:43 buhao
+ */
+@Configuration
+@EnableWebSocket
+public class WebSocketConfig implements WebSocketConfigurer {
+    @Autowired
+    private HttpAuthHandler httpAuthHandler;
+    @Autowired
+    private MyInterceptor myInterceptor;
+    @Override
+    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
+        registry
+                .addHandler(httpAuthHandler, "/top/WS/alarmPush")
+                .addInterceptors(myInterceptor)
+                .setAllowedOrigins("*");
+    }
+}

+ 97 - 0
src/main/java/com/usky/config/webScoket/WsSessionManager.java

@@ -0,0 +1,97 @@
+package com.usky.config.webScoket;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+public class WsSessionManager {
+    /**
+     * 保存连接 session 的地方
+     */
+    private static ConcurrentHashMap<String, WebSocketSession> SESSION_POOL = new ConcurrentHashMap<>();
+
+    /**
+     * 添加 session
+     *
+     * @param key
+     */
+    public static void add(String key, WebSocketSession session) {
+        // 添加 session
+        SESSION_POOL.put(key, session);
+    }
+
+    /**
+     * 删除 session,会返回删除的 session
+     *
+     * @param key
+     * @return
+     */
+    public static WebSocketSession remove(String key) {
+        // 删除 session
+        return SESSION_POOL.remove(key);
+    }
+
+    /**
+     * 删除并同步关闭连接
+     *
+     * @param key
+     */
+    public static void removeAndClose(String key) {
+        WebSocketSession session = remove(key);
+        if (session != null) {
+            try {
+                // 关闭连接
+                session.close();
+            } catch (IOException e) {
+                // todo: 关闭出现异常处理
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 获得 session
+     *
+     * @param key
+     * @return
+     */
+    public static WebSocketSession get(String key) {
+        // 获得 session
+        return SESSION_POOL.get(key);
+    }
+
+    public static void sendMessageToAll(final TextMessage message) {
+        //对用户发送的消息内容进行转义
+        //获取到所有在线用户的SocketSession对象
+        Set<Map.Entry<String, WebSocketSession>> entrySet = SESSION_POOL.entrySet();
+        for (Map.Entry<String, WebSocketSession> entry : entrySet) {
+            //某用户的WebSocketSession
+            final WebSocketSession webSocketSession = entry.getValue();
+            //判断连接是否仍然打开的
+            if (webSocketSession.isOpen()) {
+                //开启多线程发送消息
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            if (webSocketSession.isOpen()) {
+                                webSocketSession.sendMessage(message);
+                            }
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }).start();
+
+            }
+        }
+    }
+
+
+}

+ 103 - 0
src/main/java/com/usky/constant/CommonConstant.java

@@ -0,0 +1,103 @@
+package com.usky.constant;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public interface CommonConstant {
+
+    /**
+     * 正常状态
+     */
+    public static final Integer STATUS_NORMAL = 0;
+
+    /**
+     * 禁用状态
+     */
+    public static final Integer STATUS_DISABLE = -1;
+
+    /**
+     * 删除标志
+     */
+    public static final Integer DEL_FLAG_1 = 1;
+
+    /**
+     * 未删除
+     */
+    public static final Integer DEL_FLAG_0 = 0;
+
+    /**
+     * 系统日志类型: 登录
+     */
+    public static final int LOG_TYPE_1 = 1;
+
+    /**
+     * 系统日志类型: 操作
+     */
+    public static final int LOG_TYPE_2 = 2;
+
+    /**
+     * 操作日志类型: 查询
+     */
+    public static final int OPERATE_TYPE_1 = 1;
+
+    /**
+     * 操作日志类型: 添加
+     */
+    public static final int OPERATE_TYPE_2 = 2;
+
+    /**
+     * 操作日志类型: 更新
+     */
+    public static final int OPERATE_TYPE_3 = 3;
+
+    /**
+     * 操作日志类型: 删除
+     */
+    public static final int OPERATE_TYPE_4 = 4;
+
+    /**
+     * 操作日志类型: 导入
+     */
+    public static final int OPERATE_TYPE_5 = 5;
+
+    /**
+     * 操作日志类型: 导出
+     */
+    public static final int OPERATE_TYPE_6 = 6;
+
+
+    /**
+     * {@code 500 Server Error} (HTTP/1.0 - RFC 1945)
+     */
+    public static final Integer SC_INTERNAL_SERVER_ERROR_500 = 500;
+    /**
+     * {@code 200 OK} (HTTP/1.0 - RFC 1945)
+     */
+    public static final Integer SC_OK_200 = 200;
+
+
+    /** 登录用户Shiro权限缓存KEY前缀 */
+    public static String PREFIX_USER_SHIRO_CACHE  = "shiro:cache:org.jeecg.config.shiro.ShiroRealm.authorizationCache:";
+    /** 登录用户Token令牌缓存KEY前缀 */
+    public static final String PREFIX_USER_TOKEN  = "prefix_user_token_";
+    /** Token缓存时间:3600秒即一小时 */
+    public static final int  TOKEN_EXPIRE_TIME  = 3600;
+
+    /**
+     * 首页天气地址
+     */
+
+    public static final String TOP_WEATHER_HOST = "https://weather01.market.alicloudapi.com";
+    public static final String TOP_WEATHER_PATH = "/area-to-weather";
+    public static final String TOP_WEATHER_METHOD = "GET";
+    public static final String TOP_WEATHER_APPCODE = "0f2b7fce6e104ba8835358b7b59b4fb6";
+
+
+    /**
+     * MQTT数据接收类型
+     */
+    public static final String MQTT_MESSAGE_TYPE_INFO = "INFO";
+    public static final String MQTT_MESSAGE_TYPE_ALARM = "ALARM";
+    public final static String X_ACCESS_TOKEN = "X-Access-Token";
+
+}

+ 210 - 0
src/main/java/com/usky/controller/build/BuildController.java

@@ -0,0 +1,210 @@
+package com.usky.controller.build;
+
+import com.usky.entity.build.TbBuildingVoEntity;
+import com.usky.entity.build.TbFloorVoEntity;
+import com.usky.entity.build.TbRoomVoEntity;
+import com.usky.service.build.BuildService;
+import com.usky.utils.Page;
+import com.usky.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/5/24 09:20
+ * @description TODO
+ **/
+@RequestMapping("build")
+@Api(tags = "建筑管理")
+@Controller
+@Slf4j
+public class BuildController {
+    @Autowired
+    private BuildService buildServiceIpml;
+
+    @RequestMapping(value = "addBuild", method = {RequestMethod.POST})
+    @ResponseBody
+    @ApiOperation(value = "建筑新增")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "buildName", value = "建筑名称", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "buildAddr", value = "地址", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "latitude", value = "维度", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "longitude", value = "经度", required = true, paramType = "query")
+    })
+    public Result addBuild(@RequestParam("buildName") String buildName,
+                           @RequestParam("buildAddr") String buildAddr,
+                           @RequestParam("latitude") String latitude,
+                           @RequestParam("longitude") String longitude
+    ) {
+        return buildServiceIpml.addBuild(buildName, buildAddr, latitude, longitude);
+    }
+
+    @RequestMapping(value = "editBuild", method = {RequestMethod.POST})
+    @ResponseBody
+    @ApiOperation(value = "建筑信息修改")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "buildName", value = "建筑名称", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "buildAddr", value = "地址", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "latitude", value = "维度", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "id", value = "主键id", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "状态 0 删除", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "longitude", value = "经度", required = false, paramType = "query")
+    })
+    public Result editBuild(@RequestParam(value = "buildName", required = false) String buildName,
+                              @RequestParam(value = "buildAddr", required = false) String buildAddr,
+                              @RequestParam(value = "latitude", required = false) String latitude,
+                              @RequestParam(value = "status", required = false) String status,
+                              @RequestParam(value = "id", required = true) String id,
+                              @RequestParam(value = "longitude", required = false) String longitude
+    ) {
+        return buildServiceIpml.updateBuild(buildName, buildAddr, latitude, longitude, id, status);
+    }
+
+    @RequestMapping(value = "listBuild", method = {RequestMethod.GET})
+    @ResponseBody
+    @ApiOperation(value = "建筑信息查询")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "buildName", value = "建筑名称", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "buildAddr", value = "地址", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "latitude", value = "维度", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "pageNo", value = "当前页,默认1", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "pageSize", value = "页数据条数20", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "longitude", value = "经度", required = false, paramType = "query")
+    })
+    public Page<TbBuildingVoEntity> listBuild(@RequestParam(value = "buildName", required = false) String buildName,
+                                               @RequestParam(value = "buildAddr", required = false) String buildAddr,
+                                               @RequestParam(value = "latitude", required = false) String latitude,
+                                               @RequestParam(value = "pageNo", required = false, defaultValue = "1") String PageNo,
+                                               @RequestParam(value = "pageSize", required = false, defaultValue = "20") String pageSize,
+                                               @RequestParam(value = "longitude", required = false) String longitude
+    ) {
+        return buildServiceIpml.listBuild(buildName, buildAddr, latitude, longitude, PageNo, pageSize);
+    }
+
+
+    @RequestMapping(value = "addFloor", method = {RequestMethod.POST})
+    @ResponseBody
+    @ApiOperation(value = "楼层新增")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "floorName", value = "楼层名称", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "floorBuildUuid", value = "建筑唯一编码", required = true, paramType = "query")
+    })
+    public Result addFloor(@RequestParam("floorName") String floorName,
+                           @RequestParam("floorBuildUuid") String floorBuildUuid
+    ) {
+        return buildServiceIpml.addFloor(floorName, floorBuildUuid);
+    }
+
+    @RequestMapping(value = "editFloor", method = {RequestMethod.POST})
+    @ResponseBody
+    @ApiOperation(value = "楼层信息修改")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "floorName", value = "楼层名称", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "floorBuildUuid", value = "所属建筑", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "id", value = "主键id", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "状态 0 删除", required = false, paramType = "query"),
+    })
+    public Result editFloor(@RequestParam(value = "floorName", required = false) String floorName,
+                              @RequestParam(value = "floorBuildUuid", required = false) String floorBuildUuid,
+                              @RequestParam(value = "id", required = false) String id,
+                              @RequestParam(value = "status", required = false) String status
+    ) {
+        return buildServiceIpml.updateFloor(floorName, floorBuildUuid, id, status);
+    }
+
+    @RequestMapping(value = "listFloor", method = {RequestMethod.GET})
+    @ResponseBody
+    @ApiOperation(value = "楼层信息查询")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "floorName", value = "楼层名称", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "floorBuildUuid", value = "所属建筑唯一编码", required = false, paramType = "query")
+    })
+    public Page<TbFloorVoEntity> listFloor(@RequestParam(value = "floorName", required = false) String floorName,
+                                            @RequestParam(value = "floorBuildUuid", required = false) String floorBuildUuid,
+                                            @RequestParam(value = "pageNo", required = false, defaultValue = "1") String PageNo,
+                                            @RequestParam(value = "pageSize", required = false, defaultValue = "20") String pageSize
+    ) {
+        return buildServiceIpml.queryFloor(floorName, floorBuildUuid, PageNo, pageSize);
+    }
+
+
+    @RequestMapping(value = "addRoom", method = {RequestMethod.POST})
+    @ResponseBody
+    @ApiOperation(value = "房间新增")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomName", value = "房间名称", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "roomFloorUuid", value = "楼层唯一编码", required = true, paramType = "query")
+    })
+    public Result addRoom(@RequestParam(value = "roomName", required = true) String roomName,
+                          @RequestParam(value = "roomFloorUuid", required = true) String roomFloorUuid
+    ) {
+        return buildServiceIpml.addRoom(roomName, roomFloorUuid);
+    }
+
+    @RequestMapping(value = "editRoom", method = {RequestMethod.POST})
+    @ResponseBody
+    @ApiOperation(value = "房间信息修改")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomName", value = "房间名称", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "roomFloorUuid", value = "所属楼层", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "id", value = "主键id", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "状态 0 删除", required = false, paramType = "query"),
+    })
+    public Result editRoom(@RequestParam(value = "roomName", required = false) String RoomName,
+                             @RequestParam(value = "roomFloorUuid", required = false) String roomFloorUuid,
+                             @RequestParam(value = "id", required = false) String id,
+                             @RequestParam(value = "status", required = false) String status
+    ) {
+        return buildServiceIpml.updateRoom(RoomName, roomFloorUuid, id, status);
+    }
+
+    @RequestMapping(value = "listRoom", method = {RequestMethod.GET})
+    @ResponseBody
+    @ApiOperation(value = "房间信息查询")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomName", value = "房间名称", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "roomFloorUuid", value = "所属楼层唯一编码", required = false, paramType = "query")
+    })
+    public Page<TbRoomVoEntity> listRoom(@RequestParam(value = "roomName", required = false) String roomName,
+                                          @RequestParam(value = "roomFloorUuid", required = false) String roomFloorUuid,
+                                          @RequestParam(value = "pageNo", required = false, defaultValue = "1") String PageNo,
+                                          @RequestParam(value = "pageSize", required = false, defaultValue = "20") String pageSize
+    ) {
+
+
+        return buildServiceIpml.queryRoom(roomName, roomFloorUuid, PageNo, pageSize);
+    }
+
+    @RequestMapping(value = "listBuildFloorRoom", method = {RequestMethod.GET})
+    @ResponseBody
+    @ApiOperation(value = "建筑下拉框")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roomName", value = "房间名称", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "roomFloorUuid", value = "所属楼层唯一编码", required = false, paramType = "query")
+    })
+    public Page<TbRoomVoEntity> listBuildFloorRoom(@RequestParam(value = "roomName", required = false) String roomName,
+                                         @RequestParam(value = "roomFloorUuid", required = false) String roomFloorUuid,
+                                         @RequestParam(value = "pageNo", required = false, defaultValue = "1") String PageNo,
+                                         @RequestParam(value = "pageSize", required = false, defaultValue = "20") String pageSize
+    ) {
+
+
+        return buildServiceIpml.queryRoom(roomName, roomFloorUuid, PageNo, pageSize);
+    }
+
+
+
+
+
+}

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

@@ -0,0 +1,78 @@
+package com.usky.controller.login;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonObject;
+import com.usky.constant.CommonConstant;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.service.sys.user.LoginService;
+import com.usky.service.sys.user.UserService;
+import com.usky.utils.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+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;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 17:09
+ * @description TODO
+ **/
+@RestController
+@RequestMapping("sys")
+@Api(tags = "登录")
+public class LoginController {
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private LoginService loginService;
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @PostMapping("login")
+    //   @ApiOperation(value = "用户登录")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "loginName", value = "登录名", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "passWord", value = "密码", required = true, paramType = "query")
+    })
+    public Result<?> login(@RequestParam("loginName") String loginName,
+                           @RequestParam("passWord") String passWord) {
+        SysUserVO user = loginService.findUserByUsername(loginName);
+        if (!PasswordUtil.encrypt(loginName, passWord, user.getSalt()).equals(user.getPassword())) {
+            return Result.error("用户名或密码错误");
+        }
+        if (user.getStatus().equals("1")) {
+            return Result.error("账户已停用,请联系管理员!");
+        }
+        String token = JwtUtil.sign(loginName, passWord);
+        // 设置token缓存有效时间
+        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
+        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
+        JSONObject json = new JSONObject();
+        json.put("token", token);
+        json.put("userInnfo", user);
+        return Result.OK(json);
+
+
+    }
+
+    @PostMapping("loginOut")
+    @ApiOperation(value = "用户退出")
+    public Result<?> loginOut() {
+        AuthorizationUtils.clearAllCachedAuthorizationInfo();
+        return Result.error("操作成功");
+    }
+
+
+}

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

@@ -0,0 +1,115 @@
+package com.usky.controller.sys;
+
+import com.usky.entity.sys.SysDeptDTO;
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.ztree.Ztree;
+import com.usky.service.sys.dept.DeptService;
+import com.usky.service.sys.user.UserService;
+import com.usky.utils.ListUtil;
+import com.usky.utils.Result;
+import com.usky.utils.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+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;
+    @Autowired
+    private UserService userService;
+    private String prefix = "/system/dept";
+
+    @ApiOperation(value = "部门管理页面鉴权")
+    @RequiresPermissions("system:dept:view")
+    @GetMapping()
+    public String dept() {
+        return prefix + "/dept";
+    }
+
+    @RequiresPermissions("system:dept:list")
+    @ApiOperation(value = "系统-部门数据加载")
+    @GetMapping("list")
+    public Result<List<Ztree>> list() {
+        List<Ztree> data = deptService.list(new SysDeptVO());
+        return Result.OK(data);
+    }
+
+
+    @ApiOperation(value = "新增部门")
+    @RequiresPermissions("system:dept:add")
+    @PostMapping("/add")
+    @ResponseBody
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "parentId", value = "父级部门id", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "orderNum", value = "部门排序", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "deptName", value = "部门名称", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "部门状态 0 正常 1停用", required = true, paramType = "query")
+    })
+    public Result<?> add(@Validated SysDeptDTO dept) {
+        List<SysDeptDTO> data = deptService.queryDeptByNameAndParentId(dept);
+        if (ListUtil.isNotBlank(data)) {
+            return Result.error("部门名称已存在!");
+        }
+        return deptService.add(dept);
+    }
+
+    @ApiOperation(value = "修改部门")
+    @RequiresPermissions("system:dept:edit")
+    @PostMapping("/edit")
+    @ResponseBody
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "parentId", value = "父级部门id", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "orderNum", value = "部门排序", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "deptName", value = "部门名称", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "部门状态 0 正常 1停用", required = true, paramType = "query")
+    })
+    public Result<?> editSave(@Validated SysDeptDTO dept) {
+        List<SysDeptDTO> data = deptService.queryDeptByNameAndParentId(dept);
+        if (ListUtil.isNotBlank(data)) {
+            return Result.error("部门名称已存在!");
+        } else if (dept.getParentId().equals(dept.getDeptId())) {
+            return Result.error("部门上级不能是自己!");
+        } else if (StringUtils.equals("1", dept.getStatus())
+                && deptService.queryDeptChildByid(dept.getDeptId()) > 0) {
+            return Result.error("该部门包含未停用的子部门!");
+        }
+        return Result.OK();
+    }
+
+    /**
+     * 删除
+     */
+    @ApiOperation(value = "删除部门")
+    @RequiresPermissions("system:dept:remove")
+    @GetMapping("/remove/{deptId}")
+    @ResponseBody
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "deptId", value = "部门id", required = true, paramType = "query")
+    })
+    public Result<?> remove(@PathVariable("deptId") Integer deptId) {
+        if (deptService.selectDeptCount(deptId).size() > 0) {
+            return Result.error("存在下级部门,不允许删除");
+        }
+        if (ListUtil.isNotBlank(userService.queryuserByDepID(deptId))) {
+            return Result.error("部门存在用户,不允许删除");
+        }
+        deptService.remove(deptId);
+        return Result.OK();
+    }
+}

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

@@ -0,0 +1,129 @@
+package com.usky.controller.sys;
+
+
+import com.usky.annotion.AutoLog;
+import com.usky.entity.sys.SysMenuDTO;
+import com.usky.entity.sys.vo.SysMenuVO;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.service.sys.menuService.MenuService;
+import com.usky.utils.AuthorizationUtils;
+import com.usky.utils.ListUtil;
+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.validation.annotation.Validated;
+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  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);
+    }
+
+    /**
+     * 删除菜单
+     */
+    @AutoLog("菜单删除")
+    @ApiOperation(value = "菜单管理-删除")
+    @RequiresPermissions("system:menu:remove")
+    @PostMapping("remove")
+    @ResponseBody
+    public Result<?> remove(@RequestParam("menuId") Integer menuId) {
+        if (menuService.queryMenuById(menuId) > 0) {
+            return Result.error("存在子菜单,不允许删除");
+        }
+        if (menuService.queryRoleMenuByMenuId(menuId) > 0) {
+            return Result.error("菜单已分配,不允许删除");
+        }
+        AuthorizationUtils.clearAllCachedAuthorizationInfo();
+        menuService.deleteMenuById(menuId);
+        return Result.OK();
+    }
+
+    /**
+     * 新增保存菜单
+     */
+    @AutoLog("新增菜单")
+    @ApiOperation(value = "菜单管理-新增")
+    @RequiresPermissions("system:menu:add")
+    @PostMapping("/add")
+    @ResponseBody
+    public Result<?> addSave(@Validated SysMenuVO menu) {
+        //查询同一父级菜单名称是否重复
+        List<SysMenuDTO> sysMenuDTOS = menuService.queryMenuByName(menu.getMenuName(), menu.getParentId());
+        if (ListUtil.isNotBlank(sysMenuDTOS)) {
+            return Result.error("菜单名称重复!");
+        }
+        AuthorizationUtils.clearAllCachedAuthorizationInfo();
+        menuService.add(menu);
+        return Result.OK();
+    }
+
+    /**
+     * 菜单修改
+     */
+    @AutoLog("菜单修改")
+    @ApiOperation(value = "菜单管理-修改")
+    @RequiresPermissions("system:menu:edit")
+    @PostMapping("/edit")
+    @ResponseBody
+    public Result<?> editSave(@Validated SysMenuVO menu) {
+        List<SysMenuDTO> sysMenuDTOS = menuService.queryMenuByName(menu.getMenuName(), menu.getParentId());
+        if (ListUtil.isNotBlank(sysMenuDTOS)) {
+            return Result.error("菜单名称重复!");
+        }
+
+        AuthorizationUtils.clearAllCachedAuthorizationInfo();
+        menuService.updateMenu(menu);
+        return Result.OK();
+    }
+
+}

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

@@ -0,0 +1,195 @@
+package com.usky.controller.sys;
+
+import com.usky.entity.sys.SysRoleDTO;
+import com.usky.entity.sys.SysUserRoleDTO;
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.sys.vo.SysRoleVO;
+import com.usky.service.sys.RoleService;
+import com.usky.service.sys.user.UserService;
+import com.usky.utils.*;
+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.*;
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/27 14:37
+ * @description TODO
+ **/
+
+import java.util.List;
+
+@Api(tags = "系统-角色管理")
+@RestController
+@RequestMapping("sys/role")
+public class RoleController {
+
+    private String prefix = "system/role";
+    @Autowired
+    private RoleService roleService;
+
+    @Autowired
+    private UserService userService;
+
+    @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;
+    }
+
+    @ApiOperation(value = "角色查询-全部")
+    @PostMapping("listAll")
+    @RequiresPermissions("system:role:list")
+    public Result<List<SysRoleVO>> list() {
+        List<SysRoleVO> roleVOList = roleService.querRoleList(new SysRoleVO());
+        return Result.OK(roleVOList);
+    }
+
+    /**
+     * 新增保存角色
+     */
+    @ApiOperation(value = "角色新增")
+    @RequiresPermissions("system:role:add")
+    @PostMapping("/add")
+    @ResponseBody
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roleName", value = "角色名称", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "menuIds", value = "菜单组", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "deptIds", value = "部门", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "roleKey", value = "角色权限字符", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "roleSort", value = "排序", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "dataScope", value = "数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4本部门及以下数据权限)", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "角色状态(0正常 1停用)", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "remark", value = "备注", required = false, paramType = "query"),
+    })
+    public Result<?> addSave(
+            @RequestParam("roleName") String roleName,
+            @RequestParam(value = "menuIds", required = false) Integer[] menuIds,
+            @RequestParam(value = "deptIds", required = false) Integer[] deptIds,
+            @RequestParam("roleKey") String roleKey,
+            @RequestParam("roleSort") Integer roleSort,
+            @RequestParam("dataScope") String dataScope,
+            @RequestParam("status") String status,
+            @RequestParam(value = "remark", required = false) String remark
+    ) {
+        //新增角色名称校验
+        SysRoleVO roleVO = new SysRoleVO();
+        roleVO.setRoleName(roleName);
+        roleVO.setRoleKey(roleKey);
+        roleVO.setRoleSort(roleSort);
+        roleVO.setDataScope(dataScope);
+        roleVO.setStatus(status);
+        roleVO.setRemark(remark);
+        roleVO.setMenuIds(menuIds);
+        roleVO.setDeptIds(deptIds);
+        SysRoleDTO roleDTO = roleService.queryRoleByName(roleVO);
+        if (roleDTO != null) {
+            return Result.error("角色名称不能重复!");
+        }
+        //权限字符校验
+        SysRoleDTO roleKeyDto = roleService.queryRoleByKey(roleVO);
+        if (roleKeyDto != null) {
+            return Result.error("权限字符不能重复!");
+        }
+        AuthorizationUtils.clearAllCachedAuthorizationInfo();
+        roleService.addRole(roleVO);
+        return Result.OK();
+    }
+
+
+    @ApiOperation(value = "角色信息修改")
+    @RequiresPermissions("system:role:edit")
+    @PostMapping("/edit")
+    @ResponseBody
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roleId", value = "角色id", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "roleName", value = "角色名称", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "menuIds", value = "菜单组", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "deptIds", value = "部门", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "roleKey", value = "角色权限字符", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "roleSort", value = "排序", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "dataScope", value = "数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4本部门及以下数据权限)", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "角色状态(0正常 1停用)", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "remark", value = "备注", required = false, paramType = "query"),
+    })
+    public Result<?> edit(
+            @RequestParam("roleName") String roleName,
+            @RequestParam("roleId") Integer roleId,
+            @RequestParam(value = "menuIds", required = false) Integer[] menuIds,
+            @RequestParam(value = "deptIds", required = false) Integer[] deptIds,
+            @RequestParam("roleKey") String roleKey,
+            @RequestParam("roleSort") Integer roleSort,
+            @RequestParam("dataScope") String dataScope,
+            @RequestParam("status") String status,
+            @RequestParam(value = "remark", required = false) String remark
+    ) {
+
+        //新增角色名称校验
+        SysRoleVO roleVO = new SysRoleVO();
+        roleVO.setRoleName(roleName);
+        roleVO.setRoleKey(roleKey);
+        roleVO.setRoleId(roleId);
+        roleVO.setRoleSort(roleSort);
+        roleVO.setDataScope(dataScope);
+        roleVO.setStatus(status);
+        roleVO.setRemark(remark);
+        roleVO.setMenuIds(menuIds);
+        roleVO.setDeptIds(deptIds);
+        SysRoleDTO roleDTO = roleService.queryRoleByName(roleVO);
+        if (roleDTO != null) {
+            return Result.error("角色名称不能重复!");
+        }
+        //权限字符校验
+        SysRoleDTO roleKeyDto = roleService.queryRoleByKey(roleVO);
+        if (roleKeyDto != null) {
+            return Result.error("权限字符不能重复!");
+        }
+        AuthorizationUtils.clearAllCachedAuthorizationInfo();
+        roleService.edit(roleVO);
+        return Result.OK();
+    }
+
+
+    @ApiOperation(value = "角色删除")
+    @RequiresPermissions("system:role:remove")
+    @PostMapping("/remove")
+    @ResponseBody
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roleId", value = "角色id", required = true, paramType = "query")})
+    public Result<?> remove(@RequestParam("roleId") Integer roleId) {
+        List<SysUserRoleDTO> sysUserRoleDTOS = userService.queryUserByRoleId(roleId);
+        if (ListUtil.isNotBlank(sysUserRoleDTOS)) {
+            return Result.error("角色已被分配无法删除");
+        }
+        userService.remove(roleId);
+        return Result.OK();
+    }
+}

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

@@ -0,0 +1,201 @@
+package com.usky.controller.sys;
+
+import com.usky.entity.sys.SysUserDTO;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.service.sys.RoleService;
+import com.usky.service.sys.user.UserService;
+import com.usky.utils.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+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/20 15:12
+ * @description TODO
+ **/
+@Api(tags = "系统-用户管理")
+@RestController
+@RequestMapping("sys/user")
+public class UserController {
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private RoleService roleService;
+
+    private String prefix = "sys/user";
+
+    @ApiOperation("用户管理-页面鉴权")
+    @RequiresPermissions("system:user:view")
+    @GetMapping()
+    public String user() {
+        return prefix + "/user";
+    }
+
+
+    @ApiOperation(value = "系统-用户添加")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "loginName", value = "登录名", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "账户状态 0正常 1 停用", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "phonenumber", value = "手机号", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "deptId", value = "部门id", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "roleIds", value = "角色", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "userName", value = "用户名", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "remark", value = "备注", required = false, paramType = "query"),
+    })
+    @PostMapping("addUser")
+    public Result<?> addUser(
+            @RequestParam(value = "loginName", required = true) String loginName,
+            @RequestParam(value = "status", required = false) String status,
+            @RequestParam(value = "phonenumber", required = true) String phonenumber,
+            @RequestParam(value = "deptId", required = true) Integer deptId,
+            @RequestParam(value = "password", required = true) String password,
+            @RequestParam(value = "userName", required = true) String userName,
+            @RequestParam(value = "roleIds", required = true) String roleIds,
+            @RequestParam(value = "remark", required = false) String remark
+    ) {
+        //登录名校验
+        List<SysUserVO> sysUserVOList = userService.listAll(new SysUserVO(), null, loginName, null, null, null, null);
+        if (ListUtil.isNotBlank(sysUserVOList)) {
+            return Result.error("登录名已存在");
+        }
+        List<SysUserVO> phone = userService.listAll(new SysUserVO(), null, null, phonenumber, null, null, null);
+        if (ListUtil.isNotBlank(phone)) {
+            return Result.error("手机号已存在");
+        }
+        SysUserVO user = new SysUserVO();
+        user.setLoginName(loginName);
+        user.setDeptId(deptId);
+        user.setRemark(remark);
+        user.setUserName(userName);
+        user.setPassword(password);
+        user.setStatus(status);
+        user.setRoleIds(roleIds);
+        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);
+    }
+
+    @ApiOperation(value = "用户查询-全部 -可用于导出")
+    @PostMapping("listAll")
+    @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"),
+    })
+    @RequiresPermissions("system:user:list")
+    public Result<List<SysUserVO>> listAll(
+            @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
+    ) {
+        List<SysUserVO> sysUserVOList = userService.listAll(new SysUserVO(), status, loginName, phonenumber, startTime, endTime, deptId);
+        return Result.OK(sysUserVOList);
+    }
+
+
+    @ApiOperation(value = "修改用户")
+    @RequiresPermissions("system:user:edit")
+    @PostMapping("/edit")
+    @ResponseBody
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "status", value = "账户状态 0正常 1 停用", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "phonenumber", value = "手机号", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "deptId", value = "部门id", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "roleIds", value = "角色", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "userName", value = "用户名", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "remark", value = "备注", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "userId", value = "用户id", required = true, paramType = "query")
+    })
+    public Result<?> editSave(
+            @RequestParam(value = "status", required = false) String status,
+            @RequestParam(value = "phonenumber", required = false) String phonenumber,
+            @RequestParam(value = "deptId") Integer deptId,
+            @RequestParam(value = "userName", required = false) String userName,
+            @RequestParam(value = "roleIds", required = false) String roleIds,
+            @RequestParam(value = "userId", required = true) Integer userId,
+            @RequestParam(value = "remark", required = false) String remark
+    ) {
+        if (StringUtils.isNotBlank(phonenumber)) {
+            //用户手机号校验
+            List<SysUserDTO> user = userService.queryUserByPhone(phonenumber);
+            if (ListUtil.isNotBlank(user)) {
+                return Result.error("手机号已存在!");
+            }
+        }
+        SysUserVO user = new SysUserVO();
+        user.setStatus(status);
+        user.setRemark(remark);
+        user.setUserName(userName);
+        user.setDeptId(deptId);
+        user.setUserId(userId);
+        user.setRoleIds(roleIds);
+        user.setPhonenumber(phonenumber);
+        userService.updateUser(user);
+        return Result.OK();
+    }
+
+
+    @ApiOperation("密码重置")
+    @RequiresPermissions("system:user:resetPwd")
+    @PostMapping("/resetPwd")
+    @ResponseBody
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "userId", value = "用户id", required = true, paramType = "query")
+    })
+    public Result<?> resetPwdSave(@RequestParam("password") String password,
+                                  @RequestParam("password") Integer userId) {
+        if (userId == 1) {
+            return Result.error("管理员账户不允许修改!");
+        }
+        userService.reSetPW(password, userId);
+        return Result.OK();
+    }
+
+
+}

+ 13 - 0
src/main/java/com/usky/dao/BaseDao.java

@@ -0,0 +1,13 @@
+package com.usky.dao;
+
+import org.hibernate.Session;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2020/11/2 17:03
+ * @description TODO
+ **/
+public interface BaseDao {
+    public Session getSession();
+}

+ 27 - 0
src/main/java/com/usky/dao/impl/BaseDaoImpl.java

@@ -0,0 +1,27 @@
+package com.usky.dao.impl;
+
+import com.usky.dao.BaseDao;
+import org.hibernate.Session;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.orm.hibernate5.HibernateTransactionManager;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2020/11/2 17:04
+ * @description TODO
+ **/
+@Repository
+@Transactional
+public class BaseDaoImpl implements BaseDao {
+    @Autowired
+    private HibernateTransactionManager hibernateTransactionManager;
+
+    @Override
+    public Session getSession() {
+        Session currentSession = hibernateTransactionManager.getSessionFactory().getCurrentSession();
+        return currentSession;
+    }
+}

+ 42 - 0
src/main/java/com/usky/emu/ResponeCodeEnum.java

@@ -0,0 +1,42 @@
+package com.usky.emu;
+
+/**
+ * @author laowo
+ * @version 1.0.0
+ * @ClassName ResponeCodeEnum.java
+ * @Description TODO
+ * @createTime 2021/01/11/ 13:09:00
+ */
+public enum ResponeCodeEnum {
+    /**
+     * 枚举类
+     */
+    SUCCESS(true, "0000", "操作成功!"),
+
+    FAIL(false, "0001", "操作失败!"),
+
+    ERROR(false, "0002", "系统错误!");
+    private Boolean flag; // 标记Code
+
+    private String responseCode;
+
+    private String comment;
+
+    ResponeCodeEnum(Boolean flag, String responseCode, String comment) {
+        this.flag = flag;
+        this.responseCode = responseCode;
+        this.comment = comment;
+    }
+
+    public Boolean getFlag() {
+        return flag;
+    }
+
+    public String getResponseCode() {
+        return responseCode;
+    }
+
+    public String getComment() {
+        return comment;
+    }
+}

+ 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;
+    }
+}

+ 117 - 0
src/main/java/com/usky/entity/build/TbBuildingEntity.java

@@ -0,0 +1,117 @@
+package com.usky.entity.build;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/5/24 09:41
+ * @description TODO
+ **/
+@Entity
+@Table(name = "tb_building", schema = "jx_cover", catalog = "")
+public class TbBuildingEntity {
+    private int id;
+    private String buildUuid;
+    private String buildName;
+    private String buildAddr;
+    private String latitude;
+    private String longitude;
+    private int status;
+    private Timestamp creatTime;
+
+    @Id
+    @Column(name = "id")
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    @Basic
+    @Column(name = "build_uuid")
+    public String getBuildUuid() {
+        return buildUuid;
+    }
+
+    public void setBuildUuid(String buildUuid) {
+        this.buildUuid = buildUuid;
+    }
+
+    @Basic
+    @Column(name = "build_name")
+    public String getBuildName() {
+        return buildName;
+    }
+
+    public void setBuildName(String buildName) {
+        this.buildName = buildName;
+    }
+
+    @Basic
+    @Column(name = "build_addr")
+    public String getBuildAddr() {
+        return buildAddr;
+    }
+
+    public void setBuildAddr(String buildAddr) {
+        this.buildAddr = buildAddr;
+    }
+
+    @Basic
+    @Column(name = "latitude")
+    public String getLatitude() {
+        return latitude;
+    }
+
+    public void setLatitude(String latitude) {
+        this.latitude = latitude;
+    }
+
+    @Basic
+    @Column(name = "longitude")
+    public String getLongitude() {
+        return longitude;
+    }
+
+    public void setLongitude(String longitude) {
+        this.longitude = longitude;
+    }
+
+    @Basic
+    @Column(name = "status")
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    @Basic
+    @Column(name = "creat_time")
+    public Timestamp getCreatTime() {
+        return creatTime;
+    }
+
+    public void setCreatTime(Timestamp creatTime) {
+        this.creatTime = creatTime;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TbBuildingEntity that = (TbBuildingEntity) o;
+        return id == that.id && status == that.status && Objects.equals(buildUuid, that.buildUuid) && Objects.equals(buildName, that.buildName) && Objects.equals(buildAddr, that.buildAddr) && Objects.equals(latitude, that.latitude) && Objects.equals(longitude, that.longitude) && Objects.equals(creatTime, that.creatTime);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, buildUuid, buildName, buildAddr, latitude, longitude, status, creatTime);
+    }
+}

+ 36 - 0
src/main/java/com/usky/entity/build/TbBuildingVoEntity.java

@@ -0,0 +1,36 @@
+package com.usky.entity.build;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.sql.Timestamp;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/5/24 09:41
+ * @description TODO
+ **/
+@Data
+@ApiModel("建筑Vo")
+public class TbBuildingVoEntity {
+    @ApiModelProperty("主键id")
+    private int id;
+    @ApiModelProperty("建筑唯一编码")
+    private String buildUuid;
+    @ApiModelProperty("建筑名称")
+    private String buildName;
+    @ApiModelProperty("地址")
+    private String buildAddr;
+    @ApiModelProperty("维度")
+    private String latitude;
+    @ApiModelProperty("经度")
+    private String longitude;
+    @ApiModelProperty("0未删除 1 已删除")
+    private int status;
+    @ApiModelProperty("添加时间")
+    private Timestamp creatTime;
+
+
+}

+ 96 - 0
src/main/java/com/usky/entity/build/TbFloorEntity.java

@@ -0,0 +1,96 @@
+package com.usky.entity.build;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/5/24 09:41
+ * @description TODO
+ **/
+@Entity
+@Table(name = "tb_floor", schema = "jx_cover", catalog = "")
+public class TbFloorEntity {
+    private int id;
+    private String floorUuid;
+    private String floorBuildUuid;
+    private String floorName;
+    private int status;
+    private Timestamp creatTime;
+
+    @Id
+    @Column(name = "id")
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    @Basic
+    @Column(name = "floor_uuid")
+    public String getFloorUuid() {
+        return floorUuid;
+    }
+
+    public void setFloorUuid(String floorUuid) {
+        this.floorUuid = floorUuid;
+    }
+
+    @Basic
+    @Column(name = "floor_build_uuid")
+    public String getFloorBuildUuid() {
+        return floorBuildUuid;
+    }
+
+    public void setFloorBuildUuid(String floorBuildUuid) {
+        this.floorBuildUuid = floorBuildUuid;
+    }
+
+    @Basic
+    @Column(name = "floor_name")
+    public String getFloorName() {
+        return floorName;
+    }
+
+    public void setFloorName(String floorName) {
+        this.floorName = floorName;
+    }
+
+    @Basic
+    @Column(name = "status")
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    @Basic
+    @Column(name = "creat_time")
+    public Timestamp getCreatTime() {
+        return creatTime;
+    }
+
+    public void setCreatTime(Timestamp creatTime) {
+        this.creatTime = creatTime;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TbFloorEntity that = (TbFloorEntity) o;
+        return id == that.id && status == that.status && Objects.equals(floorUuid, that.floorUuid) && Objects.equals(floorBuildUuid, that.floorBuildUuid) && Objects.equals(floorName, that.floorName) && Objects.equals(creatTime, that.creatTime);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, floorUuid, floorBuildUuid, floorName, status, creatTime);
+    }
+}

+ 33 - 0
src/main/java/com/usky/entity/build/TbFloorVoEntity.java

@@ -0,0 +1,33 @@
+package com.usky.entity.build;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.sql.Timestamp;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/5/24 09:41
+ * @description TODO
+ **/
+@Data
+@ApiModel("楼层VO")
+public class TbFloorVoEntity {
+    @ApiModelProperty("主键id")
+    private int id;
+    @ApiModelProperty("楼层唯一编码")
+    private String floorUuid;
+    @ApiModelProperty("建筑唯一编码")
+    private String floorBuildUuid;
+    @ApiModelProperty("建筑名称")
+    private String buildName;
+    @ApiModelProperty("楼层唯一编码")
+    private String floorName;
+    @ApiModelProperty("0 未删除 1 已删除")
+    private int status;
+    @ApiModelProperty("添加时间")
+    private Timestamp creatTime;
+
+}

+ 95 - 0
src/main/java/com/usky/entity/build/TbRoomEntity.java

@@ -0,0 +1,95 @@
+package com.usky.entity.build;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/5/24 09:42
+ * @description TODO
+ **/
+@Entity
+@Table(name = "tb_room", schema = "jx_cover", catalog = "")
+public class TbRoomEntity {
+    private int id;
+    private String roomUuid;
+    private String roomFloorUuid;
+    private String roomName;
+    private Timestamp creatTime;
+    private Integer status;
+
+    @Id
+    @Column(name = "id")
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    @Basic
+    @Column(name = "room_uuid")
+    public String getRoomUuid() {
+        return roomUuid;
+    }
+
+    public void setRoomUuid(String roomUuid) {
+        this.roomUuid = roomUuid;
+    }
+
+    @Basic
+    @Column(name = "room_floor_uuid")
+    public String getRoomFloorUuid() {
+        return roomFloorUuid;
+    }
+
+    public void setRoomFloorUuid(String roomFloorUuid) {
+        this.roomFloorUuid = roomFloorUuid;
+    }
+
+    @Basic
+    @Column(name = "room_name")
+    public String getRoomName() {
+        return roomName;
+    }
+
+    public void setRoomName(String roomName) {
+        this.roomName = roomName;
+    }
+
+    @Basic
+    @Column(name = "creat_time")
+    public Timestamp getCreatTime() {
+        return creatTime;
+    }
+
+    public void setCreatTime(Timestamp creatTime) {
+        this.creatTime = creatTime;
+    }
+
+    @Basic
+    @Column(name = "status")
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TbRoomEntity that = (TbRoomEntity) o;
+        return id == that.id && Objects.equals(roomUuid, that.roomUuid) && Objects.equals(roomFloorUuid, that.roomFloorUuid) && Objects.equals(roomName, that.roomName) && Objects.equals(creatTime, that.creatTime) && Objects.equals(status, that.status);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, roomUuid, roomFloorUuid, roomName, creatTime, status);
+    }
+}

+ 33 - 0
src/main/java/com/usky/entity/build/TbRoomVoEntity.java

@@ -0,0 +1,33 @@
+package com.usky.entity.build;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.sql.Timestamp;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/5/24 09:42
+ * @description TODO
+ **/
+@Data
+@ApiModel("房间VO")
+public class TbRoomVoEntity {
+    @ApiModelProperty("主键id")
+    private int id;
+    @ApiModelProperty("房间唯一编码")
+    private String roomUuid;
+    @ApiModelProperty("楼层唯一编码")
+    private String roomFloorUuid;
+    @ApiModelProperty("房间名称")
+    private String roomName;
+    @ApiModelProperty("楼层名称")
+    private String floorName;
+    @ApiModelProperty("添加时间")
+    private Timestamp creatTime;
+    @ApiModelProperty("0 未删除 1 已删除")
+    private Integer status;
+
+
+}

+ 160 - 0
src/main/java/com/usky/entity/mqtt/TbDeviceAlarmsDTO.java

@@ -0,0 +1,160 @@
+package com.usky.entity.mqtt;
+
+import javax.persistence.*;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/10 14:19
+ * @description TODO
+ **/
+@Entity
+@Table(name = "tb_device_alarms", schema = "jx_cover", catalog = "")
+public class TbDeviceAlarmsDTO {
+    private int id;
+    private String devId;
+    private String registerId;
+    private String deviceName;
+    private String deviceType;
+    private String devcieModel;
+    private String property;
+    private String serial;
+    private String value;
+    private Integer status;
+    private String createTime;
+    private String timeStamp;
+
+    @Id
+    @Column(name = "id", nullable = false)
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    @Basic
+    @Column(name = "dev_id", nullable = true, length = 50)
+    public String getDevId() {
+        return devId;
+    }
+
+    public void setDevId(String devId) {
+        this.devId = devId;
+    }
+
+    @Basic
+    @Column(name = "register_id", nullable = true, length = 50)
+    public String getRegisterId() {
+        return registerId;
+    }
+
+    public void setRegisterId(String registerId) {
+        this.registerId = registerId;
+    }
+
+    @Basic
+    @Column(name = "device_name", nullable = true, length = 50)
+    public String getDeviceName() {
+        return deviceName;
+    }
+
+    public void setDeviceName(String deviceName) {
+        this.deviceName = deviceName;
+    }
+
+    @Basic
+    @Column(name = "device_type", nullable = true, length = 50)
+    public String getDeviceType() {
+        return deviceType;
+    }
+
+    public void setDeviceType(String deviceType) {
+        this.deviceType = deviceType;
+    }
+
+    @Basic
+    @Column(name = "devcie_model", nullable = true, length = 50)
+    public String getDevcieModel() {
+        return devcieModel;
+    }
+
+    public void setDevcieModel(String devcieModel) {
+        this.devcieModel = devcieModel;
+    }
+
+    @Basic
+    @Column(name = "property", nullable = true, length = 50)
+    public String getProperty() {
+        return property;
+    }
+
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    @Basic
+    @Column(name = "serial", nullable = true, length = 10)
+    public String getSerial() {
+        return serial;
+    }
+
+    public void setSerial(String serial) {
+        this.serial = serial;
+    }
+
+    @Basic
+    @Column(name = "value", nullable = true, length = 20)
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    @Basic
+    @Column(name = "status", nullable = true)
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    @Basic
+    @Column(name = "create_time", nullable = true, length = 50)
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TbDeviceAlarmsDTO that = (TbDeviceAlarmsDTO) o;
+        return id == that.id && Objects.equals(devId, that.devId) && Objects.equals(registerId, that.registerId) && Objects.equals(deviceName, that.deviceName) && Objects.equals(deviceType, that.deviceType) && Objects.equals(devcieModel, that.devcieModel) && Objects.equals(property, that.property) && Objects.equals(serial, that.serial) && Objects.equals(value, that.value) && Objects.equals(status, that.status) && Objects.equals(createTime, that.createTime);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, devId, registerId, deviceName, deviceType, devcieModel, property, serial, value, status, createTime);
+    }
+
+    @Basic
+    @Column(name = "time_stamp", nullable = true, length = 50)
+    public String getTimeStamp() {
+        return timeStamp;
+    }
+
+    public void setTimeStamp(String timeStamp) {
+        this.timeStamp = timeStamp;
+    }
+}

+ 182 - 0
src/main/java/com/usky/entity/mqtt/TbDeviceDTO.java

@@ -0,0 +1,182 @@
+package com.usky.entity.mqtt;
+
+import javax.persistence.*;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/10 16:11
+ * @description TODO
+ **/
+@Entity
+@Table(name = "tb_device", schema = "jx_cover", catalog = "")
+public class TbDeviceDTO {
+    private int id;
+    private String devId;
+    private String registerId;
+    private String devceName;
+    private String devcieModel;
+    private String connType;
+    private String deviceType;
+    private String createTime;
+    private Integer del;
+    private String remark;
+    private String longitude;
+    private String dimension;
+    private String userId;
+    private String addr;
+
+    @Id
+    @Column(name = "id", nullable = false)
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    @Basic
+    @Column(name = "addr", nullable = false, length = 50)
+    public String getAddr() {
+        return addr;
+    }
+
+    public void setAddr(String addr) {
+        this.addr = addr;
+    }
+
+    @Basic
+    @Column(name = "dev_id", nullable = false, length = 10)
+    public String getDevId() {
+        return devId;
+    }
+
+    public void setDevId(String devId) {
+        this.devId = devId;
+    }
+
+    @Basic
+    @Column(name = "register_id", nullable = true, length = 50)
+    public String getRegisterId() {
+        return registerId;
+    }
+
+    public void setRegisterId(String registerId) {
+        this.registerId = registerId;
+    }
+
+    @Basic
+    @Column(name = "devce_name", nullable = true, length = 50)
+    public String getDevceName() {
+        return devceName;
+    }
+
+    public void setDevceName(String devceName) {
+        this.devceName = devceName;
+    }
+
+    @Basic
+    @Column(name = "devcie_model", nullable = true, length = 50)
+    public String getDevcieModel() {
+        return devcieModel;
+    }
+
+    public void setDevcieModel(String devcieModel) {
+        this.devcieModel = devcieModel;
+    }
+
+    @Basic
+    @Column(name = "conn_type", nullable = true, length = 10)
+    public String getConnType() {
+        return connType;
+    }
+
+    public void setConnType(String connType) {
+        this.connType = connType;
+    }
+
+    @Basic
+    @Column(name = "device_type", nullable = true, length = 50)
+    public String getDeviceType() {
+        return deviceType;
+    }
+
+    public void setDeviceType(String deviceType) {
+        this.deviceType = deviceType;
+    }
+
+    @Basic
+    @Column(name = "create_time", nullable = true, length = 50)
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "del", nullable = true)
+    public Integer getDel() {
+        return del;
+    }
+
+    public void setDel(Integer del) {
+        this.del = del;
+    }
+
+    @Basic
+    @Column(name = "remark", nullable = true, length = 100)
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Basic
+    @Column(name = "longitude", nullable = true, length = 50)
+    public String getLongitude() {
+        return longitude;
+    }
+
+    public void setLongitude(String longitude) {
+        this.longitude = longitude;
+    }
+
+    @Basic
+    @Column(name = "dimension", nullable = true, length = 50)
+    public String getDimension() {
+        return dimension;
+    }
+
+    public void setDimension(String dimension) {
+        this.dimension = dimension;
+    }
+
+    @Basic
+    @Column(name = "user_id", nullable = true, length = 20)
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TbDeviceDTO that = (TbDeviceDTO) o;
+        return id == that.id && Objects.equals(devId, that.devId) && Objects.equals(registerId, that.registerId) && Objects.equals(devceName, that.devceName) && Objects.equals(devcieModel, that.devcieModel) && Objects.equals(connType, that.connType) && Objects.equals(deviceType, that.deviceType) && Objects.equals(createTime, that.createTime) && Objects.equals(del, that.del) && Objects.equals(remark, that.remark) && Objects.equals(longitude, that.longitude) && Objects.equals(dimension, that.dimension) && Objects.equals(userId, that.userId) && Objects.equals(addr, that.addr);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, devId, registerId, devceName, devcieModel, connType, deviceType, createTime, del, remark, longitude, dimension, userId, addr);
+    }
+}

+ 149 - 0
src/main/java/com/usky/entity/mqtt/TbDeviceInfoDTO.java

@@ -0,0 +1,149 @@
+package com.usky.entity.mqtt;
+
+import javax.persistence.*;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/10 16:11
+ * @description TODO
+ **/
+@Entity
+@Table(name = "tb_device_info", schema = "jx_cover", catalog = "")
+public class TbDeviceInfoDTO {
+    private int id;
+    private String devId;
+    private String registerId;
+    private String deviceName;
+    private String property;
+    private String serial;
+    private String value;
+    private String timeStamp;
+    private String createTime;
+    private String devceType;
+    private String devcieModel;
+
+    @Id
+    @Column(name = "id", nullable = false)
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    @Basic
+    @Column(name = "dev_id", nullable = false, length = 50)
+    public String getDevId() {
+        return devId;
+    }
+
+    public void setDevId(String devId) {
+        this.devId = devId;
+    }
+
+    @Basic
+    @Column(name = "register_id", nullable = true, length = 50)
+    public String getRegisterId() {
+        return registerId;
+    }
+
+    public void setRegisterId(String registerId) {
+        this.registerId = registerId;
+    }
+
+    @Basic
+    @Column(name = "device_name", nullable = true, length = 50)
+    public String getDeviceName() {
+        return deviceName;
+    }
+
+    public void setDeviceName(String deviceName) {
+        this.deviceName = deviceName;
+    }
+
+    @Basic
+    @Column(name = "property", nullable = true, length = 50)
+    public String getProperty() {
+        return property;
+    }
+
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    @Basic
+    @Column(name = "serial", nullable = true, length = 50)
+    public String getSerial() {
+        return serial;
+    }
+
+    public void setSerial(String serial) {
+        this.serial = serial;
+    }
+
+    @Basic
+    @Column(name = "value", nullable = true, length = 50)
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    @Basic
+    @Column(name = "time_stamp", nullable = true, length = 50)
+    public String getTimeStamp() {
+        return timeStamp;
+    }
+
+    public void setTimeStamp(String timeStamp) {
+        this.timeStamp = timeStamp;
+    }
+
+    @Basic
+    @Column(name = "create_time", nullable = true, length = 50)
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "devce_type", nullable = true, length = 50)
+    public String getDevceType() {
+        return devceType;
+    }
+
+    public void setDevceType(String devceType) {
+        this.devceType = devceType;
+    }
+
+    @Basic
+    @Column(name = "devcie_model", nullable = true, length = 50)
+    public String getDevcieModel() {
+        return devcieModel;
+    }
+
+    public void setDevcieModel(String devcieModel) {
+        this.devcieModel = devcieModel;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TbDeviceInfoDTO that = (TbDeviceInfoDTO) o;
+        return id == that.id && Objects.equals(devId, that.devId) && Objects.equals(registerId, that.registerId) && Objects.equals(deviceName, that.deviceName) && Objects.equals(property, that.property) && Objects.equals(serial, that.serial) && Objects.equals(value, that.value) && Objects.equals(timeStamp, that.timeStamp) && Objects.equals(createTime, that.createTime) && Objects.equals(devceType, that.devceType) && Objects.equals(devcieModel, that.devcieModel);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, devId, registerId, deviceName, property, serial, value, timeStamp, createTime, devceType, devcieModel);
+    }
+}

+ 45 - 0
src/main/java/com/usky/entity/mqtt/vo/TbDeviceAlarmsVO.java

@@ -0,0 +1,45 @@
+package com.usky.entity.mqtt.vo;
+
+import com.usky.entity.mqtt.TbDeviceAlarmsDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/10 14:19
+ * @description TODO
+ **/
+
+@Data
+@ApiModel(value = "设备告警VO")
+public class TbDeviceAlarmsVO {
+    private int id;
+    @ApiModelProperty("设备编码")
+    private String devId;
+    @ApiModelProperty("设备本地注册编码")
+    private String registerId;
+    @ApiModelProperty("设备名称")
+    private String deviceName;
+    @ApiModelProperty("设备类型")
+    private String deviceType;
+    @ApiModelProperty("设备型号")
+    private String devcieModel;
+    @ApiModelProperty("设备属性名")
+    private String property;
+    @ApiModelProperty("属性排序")
+    private String serial;
+    @ApiModelProperty("属性值")
+    private String value;
+    @ApiModelProperty("告警状态 0 未消除 1已消除")
+    private Integer status;
+    @ApiModelProperty("数据插入时间")
+    private String createTime;
+    @ApiModelProperty("告警上传时间")
+    private String timeStamp;
+
+}

+ 45 - 0
src/main/java/com/usky/entity/mqtt/vo/TbDeviceInfoVO.java

@@ -0,0 +1,45 @@
+package com.usky.entity.mqtt.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/10 14:19
+ * @description TODO
+ **/
+@Data
+@ApiModel(value = "设备心跳VO")
+public class TbDeviceInfoVO {
+    @ApiModelProperty("主键id")
+    private int id;
+    @ApiModelProperty("设备编号")
+    private String devId;
+    @ApiModelProperty("设备本地注册编码")
+    private String registerId;
+    @ApiModelProperty("属性名称")
+    private String property;
+    @ApiModelProperty("属性编号")
+    private String serial;
+    @ApiModelProperty("属性值")
+    private String value;
+    @ApiModelProperty("数据插入时间")
+    private String createTime;
+    @ApiModelProperty("设备名称")
+    private String deviceName;
+    @ApiModelProperty("数据上传时间")
+    private String timeStamp;
+    @ApiModelProperty("设备类型")
+    private String devceType;
+    @ApiModelProperty("设备型号")
+    private String devcieModel;
+    @ApiModelProperty("设备安装位置")
+    private String addr;
+
+
+}

+ 47 - 0
src/main/java/com/usky/entity/mqtt/vo/TbDeviceVO.java

@@ -0,0 +1,47 @@
+package com.usky.entity.mqtt.vo;
+
+import com.usky.entity.mqtt.TbDeviceDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/10 14:19
+ * @description TODO
+ **/
+@Data
+@ApiModel(value = "设备VO")
+public class TbDeviceVO {
+    @ApiModelProperty("主键ID")
+    private int id;
+    @ApiModelProperty("设备编号")
+    private String devId;
+    @ApiModelProperty("设备本地注册编码")
+    private String registerId;
+    @ApiModelProperty("设备名称")
+    private String devceName;
+    @ApiModelProperty("设备型号")
+    private String devcieModel;
+    @ApiModelProperty("通信方式 G:4G N:NB L:LoRa S:专线 B:总线")
+    private String connType;
+    @ApiModelProperty("设备类型")
+    private String deviceType;
+    @ApiModelProperty("添加时间")
+    private String createTime;
+    @ApiModelProperty("0未删除 1已删除")
+    private Integer del;
+    @ApiModelProperty("备注")
+    private String remark;
+    @ApiModelProperty("经度")
+    private String longitude;
+    @ApiModelProperty("维度")
+    private String dimension;
+    @ApiModelProperty("维保人编号")
+    private String userId;
+
+}

+ 49 - 0
src/main/java/com/usky/entity/mqtt/vo/TbDeviceVOTop.java

@@ -0,0 +1,49 @@
+package com.usky.entity.mqtt.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/10 14:19
+ * @description TODO
+ **/
+@Data
+@ApiModel(value = "首页实时设备VO")
+public class TbDeviceVOTop<T> {
+    @ApiModelProperty("主键ID")
+    private int id;
+    @ApiModelProperty("设备编号")
+    private String devId;
+    @ApiModelProperty("设备本地注册编码")
+    private String registerId;
+    @ApiModelProperty("设备名称")
+    private String devceName;
+    @ApiModelProperty("设备型号")
+    private String devcieModel;
+    @ApiModelProperty("通信方式 G:4G N:NB L:LoRa S:专线 B:总线")
+    private String connType;
+    @ApiModelProperty("设备类型")
+    private String deviceType;
+    @ApiModelProperty("添加时间")
+    private String createTime;
+    @ApiModelProperty("0未删除 1已删除")
+    private Integer del;
+    @ApiModelProperty("备注")
+    private String remark;
+    @ApiModelProperty("经度")
+    private String longitude;
+    @ApiModelProperty("维度")
+    private String dimension;
+    @ApiModelProperty("姓名")
+    private String userName;
+    @ApiModelProperty("手机号")
+    private String phone;
+    @ApiModelProperty("设备安装位置")
+    private String addr;
+    @ApiModelProperty("实时数据")
+    private T data;
+
+}

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

@@ -0,0 +1,202 @@
+package com.usky.entity.sys;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 14:03
+ * @description TODO
+ **/
+@Entity
+@Table(name = "sys_dept", schema = "jx_cover", catalog = "")
+@ApiModel(value = "部门DTO")
+public class SysDeptDTO {
+    @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(value = "创建时间",hidden = true)
+    private Timestamp createTime;
+    @ApiModelProperty("更新人")
+    private String updateBy;
+    @ApiModelProperty(value = "更新时间",hidden = true)
+    private Timestamp updateTime;
+
+    @Id
+    @Column(name = "dept_id", nullable = false)
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    public Integer getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Integer deptId) {
+        this.deptId = deptId;
+    }
+
+    @Basic
+    @Column(name = "parent_id", nullable = true)
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    @Basic
+    @Column(name = "ancestors", nullable = true, length = 50)
+    public String getAncestors() {
+        return ancestors;
+    }
+
+    public void setAncestors(String ancestors) {
+        this.ancestors = ancestors;
+    }
+
+    @Basic
+    @Column(name = "dept_name", nullable = true, length = 30)
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    @Basic
+    @Column(name = "order_num", nullable = true)
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    @Basic
+    @Column(name = "leader", nullable = true, length = 20)
+    public String getLeader() {
+        return leader;
+    }
+
+    public void setLeader(String leader) {
+        this.leader = leader;
+    }
+
+    @Basic
+    @Column(name = "phone", nullable = true, length = 11)
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    @Basic
+    @Column(name = "email", nullable = true, length = 50)
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    @Basic
+    @Column(name = "status", nullable = true, length = 1)
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    @Basic
+    @Column(name = "del_flag", nullable = true, length = 1)
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    @Basic
+    @Column(name = "create_by", nullable = true, length = 64)
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    @Basic
+    @Column(name = "create_time", nullable = true)
+    public Timestamp getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Timestamp createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "update_by", nullable = true, length = 64)
+    public String getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    @Basic
+    @Column(name = "update_time", nullable = true)
+    public Timestamp getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Timestamp updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SysDeptDTO that = (SysDeptDTO) o;
+        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
+    public int hashCode() {
+        return Objects.hash(deptId, parentId, ancestors, deptName, orderNum, leader, phone, email, status, delFlag, createBy, createTime, updateBy, updateTime);
+    }
+}

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

@@ -0,0 +1,226 @@
+package com.usky.entity.sys;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 14:03
+ * @description TODO
+ **/
+@Entity
+@Table(name = "sys_menu", schema = "jx_cover", catalog = "")
+@ApiModel(value = "系统-菜单DTO")
+public class SysMenuDTO {
+    @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;
+
+    @Id
+    @Column(name = "menu_id", nullable = false)
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    public Integer getMenuId() {
+        return menuId;
+    }
+
+    public void setMenuId(Integer menuId) {
+        this.menuId = menuId;
+    }
+
+    @Basic
+    @Column(name = "menu_name", nullable = false, length = 50)
+    public String getMenuName() {
+        return menuName;
+    }
+
+    public void setMenuName(String menuName) {
+        this.menuName = menuName;
+    }
+
+    @Basic
+    @Column(name = "parent_id", nullable = true)
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    @Basic
+    @Column(name = "order_num", nullable = true)
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    @Basic
+    @Column(name = "url", nullable = true, length = 200)
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    @Basic
+    @Column(name = "target", nullable = true, length = 20)
+    public String getTarget() {
+        return target;
+    }
+
+    public void setTarget(String target) {
+        this.target = target;
+    }
+
+    @Basic
+    @Column(name = "menu_type", nullable = true, length = 1)
+    public String getMenuType() {
+        return menuType;
+    }
+
+    public void setMenuType(String menuType) {
+        this.menuType = menuType;
+    }
+
+    @Basic
+    @Column(name = "visible", nullable = true, length = 1)
+    public String getVisible() {
+        return visible;
+    }
+
+    public void setVisible(String visible) {
+        this.visible = visible;
+    }
+
+    @Basic
+    @Column(name = "is_refresh", nullable = true, length = 1)
+    public String getIsRefresh() {
+        return isRefresh;
+    }
+
+    public void setIsRefresh(String isRefresh) {
+        this.isRefresh = isRefresh;
+    }
+
+    @Basic
+    @Column(name = "perms", nullable = true, length = 100)
+    public String getPerms() {
+        return perms;
+    }
+
+    public void setPerms(String perms) {
+        this.perms = perms;
+    }
+
+    @Basic
+    @Column(name = "icon", nullable = true, length = 100)
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    @Basic
+    @Column(name = "create_by", nullable = true, length = 64)
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    @Basic
+    @Column(name = "create_time", nullable = true)
+    public Timestamp getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Timestamp createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "update_by", nullable = true, length = 64)
+    public String getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    @Basic
+    @Column(name = "update_time", nullable = true)
+    public Timestamp getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Timestamp updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @Basic
+    @Column(name = "remark", nullable = true, length = 500)
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SysMenuDTO that = (SysMenuDTO) o;
+        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
+    public int hashCode() {
+        return Objects.hash(menuId, menuName, parentId, orderNum, url, target, menuType, visible, isRefresh, perms, icon, createBy, createTime, updateBy, updateTime, remark);
+    }
+}

+ 179 - 0
src/main/java/com/usky/entity/sys/SysRoleDTO.java

@@ -0,0 +1,179 @@
+package com.usky.entity.sys;
+
+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;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 14:03
+ * @description TODO
+ **/
+@Entity
+@Table(name = "sys_role", schema = "jx_cover", catalog = "")
+@ApiModel(value = "角色DTO")
+public class SysRoleDTO 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;
+
+    @Id
+    @Column(name = "role_id", nullable = false)
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    public Integer getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Integer roleId) {
+        this.roleId = roleId;
+    }
+
+    @Basic
+    @Column(name = "role_name", nullable = false, length = 30)
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    @Basic
+    @Column(name = "role_key", nullable = false, length = 100)
+    public String getRoleKey() {
+        return roleKey;
+    }
+
+    public void setRoleKey(String roleKey) {
+        this.roleKey = roleKey;
+    }
+
+    @Basic
+    @Column(name = "role_sort", nullable = false)
+    public int getRoleSort() {
+        return roleSort;
+    }
+
+    public void setRoleSort(int roleSort) {
+        this.roleSort = roleSort;
+    }
+
+    @Basic
+    @Column(name = "data_scope", nullable = true, length = 1)
+    public String getDataScope() {
+        return dataScope;
+    }
+
+    public void setDataScope(String dataScope) {
+        this.dataScope = dataScope;
+    }
+
+    @Basic
+    @Column(name = "status", nullable = false, length = 1)
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    @Basic
+    @Column(name = "del_flag", nullable = true, length = 1)
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    @Basic
+    @Column(name = "create_by", nullable = true, length = 64)
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    @Basic
+    @Column(name = "create_time", nullable = true)
+    public Timestamp getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Timestamp createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "update_by", nullable = true, length = 64)
+    public String getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    @Basic
+    @Column(name = "update_time", nullable = true)
+    public Timestamp getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Timestamp updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @Basic
+    @Column(name = "remark", nullable = true, length = 500)
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SysRoleDTO that = (SysRoleDTO) o;
+        return roleId == that.roleId && roleSort == that.roleSort && Objects.equals(roleName, that.roleName) && Objects.equals(roleKey, that.roleKey) && Objects.equals(dataScope, that.dataScope) && 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) && Objects.equals(remark, that.remark);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(roleId, roleName, roleKey, roleSort, dataScope, status, delFlag, createBy, createTime, updateBy, updateTime, remark);
+    }
+}

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

@@ -0,0 +1,54 @@
+package com.usky.entity.sys;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 14:03
+ * @description TODO
+ **/
+@Entity
+@Table(name = "sys_role_dept", schema = "jx_cover", catalog = "")
+
+public class SysRoleDeptDTO implements Serializable {
+    private Integer roleId;
+    private Integer deptId;
+
+    @Id
+    @Column(name = "role_id", nullable = false)
+    public Integer getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Integer roleId) {
+        this.roleId = roleId;
+    }
+
+    @Id
+    @Column(name = "dept_id", nullable = false)
+    public Integer getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Integer deptId) {
+        this.deptId = deptId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SysRoleDeptDTO that = (SysRoleDeptDTO) o;
+        return roleId == that.roleId && deptId == that.deptId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(roleId, deptId);
+    }
+}

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

@@ -0,0 +1,52 @@
+package com.usky.entity.sys;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 14:03
+ * @description TODO
+ **/
+@Entity
+@Table(name = "sys_role_menu", schema = "jx_cover", catalog = "")
+
+public class SysRoleMenuDTO implements Serializable {
+    private Integer roleId;
+    private Integer menuId;
+
+    @Id
+    @Column(name = "role_id", nullable = false)
+    public Integer getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Integer roleId) {
+        this.roleId = roleId;
+    }
+
+    @Id
+    @Column(name = "menu_id", nullable = false)
+    public Integer getMenuId() {
+        return menuId;
+    }
+
+    public void setMenuId(Integer menuId) {
+        this.menuId = menuId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SysRoleMenuDTO that = (SysRoleMenuDTO) o;
+        return roleId == that.roleId && menuId == that.menuId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(roleId, menuId);
+    }
+}

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

@@ -0,0 +1,268 @@
+package com.usky.entity.sys;
+
+import io.swagger.annotations.ApiModel;
+
+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
+ **/
+
+@Entity
+@Table(name = "sys_user", schema = "jx_cover", catalog = "")
+public class SysUserDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private Integer userId;
+    private Integer deptId;
+    private String loginName;
+    private String userName;
+    private String userType;
+    private String email;
+    private String phonenumber;
+    private String sex;
+    private String avatar;
+    private String password;
+    private String salt;
+    private String status;
+    private String delFlag;
+    private String loginIp;
+    private Timestamp loginDate;
+    private Timestamp pwdUpdateDate;
+    private String createBy;
+    private Timestamp createTime;
+    private String updateBy;
+    private Timestamp updateTime;
+    private String remark;
+
+    @Id
+    @Column(name = "user_id", nullable = false)
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    @Basic
+    @Column(name = "dept_id", nullable = true)
+    public Integer getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Integer deptId) {
+        this.deptId = deptId;
+    }
+
+    @Basic
+    @Column(name = "login_name", nullable = false, length = 30)
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    @Basic
+    @Column(name = "user_name", nullable = true, length = 30)
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    @Basic
+    @Column(name = "user_type", nullable = true, length = 2)
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    @Basic
+    @Column(name = "email", nullable = true, length = 50)
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    @Basic
+    @Column(name = "phonenumber", nullable = true, length = 11)
+    public String getPhonenumber() {
+        return phonenumber;
+    }
+
+    public void setPhonenumber(String phonenumber) {
+        this.phonenumber = phonenumber;
+    }
+
+    @Basic
+    @Column(name = "sex", nullable = true, length = 1)
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    @Basic
+    @Column(name = "avatar", nullable = true, length = 100)
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    @Basic
+    @Column(name = "password", nullable = true, length = 50)
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    @Basic
+    @Column(name = "salt", nullable = true, length = 20)
+    public String getSalt() {
+        return salt;
+    }
+
+    public void setSalt(String salt) {
+        this.salt = salt;
+    }
+
+    @Basic
+    @Column(name = "status", nullable = true, length = 1)
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    @Basic
+    @Column(name = "del_flag", nullable = true, length = 1)
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    @Basic
+    @Column(name = "login_ip", nullable = true, length = 128)
+    public String getLoginIp() {
+        return loginIp;
+    }
+
+    public void setLoginIp(String loginIp) {
+        this.loginIp = loginIp;
+    }
+
+    @Basic
+    @Column(name = "login_date", nullable = true)
+    public Timestamp getLoginDate() {
+        return loginDate;
+    }
+
+    public void setLoginDate(Timestamp loginDate) {
+        this.loginDate = loginDate;
+    }
+
+    @Basic
+    @Column(name = "pwd_update_date", nullable = true)
+    public Timestamp getPwdUpdateDate() {
+        return pwdUpdateDate;
+    }
+
+    public void setPwdUpdateDate(Timestamp pwdUpdateDate) {
+        this.pwdUpdateDate = pwdUpdateDate;
+    }
+
+    @Basic
+    @Column(name = "create_by", nullable = true, length = 64)
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    @Basic
+    @Column(name = "create_time", nullable = true)
+    public Timestamp getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Timestamp createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "update_by", nullable = true, length = 64)
+    public String getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    @Basic
+    @Column(name = "update_time", nullable = true)
+    public Timestamp getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Timestamp updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @Basic
+    @Column(name = "remark", nullable = true, length = 500)
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SysUserDTO that = (SysUserDTO) o;
+        return userId == that.userId && Objects.equals(deptId, that.deptId) && Objects.equals(loginName, that.loginName) && Objects.equals(userName, that.userName) && Objects.equals(userType, that.userType) && Objects.equals(email, that.email) && Objects.equals(phonenumber, that.phonenumber) && Objects.equals(sex, that.sex) && Objects.equals(avatar, that.avatar) && Objects.equals(password, that.password) && Objects.equals(salt, that.salt) && Objects.equals(status, that.status) && Objects.equals(delFlag, that.delFlag) && Objects.equals(loginIp, that.loginIp) && Objects.equals(loginDate, that.loginDate) && Objects.equals(pwdUpdateDate, that.pwdUpdateDate) && 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
+    public int hashCode() {
+        return Objects.hash(userId, deptId, loginName, userName, userType, email, phonenumber, sex, avatar, password, salt, status, delFlag, loginIp, loginDate, pwdUpdateDate, createBy, createTime, updateBy, updateTime, remark);
+    }
+}

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

@@ -0,0 +1,52 @@
+package com.usky.entity.sys;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 14:03
+ * @description TODO
+ **/
+@Entity
+@Table(name = "sys_user_role", schema = "jx_cover", catalog = "")
+
+public class SysUserRoleDTO implements Serializable {
+    private Integer userId;
+    private Integer roleId;
+
+    @Id
+    @Column(name = "user_id", nullable = false)
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    @Id
+    @Column(name = "role_id", nullable = false)
+    public Integer getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Integer roleId) {
+        this.roleId = roleId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SysUserRoleDTO that = (SysUserRoleDTO) o;
+        return userId == that.userId && roleId == that.roleId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(userId, roleId);
+    }
+}

+ 206 - 0
src/main/java/com/usky/entity/sys/log/SysLogDTO.java

@@ -0,0 +1,206 @@
+package com.usky.entity.sys.log;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/7/14 13:57
+ * @description 系统日志DTO
+ **/
+@Entity
+@Table(name = "sys_log", schema = "sd_party_school", catalog = "")
+public class SysLogDTO {
+    private long id;
+    private Integer logType;
+    private String logContent;
+    private Integer operateType;
+    private String userid;
+    private String username;
+    private String ip;
+    private String method;
+    private String requestUrl;
+    private String requestParam;
+    private String requestType;
+    private Long costTime;
+    private String createBy;
+    private Timestamp createTime;
+    private String updateBy;
+    private Timestamp updateTime;
+
+
+    @Id
+    @Column(name = "id")
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    @Basic
+    @Column(name = "log_type", nullable = true)
+    public Integer getLogType() {
+        return logType;
+    }
+
+    public void setLogType(Integer logType) {
+        this.logType = logType;
+    }
+
+    @Basic
+    @Column(name = "log_content", nullable = true, length = 1000)
+    public String getLogContent() {
+        return logContent;
+    }
+
+    public void setLogContent(String logContent) {
+        this.logContent = logContent;
+    }
+
+    @Basic
+    @Column(name = "operate_type", nullable = true)
+    public Integer getOperateType() {
+        return operateType;
+    }
+
+    public void setOperateType(Integer operateType) {
+        this.operateType = operateType;
+    }
+
+    @Basic
+    @Column(name = "userid", nullable = true, length = 32)
+    public String getUserid() {
+        return userid;
+    }
+
+    public void setUserid(String userid) {
+        this.userid = userid;
+    }
+
+    @Basic
+    @Column(name = "username", nullable = true, length = 100)
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    @Basic
+    @Column(name = "ip", nullable = true, length = 100)
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    @Basic
+    @Column(name = "method", nullable = true, length = 500)
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    @Basic
+    @Column(name = "request_url", nullable = true, length = 255)
+    public String getRequestUrl() {
+        return requestUrl;
+    }
+
+    public void setRequestUrl(String requestUrl) {
+        this.requestUrl = requestUrl;
+    }
+
+    @Basic
+    @Column(name = "request_param", nullable = true, length = -1)
+    public String getRequestParam() {
+        return requestParam;
+    }
+
+    public void setRequestParam(String requestParam) {
+        this.requestParam = requestParam;
+    }
+
+    @Basic
+    @Column(name = "request_type", nullable = true, length = 10)
+    public String getRequestType() {
+        return requestType;
+    }
+
+    public void setRequestType(String requestType) {
+        this.requestType = requestType;
+    }
+
+    @Basic
+    @Column(name = "cost_time", nullable = true)
+    public Long getCostTime() {
+        return costTime;
+    }
+
+    public void setCostTime(Long costTime) {
+        this.costTime = costTime;
+    }
+
+    @Basic
+    @Column(name = "create_by", nullable = true, length = 32)
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    @Basic
+    @Column(name = "create_time", nullable = true)
+    public Timestamp getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Timestamp createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "update_by", nullable = true, length = 32)
+    public String getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    @Basic
+    @Column(name = "update_time", nullable = true)
+    public Timestamp getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Timestamp updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SysLogDTO sysLog = (SysLogDTO) o;
+        return Objects.equals(id, sysLog.id) && Objects.equals(logType, sysLog.logType) && Objects.equals(logContent, sysLog.logContent) && Objects.equals(operateType, sysLog.operateType) && Objects.equals(userid, sysLog.userid) && Objects.equals(username, sysLog.username) && Objects.equals(ip, sysLog.ip) && Objects.equals(method, sysLog.method) && Objects.equals(requestUrl, sysLog.requestUrl) && Objects.equals(requestParam, sysLog.requestParam) && Objects.equals(requestType, sysLog.requestType) && Objects.equals(costTime, sysLog.costTime) && Objects.equals(createBy, sysLog.createBy) && Objects.equals(createTime, sysLog.createTime) && Objects.equals(updateBy, sysLog.updateBy) && Objects.equals(updateTime, sysLog.updateTime);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, logType, logContent, operateType, userid, username, ip, method, requestUrl, requestParam, requestType, costTime, createBy, createTime, updateBy, updateTime);
+    }
+}

+ 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;
+
+}

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

@@ -0,0 +1,62 @@
+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.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+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("菜单名称")
+    @NotBlank(message = "菜单名称不能为空")
+    @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
+    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>();
+
+}

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

@@ -0,0 +1,67 @@
+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 javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+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("角色名称")
+    @NotBlank(message = "角色名称不能为空")
+    @Size(min = 0, max = 10, message = "角色名称不能超过10个字符")
+    private String roleName;
+    @ApiModelProperty("角色权限字符")
+    private String roleKey;
+    @ApiModelProperty("角色显示排序")
+    private int roleSort;
+    @ApiModelProperty("数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)")
+    @NotBlank(message = "数据范围不能为空")
+    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;
+
+    public boolean isAdmin() {
+        return isAdmin(this.roleId);
+    }
+
+    public static boolean isAdmin(Integer roleId) {
+        return roleId != null && 1 == roleId;
+    }
+    /** 菜单组 */
+    @ApiModelProperty("菜单")
+    private Integer[] menuIds;
+
+    /** 部门组(数据权限) */
+    @ApiModelProperty("部门")
+    private Integer[] deptIds;
+}

+ 91 - 0
src/main/java/com/usky/entity/sys/vo/SysUserVO.java

@@ -0,0 +1,91 @@
+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.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/19 14:03
+ * @description TODO
+ **/
+@ApiModel("系统-用户VO")
+@Data
+public class SysUserVO extends BaseEntity implements Serializable {
+    @ApiModelProperty("用户id")
+    private Integer userId;
+    @ApiModelProperty("部门id")
+    private Integer deptId;
+    @ApiModelProperty("登录名")
+    @NotBlank(message = "登录名不能为空")
+    @Size(min = 0, max = 10, message = "登录名称不能超过10个字符")
+    private String loginName;
+    @ApiModelProperty("用户名")
+    private String userName;
+    @ApiModelProperty("用户类型 0 系统用户 1 注册用户")
+    private String userType;
+    @ApiModelProperty("邮箱地址")
+    private String email;
+    @ApiModelProperty("手机号")
+    @NotBlank(message = "手机号不能为空")
+    private String phonenumber;
+    @ApiModelProperty("用户性别(0男 1女 2未知)")
+    private String sex;
+    @ApiModelProperty("头像路径")
+    private String avatar;
+    @ApiModelProperty("密码")
+    @NotBlank(message = "密码不能为空")
+    private String password;
+    @ApiModelProperty("随机盐")
+    private String salt;
+    @ApiModelProperty("账户状态 0正常 1 停用")
+    private String status;
+    @ApiModelProperty("删除标准 0 未删除 1 已删除")
+    private String delFlag;
+    @ApiModelProperty("最后登录IP")
+    private String loginIp;
+    @ApiModelProperty("最后登录时间")
+    private Timestamp loginDate;
+    @ApiModelProperty("密码最后更新时间")
+    private Timestamp pwdUpdateDate;
+    @ApiModelProperty("创建人")
+    private String createBy;
+    @ApiModelProperty(value = "创建时间")
+    private Timestamp createTime;
+    @ApiModelProperty("更新人")
+    private String updateBy;
+    @ApiModelProperty("更新时间")
+    private Timestamp updateTime;
+    @ApiModelProperty("备注")
+    private String remark;
+    @ApiModelProperty("部门名称")
+    private String deptName;
+    @ApiModelProperty("部门领导")
+    private String leader;
+
+    public boolean isAdmin() {
+        return isAdmin(this.userId);
+    }
+
+    public static boolean isAdmin(Integer userId) {
+        return userId != null && 1 == userId;
+    }
+
+    private List<SysRoleDTO> roles;
+
+    /**
+     * 角色组
+     */
+    private String roleIds;
+
+
+}

+ 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;
+}

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

@@ -0,0 +1,16 @@
+package com.usky.exception;
+
+import org.apache.shiro.ShiroException;
+
+/**
+ * 根据Token获取用户信息异常
+ */
+public class GetUserInfoFromTokenException extends RuntimeException {
+    public GetUserInfoFromTokenException(String message) {
+        super(message);
+    }
+
+    public GetUserInfoFromTokenException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

+ 94 - 0
src/main/java/com/usky/exception/GloableExceptionResolver.java

@@ -0,0 +1,94 @@
+package com.usky.exception;
+
+import com.usky.exception.user.UserUnExist;
+import com.usky.utils.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.ShiroException;
+import org.apache.shiro.UnavailableSecurityManagerException;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.IncorrectCredentialsException;
+import org.apache.shiro.authc.LockedAccountException;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.authz.AuthorizationException;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.data.redis.connection.PoolException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2020/11/10 15:00
+ * @description 全局异常处理
+ **/
+@RestControllerAdvice
+@Slf4j
+public class GloableExceptionResolver {
+
+    @ExceptionHandler(Exception.class)
+    public Result<?> handleException(Exception e) {
+        log.error(e.getMessage(), e);
+        return Result.error("操作失败," + e.getMessage());
+    }
+
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    public Result<?> HttpRequestMethodNotSupportedException(Exception e) {
+        log.error(e.getMessage(), e);
+        return Result.error("请求方式异常," + e.getMessage());
+    }
+
+    @ExceptionHandler(DataIntegrityViolationException.class)
+    public Result<?> handleDataIntegrityViolationException(DataIntegrityViolationException e) {
+        log.error(e.getMessage(), e);
+        return Result.error("字段太长,超出数据库字段的长度");
+    }
+
+    @ExceptionHandler(PoolException.class)
+    public Result<?> handlePoolException(PoolException e) {
+        log.error(e.getMessage(), e);
+        return Result.error("Redis 连接异常!");
+    }
+
+    /**
+     * 用户不存在
+     *
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(UserUnExist.class)
+    public Result<?> UserUnExist(UserUnExist e) {
+        log.error(e.getMessage(), e);
+        return Result.error(e.getMessage());
+    }
+
+    @ExceptionHandler(GetUserInfoFromTokenException.class)
+    public Result<?> handleGetUserInfoFromTokenException(GetUserInfoFromTokenException e) {
+        log.error(e.getMessage(), e);
+        return Result.error(e.getMessage());
+    }
+
+
+    @ExceptionHandler(ShiroException.class)
+    public Result<?> doHandleShiroException(
+            ShiroException e) {
+        if (e instanceof UnknownAccountException) {
+            return Result.error("账户不存在");
+        } else if (e instanceof LockedAccountException) {
+            return Result.error("账户被禁用");
+        } else if (e instanceof IncorrectCredentialsException) {
+            return Result.error("密码不正确");
+        } else if (e instanceof AuthorizationException) {
+            return Result.error("没有此操作权限");
+        } else if (e instanceof UnavailableSecurityManagerException) {
+            return Result.error("用户未登录!");
+        } else if (e instanceof AuthenticationException) {
+            return Result.error(e.getMessage());
+        }
+        System.out.println("e = " + e.getMessage());
+        return Result.error("系统维护中");
+
+    }
+
+
+}

+ 17 - 0
src/main/java/com/usky/exception/user/UserUnExist.java

@@ -0,0 +1,17 @@
+package com.usky.exception.user;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/9/10 14:56
+ * @description TODO
+ **/
+public class UserUnExist extends RuntimeException{
+    public UserUnExist(String message) {
+        super(message);
+    }
+
+    public UserUnExist(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

+ 530 - 0
src/main/java/com/usky/filter/HTMLFilter.java

@@ -0,0 +1,530 @@
+package com.usky.filter;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * HTML filtering utility for protecting against XSS (Cross Site Scripting).
+ *
+ * This code is licensed LGPLv3
+ *
+ * This code is a Java port of the original work in PHP by Cal Hendersen.
+ * http://code.iamcal.com/php/lib_filter/
+ *
+ * The trickiest part of the translation was handling the differences in regex handling
+ * between PHP and Java.  These resources were helpful in the process:
+ *
+ * http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html
+ * http://us2.php.net/manual/en/reference.pcre.pattern.modifiers.php
+ * http://www.regular-expressions.info/modifiers.html
+ *
+ * A note on naming conventions: instance variables are prefixed with a "v"; global
+ * constants are in all caps.
+ *
+ * Sample use:
+ * String input = ...
+ * String clean = new HTMLFilter().filter( input );
+ *
+ * The class is not thread safe. Create a new instance if in doubt.
+ *
+ * If you find bugs or have suggestions on improvement (especially regarding
+ * performance), please contact us.  The latest version of this
+ * source, and our contact details, can be found at http://xss-html-filter.sf.net
+ *
+ * @author Joseph O'Connell
+ * @author Cal Hendersen
+ * @author Michael Semb Wever
+ */
+public final class HTMLFilter {
+
+    /** regex flag union representing /si modifiers in php **/
+    private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
+    private static final Pattern P_COMMENTS = Pattern.compile("<!--(.*?)-->", Pattern.DOTALL);
+    private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI);
+    private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL);
+    private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);
+    private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);
+    private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI);
+    private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI);
+    private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);
+    private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?");
+    private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?");
+    private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");
+    private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))");
+    private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);
+    private static final Pattern P_END_ARROW = Pattern.compile("^>");
+    private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)");
+    private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)");
+    private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)");
+    private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)");
+    private static final Pattern P_AMP = Pattern.compile("&");
+    private static final Pattern P_QUOTE = Pattern.compile("\"");
+    private static final Pattern P_LEFT_ARROW = Pattern.compile("<");
+    private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");
+    private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");
+
+    // @xxx could grow large... maybe use sesat's ReferenceMap
+    private static final ConcurrentMap<String,Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<String, Pattern>();
+    private static final ConcurrentMap<String,Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<String, Pattern>();
+
+    /** set of allowed html elements, along with allowed attributes for each element **/
+    private final Map<String, List<String>> vAllowed;
+    /** counts of open tags for each (allowable) html element **/
+    private final Map<String, Integer> vTagCounts = new HashMap<String, Integer>();
+
+    /** html elements which must always be self-closing (e.g. "<img />") **/
+    private final String[] vSelfClosingTags;
+    /** html elements which must always have separate opening and closing tags (e.g. "<b></b>") **/
+    private final String[] vNeedClosingTags;
+    /** set of disallowed html elements **/
+    private final String[] vDisallowed;
+    /** attributes which should be checked for valid protocols **/
+    private final String[] vProtocolAtts;
+    /** allowed protocols **/
+    private final String[] vAllowedProtocols;
+    /** tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />") **/
+    private final String[] vRemoveBlanks;
+    /** entities allowed within html markup **/
+    private final String[] vAllowedEntities;
+    /** flag determining whether comments are allowed in input String. */
+    private final boolean stripComment;
+    private final boolean encodeQuotes;
+    private boolean vDebug = false;
+    /**
+     * flag determining whether to try to make tags when presented with "unbalanced"
+     * angle brackets (e.g. "<b text </b>" becomes "<b> text </b>").  If set to false,
+     * unbalanced angle brackets will be html escaped.
+     */
+    private final boolean alwaysMakeTags;
+
+    /** Default constructor.
+     *
+     */
+    public HTMLFilter() {
+        vAllowed = new HashMap<String, List<String>>();
+
+        final ArrayList<String> a_atts = new ArrayList<String>();
+        a_atts.add("href");
+        a_atts.add("target");
+        vAllowed.put("a", a_atts);
+
+        final ArrayList<String> img_atts = new ArrayList<String>();
+        img_atts.add("src");
+        img_atts.add("width");
+        img_atts.add("height");
+        img_atts.add("alt");
+        vAllowed.put("img", img_atts);
+
+        final ArrayList<String> no_atts = new ArrayList<String>();
+        vAllowed.put("b", no_atts);
+        vAllowed.put("strong", no_atts);
+        vAllowed.put("i", no_atts);
+        vAllowed.put("em", no_atts);
+
+        vSelfClosingTags = new String[]{"img"};
+        vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"};
+        vDisallowed = new String[]{};
+        vAllowedProtocols = new String[]{"http", "mailto", "https"}; // no ftp.
+        vProtocolAtts = new String[]{"src", "href"};
+        vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"};
+        vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"};
+        stripComment = true;
+        encodeQuotes = true;
+        alwaysMakeTags = true;
+    }
+
+    /** Set debug flag to true. Otherwise use default settings. See the default constructor.
+     *
+     * @param debug turn debug on with a true argument
+     */
+    public HTMLFilter(final boolean debug) {
+        this();
+        vDebug = debug;
+
+    }
+
+    /** Map-parameter configurable constructor.
+     *
+     * @param conf map containing configuration. keys match field names.
+     */
+    public HTMLFilter(final Map<String,Object> conf) {
+
+        assert conf.containsKey("vAllowed") : "configuration requires vAllowed";
+        assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";
+        assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags";
+        assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed";
+        assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols";
+        assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts";
+        assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks";
+        assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities";
+
+        vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get("vAllowed"));
+        vSelfClosingTags = (String[]) conf.get("vSelfClosingTags");
+        vNeedClosingTags = (String[]) conf.get("vNeedClosingTags");
+        vDisallowed = (String[]) conf.get("vDisallowed");
+        vAllowedProtocols = (String[]) conf.get("vAllowedProtocols");
+        vProtocolAtts = (String[]) conf.get("vProtocolAtts");
+        vRemoveBlanks = (String[]) conf.get("vRemoveBlanks");
+        vAllowedEntities = (String[]) conf.get("vAllowedEntities");
+        stripComment =  conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true;
+        encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true;
+        alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;
+    }
+
+    private void reset() {
+        vTagCounts.clear();
+    }
+
+    private void debug(final String msg) {
+        if (vDebug) {
+            Logger.getAnonymousLogger().info(msg);
+        }
+    }
+
+    //---------------------------------------------------------------
+    // my versions of some PHP library functions
+    public static String chr(final int decimal) {
+        return String.valueOf((char) decimal);
+    }
+
+    public static String htmlSpecialChars(final String s) {
+        String result = s;
+        result = regexReplace(P_AMP, "&amp;", result);
+        result = regexReplace(P_QUOTE, "&quot;", result);
+        result = regexReplace(P_LEFT_ARROW, "&lt;", result);
+        result = regexReplace(P_RIGHT_ARROW, "&gt;", result);
+        return result;
+    }
+
+    //---------------------------------------------------------------
+    /**
+     * given a user submitted input String, filter out any invalid or restricted
+     * html.
+     *
+     * @param input text (i.e. submitted by a user) than may contain html
+     * @return "clean" version of input, with only valid, whitelisted html elements allowed
+     */
+    public String filter(final String input) {
+        reset();
+        String s = input;
+
+        debug("************************************************");
+        debug("              INPUT: " + input);
+
+        s = escapeComments(s);
+        debug("     escapeComments: " + s);
+
+        s = balanceHTML(s);
+        debug("        balanceHTML: " + s);
+
+        s = checkTags(s);
+        debug("          checkTags: " + s);
+
+        s = processRemoveBlanks(s);
+        debug("processRemoveBlanks: " + s);
+
+        s = validateEntities(s);
+        debug("    validateEntites: " + s);
+
+        debug("************************************************\n\n");
+        return s;
+    }
+
+    public boolean isAlwaysMakeTags(){
+        return alwaysMakeTags;
+    }
+
+    public boolean isStripComments(){
+        return stripComment;
+    }
+
+    private String escapeComments(final String s) {
+        final Matcher m = P_COMMENTS.matcher(s);
+        final StringBuffer buf = new StringBuffer();
+        if (m.find()) {
+            final String match = m.group(1); //(.*?)
+            m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));
+        }
+        m.appendTail(buf);
+
+        return buf.toString();
+    }
+
+    private String balanceHTML(String s) {
+        if (alwaysMakeTags) {
+            //
+            // try and form html
+            //
+            s = regexReplace(P_END_ARROW, "", s);
+            s = regexReplace(P_BODY_TO_END, "<$1>", s);
+            s = regexReplace(P_XML_CONTENT, "$1<$2", s);
+
+        } else {
+            //
+            // escape stray brackets
+            //
+            s = regexReplace(P_STRAY_LEFT_ARROW, "&lt;$1", s);
+            s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2&gt;<", s);
+
+            //
+            // the last regexp causes '<>' entities to appear
+            // (we need to do a lookahead assertion so that the last bracket can
+            // be used in the next pass of the regexp)
+            //
+            s = regexReplace(P_BOTH_ARROWS, "", s);
+        }
+
+        return s;
+    }
+
+    private String checkTags(String s) {
+        Matcher m = P_TAGS.matcher(s);
+
+        final StringBuffer buf = new StringBuffer();
+        while (m.find()) {
+            String replaceStr = m.group(1);
+            replaceStr = processTag(replaceStr);
+            m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));
+        }
+        m.appendTail(buf);
+
+        s = buf.toString();
+
+        // these get tallied in processTag
+        // (remember to reset before subsequent calls to filter method)
+        for (String key : vTagCounts.keySet()) {
+            for (int ii = 0; ii < vTagCounts.get(key); ii++) {
+                s += "</" + key + ">";
+            }
+        }
+
+        return s;
+    }
+
+    private String processRemoveBlanks(final String s) {
+        String result = s;
+        for (String tag : vRemoveBlanks) {
+            if(!P_REMOVE_PAIR_BLANKS.containsKey(tag)){
+                P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));
+            }
+            result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);
+            if(!P_REMOVE_SELF_BLANKS.containsKey(tag)){
+                P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));
+            }
+            result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);
+        }
+
+        return result;
+    }
+
+    private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) {
+        Matcher m = regex_pattern.matcher(s);
+        return m.replaceAll(replacement);
+    }
+
+    private String processTag(final String s) {
+        // ending tags
+        Matcher m = P_END_TAG.matcher(s);
+        if (m.find()) {
+            final String name = m.group(1).toLowerCase();
+            if (allowed(name)) {
+                if (!inArray(name, vSelfClosingTags)) {
+                    if (vTagCounts.containsKey(name)) {
+                        vTagCounts.put(name, vTagCounts.get(name) - 1);
+                        return "</" + name + ">";
+                    }
+                }
+            }
+        }
+
+        // starting tags
+        m = P_START_TAG.matcher(s);
+        if (m.find()) {
+            final String name = m.group(1).toLowerCase();
+            final String body = m.group(2);
+            String ending = m.group(3);
+
+            //debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );
+            if (allowed(name)) {
+                String params = "";
+
+                final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);
+                final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);
+                final List<String> paramNames = new ArrayList<String>();
+                final List<String> paramValues = new ArrayList<String>();
+                while (m2.find()) {
+                    paramNames.add(m2.group(1)); //([a-z0-9]+)
+                    paramValues.add(m2.group(3)); //(.*?)
+                }
+                while (m3.find()) {
+                    paramNames.add(m3.group(1)); //([a-z0-9]+)
+                    paramValues.add(m3.group(3)); //([^\"\\s']+)
+                }
+
+                String paramName, paramValue;
+                for (int ii = 0; ii < paramNames.size(); ii++) {
+                    paramName = paramNames.get(ii).toLowerCase();
+                    paramValue = paramValues.get(ii);
+
+//          debug( "paramName='" + paramName + "'" );
+//          debug( "paramValue='" + paramValue + "'" );
+//          debug( "allowed? " + vAllowed.get( name ).contains( paramName ) );
+
+                    if (allowedAttribute(name, paramName)) {
+                        if (inArray(paramName, vProtocolAtts)) {
+                            paramValue = processParamProtocol(paramValue);
+                        }
+                        params += " " + paramName + "=\"" + paramValue + "\"";
+                    }
+                }
+
+                if (inArray(name, vSelfClosingTags)) {
+                    ending = " /";
+                }
+
+                if (inArray(name, vNeedClosingTags)) {
+                    ending = "";
+                }
+
+                if (ending == null || ending.length() < 1) {
+                    if (vTagCounts.containsKey(name)) {
+                        vTagCounts.put(name, vTagCounts.get(name) + 1);
+                    } else {
+                        vTagCounts.put(name, 1);
+                    }
+                } else {
+                    ending = " /";
+                }
+                return "<" + name + params + ending + ">";
+            } else {
+                return "";
+            }
+        }
+
+        // comments
+        m = P_COMMENT.matcher(s);
+        if (!stripComment && m.find()) {
+            return  "<" + m.group() + ">";
+        }
+
+        return "";
+    }
+
+    private String processParamProtocol(String s) {
+        s = decodeEntities(s);
+        final Matcher m = P_PROTOCOL.matcher(s);
+        if (m.find()) {
+            final String protocol = m.group(1);
+            if (!inArray(protocol, vAllowedProtocols)) {
+                // bad protocol, turn into local anchor link instead
+                s = "#" + s.substring(protocol.length() + 1, s.length());
+                if (s.startsWith("#//")) {
+                    s = "#" + s.substring(3, s.length());
+                }
+            }
+        }
+
+        return s;
+    }
+
+    private String decodeEntities(String s) {
+        StringBuffer buf = new StringBuffer();
+
+        Matcher m = P_ENTITY.matcher(s);
+        while (m.find()) {
+            final String match = m.group(1);
+            final int decimal = Integer.decode(match).intValue();
+            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+        }
+        m.appendTail(buf);
+        s = buf.toString();
+
+        buf = new StringBuffer();
+        m = P_ENTITY_UNICODE.matcher(s);
+        while (m.find()) {
+            final String match = m.group(1);
+            final int decimal = Integer.valueOf(match, 16).intValue();
+            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+        }
+        m.appendTail(buf);
+        s = buf.toString();
+
+        buf = new StringBuffer();
+        m = P_ENCODE.matcher(s);
+        while (m.find()) {
+            final String match = m.group(1);
+            final int decimal = Integer.valueOf(match, 16).intValue();
+            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+        }
+        m.appendTail(buf);
+        s = buf.toString();
+
+        s = validateEntities(s);
+        return s;
+    }
+
+    private String validateEntities(final String s) {
+        StringBuffer buf = new StringBuffer();
+
+        // validate entities throughout the string
+        Matcher m = P_VALID_ENTITIES.matcher(s);
+        while (m.find()) {
+            final String one = m.group(1); //([^&;]*)
+            final String two = m.group(2); //(?=(;|&|$))
+            m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));
+        }
+        m.appendTail(buf);
+
+        return encodeQuotes(buf.toString());
+    }
+
+    private String encodeQuotes(final String s){
+        if(encodeQuotes){
+            StringBuffer buf = new StringBuffer();
+            Matcher m = P_VALID_QUOTES.matcher(s);
+            while (m.find()) {
+                final String one = m.group(1); //(>|^)
+                final String two = m.group(2); //([^<]+?)
+                final String three = m.group(3); //(<|$)
+                m.appendReplacement(buf, Matcher.quoteReplacement(one + regexReplace(P_QUOTE, "&quot;", two) + three));
+            }
+            m.appendTail(buf);
+            return buf.toString();
+        }else{
+            return s;
+        }
+    }
+
+    private String checkEntity(final String preamble, final String term) {
+
+        return ";".equals(term) && isValidEntity(preamble)
+                ? '&' + preamble
+                : "&amp;" + preamble;
+    }
+
+    private boolean isValidEntity(final String entity) {
+        return inArray(entity, vAllowedEntities);
+    }
+
+    private static boolean inArray(final String s, final String[] array) {
+        for (String item : array) {
+            if (item != null && item.equals(s)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean allowed(final String name) {
+        return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);
+    }
+
+    private boolean allowedAttribute(final String name, final String paramName) {
+        return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));
+    }
+}

+ 22 - 0
src/main/java/com/usky/filter/XssEncode.java

@@ -0,0 +1,22 @@
+package com.usky.filter;
+
+
+
+public class XssEncode {
+    public static String xssEncode(String s) {
+        if (s == null || s.isEmpty()) {
+            return s;
+        }
+        try {
+            HTMLFilter htmlFilter = new HTMLFilter();
+            String clean = htmlFilter.filter(s);
+            return clean;
+        } catch (NullPointerException e) {
+            return s;
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+
+        return null;
+    }
+}

+ 36 - 0
src/main/java/com/usky/filter/XssFilter.java

@@ -0,0 +1,36 @@
+package com.usky.filter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+public class XssFilter extends OncePerRequestFilter {
+     private final Logger logger = LoggerFactory.getLogger(this.getClass());
+     @Override
+        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
+                throws ServletException, IOException {
+            try {
+                String uri = request.getRequestURI();
+                //特殊url不走过滤器
+                if (uri.contains("receipt") || uri.contains("mobile/buildingMgr")
+                         || uri.contains("bestPay") || uri.contains("backNotify") || uri.contains("frontNotify")
+                         || uri.contains("queryOrder") || uri.contains("refundNotify") || uri.contains("refund")
+                         || uri.contains("reverse")) {
+                    chain.doFilter(request, response);
+                } else {
+                    XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
+                    chain.doFilter(xssRequest, response);
+                }
+            } catch (Exception e) {
+            //    System.out.println("e = " + e.getCause().getMessage());
+                logger.error("Xss过滤器,包装request对象失败");
+                chain.doFilter(request, response);
+            }
+        }
+}

+ 101 - 0
src/main/java/com/usky/filter/XssHttpServletRequestWrapper.java

@@ -0,0 +1,101 @@
+package com.usky.filter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
+
+    HttpServletRequest orgRequest = null;
+
+    public XssHttpServletRequestWrapper(HttpServletRequest request) {
+        super(request);
+        orgRequest = request;
+    }
+
+    /**
+     * 覆盖getParameter方法,将参数名和参数值都做xss过滤
+     */
+    @Override
+    public String getParameter(String name) {
+        String value = super.getParameter(xssEncode(name));
+        if (value != null) {
+            value = xssEncode(value);
+        }
+        return value;
+    }
+    /**
+     * 覆盖getParameterValues方法,将参数名和参数值都做xss过滤
+     */
+    @Override
+    public String[] getParameterValues(String parameter) {
+        String[] values = super.getParameterValues(parameter);
+        if (values==null)  {
+            return null;
+        }
+        int count = values.length;
+        String[] encodedValues = new String[count];
+        for (int i = 0; i < count; i++) {
+            encodedValues[i] = xssEncode(values[i]);
+        }
+        return encodedValues;
+    }
+
+    /**
+     * 获取request的属性时,做xss过滤
+     */
+     @Override
+    public Object getAttribute(String name) {
+        Object value = super.getAttribute(name);
+        if (null != value && value instanceof String) {
+            value = xssEncode((String) value);
+        }
+        return value;
+    };
+
+    /**
+     * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
+     */
+    @Override
+    public String getHeader(String name) {
+        String value = super.getHeader(xssEncode(name));
+        if (value != null) {
+            value = xssEncode(value);
+        }
+        return value;
+    }
+
+
+    /**
+     * 将容易引起xss漏洞的半角字符直接替换成全角字符
+     *
+     * @param s
+     * @return
+     */
+    private static String xssEncode(String s) {
+        return XssEncode.xssEncode(s);
+    }
+
+    /**
+     * 获取最原始的request
+     *
+     * @return
+     */
+    public HttpServletRequest getOrgRequest() {
+        return orgRequest;
+    }
+
+    /**
+     * 获取最原始的request的静态方法
+     *
+     * @return
+     */
+    public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
+        if (req instanceof XssHttpServletRequestWrapper) {
+            return ((XssHttpServletRequestWrapper) req).getOrgRequest();
+        }
+
+        return req;
+    }
+
+
+}

+ 83 - 0
src/main/java/com/usky/mqtthandler/Mqtt2MessageHandler.java

@@ -0,0 +1,83 @@
+package com.usky.mqtthandler;
+
+import com.usky.config.webScoket.WsSessionManager;
+import com.usky.constant.CommonConstant;
+import com.usky.service.mqtt.MqttService;
+import com.usky.utils.RedisUtil;
+import lombok.SneakyThrows;
+import lombok.extern.log4j.Log4j2;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.MessageHandler;
+import org.springframework.messaging.MessagingException;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.TextMessage;
+
+import javax.annotation.PostConstruct;
+
+@Log4j2
+@Component
+public class Mqtt2MessageHandler implements MessageHandler {
+    @Autowired
+    private MqttPahoMessageDrivenChannelAdapter channel1MqttChannelAdapter;
+
+    @Autowired
+    private MqttService mqttService;
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @PostConstruct
+    private void addFailEvent() {
+        channel1MqttChannelAdapter.setApplicationEventPublisher((event) -> {
+            log.error("【MQTT】失败事件 {}", event);
+        });
+    }
+
+    @SneakyThrows
+    @ServiceActivator(inputChannel = "channel1")
+    @Override
+    public void handleMessage(Message<?> message) throws MessagingException {
+        Object o = redisUtil.get("15365185591");
+        String payload = (String) message.getPayload();
+        if (isJsonObject(payload)) {
+            JSONObject data = JSONObject.fromObject(payload);
+            if (data.has("type")) {
+                if (CommonConstant.MQTT_MESSAGE_TYPE_INFO.equals(data.get("type"))) {
+                    log.info("【MQTT】心跳数据{}解析】", message);
+                    mqttService.infoSava(data);
+
+                } else if (CommonConstant.MQTT_MESSAGE_TYPE_ALARM.equals(data.get("type"))) {
+
+                    log.info("【MQTT】告警数据{}解析】", message);
+
+                    mqttService.alarmSendAndSava(data);
+                } else {
+
+                    log.error("【MQTT】数据类型异常{}", message);
+                }
+            }
+        } else {
+            log.error("【MQTT】数据格式异常{}", message);
+
+        }
+
+    }
+
+
+    public static boolean isJsonObject(String content) {
+        if (StringUtils.isBlank(content)) {
+            return false;
+        }
+        try {
+            JSONObject data = JSONObject.fromObject(content);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+}

+ 104 - 0
src/main/java/com/usky/service/build/BuildService.java

@@ -0,0 +1,104 @@
+package com.usky.service.build;
+
+import com.usky.entity.build.TbBuildingVoEntity;
+import com.usky.entity.build.TbFloorVoEntity;
+import com.usky.entity.build.TbRoomVoEntity;
+import com.usky.utils.Page;
+import com.usky.utils.Result;
+
+public interface BuildService {
+    /**
+     * 建筑新增
+     *
+     * @param buildName
+     * @param buildAddr
+     * @param latitude
+     * @param longitude
+     * @return
+     */
+    Result addBuild(String buildName, String buildAddr, String latitude, String longitude);
+
+    /**
+     * 建筑信息修改
+     *
+     * @param buildName
+     * @param buildAddr
+     * @param latitude
+     * @param longitude
+     * @param id
+     * @param status
+     * @return
+     */
+    Result updateBuild(String buildName, String buildAddr, String latitude, String longitude, String id, String status);
+
+    /**
+     * 建筑信息查询
+     *
+     * @param buildName
+     * @param buildAddr
+     * @param latitude
+     * @param longitude
+     * @param pageNo
+     * @param pageSize
+     * @return
+     */
+    Page<TbBuildingVoEntity> listBuild(String buildName, String buildAddr, String latitude, String longitude, String pageNo, String pageSize);
+
+    /**
+     * 楼层新增
+     *
+     * @param floorBuildUuid
+     * @return
+     */
+    Result addFloor(String floorName, String floorBuildUuid);
+
+    /**
+     * 楼层信息修改
+     *
+     * @param id
+     * @param status
+     * @return
+     */
+    Result updateFloor(String floorName, String floorBuildUuid, String id, String status);
+
+    /**
+     * 楼层信息查询
+     *
+     * @param floorName
+     * @param floorBuildUuid
+     * @param pageNo
+     * @param pageSize
+     * @return
+     */
+    Page<TbFloorVoEntity> queryFloor(String floorName, String floorBuildUuid, String pageNo, String pageSize);
+
+    /**
+     * 添加房间
+     *
+     * @param roomName
+     * @param roomFloorUuid
+     * @return
+     */
+    Result addRoom(String roomName, String roomFloorUuid);
+
+    /**
+     * 房间信息修改
+     *
+     * @param roomName
+     * @param roomFloorUuid
+     * @param id
+     * @param status
+     * @return
+     */
+    Result updateRoom(String roomName, String roomFloorUuid, String id, String status);
+
+    /**
+     * 房间信息查询
+     * @param roomName
+     * @param roomFloorUuid
+     * @param pageNo
+     * @param pageSize
+     * @return
+     */
+    Page<TbRoomVoEntity> queryRoom(String roomName, String roomFloorUuid, String pageNo, String pageSize);
+}

+ 263 - 0
src/main/java/com/usky/service/build/BuildServiceImpl.java

@@ -0,0 +1,263 @@
+package com.usky.service.build;
+
+import com.usky.dao.impl.BaseDaoImpl;
+import com.usky.entity.build.*;
+import com.usky.utils.*;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.query.Query;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/5/24 09:53
+ * @description TODO
+ **/
+@Service
+@Transactional
+public class BuildServiceImpl extends BaseDaoImpl implements BuildService {
+    @Override
+    public Result addBuild(String buildName, String buildAddr, String latitude, String longitude) {
+        TbBuildingEntity buildDTO = new TbBuildingEntity();
+        buildDTO.setBuildName(buildName);
+        buildDTO.setBuildAddr(buildAddr);
+        buildDTO.setLatitude(latitude);
+        buildDTO.setLongitude(longitude);
+        buildDTO.setCreatTime(new Timestamp(System.currentTimeMillis()));
+        buildDTO.setBuildUuid(UUIDUtils.getUUID());
+        buildDTO.setStatus(0);
+        getSession().save(buildDTO);
+        return Result.OK();
+    }
+
+    @Override
+    public Result updateBuild(String buildName, String buildAddr, String latitude, String longitude, String id, String status) {
+        Query query = getSession().createQuery("from TbBuildingEntity t where t.id =:id and t.status = 0");
+        List<TbBuildingEntity> buildList = query.setInteger("id", Integer.parseInt(id)).list();
+        if (ListUtil.isBlank(buildList)) {
+            return Result.error("建筑不存在");
+        }
+        TbBuildingEntity tbBuildingEntity = buildList.get(0);
+        if (StringUtils.isNotBlank(buildAddr)) {
+            tbBuildingEntity.setBuildAddr(buildAddr);
+        }
+        if (StringUtils.isNotBlank(buildName)) {
+            tbBuildingEntity.setBuildName(buildName);
+        }
+        if (StringUtils.isNotBlank(latitude)) {
+            tbBuildingEntity.setLatitude(latitude);
+        }
+        if (StringUtils.isNotBlank(longitude)) {
+            tbBuildingEntity.setLongitude(longitude);
+        }
+        if (StringUtils.isNotBlank(status)) {
+
+            List list = getSession().createQuery("from TbFloorEntity t where t.status=0 and t.floorBuildUuid='" + tbBuildingEntity.getBuildUuid() + "'").list();
+            if (ListUtil.isNotBlank(list)) {
+                return Result.error("请先删除下属楼层信息");
+            }
+            tbBuildingEntity.setStatus(Integer.parseInt(status));
+        }
+        getSession().update(tbBuildingEntity);
+        return Result.OK();
+    }
+
+    @Override
+    public Page<TbBuildingVoEntity> listBuild(String buildName, String buildAddr, String latitude, String longitude, String pageNo, String pageSize) {
+
+        StringBuffer sb = new StringBuffer();
+        sb.append("from TbBuildingEntity t where t.status = 0 ");
+        if (StringUtils.isNotBlank(buildName)) {
+            sb.append(" and t.buildName like '%" + buildName + "%'");
+        }
+        if (StringUtils.isNotBlank(buildAddr)) {
+            sb.append(" and t.buildAddr like '%" + buildAddr + "%'");
+        }
+        sb.append(" order By t.creatTime DESC");
+        List list = getSession().createQuery(sb.toString()).list();
+        Page<TbBuildingVoEntity> result = new Page<>(list.size(), Integer.parseInt(pageSize));
+        result.setPageNo(Integer.parseInt(pageNo));
+        Query query = getSession().createQuery(sb.toString());
+        query.setFirstResult((Integer.parseInt(pageNo) - 1) * Integer.parseInt(pageSize));
+        query.setMaxResults(Integer.parseInt(pageSize));
+        List<TbBuildingVoEntity> list1 = query.list();
+        result.setPageList(list1);
+        return result;
+    }
+
+    @Override
+    public Result addFloor(String floorName, String floorBuildUuid) {
+        TbFloorEntity floorEntity = new TbFloorEntity();
+        Query query = getSession().createQuery("from TbBuildingEntity t where t.status = 0 and t.buildUuid=:floorBuildUuid");
+        List floorBuildUuid1 = query.setString("floorBuildUuid", floorBuildUuid).list();
+        if (ListUtil.isBlank(floorBuildUuid1)) {
+            return Result.error("建筑不存在");
+        }
+        floorEntity.setFloorName(floorName);
+        floorEntity.setStatus(0);
+        floorEntity.setCreatTime(new Timestamp(System.currentTimeMillis()));
+        floorEntity.setFloorUuid(UUIDUtils.getUUID());
+        floorEntity.setFloorBuildUuid(floorBuildUuid);
+        getSession().save(floorEntity);
+        return  Result.OK();
+    }
+
+    @Override
+    public Result updateFloor(String floorName, String floorBuildUuid, String id, String status) {
+        Query query = getSession().createQuery("from TbFloorEntity t where t.status=0 and t.id=:id");
+        List<TbFloorEntity> floorList = query.setInteger("id", Integer.parseInt(id)).list();
+        if (ListUtil.isBlank(floorList)) {
+            return Result.error("楼层不存在");
+        }
+        TbFloorEntity tbFloorEntity = floorList.get(0);
+        if (StringUtils.isNotBlank(floorBuildUuid)) {
+            Query builsQuery = getSession().createQuery("from TbBuildingEntity t where t.status = 0 and t.buildUuid=:floorBuildUuid");
+            List floorBuildUuid1 = builsQuery.setString("floorBuildUuid", floorBuildUuid).list();
+            if (ListUtil.isBlank(floorBuildUuid1)) {
+                return  Result.error( "建筑不存在");
+            }
+            tbFloorEntity.setFloorBuildUuid(floorBuildUuid);
+        }
+
+
+        if (StringUtils.isNotBlank(floorName)) {
+            tbFloorEntity.setFloorName(floorName);
+        }
+        if (StringUtils.isNotBlank(status)) {
+            List<TbRoomEntity> list = getSession().createQuery("from TbRoomEntity t where t.status=0 and t.roomFloorUuid='" + tbFloorEntity.getFloorUuid() + "'").list();
+            if (ListUtil.isNotBlank(list)) {
+                return  Result.error("请删除下属房间");
+            }
+
+            tbFloorEntity.setStatus(Integer.parseInt(status));
+        }
+        getSession().update(tbFloorEntity);
+        return  Result.OK();
+    }
+
+    @Override
+    public Page<TbFloorVoEntity> queryFloor(String floorName, String floorBuildUuid, String pageNo, String pageSize) {
+        StringBuffer sb = new StringBuffer();
+        sb.append("from TbFloorEntity t where t.status = 0");
+        if (StringUtils.isNotBlank(floorName)) {
+            sb.append(" and t.floorName like '%" + floorName + "%'");
+        }
+        if (StringUtils.isNotBlank(floorBuildUuid)) {
+            sb.append(" and t.floorBuildUuid ='" + floorBuildUuid + "'");
+        }
+        sb.append(" order By t.creatTime DESC");
+        List list = getSession().createQuery(sb.toString()).list();
+        Page<TbFloorVoEntity> result = new Page<>(list.size(), Integer.parseInt(pageSize));
+        Query query = getSession().createQuery(sb.toString());
+        query.setFirstResult((Integer.parseInt(pageNo) - 1) * Integer.parseInt(pageSize));
+        query.setMaxResults(Integer.parseInt(pageSize));
+        List<TbFloorEntity> list1 = query.list();
+        List<TbFloorVoEntity> tbFloorVoEntities = BeanHelp.copyWithCollection(list1, TbFloorVoEntity.class);
+        if (ListUtil.isBlank(list1)) {
+            result.setPageNo(Integer.parseInt(pageNo));
+            result.setPageList(tbFloorVoEntities);
+            return result;
+        }
+        for (TbFloorVoEntity o : tbFloorVoEntities) {
+            List<TbBuildingEntity> buildingEntityList = getSession().createQuery("from TbBuildingEntity t where t.status=0 and t.buildUuid='" + o.getFloorBuildUuid() + "'").list();
+            if (ListUtil.isBlank(buildingEntityList)) {
+                o.setBuildName("");
+            } else {
+
+                o.setBuildName(buildingEntityList.get(0).getBuildName());
+            }
+        }
+        result.setPageNo(Integer.parseInt(pageNo));
+        result.setPageList(tbFloorVoEntities);
+        return result;
+
+
+    }
+
+    @Override
+    public Result addRoom(String roomName, String roomFloorUuid) {
+        Query query = getSession().createQuery("from TbFloorEntity t where t.status = 0 and t.floorUuid=:roomFloorUuid");
+        List roomFloorUuid1 = query.setString("roomFloorUuid", roomFloorUuid).list();
+        if (ListUtil.isBlank(roomFloorUuid1)) {
+            return  Result.error("楼层不存在");
+        }
+        TbRoomEntity roomEntity = new TbRoomEntity();
+        roomEntity.setRoomName(roomName);
+        roomEntity.setRoomUuid(UUIDUtils.getUUID());
+        roomEntity.setRoomFloorUuid(roomFloorUuid);
+        roomEntity.setCreatTime(new Timestamp(System.currentTimeMillis()));
+        roomEntity.setStatus(0);
+        getSession().save(roomEntity);
+        return  Result.OK();
+    }
+
+    @Override
+    public Result updateRoom(String roomName, String roomFloorUuid, String id, String status) {
+        Query query = getSession().createQuery("from TbRoomEntity t where t.status=0 and t.id=:id");
+        List<TbRoomEntity> roomEntities = query.setInteger("id", Integer.parseInt(id)).list();
+        if (ListUtil.isBlank(roomEntities)) {
+            return  Result.error("房间不存在");
+        }
+        TbRoomEntity tbRoomEntity = roomEntities.get(0);
+        if (StringUtils.isNotBlank(roomName)) {
+            tbRoomEntity.setRoomName(roomName);
+        }
+        if (StringUtils.isNotBlank(status)) {
+            tbRoomEntity.setStatus(Integer.parseInt(status));
+        }
+        if (StringUtils.isNotBlank(roomFloorUuid)) {
+            Query query1 = getSession().createQuery("from TbFloorEntity t where t.status = 0 and t.floorUuid=:roomFloorUuid");
+            List<TbFloorEntity> roomFloorUuid1 = query1.setString("roomFloorUuid", roomFloorUuid).list();
+            if (ListUtil.isBlank(roomFloorUuid1)) {
+                return  Result.error("楼层不存在");
+            }
+            tbRoomEntity.setRoomFloorUuid(roomFloorUuid);
+        }
+        getSession().update(tbRoomEntity);
+        return  Result.OK();
+    }
+
+    @Override
+    public Page<TbRoomVoEntity> queryRoom(String roomName, String roomFloorUuid, String pageNo, String pageSize) {
+        StringBuffer sb = new StringBuffer();
+        sb.append("from TbRoomEntity t where t.status=0 ");
+        if (StringUtils.isNotBlank(roomName)) {
+            sb.append(" and t.roomName like'%" + roomName + "%'");
+        }
+        if (StringUtils.isNotBlank(roomFloorUuid)) {
+            sb.append(" and t.roomFloorUuid = '" + roomFloorUuid + "'");
+        }
+        sb.append(" order By t.creatTime DESC");
+        List<TbRoomEntity> total = getSession().createQuery(sb.toString()).list();
+        Page<TbRoomVoEntity> result = new Page<TbRoomVoEntity>(total.size(), Integer.parseInt(pageSize));
+        result.setPageNo(Integer.parseInt(pageNo));
+        result.setPageSize(Integer.parseInt(pageSize));
+        Query query = getSession().createQuery(sb.toString());
+        query.setFirstResult((Integer.parseInt(pageNo) - 1) * Integer.parseInt(pageSize));
+        query.setMaxResults(Integer.parseInt(pageSize));
+        List<TbRoomVoEntity> list = query.list();
+        List<TbRoomVoEntity> roomVoEntityList = BeanHelp.copyWithCollection(list, TbRoomVoEntity.class);
+        if (ListUtil.isBlank(roomVoEntityList)) {
+            {
+                result.setPageList(roomVoEntityList);
+                return result;
+            }
+        }
+        for (TbRoomVoEntity roomVoEntity : roomVoEntityList) {
+            List<TbFloorEntity> floorEntityList = getSession().createQuery("from TbFloorEntity t where t.status=0 and t.floorUuid='" + roomVoEntity.getRoomFloorUuid() + "'").list();
+            if (ListUtil.isBlank(floorEntityList)) {
+                roomVoEntity.setFloorName("");
+            } else {
+
+                roomVoEntity.setFloorName(floorEntityList.get(0).getFloorName());
+            }
+        }
+        result.setPageList(roomVoEntityList);
+        return result;
+
+    }
+}

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

@@ -0,0 +1,7 @@
+package com.usky.service.log;
+
+import com.usky.entity.sys.log.SysLogDTO;
+
+public interface LogService {
+    void addLog(SysLogDTO dto);
+}

+ 19 - 0
src/main/java/com/usky/service/log/LogServiceImpl.java

@@ -0,0 +1,19 @@
+package com.usky.service.log;
+
+import com.usky.dao.impl.BaseDaoImpl;
+import com.usky.entity.sys.log.SysLogDTO;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/7/14 14:10
+ * @description TODO
+ **/
+@Service
+public class LogServiceImpl extends BaseDaoImpl implements LogService {
+    @Override
+    public void addLog(SysLogDTO dto) {
+        getSession().save(dto);
+    }
+}

+ 22 - 0
src/main/java/com/usky/service/mqtt/MqttService.java

@@ -0,0 +1,22 @@
+package com.usky.service.mqtt;
+
+import net.sf.json.JSONObject;
+
+/**
+ * @author laowo
+ */
+public interface MqttService {
+    /**
+     * 心跳数据保存
+     *
+     * @param data
+     */
+    void infoSava(JSONObject data);
+
+    /**
+     * 告警数据推送和保存
+     *
+     * @param data
+     */
+    void alarmSendAndSava(JSONObject data);
+}

+ 103 - 0
src/main/java/com/usky/service/mqtt/MqttServiceImpl.java

@@ -0,0 +1,103 @@
+package com.usky.service.mqtt;
+
+import com.usky.config.webScoket.WsSessionManager;
+import com.usky.dao.impl.BaseDaoImpl;
+import com.usky.entity.mqtt.TbDeviceAlarmsDTO;
+import com.usky.entity.mqtt.TbDeviceInfoDTO;
+import com.usky.utils.RedisUtil;
+import com.usky.utils.TimeUtil;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.hibernate.Session;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.socket.TextMessage;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/10 15:12
+ * @description TODO
+ **/
+@Service
+@Transactional
+public class MqttServiceImpl extends BaseDaoImpl implements MqttService {
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Override
+    public void infoSava(JSONObject data) {
+        //获取设备列表
+        JSONArray devs = (JSONArray) data.get("devs");
+        for (int i = 0; i < devs.size(); i++) {
+            //获取属性列表
+            JSONObject device = (JSONObject) devs.get(i);
+            Object timeStamp = device.get("timeStamp");
+            String time = TimeUtil.getTime(timeStamp.toString());
+            device.put("timeStamp",time);
+            device.put("type", "INFO");
+            redisUtil.set((String) device.get("devId"), device.toString());
+            JSONArray dp = (JSONArray) device.get("dp");
+            for (int j = 0; j < dp.size(); j++) {
+                TbDeviceInfoDTO deviceInfoDTO = new TbDeviceInfoDTO();
+                //设备属性信息
+                JSONObject devDp = (JSONObject) dp.get(j);
+                deviceInfoDTO.setDevId((String) device.get("devId"));
+                deviceInfoDTO.setDevcieModel((String) device.get("deviceModel"));
+                deviceInfoDTO.setDeviceName((String) device.get("deviceName"));
+                deviceInfoDTO.setDevceType(String.valueOf(device.get("deviceType")));
+                deviceInfoDTO.setTimeStamp(device.get("timeStamp").toString());
+                deviceInfoDTO.setProperty((String) devDp.get("property"));
+                deviceInfoDTO.setSerial((String) devDp.get("serial"));
+                deviceInfoDTO.setValue(devDp.get("value").toString());
+                deviceInfoDTO.setCreateTime(TimeUtil.getTime());
+                //设备实时状体存续
+                Session session = getSession();
+                session.save(deviceInfoDTO);
+                session.flush();
+                session.clear();
+            }
+        }
+    }
+
+    @Override
+    public void alarmSendAndSava(JSONObject data) {
+//获取设备列表
+        JSONArray devs = (JSONArray) data.get("alarms");
+        for (int i = 0; i < devs.size(); i++) {
+            //获取属性列表
+            JSONObject device = (JSONObject) devs.get(i);
+            device.put("type", "ALARM");
+            JSONArray dp = (JSONArray) device.get("dp");
+            redisUtil.set((String) device.get("devId"), device.toString());
+            Object timeStamp = device.get("timeStamp");
+            String time = TimeUtil.getTime(timeStamp.toString());
+            device.put("timeStamp",time);
+            WsSessionManager.sendMessageToAll(new TextMessage(device.toString()));
+            for (int j = 0; j < dp.size(); j++) {
+                TbDeviceAlarmsDTO deviceAlarmsDTO = new TbDeviceAlarmsDTO();
+                //设备属性信息
+                JSONObject devDp = (JSONObject) dp.get(j);
+                deviceAlarmsDTO.setDevId((String) device.get("devId"));
+                deviceAlarmsDTO.setDevcieModel((String) device.get("devcieModel"));
+                deviceAlarmsDTO.setDeviceName((String) device.get("deviceName"));
+                deviceAlarmsDTO.setDeviceType(String.valueOf(device.get("deviceType")));
+                deviceAlarmsDTO.setTimeStamp(device.get("timeStamp").toString());
+                deviceAlarmsDTO.setProperty((String) devDp.get("property"));
+                deviceAlarmsDTO.setSerial(String.valueOf(devDp.get("serial")));
+                deviceAlarmsDTO.setValue(String.valueOf(devDp.get("value")));
+                deviceAlarmsDTO.setStatus((Integer) devDp.get("status"));
+                deviceAlarmsDTO.setCreateTime(TimeUtil.getTime());
+                //告警存储
+                Session session = getSession();
+                //webSocket告警推送
+                session.save(deviceAlarmsDTO);
+                session.flush();
+                session.clear();
+            }
+        }
+    }
+
+
+}

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

@@ -0,0 +1,56 @@
+package com.usky.service.sys;
+
+import com.usky.entity.sys.SysRoleDTO;
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.sys.vo.SysRoleVO;
+import com.usky.utils.Page;
+
+import java.util.List;
+
+/**
+ * @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);
+
+    /**
+     * 查询角色
+     *
+     * @param sysRoleVO
+     * @return
+     */
+    List<SysRoleVO> querRoleList(SysRoleVO sysRoleVO);
+
+    /**
+     * 通过角色名称查询角色
+     *
+     * @param role
+     * @return
+     */
+    SysRoleDTO queryRoleByName(SysRoleVO role);
+
+    /**
+     * 权限字符校验
+     *
+     * @param role
+     * @return
+     */
+    SysRoleDTO queryRoleByKey(SysRoleVO role);
+
+    /**
+     * 新增角色
+     *
+     * @param roleVO
+     */
+    void addRole(SysRoleVO roleVO);
+
+    /**
+     * 角色修改
+     *
+     * @param roleVO
+     */
+    void edit(SysRoleVO roleVO);
+}

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

@@ -0,0 +1,208 @@
+package com.usky.service.sys;
+
+import com.sun.org.apache.xpath.internal.operations.Gte;
+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.SysRoleDTO;
+import com.usky.entity.sys.SysRoleDeptDTO;
+import com.usky.entity.sys.SysRoleMenuDTO;
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.sys.vo.SysRoleVO;
+import com.usky.utils.BeanHelp;
+import com.usky.utils.Page;
+
+import com.usky.utils.ShiroUtils;
+import io.swagger.models.auth.In;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.query.NativeQuery;
+import org.hibernate.transform.Transformers;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+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");
+        StringBuilder sb = new StringBuilder();
+        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;
+    }
+
+    @Override
+    @DataScope(deptAlias = "d")
+    public List<SysRoleVO> querRoleList(SysRoleVO sysRoleVO) {
+        String dataScope = (String) sysRoleVO.getParams().get("dataScope");
+        StringBuilder sb = new StringBuilder();
+        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(dataScope)) {
+            sb.append(dataScope);
+        }
+
+        return (List<SysRoleVO>) getSession().createSQLQuery(sb.toString()).setResultTransformer(Transformers.aliasToBean(SysRoleVO.class)).list();
+    }
+
+    @Override
+    public SysRoleDTO queryRoleByName(SysRoleVO role) {
+        return (SysRoleDTO) getSession().createQuery("from SysRoleDTO t where t.roleName='" + role.getRoleName() + "'").uniqueResult();
+    }
+
+    @Override
+    public SysRoleDTO queryRoleByKey(SysRoleVO role) {
+        return (SysRoleDTO) getSession().createQuery("from SysRoleDTO t where t.roleKey='" + role.getRoleKey() + "'").uniqueResult();
+    }
+
+    @Override
+    @Transactional
+    public void addRole(SysRoleVO roleVO) {
+        SysRoleDTO roleDTO = BeanHelp.copyProperties(roleVO, SysRoleDTO.class);
+        roleDTO.setCreateBy(ShiroUtils.getLoginName());
+        roleDTO.setCreateTime(new Timestamp(System.currentTimeMillis()));
+        getSession().save(roleDTO);
+        Integer roleId = roleDTO.getRoleId();
+        insertRoleMenu(roleVO, roleId);
+        roleVO.setRoleId(roleId);
+        insertRoleDept(roleVO);
+    }
+
+    /**
+     * 角色修改
+     *
+     * @param roleVO
+     */
+    @Override
+    @Transactional
+    public void edit(SysRoleVO roleVO) {
+        SysRoleDTO roleDTO = (SysRoleDTO) getSession().createQuery("from SysRoleDTO t where t.roleId=" + roleVO.getRoleId() + "").uniqueResult();
+        if (StringUtils.isNotBlank(roleVO.getRoleKey())) {
+            roleDTO.setRoleKey(roleVO.getRoleKey());
+        }
+        if (StringUtils.isNotBlank(roleVO.getRemark())) {
+            roleDTO.setRemark(roleVO.getRemark());
+        }
+        if (StringUtils.isNotBlank(roleVO.getRoleName())) {
+            roleDTO.setRoleKey(roleVO.getRoleKey());
+        }
+        if (StringUtils.isNotBlank(roleVO.getStatus())) {
+            roleDTO.setStatus(roleVO.getStatus());
+        }
+        roleDTO.setRoleSort(roleVO.getRoleSort());
+        roleDTO.setUpdateBy(ShiroUtils.getLoginName());
+        roleDTO.setUpdateTime(new Timestamp(System.currentTimeMillis()));
+        getSession().saveOrUpdate(roleDTO);
+        delRoleMenuByRoleId(roleVO.getRoleId());
+        insertRoleMenu(roleVO, roleVO.getRoleId());
+        //删除角色和部门关联
+        delRoleDept(roleVO.getRoleId());
+        insertRoleDept(roleVO);
+    }
+
+    /**
+     * 删除角色菜单关联
+     *
+     * @param roleId
+     */
+    public void delRoleMenuByRoleId(Integer roleId) {
+        getSession().createSQLQuery("delete from sys_role_menu where role_id=" + roleId + "").executeUpdate();
+
+    }
+
+    public void insertRoleMenu(SysRoleVO role, Integer roleId) {
+        if (null != role.getMenuIds() && role.getMenuIds().length != 0) {
+            List<SysRoleMenuDTO> list = new ArrayList<SysRoleMenuDTO>();
+            for (Integer menuId : role.getMenuIds()) {
+                SysRoleMenuDTO rm = new SysRoleMenuDTO();
+                rm.setRoleId(roleId);
+                rm.setMenuId(menuId);
+                getSession().save(rm);
+                getSession().flush();
+                getSession().clear();
+            }
+        }
+
+    }
+
+    public void insertRoleDept(SysRoleVO role) {
+        // 新增角色与部门(数据权限)管理
+        if (null != role.getMenuIds() && role.getMenuIds().length != 0) {
+            for (Integer deptId : role.getDeptIds()) {
+                SysRoleDeptDTO rd = new SysRoleDeptDTO();
+                rd.setRoleId(role.getRoleId());
+                rd.setDeptId(deptId);
+                getSession().save(rd);
+                getSession().flush();
+                getSession().clear();
+            }
+        }
+
+    }
+
+    public void delRoleDept(Integer roleId) {
+        getSession().createSQLQuery("delete from sys_role_dept where role_id=" + roleId + "").executeUpdate();
+    }
+
+
+}

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

@@ -0,0 +1,54 @@
+package com.usky.service.sys.dept;
+
+import com.usky.entity.sys.SysDeptDTO;
+import com.usky.entity.sys.vo.SysDeptVO;
+import com.usky.entity.ztree.Ztree;
+import com.usky.utils.Result;
+
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/26 15:52
+ * @description TODO
+ **/
+public interface DeptService {
+    /**
+     * 部门树加载
+     *
+     * @param sysDeptVO
+     * @return
+     */
+    public List<Ztree> list(SysDeptVO sysDeptVO);
+
+    /**
+     * 根据父级id和部门名称查询部门
+     *
+     * @param dept
+     * @return
+     */
+    List<SysDeptDTO> queryDeptByNameAndParentId(SysDeptDTO dept);
+
+    /**
+     * 新增部门
+     *
+     * @param dept
+     * @return
+     */
+    Result<?> add(SysDeptDTO dept);
+
+    /**
+     * 根据父级id查询子部门
+     *
+     * @param deptId
+     * @return
+     */
+    int queryDeptChildByid(Integer deptId);
+
+
+    List selectDeptCount(Integer deptId);
+
+    void remove(Integer deptId);
+}
+

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

@@ -0,0 +1,131 @@
+package com.usky.service.sys.dept;
+
+import com.usky.annotion.DataScope;
+import com.usky.dao.impl.BaseDaoImpl;
+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 com.usky.utils.Result;
+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;
+    }
+
+
+    @Override
+    public List<SysDeptDTO> queryDeptByNameAndParentId(SysDeptDTO dept) {
+        return (List<SysDeptDTO>) getSession().createQuery("from SysDeptDTO t where t.deptName='" + dept.getDeptName() + "' and t.parentId=" + dept.getDeptId() + "").list();
+    }
+
+    /**
+     * 部门新增
+     *
+     * @param dept
+     * @return
+     */
+    @Override
+    public Result<?> add(SysDeptDTO dept) {
+        SysDeptDTO parent = queryDeptById(dept.getParentId());
+        if ("1".equals(parent.getStatus())) {
+            Result.error("部门已停用无法添加!");
+        }
+        dept.setAncestors(parent.getAncestors() + "," + dept.getParentId());
+        getSession().save(dept);
+        return Result.OK();
+    }
+
+    @Override
+    public int queryDeptChildByid(Integer deptId) {
+        List lis = getSession().createSQLQuery("select count(*) from sys_dept where status = 0 and del_flag = '0' and find_in_set(#{deptId}, ancestors)").list();
+        lis.get(0);
+
+
+        return 0;
+    }
+
+
+    @Override
+    public List selectDeptCount(Integer deptId) {
+
+        return getSession().createSQLQuery("select count(1) from sys_dept where del_flag = '0' and parent_id = " + deptId + "").list();
+    }
+
+    @Override
+    public void remove(Integer deptId) {
+        getSession().createSQLQuery("update sys_dept set del_flag = '1' where dept_id = " + deptId + "");
+    }
+
+
+    public SysDeptDTO queryDeptById(Integer deptId) {
+
+        return (SysDeptDTO) getSession().createQuery("from SysDeptDTO t where t.deptId=" + deptId + "").uniqueResult();
+    }
+
+    /**
+     * 对象转部门树
+     *
+     * @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;
+    }
+
+
+}

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

@@ -0,0 +1,90 @@
+package com.usky.service.sys.menuService;
+
+
+import com.usky.entity.sys.SysMenuDTO;
+import com.usky.entity.sys.vo.SysMenuVO;
+import com.usky.entity.sys.vo.SysUserVO;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/23 15:11
+ * @description TODO
+ **/
+public interface MenuService {
+    /**
+     * 根据用户id查询权限
+     *
+     * @param userId 用户id
+     * @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);
+
+    /**
+     * 根据菜单id查询菜单
+     *
+     * @param menuId
+     * @return
+     */
+    int queryMenuById(Integer menuId);
+
+    /**
+     * 查询角色-菜单
+     *
+     * @param menuId
+     * @return
+     */
+    int queryRoleMenuByMenuId(Integer menuId);
+
+    /**
+     * 删除菜单
+     *
+     * @param menuId
+     */
+    void deleteMenuById(Integer menuId);
+
+    /**
+     * 根据菜单名称查询菜单
+     *
+     * @param menuName
+     * @param parentId
+     * @return
+     */
+    List<SysMenuDTO> queryMenuByName(String menuName, Integer parentId);
+
+    /**
+     * 新增菜单
+     *
+     * @param menu
+     */
+    void add(SysMenuVO menu);
+
+    /**
+     * 菜单修改
+     *
+     * @param menu
+     */
+    void updateMenu(SysMenuVO menu);
+}

+ 253 - 0
src/main/java/com/usky/service/sys/menuService/MenuServiceImpl.java

@@ -0,0 +1,253 @@
+package com.usky.service.sys.menuService;
+
+import com.usky.annotion.DataScope;
+import com.usky.dao.impl.BaseDaoImpl;
+
+import com.usky.entity.sys.SysMenuDTO;
+import com.usky.entity.sys.vo.SysMenuVO;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.utils.BeanHelp;
+import com.usky.utils.ShiroUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.transform.Transformers;
+import org.springframework.stereotype.Service;
+
+import java.math.BigInteger;
+import java.sql.Timestamp;
+import java.util.*;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/23 15:13
+ * @description TODO
+ **/
+@Service
+public class MenuServiceImpl extends BaseDaoImpl implements MenuService {
+    @Override
+    public Set<String> qyeryPermsByUserId(long userId) {
+        @SuppressWarnings("all")
+        String sql = "SELECT DISTINCT\n" +
+                "\tm.perms \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 r ON r.role_id = ur.role_id \n" +
+                "WHERE\n" +
+                "\tm.visible = '0' \n" +
+                "\tAND r.STATUS = '0' AND ur.user_id = " + userId + "";
+        List<String> perms = getSession().createSQLQuery(sql).list();
+
+
+        Set<String> permsSet = new HashSet<>();
+        for (String perm : perms) {
+            if (StringUtils.isNotBlank(perm)) {
+                permsSet.addAll(Arrays.asList(perm.trim().split(",")));
+            }
+        }
+        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 as isRefresh, 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;
+    }
+
+    @Override
+    public int queryMenuById(Integer menuId) {
+        List list = getSession().createSQLQuery("select count(1) from sys_menu where parent_id=" + menuId + "").list();
+        return ((BigInteger) list.get(0)).intValue();
+    }
+
+    @Override
+    public int queryRoleMenuByMenuId(Integer menuId) {
+
+        List list = getSession().createSQLQuery("select count(1) from sys_role_menu where menu_id=" + menuId + "").list();
+
+        return ((BigInteger) list.get(0)).intValue();
+    }
+
+    @Override
+    public void deleteMenuById(Integer menuId) {
+        getSession().createSQLQuery("delete from sys_menu where menu_id = " + menuId + " or parent_id = " + menuId + "").executeUpdate();
+    }
+
+    @Override
+    public List<SysMenuDTO> queryMenuByName(String menuName, Integer parentId) {
+        List<SysMenuDTO> list = getSession().createQuery("from SysMenuDTO t where t.menuName='" + menuName + "' and  t.parentId=parentId").list();
+
+        return list;
+    }
+
+    @Override
+    public void add(SysMenuVO menu) {
+        menu.setCreateBy(ShiroUtils.getLoginName());
+        menu.setCreateTime(new Timestamp(System.currentTimeMillis()));
+        SysMenuDTO sysMenuDTO = BeanHelp.copyProperties(menu, SysMenuDTO.class);
+        getSession().save(sysMenuDTO);
+    }
+
+    @Override
+    public void updateMenu(SysMenuVO menu) {
+        SysMenuDTO sysMenuDTO = BeanHelp.copyProperties(menu, SysMenuDTO.class);
+        String loginName = ShiroUtils.getLoginName();
+        sysMenuDTO.setUpdateBy(loginName);
+        sysMenuDTO.setUpdateTime(new Timestamp(System.currentTimeMillis()));
+        getSession().update(sysMenuDTO);
+    }
+
+    /**
+     * 根据父节点的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;
+    }
+}

+ 18 - 0
src/main/java/com/usky/service/sys/user/LoginService.java

@@ -0,0 +1,18 @@
+package com.usky.service.sys.user;
+
+import com.usky.entity.sys.vo.SysUserVO;
+
+/**
+ * @author laowo
+ */
+public interface LoginService {
+    /**
+     * 根据登录用户名查用户
+     *
+     * @param username
+     * @return
+     */
+    SysUserVO findUserByUsername(String username);
+
+
+}

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

@@ -0,0 +1,64 @@
+package com.usky.service.sys.user;
+
+
+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.BeanHelp;
+import com.usky.utils.ListUtil;
+import org.apache.shiro.authc.AuthenticationException;
+import org.hibernate.transform.Transformers;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/20 11:22
+ * @description TODO
+ **/
+@Service
+public class LoginServiceImpl extends BaseDaoImpl implements LoginService {
+    @Override
+    @SuppressWarnings("unchecked")
+    public SysUserVO findUserByUsername(String username) {
+        List<SysUserDTO> list = getSession().createQuery("from SysUserDTO where loginName ='" + username + "' and delFlag='0'").list();
+        if (ListUtil.isBlank(list)) {
+            throw new AuthenticationException("登录用户不存在!!!!!");
+        }
+        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;
+    }
+
+
+}

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

@@ -0,0 +1,96 @@
+package com.usky.service.sys.user;
+
+import com.usky.entity.sys.SysUserDTO;
+import com.usky.entity.sys.SysUserRoleDTO;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.utils.Page;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author laowo
+ */
+public interface UserService {
+
+
+    /**
+     * 用户添加
+     *
+     * @param user
+     */
+    void addUser(SysUserVO user);
+
+    /**
+     * 根据用户Id查询角色
+     *
+     * @param userId
+     * @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);
+
+    /**
+     * 查询用户 -没有分页
+     *
+     * @param sysUserVO
+     * @param status
+     * @param loginName
+     * @param phonenumber
+     * @param startTime
+     * @param endTime
+     * @param deptId
+     * @return
+     */
+    List<SysUserVO> listAll(SysUserVO sysUserVO, Integer status, String loginName, String phonenumber, String startTime, String endTime, Integer deptId);
+
+    /**
+     * 根据手机号查询用户
+     *
+     * @param phonenumber
+     * @return
+     */
+    List<SysUserDTO> queryUserByPhone(String phonenumber);
+
+    /**
+     * 用户信息修改
+     *
+     * @param user
+     */
+    void updateUser(SysUserVO user);
+
+    /**
+     * 根据角色id查询用户
+     *
+     * @param roleId
+     * @return
+     */
+    List<SysUserRoleDTO> queryUserByRoleId(Integer roleId);
+
+    /**
+     * 删除角色
+     *
+     * @param roleId
+     */
+    void remove(Integer roleId);
+
+    List<SysUserDTO> queryuserByDepID(Integer deptId);
+
+    void reSetPW(String password, Integer userId);
+
+}

+ 249 - 0
src/main/java/com/usky/service/sys/user/UserServiceImpl.java

@@ -0,0 +1,249 @@
+package com.usky.service.sys.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.SysUserRoleDTO;
+import com.usky.entity.sys.vo.SysUserVO;
+import com.usky.utils.*;
+import org.apache.commons.lang3.RandomStringUtils;
+
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.crypto.hash.Md5Hash;
+import org.hibernate.query.NativeQuery;
+import org.hibernate.transform.Transformers;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Timestamp;
+import java.util.*;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/8/20 15:08
+ * @description TODO
+ **/
+@Service
+public class UserServiceImpl extends BaseDaoImpl implements UserService {
+    @Override
+    @Transactional
+    public void addUser(SysUserVO user) {
+        SysUserDTO sysUserDTO = BeanHelp.copyProperties(user, SysUserDTO.class);
+        String password = sysUserDTO.getPassword();
+    //    String salt = RandomStringUtils.randomNumeric(6, 8);
+        String salt = oConvertUtils.randomGen(8);
+        String passwordEncode = PasswordUtil.encrypt(sysUserDTO.getLoginName(), password, salt);
+        sysUserDTO.setSalt(salt);
+    //    Md5Hash md5Hash = new Md5Hash(password, salt); //模拟md5加密一次
+        sysUserDTO.setPassword(passwordEncode);
+        sysUserDTO.setStatus("0");
+        //用户类型
+        sysUserDTO.setUserType("01");
+        sysUserDTO.setDelFlag("0");
+        sysUserDTO.setCreateBy(ShiroUtils.getLoginName());
+        sysUserDTO.setCreateTime(new Timestamp(System.currentTimeMillis()));
+        getSession().save(sysUserDTO);
+
+        insertUserRole(sysUserDTO.getUserId(), user.getRoleIds());
+    }
+
+    /**
+     * @param userId
+     * @param roleIds
+     */
+    public void insertUserRole(Integer userId, String roleIds) {
+        if (StringUtils.isNotNull(roleIds)) {
+            // 新增用户与角色管理
+            String[] split = roleIds.split(",");
+            for (String roleId : split) {
+                SysUserRoleDTO ur = new SysUserRoleDTO();
+                ur.setUserId(userId);
+                ur.setRoleId(Integer.valueOf(roleId));
+                getSession().save(ur);
+                getSession().flush();
+                getSession().clear();
+            }
+        }
+    }
+
+    @Override
+    @SuppressWarnings("all")
+    public Set<String> queryRoleKeys(long userId) {
+        String sql = "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' and ur.user_id = " + userId + "";
+        List<SysRoleDTO> perms = getSession().createSQLQuery(sql)
+                .setResultTransformer(Transformers.aliasToBean(SysRoleDTO.class)).list();
+        Set<String> permsSet = new HashSet<>();
+        for (SysRoleDTO perm : perms) {
+            if (perm != null) {
+                permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
+            }
+        }
+        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;
+    }
+
+    @Override
+    @DataScope(deptAlias = "d", userAlias = "u")
+    public List<SysUserVO> listAll(SysUserVO sysUserVO, Integer status, String loginName, String phonenumber, String startTime, String endTime, Integer deptId) {
+        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<SysUserVO> list = getSession().createSQLQuery(sb.toString()).setResultTransformer(Transformers.aliasToBean(SysUserVO.class)).list();
+
+        return list;
+    }
+
+    @Override
+    public List<SysUserDTO> queryUserByPhone(String phonenumber) {
+        List<SysUserDTO> list = getSession().createQuery("from SysUserDTO t where t.delFlag='0' and t.phonenumber='" + phonenumber + "'").list();
+        return list;
+    }
+
+    @Override
+    @Transactional
+    public void updateUser(SysUserVO user) {
+        //删除角色关联
+        delUserRolerByUserId(user.getUserId());
+        //新增用户角色关联
+        insertUserRole(user.getUserId(), user.getRoleIds());
+        SysUserDTO o = (SysUserDTO) getSession().createQuery("from SysUserDTO t where t.userId=" + user.getUserId() + "").uniqueResult();
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(user.getStatus())) {
+            o.setStatus(user.getStatus());
+        }
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(user.getDelFlag())) {
+            o.setDelFlag(user.getDelFlag());
+        }
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(user.getPhonenumber())) {
+            o.setPhonenumber(user.getPhonenumber());
+        }
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(user.getUserName())) {
+            o.setUserName(user.getUserName());
+        }
+        if (0 != user.getDeptId()) {
+            o.setDeptId(user.getDeptId());
+        }
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(user.getRemark())) {
+            o.setRemark(user.getRemark());
+        }
+        getSession().update(o);
+    }
+
+    @Override
+    public List<SysUserRoleDTO> queryUserByRoleId(Integer roleId) {
+
+        return (List<SysUserRoleDTO>) getSession().createQuery("from SysUserRoleDTO t where t.roleId=" + roleId + "").list();
+    }
+
+    /**
+     * 角色删除
+     *
+     * @param roleId
+     */
+    @Override
+    public void remove(Integer roleId) {
+        getSession().createSQLQuery("delete from sys_role where role_id=" + roleId + "").executeUpdate();
+    }
+
+    @Override
+    public List<SysUserDTO> queryuserByDepID(Integer deptId) {
+
+        return (List<SysUserDTO>) getSession().createQuery("from  SysUserDTO t where t.deptId=" + deptId + " and delFlag='0'").list();
+    }
+
+    @Override
+    public void reSetPW(String password, Integer userId) {
+        SysUserDTO user = (SysUserDTO) getSession().createQuery("from SysUserDTO t where t.userId=" + userId + "").uniqueResult();
+        String salt = RandomStringUtils.randomNumeric(6, 8);
+        user.setSalt(salt);
+        user.setPassword(new Md5Hash(password, salt).toString());
+        user.setUpdateBy(ShiroUtils.getLoginName());
+        user.setUpdateTime(new Timestamp(System.currentTimeMillis()));
+        getSession().saveOrUpdate(user);
+    }
+
+
+
+    public void delUserRolerByUserId(Integer userId) {
+        getSession().createSQLQuery("delete from sys_user_role where user_id=" + userId + "").executeUpdate();
+    }
+
+
+}

+ 22 - 0
src/main/java/com/usky/task/Dhtask.java

@@ -0,0 +1,22 @@
+package com.usky.task;
+
+import com.usky.utils.TimeUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2021/5/28 09:50
+ * @description TODO
+ **/
+@Component
+@Slf4j
+public class Dhtask {
+    @Scheduled(cron = "${cron.rk}")
+    public void dhTask(){
+        String time = TimeUtil.getTime();
+        log.info("大华摄像机数据同步开始++++"+time+"++++++++");
+    }
+}

+ 17 - 0
src/main/java/com/usky/task/ScheduledConfig.java

@@ -0,0 +1,17 @@
+package com.usky.task;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+
+@Configuration
+public class ScheduledConfig {
+    @Bean
+    public TaskScheduler taskScheduler() {
+        ThreadPoolTaskScheduler scheduling = new ThreadPoolTaskScheduler();
+        scheduling.setPoolSize(10);
+        scheduling.initialize();
+        return scheduling;
+    }
+}

+ 30 - 0
src/main/java/com/usky/utils/AuthorizationUtils.java

@@ -0,0 +1,30 @@
+package com.usky.utils;
+
+
+import com.usky.config.shiro.ShiroRealm;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.mgt.RealmSecurityManager;
+
+/**
+ * 用户授权信息
+ *
+ */
+public class AuthorizationUtils
+{
+    /**
+     * 清理所有用户授权信息缓存
+     */
+    public static void clearAllCachedAuthorizationInfo()
+    {
+        getUserRealm().clearAllCachedAuthorizationInfo();
+    }
+
+    /**
+     * 获取自定义Realm
+     */
+    public static ShiroRealm getUserRealm()
+    {
+        RealmSecurityManager rsm = (RealmSecurityManager) SecurityUtils.getSecurityManager();
+        return (ShiroRealm) rsm.getRealms().iterator().next();
+    }
+}

+ 74 - 0
src/main/java/com/usky/utils/BeanHelp.java

@@ -0,0 +1,74 @@
+package com.usky.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2020/3/9 12:49
+ * @description TODO
+ **/
+@Slf4j
+public class BeanHelp {
+    public static <T> T copyProperties(Object source, Class<T> target){
+        try {
+            T t = target.newInstance();
+            BeanUtils.copyProperties(source, t);
+            return t;
+        } catch (Exception e) {
+            log.error("【数据转换】数据转换出错,目标对象{}构造函数异常", target.getName(), e);
+            //logger.error();
+            // throw new LyException(ExceptionEnum.DATA_TRANSFER_ERROR);
+        }
+        return null;
+    }
+
+    public static <T> List<T> copyWithCollection(List<?> sourceList, Class<T> target){
+        try {
+            return sourceList.stream().map(s -> copyProperties(s, target)).collect(Collectors.toList());
+        } catch (Exception e) {
+            log.error("【数据转换】数据转换出错,目标对象{}构造函数异常", target.getName(), e);
+            // throw new LyException(ExceptionEnum.DATA_TRANSFER_ERROR);
+        }
+        return null;
+    }
+
+    public static <T> Set<T> copyWithCollection(Set<?> sourceList, Class<T> target){
+        try {
+            return sourceList.stream().map(s -> copyProperties(s, target)).collect(Collectors.toSet());
+        } catch (Exception e) {
+
+        }
+        return null;
+    }
+
+
+    /**
+     * JSON字符串转对象
+     * @param jsonStr
+     * @param clazz
+     * @return
+     */
+    public static <T> T jsonStrToObject(String jsonStr, Class<T> clazz){
+        return JSONObject.parseObject(jsonStr, clazz);
+
+    }
+
+    /**
+     * JSON字符串转List
+     * @param type
+     * @param listString
+     * @return
+     */
+    public static <T> List<T> listStringToOjectList(String listString,Class<T> type){
+        return JSONObject.parseArray(listString, type);
+
+    }
+
+}

+ 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();
+    }
+}

+ 35 - 0
src/main/java/com/usky/utils/CipherUtils.java

@@ -0,0 +1,35 @@
+package com.usky.utils;
+
+import javax.crypto.KeyGenerator;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * 对称密钥密码算法工具类
+ *
+ */
+public class CipherUtils
+{
+    /**
+     * 生成随机秘钥
+     *
+     * @param keyBitSize 字节大小
+     * @param algorithmName 算法名称
+     * @return 创建密匙
+     */
+    public static Key generateNewKey(int keyBitSize, String algorithmName)
+    {
+        KeyGenerator kg;
+        try
+        {
+            kg = KeyGenerator.getInstance(algorithmName);
+        }
+        catch (NoSuchAlgorithmException e)
+        {
+            String msg = "Unable to acquire " + algorithmName + " algorithm.  This is required to function.";
+            throw new IllegalStateException(msg, e);
+        }
+        kg.init(keyBitSize);
+        return kg.generateKey();
+    }
+}

+ 28 - 0
src/main/java/com/usky/utils/ConfigUtil.java

@@ -0,0 +1,28 @@
+package com.usky.utils;
+
+import java.util.ResourceBundle;
+
+/**
+ * @author 鲁班七号
+ * @version v1.0
+ * @date 2020/4/30 14:28
+ * @description TODO
+ **/
+public class ConfigUtil {
+    private static String BASE_URL;
+    static {
+        ResourceBundle bundle = ResourceBundle.getBundle("config");
+        BASE_URL = bundle.getString("BASE_URL");//系统路径
+
+    }
+
+    public ConfigUtil() {
+    }
+
+
+    public static String getSimBaseUrl() {
+        return BASE_URL;
+    }
+
+
+}

+ 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("^整$", "零元整");
+    }
+}

+ 26 - 0
src/main/java/com/usky/utils/DaoResult.java

@@ -0,0 +1,26 @@
+package com.usky.utils;
+
+public class DaoResult {
+	String result;
+	boolean success;
+	public DaoResult(String result, boolean success){
+		this.result = result;
+		this.success = success;
+	}
+	public DaoResult(){
+		this.result="";
+		this.success=false;
+	}
+	public String getResult() {
+		return result;
+	}
+	public void setResult(String result) {
+		this.result = result;
+	}
+	public boolean isSuccess() {
+		return success;
+	}
+	public void setSuccess(boolean success) {
+		this.success = success;
+	}
+}

+ 23 - 0
src/main/java/com/usky/utils/DialectForInkfish.java

@@ -0,0 +1,23 @@
+package com.usky.utils;
+
+import org.hibernate.dialect.MySQL5Dialect;
+
+import java.sql.Types;
+
+/**
+ * @Author zhangzilong
+ * @Description //TODO
+ * @Date $ $
+ * @Param $
+ * @return $
+ */
+public class DialectForInkfish extends MySQL5Dialect {
+
+
+    public DialectForInkfish() {
+        super();
+        registerHibernateType(Types.LONGVARCHAR, 65535, "text");
+    }
+
+
+}

+ 314 - 0
src/main/java/com/usky/utils/HttpUtils.java

@@ -0,0 +1,314 @@
+package com.usky.utils;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicNameValuePair;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class HttpUtils {
+	
+	/**
+	 * get
+	 * 
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doGet(String host, String path, String method, 
+			Map<String, String> headers, 
+			Map<String, String> querys)
+            throws Exception {    	
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpGet request = new HttpGet(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+        
+        return httpClient.execute(request);
+    }
+	
+	/**
+	 * post form
+	 * 
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @param bodys
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doPost(String host, String path, String method, 
+			Map<String, String> headers, 
+			Map<String, String> querys, 
+			Map<String, String> bodys)
+            throws Exception {    	
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (bodys != null) {
+            List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
+
+            for (String key : bodys.keySet()) {
+                nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
+            }
+            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
+            formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
+            request.setEntity(formEntity);
+        }
+
+        return httpClient.execute(request);
+    }	
+	
+	/**
+	 * Post String
+	 * 
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @param body
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doPost(String host, String path, String method, 
+			Map<String, String> headers, 
+			Map<String, String> querys, 
+			String body)
+            throws Exception {    	
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (StringUtils.isNotBlank(body)) {
+        	request.setEntity(new StringEntity(body, "utf-8"));
+        }
+
+        return httpClient.execute(request);
+    }
+	
+	/**
+	 * Post stream
+	 * 
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @param body
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doPost(String host, String path, String method, 
+			Map<String, String> headers, 
+			Map<String, String> querys, 
+			byte[] body)
+            throws Exception {    	
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (body != null) {
+        	request.setEntity(new ByteArrayEntity(body));
+        }
+
+        return httpClient.execute(request);
+    }
+	
+	/**
+	 * Put String
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @param body
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doPut(String host, String path, String method, 
+			Map<String, String> headers, 
+			Map<String, String> querys, 
+			String body)
+            throws Exception {    	
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpPut request = new HttpPut(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (StringUtils.isNotBlank(body)) {
+        	request.setEntity(new StringEntity(body, "utf-8"));
+        }
+
+        return httpClient.execute(request);
+    }
+	
+	/**
+	 * Put stream
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @param body
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doPut(String host, String path, String method, 
+			Map<String, String> headers, 
+			Map<String, String> querys, 
+			byte[] body)
+            throws Exception {    	
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpPut request = new HttpPut(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (body != null) {
+        	request.setEntity(new ByteArrayEntity(body));
+        }
+
+        return httpClient.execute(request);
+    }
+	
+	/**
+	 * Delete
+	 *  
+	 * @param host
+	 * @param path
+	 * @param method
+	 * @param headers
+	 * @param querys
+	 * @return
+	 * @throws Exception
+	 */
+	public static HttpResponse doDelete(String host, String path, String method, 
+			Map<String, String> headers, 
+			Map<String, String> querys)
+            throws Exception {    	
+    	HttpClient httpClient = wrapClient(host);
+
+    	HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+        	request.addHeader(e.getKey(), e.getValue());
+        }
+        
+        return httpClient.execute(request);
+    }
+	
+	private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
+    	StringBuilder sbUrl = new StringBuilder();
+    	sbUrl.append(host);
+    	if (!StringUtils.isBlank(path)) {
+    		sbUrl.append(path);
+        }
+    	if (null != querys) {
+    		StringBuilder sbQuery = new StringBuilder();
+        	for (Map.Entry<String, String> query : querys.entrySet()) {
+        		if (0 < sbQuery.length()) {
+        			sbQuery.append("&");
+        		}
+        		if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
+        			sbQuery.append(query.getValue());
+                }
+        		if (!StringUtils.isBlank(query.getKey())) {
+        			sbQuery.append(query.getKey());
+        			if (!StringUtils.isBlank(query.getValue())) {
+        				sbQuery.append("=");
+        				sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
+        			}        			
+                }
+        	}
+        	if (0 < sbQuery.length()) {
+        		sbUrl.append("?").append(sbQuery);
+        	}
+        }
+    	
+    	return sbUrl.toString();
+    }
+	
+	private static HttpClient wrapClient(String host) {
+		HttpClient httpClient = new DefaultHttpClient();
+		if (host.startsWith("https://")) {
+			sslClient(httpClient);
+		}
+		
+		return httpClient;
+	}
+	
+	private static void sslClient(HttpClient httpClient) {
+        try {
+            SSLContext ctx = SSLContext.getInstance("TLS");
+            X509TrustManager tm = new X509TrustManager() {
+                @Override
+				public X509Certificate[] getAcceptedIssuers() {
+                    return null;
+                }
+                @Override
+				public void checkClientTrusted(X509Certificate[] xcs, String str) {
+                	
+                }
+                @Override
+				public void checkServerTrusted(X509Certificate[] xcs, String str) {
+                	
+                }
+            };
+            ctx.init(null, new TrustManager[] { tm }, null);
+            SSLSocketFactory ssf = new SSLSocketFactory(ctx);
+            ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+            ClientConnectionManager ccm = httpClient.getConnectionManager();
+            SchemeRegistry registry = ccm.getSchemeRegistry();
+            registry.register(new Scheme("https", 443, ssf));
+        } catch (KeyManagementException ex) {
+            throw new RuntimeException(ex);
+        } catch (NoSuchAlgorithmException ex) {
+        	throw new RuntimeException(ex);
+        }
+    }
+}

+ 58 - 0
src/main/java/com/usky/utils/IPUtils.java

@@ -0,0 +1,58 @@
+
+package com.usky.utils;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * IP地址
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class IPUtils {
+    private static Logger logger = LoggerFactory.getLogger(IPUtils.class);
+
+    /**
+     * 获取IP地址
+     * <p>
+     * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
+     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+        String ip = null;
+        try {
+            ip = request.getHeader("x-forwarded-for");
+            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("Proxy-Client-IP");
+            }
+            if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTP_CLIENT_IP");
+            }
+            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+            }
+            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getRemoteAddr();
+            }
+        } catch (Exception e) {
+            logger.error("IPUtils ERROR ", e);
+        }
+
+        //使用代理,则获取第一个IP地址
+        if (StringUtils.isEmpty(ip) && ip.length() > 15) {
+            if (ip.indexOf(",") > 0) {
+                ip = ip.substring(0, ip.indexOf(","));
+            }
+        }
+
+        return ip;
+    }
+
+}

+ 53 - 0
src/main/java/com/usky/utils/JsonUtil.java

@@ -0,0 +1,53 @@
+package com.usky.utils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author 我去喂猪了
+ * @version v1.0
+ * @date 2020/9/12 14:35
+ * @description TODO
+ **/
+
+public class JsonUtil {
+
+    private static Pattern linePattern = Pattern.compile("_(\\w)");
+
+    /** 下划线转驼峰 */
+    public static String lineToHump(String str) {
+        str = str.toLowerCase();
+        Matcher matcher = linePattern.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+    /** 驼峰转下划线(简单写法,效率低于{@link #humpToLine2(String)}) */
+    public static String humpToLine(String str) {
+        return str.replaceAll("[A-Z]", "_$0").toLowerCase();
+    }
+
+    private static Pattern humpPattern = Pattern.compile("[A-Z]");
+
+    /** 驼峰转下划线,效率比上面高 */
+    public static String humpToLine2(String str) {
+        Matcher matcher = humpPattern.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        while (matcher.find()) {
+            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+    public static void main(String[] args) {
+        String lineToHump = lineToHump("{\"device_code\":\"12321312332313\",\"company_code\":\"\",\"device_name\":\"1223\",\"transmission_mode\":\"1\",\"device_types\":\"3\",\"device_model\":\"6\",\"data\":\"1\",\"device_install\":\"1\",\"device_floor\":\"1\",\"sim\":\"11\",\"manufactor_name\":\"无锡蓝天\",\"installer\":\"1\",\"magnification\":\"\",\"model_corresponding_method\":\"\",\"ports\":\"0\",\"highest_floor\":\"1\",\"lowest_floor\":\"1\",\"top_level_label\":\"0\",\"ownerId\":\"0\",\"device_type\":\"Smoke\",\"is_secure\":\"0\",\"status\":\"1\",\"protocol_type\":\"CoPA\",\"location\":\"黄浦区\",\"model\":\"\",\"psk\":\"c78af7fe1406eaad0898cce15b6e15f1\",\"iot_id\":\"7662fe48-2cdb-467f-869e-dd6a6babf8c4\",\"ownerCode\":\"YT100036000010000001\",\"number\":\"10000001\"}");
+        System.out.println(lineToHump);// fParentNoLeader
+
+    }
+
+}

+ 71 - 0
src/main/java/com/usky/utils/JsonUtils.java

@@ -0,0 +1,71 @@
+package com.usky.utils;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+
+public class JsonUtils {
+
+    public static final ObjectMapper mapper = new ObjectMapper();
+
+    private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);
+
+    public static String toString(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (obj.getClass() == String.class) {
+            return (String) obj;
+        }
+        try {
+            return mapper.writeValueAsString(obj);
+        } catch (JsonProcessingException e) {
+            logger.error("json序列化出错:" + obj, e);
+            return null;
+        }
+    }
+
+    public static <T> T toBean(String json, Class<T> tClass) {
+        try {
+            return mapper.readValue(json, tClass);
+        } catch (IOException e) {
+            logger.error("json解析出错:" + json, e);
+            return null;
+        }
+    }
+
+    public static <E> List<E> toList(String json, Class<E> eClass) {
+        try {
+            return mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, eClass));
+        } catch (IOException e) {
+            logger.error("json解析出错:" + json, e);
+            return null;
+        }
+    }
+
+    public static <K, V> Map<K, V> toMap(String json, Class<K> kClass, Class<V> vClass) {
+        try {
+            return mapper.readValue(json, mapper.getTypeFactory().constructMapType(Map.class, kClass, vClass));
+        } catch (IOException e) {
+            logger.error("json解析出错:" + json, e);
+            return null;
+        }
+    }
+
+    public static <T> T nativeRead(String json, TypeReference<T> type) {
+        try {
+            return mapper.readValue(json, type);
+        } catch (IOException e) {
+            logger.error("json解析出错:" + json, e);
+            return null;
+        }
+    }
+
+}

+ 207 - 0
src/main/java/com/usky/utils/JwtUtil.java

@@ -0,0 +1,207 @@
+package com.usky.utils;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.usky.exception.GetUserInfoFromTokenException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.Date;
+
+/**
+ * @Author Scott
+ * @Date 2018-07-12 14:23
+ * @Desc JWT工具类
+ **/
+public class JwtUtil {
+
+	// Token过期时间30分钟(用户登录过期时间是此时间的两倍,以token在reids缓存时间为准)
+	public static final long EXPIRE_TIME = 30 * 60 * 1000;
+
+	/**
+	 * 校验token是否正确
+	 *
+	 * @param token  密钥
+	 * @param secret 用户的密码
+	 * @return 是否正确
+	 */
+	public static boolean verify(String token, String username, String secret) {
+		try {
+			// 根据密码生成JWT效验器
+			Algorithm algorithm = Algorithm.HMAC256(secret);
+			JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();
+			// 效验TOKEN
+			DecodedJWT jwt = verifier.verify(token);
+			return true;
+		} catch (Exception exception) {
+			return false;
+		}
+	}
+
+	/**
+	 * 获得token中的信息无需secret解密也能获得
+	 *
+	 * @return token中包含的用户名
+	 */
+	public static String getUsername(String token) {
+		try {
+			DecodedJWT jwt = JWT.decode(token);
+			return jwt.getClaim("username").asString();
+		} catch (JWTDecodeException e) {
+			return null;
+		}
+	}
+
+	/**
+	 * 生成签名,5min后过期
+	 *
+	 * @param username 用户名
+	 * @param secret   用户的密码
+	 * @return 加密的token
+	 */
+	public static String sign(String username, String secret) {
+		Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
+		Algorithm algorithm = Algorithm.HMAC256(secret);
+		// 附带username信息
+		return JWT.create().withClaim("username", username).withExpiresAt(date).sign(algorithm);
+
+	}
+
+	/**
+	 * 根据request中的token获取用户账号
+	 * 
+	 * @param request
+	 * @return
+	 * @throws
+	 */
+	public static String getUserNameByToken(HttpServletRequest request) throws GetUserInfoFromTokenException {
+		String accessToken = request.getHeader("X-Access-Token");
+		String username = getUsername(accessToken);
+		if (oConvertUtils.isEmpty(username)) {
+			throw new GetUserInfoFromTokenException("未获取到用户");
+		}
+		return username;
+	}
+	
+	/**
+	  *  从session中获取变量
+	 * @param key
+	 * @return
+	 */
+	public static String getSessionData(String key) {
+		//${myVar}%
+		//得到${} 后面的值
+		String moshi = "";
+		if(key.indexOf("}")!=-1){
+			 moshi = key.substring(key.indexOf("}")+1);
+		}
+		String returnValue = null;
+		if (key.contains("#{")) {
+			key = key.substring(2,key.indexOf("}"));
+		}
+		if (oConvertUtils.isNotEmpty(key)) {
+			HttpSession session = SpringContextUtils.getHttpServletRequest().getSession();
+			returnValue = (String) session.getAttribute(key);
+		}
+		//结果加上${} 后面的值
+		if(returnValue!=null){returnValue = returnValue + moshi;}
+		return returnValue;
+	}
+	
+//	/**
+//	  * 从当前用户中获取变量
+//	 * @param key
+//	 * @param user
+//	 * @return
+//	 */
+//	//TODO 急待改造 sckjkdsjsfjdk
+//	public static String getUserSystemData(String key,SysUserCacheInfo user) {
+//		if(user==null) {
+//			user = JeecgDataAutorUtils.loadUserInfo();
+//		}
+//		//#{sys_user_code}%
+//
+//		// 获取登录用户信息
+//		LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+//
+//		String moshi = "";
+//		if(key.indexOf("}")!=-1){
+//			 moshi = key.substring(key.indexOf("}")+1);
+//		}
+//		String returnValue = null;
+//		//针对特殊标示处理#{sysOrgCode},判断替换
+//		if (key.contains("#{")) {
+//			key = key.substring(2,key.indexOf("}"));
+//		} else {
+//			key = key;
+//		}
+//		//替换为系统登录用户帐号
+//		if (key.equals(DataBaseConstant.SYS_USER_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_USER_CODE_TABLE)) {
+//			if(user==null) {
+//				returnValue = sysUser.getUsername();
+//			}else {
+//				returnValue = user.getSysUserCode();
+//			}
+//		}
+//		//替换为系统登录用户真实名字
+//		else if (key.equals(DataBaseConstant.SYS_USER_NAME)|| key.toLowerCase().equals(DataBaseConstant.SYS_USER_NAME_TABLE)) {
+//			if(user==null) {
+//				returnValue = sysUser.getRealname();
+//			}else {
+//				returnValue = user.getSysUserName();
+//			}
+//		}
+//
+//		//替换为系统用户登录所使用的机构编码
+//		else if (key.equals(DataBaseConstant.SYS_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_ORG_CODE_TABLE)) {
+//			if(user==null) {
+//				returnValue = sysUser.getOrgCode();
+//			}else {
+//				returnValue = user.getSysOrgCode();
+//			}
+//		}
+//		//替换为系统用户所拥有的所有机构编码
+//		else if (key.equals(DataBaseConstant.SYS_MULTI_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_MULTI_ORG_CODE_TABLE)) {
+//			if(user==null){
+//				//TODO 暂时使用用户登录部门,存在逻辑缺陷,不是用户所拥有的部门
+//				returnValue = sysUser.getOrgCode();
+//			}else{
+//				if(user.isOneDepart()) {
+//					returnValue = user.getSysMultiOrgCode().get(0);
+//				}else {
+//					returnValue = Joiner.on(",").join(user.getSysMultiOrgCode());
+//				}
+//			}
+//		}
+//		//替换为当前系统时间(年月日)
+//		else if (key.equals(DataBaseConstant.SYS_DATE)|| key.toLowerCase().equals(DataBaseConstant.SYS_DATE_TABLE)) {
+//			returnValue = DateUtils.formatDate();
+//		}
+//		//替换为当前系统时间(年月日时分秒)
+//		else if (key.equals(DataBaseConstant.SYS_TIME)|| key.toLowerCase().equals(DataBaseConstant.SYS_TIME_TABLE)) {
+//			returnValue = DateUtils.now();
+//		}
+//		//流程状态默认值(默认未发起)
+//		else if (key.equals(DataBaseConstant.BPM_STATUS)|| key.toLowerCase().equals(DataBaseConstant.BPM_STATUS_TABLE)) {
+//			returnValue = "1";
+//		}
+//		//update-begin-author:taoyan date:20210330 for:多租户ID作为系统变量
+//		else if (key.equals(DataBaseConstant.TENANT_ID) || key.toLowerCase().equals(DataBaseConstant.TENANT_ID_TABLE)){
+//			returnValue = sysUser.getRelTenantIds();
+//			if(oConvertUtils.isEmpty(returnValue) || (returnValue!=null && returnValue.indexOf(",")>0)){
+//				returnValue = SpringContextUtils.getHttpServletRequest().getHeader(CommonConstant.TENANT_ID);
+//			}
+//		}
+//		//update-end-author:taoyan date:20210330 for:多租户ID作为系统变量
+//		if(returnValue!=null){returnValue = returnValue + moshi;}
+//		return returnValue;
+//	}
+//
+////	public static void main(String[] args) {
+////		 String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjUzMzY1MTMsInVzZXJuYW1lIjoiYWRtaW4ifQ.xjhud_tWCNYBOg_aRlMgOdlZoWFFKB_givNElHNw3X0";
+////		 System.out.println(JwtUtil.getUsername(token));
+////	}
+}

+ 37 - 0
src/main/java/com/usky/utils/ListUtil.java

@@ -0,0 +1,37 @@
+package com.usky.utils;
+
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2020/2/22 15:41
+ * @description 集合判断工具类
+ **/
+public class ListUtil {
+    /**
+     * 判断集合是否为空
+     * @param list
+     * @return
+     */
+    public static boolean isNotBlank(List list) {
+        if (list == null || list.isEmpty()) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     *
+     * @param list
+     * @return
+     */
+    public static boolean isBlank(List list) {
+        if (list == null || list.isEmpty()) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+}

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