From 1cd1c38372a5652b59866f28953179476cf84567 Mon Sep 17 00:00:00 2001
From: liuhaonan <konodioda2333@vip.qq.com>
Date: 星期二, 18 一月 2022 10:40:47 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 sandu-common/src/main/java/com/sandu/common/redis/UserModel.java                                   |   14 
 sandu-common/src/main/java/com/sandu/common/security/LoginUserInfo.java                            |   82 +++
 sandu-common/src/main/java/com/sandu/common/security/TokenFilter.java                              |   57 +-
 sandu-common/src/main/java/com/sandu/common/enums/ResponseStatusEnums.java                         |    1 
 dao/src/main/java/com/sandu/ximon/dao/bo/MenuNode.java                                             |   18 
 sandu-common/src/main/java/com/sandu/common/util/ThrowableUtil.java                                |    7 
 sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUserService.java                    |  226 +++++-----
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java |    8 
 sandu-common/src/main/java/com/sandu/common/util/SpringContextHolder.java                          |    7 
 sandu-common/src/main/java/com/sandu/common/execption/EntityExistException.java                    |    7 
 sandu-common/src/main/java/com/sandu/common/security/JwtAuthenticationEntryPoint.java              |  130 +++--
 ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java                    |   41 +
 ximon-admin/src/test/java/com/sandu/ximon/admin/BaseTopicTests.java                                |   28 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java        |    3 
 ximon-admin/src/main/java/com/sandu/ximon/admin/param/MenuParam.java                               |   63 ++
 sandu-common/src/main/java/com/sandu/common/execption/BusinessException.java                       |    7 
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java                          |   37 
 sandu-common/src/main/java/com/sandu/common/security/token/JwtTokenProvider.java                   |   95 ++++
 sandu-common/src/main/java/com/sandu/common/security/token/RedisTokenProvider.java                 |   53 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskService.java                      |   25 
 sandu-common/src/main/java/com/sandu/common/log/LogService.java                                    |    7 
 sandu-common/src/main/java/com/sandu/common/security/token/TokenProvider.java                      |   26 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/MenuService.java                           |   58 ++
 sandu-common/src/main/java/com/sandu/common/security/JwtAccessDeniedHandler.java                   |    7 
 ximon-admin/src/main/java/com/sandu/ximon/admin/controller/MenuController.java                     |   60 ++
 sandu-common/src/main/java/com/sandu/common/service/BaseService.java                               |    7 
 ximon-admin/src/main/resources/application-test.yml                                                |    2 
 dao/src/main/java/com/sandu/ximon/dao/domain/Menu.java                                             |    4 
 sandu-common/src/main/java/com/sandu/common/security/jwt/JwtTokenProvider.java                     |    1 
 sandu-common/src/main/java/com/sandu/common/service/impl/BaseServiceImpl.java                      |    7 
 sandu-common/src/main/java/com/sandu/common/util/RequestHolder.java                                |    7 
 sandu-common/src/main/java/com/sandu/common/security/config/SecurityProperties.java                |    6 
 sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUser.java                           |   52 +-
 sandu-common/src/main/java/com/sandu/common/security/config/SecurityConfig.java                    |   28 -
 sandu-common/src/main/java/com/sandu/common/execption/ApiError.java                                |    7 
 ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java                        |   87 +--
 36 files changed, 839 insertions(+), 436 deletions(-)

diff --git a/dao/src/main/java/com/sandu/ximon/dao/bo/MenuNode.java b/dao/src/main/java/com/sandu/ximon/dao/bo/MenuNode.java
new file mode 100644
index 0000000..14aeecc
--- /dev/null
+++ b/dao/src/main/java/com/sandu/ximon/dao/bo/MenuNode.java
@@ -0,0 +1,18 @@
+package com.sandu.ximon.dao.bo;
+
+import com.sandu.ximon.dao.domain.Menu;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 鑿滃崟鏍戝舰鑺傜偣
+ *
+ * @author chenjiantian
+ * @date 2021/4/27 19:00
+ */
+@Data
+public class MenuNode extends Menu {
+
+    private List<MenuNode> children;
+}
diff --git a/dao/src/main/java/com/sandu/ximon/dao/domain/Menu.java b/dao/src/main/java/com/sandu/ximon/dao/domain/Menu.java
index 666e3bc..c4f615d 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/domain/Menu.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/domain/Menu.java
@@ -67,7 +67,7 @@
     private String permission;
 
     /**
-     * 绫诲瀷锛�0锛氳彍鍗曪紝1锛氭寜閽�
+     * 绫诲瀷锛�0锛氱洰褰�   1锛氳彍鍗�   2锛氭寜閽�
      */
     private Integer type;
 
@@ -83,4 +83,4 @@
 
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
-}
\ No newline at end of file
+}
diff --git a/sandu-common/src/main/java/com/sandu/common/enums/ResponseStatusEnums.java b/sandu-common/src/main/java/com/sandu/common/enums/ResponseStatusEnums.java
index bb6b5a3..06c213c 100644
--- a/sandu-common/src/main/java/com/sandu/common/enums/ResponseStatusEnums.java
+++ b/sandu-common/src/main/java/com/sandu/common/enums/ResponseStatusEnums.java
@@ -21,6 +21,7 @@
      */
     TOKEN_INVALID(40011, "token鏃犳晥"),
     TOKEN_EXPIRED(40012, "token杩囨湡"),
+    TOKEN_NONE(40013, "token涓虹┖"),
     SINGLE_LOGIN(40014, "璇ヨ处鍙峰湪鍏朵粬璁惧鐧诲綍,璇烽噸鏂扮櫥褰�"),
 
     FORBIDDEN(40030, "娌℃湁鐩稿叧鏉冮檺"),
diff --git a/sandu-common/src/main/java/com/sandu/common/execption/ApiError.java b/sandu-common/src/main/java/com/sandu/common/execption/ApiError.java
index 0133fee..c23177e 100644
--- a/sandu-common/src/main/java/com/sandu/common/execption/ApiError.java
+++ b/sandu-common/src/main/java/com/sandu/common/execption/ApiError.java
@@ -1,9 +1,4 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
+
 package com.sandu.common.execption;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
diff --git a/sandu-common/src/main/java/com/sandu/common/execption/BusinessException.java b/sandu-common/src/main/java/com/sandu/common/execption/BusinessException.java
index 89d2b61..b59b284 100644
--- a/sandu-common/src/main/java/com/sandu/common/execption/BusinessException.java
+++ b/sandu-common/src/main/java/com/sandu/common/execption/BusinessException.java
@@ -1,9 +1,4 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
+
 package com.sandu.common.execption;
 
 import com.sandu.common.enums.ResponseStatusEnums;
diff --git a/sandu-common/src/main/java/com/sandu/common/execption/EntityExistException.java b/sandu-common/src/main/java/com/sandu/common/execption/EntityExistException.java
index e654edd..775df28 100644
--- a/sandu-common/src/main/java/com/sandu/common/execption/EntityExistException.java
+++ b/sandu-common/src/main/java/com/sandu/common/execption/EntityExistException.java
@@ -1,9 +1,4 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
+
 package com.sandu.common.execption;
 
 import org.springframework.util.StringUtils;
diff --git a/sandu-common/src/main/java/com/sandu/common/log/LogService.java b/sandu-common/src/main/java/com/sandu/common/log/LogService.java
index 37b4f84..2675d54 100644
--- a/sandu-common/src/main/java/com/sandu/common/log/LogService.java
+++ b/sandu-common/src/main/java/com/sandu/common/log/LogService.java
@@ -1,9 +1,4 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
+
 package com.sandu.common.log;
 
 import org.aspectj.lang.ProceedingJoinPoint;
diff --git a/sandu-common/src/main/java/com/sandu/common/redis/UserModel.java b/sandu-common/src/main/java/com/sandu/common/redis/UserModel.java
index 8b2e877..b26b20f 100644
--- a/sandu-common/src/main/java/com/sandu/common/redis/UserModel.java
+++ b/sandu-common/src/main/java/com/sandu/common/redis/UserModel.java
@@ -1,14 +1,21 @@
 package com.sandu.common.redis;
 
+import com.sandu.common.security.config.SecurityProperties;
+import com.sandu.common.util.SpringContextHolder;
+
 /**
  * @author chenjiantian
  * @date 2021/7/20 12:00
  */
-public class UserModel extends BasePrefix{
+public class UserModel extends BasePrefix {
 
     @Override
     public String getModelName() {
-        return "user";
+        String onlineKey = SpringContextHolder.getBean(SecurityProperties.class).getOnlineKey();
+        if (onlineKey == null) {
+            throw new IllegalArgumentException("璇烽厤缃畂nlineKey");
+        }
+        return onlineKey;
     }
 
     public UserModel(int expireSeconds, String prefix) {
@@ -17,5 +24,8 @@
 
     public static UserModel User = new UserModel(60, "gl");
 
+    public static UserModel USER_TOKEN = new UserModel(60 * 60 * 24 * 7, "token");
+    public static UserModel USER_INFO = new UserModel(60 * 60 * 24 * 7, "info");
+
 
 }
diff --git a/sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUser.java b/sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUser.java
index e4a32e0..1f75b96 100644
--- a/sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUser.java
+++ b/sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUser.java
@@ -1,26 +1,26 @@
-package com.sandu.common.redis.online;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDateTime;
-
-/**
- * @author chenjiantian
- * @date 2021/8/6 16:31
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class OnlineUser {
-
-    private Long userId;
-    // 杩欓噷鎸囨墜鏈哄彿
-    private String userName;
-    private String token;
-    private String ip;
-    private String browser;
-    private LocalDateTime loginTime;
-
-}
+//package com.sandu.common.redis.online;
+//
+//import lombok.AllArgsConstructor;
+//import lombok.Data;
+//import lombok.NoArgsConstructor;
+//
+//import java.time.LocalDateTime;
+//
+///**
+// * @author chenjiantian
+// * @date 2021/8/6 16:31
+// */
+//@Data
+//@AllArgsConstructor
+//@NoArgsConstructor
+//public class OnlineUser {
+//
+//    private Long userId;
+//    // 杩欓噷鎸囨墜鏈哄彿
+//    private String userName;
+//    private String token;
+//    private String ip;
+//    private String browser;
+//    private LocalDateTime loginTime;
+//
+//}
diff --git a/sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUserService.java b/sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUserService.java
index 220c181..3a5f287 100644
--- a/sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUserService.java
+++ b/sandu-common/src/main/java/com/sandu/common/redis/online/OnlineUserService.java
@@ -1,115 +1,115 @@
-package com.sandu.common.redis.online;
-
-import cn.hutool.extra.servlet.ServletUtil;
-import cn.hutool.http.useragent.UserAgent;
-import cn.hutool.http.useragent.UserAgentInfo;
-import cn.hutool.http.useragent.UserAgentUtil;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-import com.sandu.common.redis.RedisService;
-import com.sandu.common.security.config.SecurityProperties;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.core.userdetails.UserDetails;
-
-import javax.servlet.http.HttpServletRequest;
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-
-/**
- * @author chenjiantian
- * @date 2021/8/6 16:26
- * 鍦ㄧ嚎鐢ㄦ埛鏈嶅姟绫�
- * 鍦� BaseRedisConfig 娉ㄥ叆
- */
-@Slf4j
-public class OnlineUserService {
-
-    private final SecurityProperties properties;
-    private final RedisService redisService;
-
-    public OnlineUserService(SecurityProperties properties, RedisService redisService) {
-        this.properties = properties;
-        this.redisService = redisService;
-    }
-
-    /**
-     * 淇濆瓨鍦ㄧ嚎鐢ㄦ埛淇℃伅
-     */
-    public void save(UserDetails userDetails, String token, Long userId,HttpServletRequest request) {
-        String ip = ServletUtil.getClientIP(request);
-        UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
-        String browser = Optional.ofNullable(userAgent).map(UserAgent::getBrowser).map(UserAgentInfo::getName).orElse("");
-        OnlineUser onlineUser = new OnlineUser(userId,userDetails.getUsername(), token, ip, browser, LocalDateTime.now());
-//        redisService.set(properties.getOnlineKey() + token, onlineUser, properties.getTokenValidityInSeconds() / 1000);
-        redisService.set(properties.getOnlineKey() + userDetails.getUsername(), onlineUser);
-    }
-
-    /**
-     * 鏌ヨ鍏ㄩ儴鏁版嵁
-     *
-     * @param filter
-     * @return
-     */
-    public List<OnlineUser> getAll(String filter) {
-        Set<String> keys = redisService.keys(properties.getOnlineKey() + "*");
-
-        List<OnlineUser> onlineUsers = new ArrayList<>();
-        for (String key : keys) {
-            OnlineUser onlineUser = (OnlineUser) redisService.get(key);
-            if (StringUtils.isNotBlank(filter)) {
-                if (onlineUser.toString().contains(filter)) {
-                    onlineUsers.add(onlineUser);
-                }
-            } else {
-                onlineUsers.add(onlineUser);
-            }
-        }
-        onlineUsers.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime()));
-        return onlineUsers;
-    }
-
-    private boolean kickOut(String token) throws Exception {
-        token = properties.getOnlineKey() + token;
-        return redisService.del(token);
-    }
-
-    public OnlineUser getOne(String key) {
-        return (OnlineUser) redisService.get(key);
-    }
-
-    /**
-     * 妫�娴嬬敤鎴锋槸鍚﹀湪涔嬪墠宸茬粡鐧诲綍锛屽凡缁忕櫥褰曡涪涓嬬嚎
-     *
-     * @param userName 鐢ㄦ埛鍚�
-     */
-    public void checkLoginOnUser(String userName, String ignoreToken) {
-//        List<OnlineUser> onlineUsers = getAll(userName);
-//        if (onlineUsers == null || onlineUsers.isEmpty()) {
+//package com.sandu.common.redis.online;
+//
+//import cn.hutool.extra.servlet.ServletUtil;
+//import cn.hutool.http.useragent.UserAgent;
+//import cn.hutool.http.useragent.UserAgentInfo;
+//import cn.hutool.http.useragent.UserAgentUtil;
+//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+//import com.sandu.common.redis.RedisService;
+//import com.sandu.common.security.config.SecurityProperties;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.security.core.userdetails.UserDetails;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import java.time.LocalDateTime;
+//import java.util.ArrayList;
+//import java.util.List;
+//import java.util.Optional;
+//import java.util.Set;
+//
+///**
+// * @author chenjiantian
+// * @date 2021/8/6 16:26
+// * 鍦ㄧ嚎鐢ㄦ埛鏈嶅姟绫�
+// * 鍦� BaseRedisConfig 娉ㄥ叆
+// */
+//@Slf4j
+//public class OnlineUserService {
+//
+//    private final SecurityProperties properties;
+//    private final RedisService redisService;
+//
+//    public OnlineUserService(SecurityProperties properties, RedisService redisService) {
+//        this.properties = properties;
+//        this.redisService = redisService;
+//    }
+//
+//    /**
+//     * 淇濆瓨鍦ㄧ嚎鐢ㄦ埛淇℃伅
+//     */
+//    public void save(UserDetails userDetails, String token, Long userId,HttpServletRequest request) {
+//        String ip = ServletUtil.getClientIP(request);
+//        UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
+//        String browser = Optional.ofNullable(userAgent).map(UserAgent::getBrowser).map(UserAgentInfo::getName).orElse("");
+//        OnlineUser onlineUser = new OnlineUser(userId,userDetails.getUsername(), token, ip, browser, LocalDateTime.now());
+////        redisService.set(properties.getOnlineKey() + token, onlineUser, properties.getTokenValidityInSeconds() / 1000);
+//        redisService.set(properties.getOnlineKey() + userDetails.getUsername(), onlineUser);
+//    }
+//
+//    /**
+//     * 鏌ヨ鍏ㄩ儴鏁版嵁
+//     *
+//     * @param filter
+//     * @return
+//     */
+//    public List<OnlineUser> getAll(String filter) {
+//        Set<String> keys = redisService.keys(properties.getOnlineKey() + "*");
+//
+//        List<OnlineUser> onlineUsers = new ArrayList<>();
+//        for (String key : keys) {
+//            OnlineUser onlineUser = (OnlineUser) redisService.get(key);
+//            if (StringUtils.isNotBlank(filter)) {
+//                if (onlineUser.toString().contains(filter)) {
+//                    onlineUsers.add(onlineUser);
+//                }
+//            } else {
+//                onlineUsers.add(onlineUser);
+//            }
+//        }
+//        onlineUsers.sort((o1, o2) -> o2.getLoginTime().compareTo(o1.getLoginTime()));
+//        return onlineUsers;
+//    }
+//
+//    private boolean kickOut(String token) throws Exception {
+//        token = properties.getOnlineKey() + token;
+//        return redisService.del(token);
+//    }
+//
+//    public OnlineUser getOne(String key) {
+//        return (OnlineUser) redisService.get(key);
+//    }
+//
+//    /**
+//     * 妫�娴嬬敤鎴锋槸鍚﹀湪涔嬪墠宸茬粡鐧诲綍锛屽凡缁忕櫥褰曡涪涓嬬嚎
+//     *
+//     * @param userName 鐢ㄦ埛鍚�
+//     */
+//    public void checkLoginOnUser(String userName, String ignoreToken) {
+////        List<OnlineUser> onlineUsers = getAll(userName);
+////        if (onlineUsers == null || onlineUsers.isEmpty()) {
+////            return;
+////        }
+//        OnlineUser onlineUser = getOne(properties.getOnlineKey() + userName);
+//        if(onlineUser == null){
 //            return;
 //        }
-        OnlineUser onlineUser = getOne(properties.getOnlineKey() + userName);
-        if(onlineUser == null){
-            return;
-        }
-//        for (OnlineUser onlineUser : onlineUsers) {
-            if (onlineUser.getUserName().equals(userName)) {
-                try {
-                    String token = onlineUser.getToken();
-                    if (StringUtils.isNotBlank(ignoreToken) && !ignoreToken.equals(token)) {
-                        this.kickOut(token);
-                    } else if (StringUtils.isBlank(ignoreToken)) {
-                        this.kickOut(token);
-                    }
-                } catch (Exception e) {
-                    log.error("checkUser is error", e);
-                }
-            }
-//        }
-    }
-
-    public void updateOne(OnlineUser onlineUser) {
-        redisService.set(properties.getOnlineKey() + onlineUser.getUserName(), onlineUser);
-    }
-}
+////        for (OnlineUser onlineUser : onlineUsers) {
+//            if (onlineUser.getUserName().equals(userName)) {
+//                try {
+//                    String token = onlineUser.getToken();
+//                    if (StringUtils.isNotBlank(ignoreToken) && !ignoreToken.equals(token)) {
+//                        this.kickOut(token);
+//                    } else if (StringUtils.isBlank(ignoreToken)) {
+//                        this.kickOut(token);
+//                    }
+//                } catch (Exception e) {
+//                    log.error("checkUser is error", e);
+//                }
+//            }
+////        }
+//    }
+//
+//    public void updateOne(OnlineUser onlineUser) {
+//        redisService.set(properties.getOnlineKey() + onlineUser.getUserName(), onlineUser);
+//    }
+//}
diff --git a/sandu-common/src/main/java/com/sandu/common/security/JwtAccessDeniedHandler.java b/sandu-common/src/main/java/com/sandu/common/security/JwtAccessDeniedHandler.java
index fc32cb7..cfe084e 100644
--- a/sandu-common/src/main/java/com/sandu/common/security/JwtAccessDeniedHandler.java
+++ b/sandu-common/src/main/java/com/sandu/common/security/JwtAccessDeniedHandler.java
@@ -1,9 +1,4 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
+
 package com.sandu.common.security;
 
 import org.springframework.security.access.AccessDeniedException;
diff --git a/sandu-common/src/main/java/com/sandu/common/security/JwtAuthenticationEntryPoint.java b/sandu-common/src/main/java/com/sandu/common/security/JwtAuthenticationEntryPoint.java
index 9068f02..7c57d07 100644
--- a/sandu-common/src/main/java/com/sandu/common/security/JwtAuthenticationEntryPoint.java
+++ b/sandu-common/src/main/java/com/sandu/common/security/JwtAuthenticationEntryPoint.java
@@ -1,20 +1,17 @@
 package com.sandu.common.security;
 
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.sandu.common.enums.ResponseStatusEnums;
-import com.sandu.common.redis.online.OnlineUser;
-import com.sandu.common.redis.online.OnlineUserService;
 import com.sandu.common.security.config.SecurityProperties;
-import com.sandu.common.security.jwt.JwtTokenProvider;
+import com.sandu.common.security.token.TokenProvider;
 import com.sandu.common.util.ResponseUtil;
-import com.sandu.common.util.SpringContextHolder;
-import io.jsonwebtoken.ExpiredJwtException;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.AuthenticationEntryPoint;
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -25,70 +22,91 @@
 @Component
 public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
 
-    @Autowired
-    private JwtTokenProvider tokenProvider;
+    @Resource
+    private TokenProvider tokenProvider;
+    @Resource
+    private SecurityProperties properties;
 
     @Override
     public void commence(HttpServletRequest request,
                          HttpServletResponse response,
                          AuthenticationException authException) throws IOException {
 
-        String token = tokenProvider.getToken(request);
-        SecurityProperties properties = SpringContextHolder.getBean(SecurityProperties.class);
+        String token = request.getHeader(properties.getHeader());
 
         if (!StringUtils.hasText(token)) {
+            writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_NONE.getCode(), ResponseStatusEnums.TOKEN_NONE.getMessage()));
+            return;
+        }
+
+        LoginUserInfo loginUserInfo = tokenProvider.validateToken(token);
+
+        if (loginUserInfo == null) {
             writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage()));
             return;
         }
 
-
-        Throwable exception = tokenProvider.getException(token);
-
-        // jwt杩囨湡 鏇挎崲鏂扮殑jwt
-        if (exception instanceof ExpiredJwtException) {
-            String usernameForce = tokenProvider.getSubjectForce(token);
-            if (properties.isCacheOnline()) {
-                OnlineUserService onlineUserService = SpringContextHolder.getBean(OnlineUserService.class);
-                OnlineUser onlineUser = onlineUserService.getOne(properties.getOnlineKey() + usernameForce);
-                if (onlineUser == null || !token.equals(onlineUser.getToken())) {
-                    // redis涓婃病鏈� 鎴栬�呬笉鏄綋鍓嶇敤鎴风殑token 杩斿洖澶辨晥
-                    writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage()));
-                } else {
-                    // 杩斿洖杩囨湡锛屾惡甯︽柊鐨則oken
-                    String refreshToken = tokenProvider.refreshToken(token);
-                    onlineUser.setToken(refreshToken);
-                    onlineUserService.updateOne(onlineUser);
-                    writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_EXPIRED.getCode(), ResponseStatusEnums.TOKEN_EXPIRED.getMessage(), properties.getTokenStartWith() + refreshToken));
-                }
-            } else {
-                // 杩斿洖杩囨湡锛屾惡甯︽柊鐨則oken
-                String refreshToken = properties.getTokenStartWith() + tokenProvider.refreshToken(token);
-                writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_EXPIRED.getCode(), ResponseStatusEnums.TOKEN_EXPIRED.getMessage(), null));
-            }
-            return;
+        if (!StrUtil.equals(loginUserInfo.getToken(), token)) {
+            writeResponse(response, ResponseUtil.error(ResponseStatusEnums.SINGLE_LOGIN.getCode(), ResponseStatusEnums.SINGLE_LOGIN.getMessage()));
         }
 
-        // 鍏朵粬jwt瑙f瀽寮傚父
-        if (exception != null) {
-            writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage()));
-        } else {
-            //jwt瑙f瀽姝e父 鐪嬬湅鏄笉鏄痳edis鐨勯棶棰�
-            if (properties.isCacheOnline()) {
-                String usernameForce = tokenProvider.getSubjectForce(token);
-                OnlineUserService onlineUserService = SpringContextHolder.getBean(OnlineUserService.class);
-                OnlineUser onlineUser = onlineUserService.getOne(properties.getOnlineKey() + usernameForce);
-                if (onlineUser != null && !token.equals(onlineUser.getToken())) {
-                    // 鍜屾湇鍔″櫒淇濆瓨鐨則oken涓嶄竴鏍凤紝璇存槑鍦ㄥ叾浠栧湴鏂圭櫥褰�
-                    writeResponse(response, ResponseUtil.error(ResponseStatusEnums.SINGLE_LOGIN.getCode(), ResponseStatusEnums.SINGLE_LOGIN.getMessage()));
-                } else {
-                    // 鏈嶅姟鍣ㄦ病鏈夊湪绾跨敤鎴穞oken鎴栬�卼oken涓嶄竴鑷� 閮借繑鍥瀟oken澶辨晥
-                    writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage()));
-                }
-            } else {
-                writeResponse(response, ResponseUtil.error(ResponseStatusEnums.FAIL.getCode(), "璁よ瘉鍑洪敊"));
-            }
-        }
-        return;
+
+//        String token = tokenProvider.getToken(request);
+//        SecurityProperties properties = SpringContextHolder.getBean(SecurityProperties.class);
+//
+//        if (!StringUtils.hasText(token)) {
+//            writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage()));
+//            return;
+//        }
+//
+//
+//        Throwable exception = tokenProvider.getException(token);
+//
+//        // jwt杩囨湡 鏇挎崲鏂扮殑jwt
+//        if (exception instanceof ExpiredJwtException) {
+//            String usernameForce = tokenProvider.getSubjectForce(token);
+//            if (properties.isCacheOnline()) {
+//                OnlineUserService onlineUserService = SpringContextHolder.getBean(OnlineUserService.class);
+//                OnlineUser onlineUser = onlineUserService.getOne(properties.getOnlineKey() + usernameForce);
+//                if (onlineUser == null || !token.equals(onlineUser.getToken())) {
+//                    // redis涓婃病鏈� 鎴栬�呬笉鏄綋鍓嶇敤鎴风殑token 杩斿洖澶辨晥
+//                    writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage()));
+//                } else {
+//                    // 杩斿洖杩囨湡锛屾惡甯︽柊鐨則oken
+//                    String refreshToken = tokenProvider.refreshToken(token);
+//                    onlineUser.setToken(refreshToken);
+//                    onlineUserService.updateOne(onlineUser);
+//                    writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_EXPIRED.getCode(), ResponseStatusEnums.TOKEN_EXPIRED.getMessage(), properties.getTokenStartWith() + refreshToken));
+//                }
+//            } else {
+//                // 杩斿洖杩囨湡锛屾惡甯︽柊鐨則oken
+//                String refreshToken = properties.getTokenStartWith() + tokenProvider.refreshToken(token);
+//                writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_EXPIRED.getCode(), ResponseStatusEnums.TOKEN_EXPIRED.getMessage(), null));
+//            }
+//            return;
+//        }
+//
+//        // 鍏朵粬jwt瑙f瀽寮傚父
+//        if (exception != null) {
+//            writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage()));
+//        } else {
+//            //jwt瑙f瀽姝e父 鐪嬬湅鏄笉鏄痳edis鐨勯棶棰�
+//            if (properties.isCacheOnline()) {
+//                String usernameForce = tokenProvider.getSubjectForce(token);
+//                OnlineUserService onlineUserService = SpringContextHolder.getBean(OnlineUserService.class);
+//                OnlineUser onlineUser = onlineUserService.getOne(properties.getOnlineKey() + usernameForce);
+//                if (onlineUser != null && !token.equals(onlineUser.getToken())) {
+//                    // 鍜屾湇鍔″櫒淇濆瓨鐨則oken涓嶄竴鏍凤紝璇存槑鍦ㄥ叾浠栧湴鏂圭櫥褰�
+//                    writeResponse(response, ResponseUtil.error(ResponseStatusEnums.SINGLE_LOGIN.getCode(), ResponseStatusEnums.SINGLE_LOGIN.getMessage()));
+//                } else {
+//                    // 鏈嶅姟鍣ㄦ病鏈夊湪绾跨敤鎴穞oken鎴栬�卼oken涓嶄竴鑷� 閮借繑鍥瀟oken澶辨晥
+//                    writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage()));
+//                }
+//            } else {
+//                writeResponse(response, ResponseUtil.error(ResponseStatusEnums.FAIL.getCode(), "璁よ瘉鍑洪敊"));
+//            }
+//        }
+//        return;
 
     }
 
diff --git a/sandu-common/src/main/java/com/sandu/common/security/LoginUserInfo.java b/sandu-common/src/main/java/com/sandu/common/security/LoginUserInfo.java
new file mode 100644
index 0000000..85aba1f
--- /dev/null
+++ b/sandu-common/src/main/java/com/sandu/common/security/LoginUserInfo.java
@@ -0,0 +1,82 @@
+package com.sandu.common.security;
+
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.sandu.common.enums.AdminStatusStatus;
+import lombok.Data;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+/**
+ * @author chenjiantian
+ * @date 2022/1/8 16:22
+ * 鐧诲綍鐢ㄦ埛鐨勪俊鎭�
+ */
+@Data
+public class LoginUserInfo implements UserDetails {
+
+    private Long userId;
+    private String account;
+    private String name;
+    private String token;
+    private String role;
+    /**
+     * 鐢ㄦ埛鏉冮檺 鐢�,鍒嗛殧
+     */
+    private String permission;
+    /**
+     * 0 "绂佺敤",  1 "姝e父" ,2锛歵oken 杩囨湡 3锛氭湭鎵惧埌鐢ㄦ埛淇℃伅 4锛氬湪鍏跺畠鍦版柟鐧诲綍 5:IP闄愬埗 6:token 瑙f瀽澶辫触
+     */
+    private Integer status;
+    private Long createTimestamp;
+
+    private String ip;
+    // 绠$悊鍛樼被鍨嬶紝绠$悊鍛� 0瀹樻柟绠$悊鍛橈紝1瀹㈡埛绠$悊鍛� 銆傛煡鐪婣dministratorEnums
+    private Integer administratorType;
+
+    @JsonIgnore
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        if (StrUtil.isBlank(permission)) {
+            return null;
+        }
+        return Arrays.stream(permission.split(","))
+                .map(SimpleGrantedAuthority::new)
+                .collect(Collectors.toList());
+    }
+    @JsonIgnore
+    @Override
+    public String getPassword() {
+        return null;
+    }
+    @JsonIgnore
+    @Override
+    public String getUsername() {
+        return account;
+    }
+    @JsonIgnore
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+    @JsonIgnore
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+    @JsonIgnore
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+    @JsonIgnore
+    @Override
+    public boolean isEnabled() {
+        return AdminStatusStatus.NORMAL.getCode().equals(status);
+    }
+}
diff --git a/sandu-common/src/main/java/com/sandu/common/security/TokenFilter.java b/sandu-common/src/main/java/com/sandu/common/security/TokenFilter.java
index 0688d70..642a643 100644
--- a/sandu-common/src/main/java/com/sandu/common/security/TokenFilter.java
+++ b/sandu-common/src/main/java/com/sandu/common/security/TokenFilter.java
@@ -1,22 +1,19 @@
 package com.sandu.common.security;
 
-import com.sandu.common.redis.online.OnlineUser;
-import com.sandu.common.redis.online.OnlineUserService;
+import cn.hutool.core.util.StrUtil;
 import com.sandu.common.security.config.SecurityProperties;
-import com.sandu.common.security.jwt.JwtTokenProvider;
-import com.sandu.common.util.SpringContextHolder;
+import com.sandu.common.security.token.TokenProvider;
+import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.util.StringUtils;
-import org.springframework.web.filter.GenericFilterBean;
+import org.springframework.web.filter.OncePerRequestFilter;
 
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 
 /**
@@ -26,40 +23,32 @@
  * @author chenjiantian
  */
 @Slf4j
-public class TokenFilter extends GenericFilterBean {
+@AllArgsConstructor
+public class TokenFilter extends OncePerRequestFilter {
 
-    private final JwtTokenProvider tokenProvider;
-
-    public TokenFilter(JwtTokenProvider tokenProvider) {
-        this.tokenProvider = tokenProvider;
-    }
+    private final TokenProvider tokenProvider;
+    private final SecurityProperties properties;
 
     @Override
-    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
-            throws IOException, ServletException {
-        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
-        String token = tokenProvider.getToken(httpServletRequest);
-        SecurityProperties properties = SpringContextHolder.getBean(SecurityProperties.class);
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
+        String token = request.getHeader(properties.getHeader());
 
+        if (token != null && token.startsWith(properties.getTokenStartWith())) {
+            token = token.substring(properties.getTokenStartWith().length());
+        }
 
-        if (StringUtils.hasText(token) && tokenProvider.validateToken(token)) {
-            Authentication authentication = tokenProvider.getAuthentication(token);
-            // 鏄惁浣跨敤redis缂撳瓨鐢ㄦ埛鍔熻兘
-            if (!properties.isCacheOnline()) {
+        LoginUserInfo loginUserInfo = tokenProvider.validateToken(token);
+        if (loginUserInfo != null) {
+            if (StrUtil.equals(loginUserInfo.getToken(), token)) {
+                Authentication authentication = new UsernamePasswordAuthenticationToken(
+                        loginUserInfo, null,
+                        loginUserInfo.getAuthorities());
                 SecurityContextHolder.getContext().setAuthentication(authentication);
-            } else {
-                OnlineUserService onlineUserService = SpringContextHolder.getBean(OnlineUserService.class);
-                OnlineUser onlineUser = onlineUserService.getOne(properties.getOnlineKey() + ((UserDetails) authentication.getPrincipal()).getUsername());
-                if (onlineUser != null) {
-                    // 鍖归厤涓婂綋鍓嶇敤鎴风殑token鎵嶅悎娉曪紝闃叉jwt涓嶅彈鎺у埗
-                    if (token.equals(onlineUser.getToken())) {
-                        SecurityContextHolder.getContext().setAuthentication(authentication);
-                    }
-                }
             }
         }
 
-        filterChain.doFilter(servletRequest, servletResponse);
+
+        filterChain.doFilter(request, response);
     }
 
 }
diff --git a/sandu-common/src/main/java/com/sandu/common/security/config/SecurityConfig.java b/sandu-common/src/main/java/com/sandu/common/security/config/SecurityConfig.java
index a62f6d1..7079516 100644
--- a/sandu-common/src/main/java/com/sandu/common/security/config/SecurityConfig.java
+++ b/sandu-common/src/main/java/com/sandu/common/security/config/SecurityConfig.java
@@ -1,16 +1,11 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
 package com.sandu.common.security.config;
 
 import com.sandu.common.security.JwtAccessDeniedHandler;
 import com.sandu.common.security.JwtAuthenticationEntryPoint;
 import com.sandu.common.security.TokenFilter;
 import com.sandu.common.security.annotation.AnonymousAccess;
-import com.sandu.common.security.jwt.JwtTokenProvider;
+import com.sandu.common.security.token.TokenProvider;
+import lombok.AllArgsConstructor;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -41,25 +36,15 @@
 @Configuration
 @EnableGlobalMethodSecurity(prePostEnabled = true)
 @EnableWebSecurity
+@AllArgsConstructor
 public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
-    private final JwtTokenProvider tokenProvider;
+    private final TokenProvider tokenProvider;
     private final CorsFilter corsFilter;
+    private final SecurityProperties properties;
     private final JwtAuthenticationEntryPoint authenticationErrorHandler;
     private final JwtAccessDeniedHandler jwtAccessDeniedHandler;
     private final ApplicationContext applicationContext;
-
-    public SecurityConfig(JwtTokenProvider tokenProvider, CorsFilter corsFilter,
-                          JwtAuthenticationEntryPoint authenticationErrorHandler,
-                          JwtAccessDeniedHandler jwtAccessDeniedHandler,
-                          ApplicationContext applicationContext) {
-        this.tokenProvider = tokenProvider;
-        this.corsFilter = corsFilter;
-        this.authenticationErrorHandler = authenticationErrorHandler;
-        this.jwtAccessDeniedHandler = jwtAccessDeniedHandler;
-        this.applicationContext = applicationContext;
-    }
-
 
     @Bean
     GrantedAuthorityDefaults grantedAuthorityDefaults() {
@@ -143,7 +128,6 @@
 
     @Bean
     public TokenFilter jwtAuthenticationTokenFilter() {
-        TokenFilter customFilter = new TokenFilter(tokenProvider);
-        return customFilter;
+        return new TokenFilter(tokenProvider, properties);
     }
 }
diff --git a/sandu-common/src/main/java/com/sandu/common/security/config/SecurityProperties.java b/sandu-common/src/main/java/com/sandu/common/security/config/SecurityProperties.java
index 837b43c..e607a5a 100644
--- a/sandu-common/src/main/java/com/sandu/common/security/config/SecurityProperties.java
+++ b/sandu-common/src/main/java/com/sandu/common/security/config/SecurityProperties.java
@@ -1,5 +1,6 @@
 package com.sandu.common.security.config;
 
+import cn.hutool.core.util.StrUtil;
 import lombok.Getter;
 import lombok.Setter;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -36,7 +37,7 @@
     private Long tokenValidityInSeconds;
 
     /**
-     * 鍦ㄧ嚎鐢ㄦ埛 key锛屾牴鎹� key 鏌ヨ redis 涓湪绾跨敤鎴风殑鏁版嵁
+     * 鍦ㄧ嚎鐢ㄦ埛 model name
      */
     private String onlineKey;
 
@@ -46,6 +47,9 @@
     private boolean cacheOnline = false;
 
     public String getTokenStartWith() {
+        if(StrUtil.isBlank(tokenStartWith)){
+            return "";
+        }
         return tokenStartWith + " ";
     }
 }
diff --git a/sandu-common/src/main/java/com/sandu/common/security/jwt/JwtTokenProvider.java b/sandu-common/src/main/java/com/sandu/common/security/jwt/JwtTokenProvider.java
index 5dbe8f1..455d97c 100644
--- a/sandu-common/src/main/java/com/sandu/common/security/jwt/JwtTokenProvider.java
+++ b/sandu-common/src/main/java/com/sandu/common/security/jwt/JwtTokenProvider.java
@@ -25,7 +25,6 @@
  * @date 2021/4/23 16:43
  */
 @Slf4j
-@Component
 public class JwtTokenProvider implements InitializingBean {
 
     private static final String AUTHORITIES_KEY = "auth";
diff --git a/sandu-common/src/main/java/com/sandu/common/security/token/JwtTokenProvider.java b/sandu-common/src/main/java/com/sandu/common/security/token/JwtTokenProvider.java
new file mode 100644
index 0000000..acb61cf
--- /dev/null
+++ b/sandu-common/src/main/java/com/sandu/common/security/token/JwtTokenProvider.java
@@ -0,0 +1,95 @@
+package com.sandu.common.security.token;
+
+import com.sandu.common.enums.AdminStatusStatus;
+import com.sandu.common.security.LoginUserInfo;
+import com.sandu.common.security.config.SecurityProperties;
+import io.jsonwebtoken.*;
+import io.jsonwebtoken.io.Decoders;
+import io.jsonwebtoken.io.DecodingException;
+import io.jsonwebtoken.security.Keys;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.stereotype.Component;
+
+import java.security.Key;
+import java.util.Date;
+import java.util.stream.Collectors;
+
+/**
+ * @author chenjiantian
+ * @date 2022/1/8 18:12
+ */
+@Component
+@Slf4j
+@ConditionalOnProperty(prefix = "sandu.jwt", name = "cache-online", havingValue = "false")
+public class JwtTokenProvider implements TokenProvider, InitializingBean {
+
+    private static final String AUTHORITIES_KEY = "auth";
+    private static final String CREDENTIALS_KEY = "cred";
+    private static final String ADMINISTRATOR_KEY = "admin";
+    private final SecurityProperties properties;
+    private Key key;
+
+    public JwtTokenProvider(SecurityProperties properties) {
+        this.properties = properties;
+    }
+
+    @Override
+    public void afterPropertiesSet() {
+        byte[] keyBytes = Decoders.BASE64.decode(properties.getBase64Secret());
+        this.key = Keys.hmacShaKeyFor(keyBytes);
+    }
+
+    @Override
+    public String createToken(LoginUserInfo loginUserInfo) {
+        if (loginUserInfo.getUserId() == null) {
+            throw new IllegalArgumentException("鐢ㄦ埛id涓嶈兘涓虹┖");
+        }
+        String authorities = loginUserInfo.getAuthorities().stream()
+                .map(GrantedAuthority::getAuthority)
+                .collect(Collectors.joining(","));
+
+        long now = (new Date()).getTime();
+        Date expiration = new Date(now + properties.getTokenValidityInSeconds());
+
+        return Jwts.builder()
+                .setSubject(loginUserInfo.getUserId().toString())
+                .claim(AUTHORITIES_KEY, authorities)
+                .claim(CREDENTIALS_KEY, loginUserInfo.getAccount())
+                .claim(ADMINISTRATOR_KEY, loginUserInfo.getAdministratorType())
+                .setExpiration(expiration)
+                .signWith(key, SignatureAlgorithm.HS512)
+                .compact();
+    }
+
+    @Override
+    public LoginUserInfo validateToken(String token) {
+        try {
+            Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
+            LoginUserInfo loginUserInfo = new LoginUserInfo();
+            loginUserInfo.setUserId(Long.valueOf(claims.getSubject()));
+            loginUserInfo.setAccount(String.valueOf(claims.get(CREDENTIALS_KEY)));
+            loginUserInfo.setPermission(claims.get(AUTHORITIES_KEY).toString());
+            loginUserInfo.setAdministratorType(Integer.parseInt(claims.get(ADMINISTRATOR_KEY).toString()));
+            loginUserInfo.setToken(token);
+            loginUserInfo.setStatus(AdminStatusStatus.NORMAL.getCode());
+            return loginUserInfo;
+        } catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) {
+            log.info("Invalid JWT signature.");
+//            e.printStackTrace();
+        } catch (ExpiredJwtException e) {
+            log.info("Expired JWT token.");
+//            e.printStackTrace();
+        } catch (UnsupportedJwtException | DecodingException e) {
+            log.info("Unsupported JWT token.");
+//            e.printStackTrace();
+        } catch (IllegalArgumentException e) {
+            log.info("JWT token compact of handler are invalid.");
+//            e.printStackTrace();
+        }
+
+        return null;
+    }
+}
diff --git a/sandu-common/src/main/java/com/sandu/common/security/token/RedisTokenProvider.java b/sandu-common/src/main/java/com/sandu/common/security/token/RedisTokenProvider.java
new file mode 100644
index 0000000..a1da728
--- /dev/null
+++ b/sandu-common/src/main/java/com/sandu/common/security/token/RedisTokenProvider.java
@@ -0,0 +1,53 @@
+package com.sandu.common.security.token;
+
+import cn.hutool.core.util.IdUtil;
+import com.sandu.common.redis.RedisService;
+import com.sandu.common.redis.UserModel;
+import com.sandu.common.security.LoginUserInfo;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author chenjiantian
+ * @date 2022/1/8 16:39
+ */
+@AllArgsConstructor
+@Component
+@ConditionalOnProperty(prefix = "sandu.jwt", name = "cache-online", havingValue = "true")
+public class RedisTokenProvider implements TokenProvider {
+
+    private final RedisService redisService;
+
+    @Override
+    public String createToken(LoginUserInfo loginUserInfo) {
+        if (loginUserInfo.getUserId() == null) {
+            throw new IllegalArgumentException("鐢ㄦ埛id涓嶈兘涓虹┖");
+        }
+        String token = IdUtil.simpleUUID();
+        loginUserInfo.setToken(token);
+        loginUserInfo.setCreateTimestamp(System.currentTimeMillis());
+        redisService.set(UserModel.USER_TOKEN.key(token), loginUserInfo.getUserId(), UserModel.USER_TOKEN.expireSeconds());
+        redisService.set(UserModel.USER_INFO.key(loginUserInfo.getUserId().toString()), loginUserInfo);
+        return token;
+    }
+
+    @Override
+    public LoginUserInfo validateToken(String token) {
+        if (token == null) {
+            return null;
+        }
+        Long userId = (Long) redisService.get(UserModel.USER_TOKEN.key(token));
+        if (userId == null) {
+            return null;
+        }
+        LoginUserInfo userInfo = (LoginUserInfo) redisService.get(UserModel.USER_INFO.key(userId.toString()));
+        if (userInfo != null) {
+            if (redisService.getExpire(token) < UserModel.USER_TOKEN.expireSeconds()) {
+                redisService.expire(token, UserModel.USER_TOKEN.expireSeconds());
+            }
+        }
+        return userInfo;
+    }
+
+}
diff --git a/sandu-common/src/main/java/com/sandu/common/security/token/TokenProvider.java b/sandu-common/src/main/java/com/sandu/common/security/token/TokenProvider.java
new file mode 100644
index 0000000..b058649
--- /dev/null
+++ b/sandu-common/src/main/java/com/sandu/common/security/token/TokenProvider.java
@@ -0,0 +1,26 @@
+package com.sandu.common.security.token;
+
+import com.sandu.common.security.LoginUserInfo;
+
+/**
+ * @author chenjiantian
+ * @date 2022/1/8 16:10
+ */
+public interface TokenProvider {
+
+    /**
+     * 鐢熸垚token
+     * @param loginUserInfo 鐢ㄦ埛淇℃伅
+     * @return token
+     */
+    String createToken(LoginUserInfo loginUserInfo);
+
+    /**
+     * 楠岃瘉token 鏈夋病鏈変繚瀛樼敤鎴蜂俊鎭�
+     * @param token token
+     * @return null琛ㄧずtoken 娌℃湁鍏宠仈鐢ㄦ埛淇℃伅
+     */
+    LoginUserInfo validateToken(String token);
+
+
+}
diff --git a/sandu-common/src/main/java/com/sandu/common/service/BaseService.java b/sandu-common/src/main/java/com/sandu/common/service/BaseService.java
index d91a25b..a6b2e0a 100644
--- a/sandu-common/src/main/java/com/sandu/common/service/BaseService.java
+++ b/sandu-common/src/main/java/com/sandu/common/service/BaseService.java
@@ -1,9 +1,4 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
+
 package com.sandu.common.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
diff --git a/sandu-common/src/main/java/com/sandu/common/service/impl/BaseServiceImpl.java b/sandu-common/src/main/java/com/sandu/common/service/impl/BaseServiceImpl.java
index 61dcfb6..7f5d8dc 100644
--- a/sandu-common/src/main/java/com/sandu/common/service/impl/BaseServiceImpl.java
+++ b/sandu-common/src/main/java/com/sandu/common/service/impl/BaseServiceImpl.java
@@ -1,9 +1,4 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
+
 package com.sandu.common.service.impl;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
diff --git a/sandu-common/src/main/java/com/sandu/common/util/RequestHolder.java b/sandu-common/src/main/java/com/sandu/common/util/RequestHolder.java
index a3d3b57..5da9c57 100644
--- a/sandu-common/src/main/java/com/sandu/common/util/RequestHolder.java
+++ b/sandu-common/src/main/java/com/sandu/common/util/RequestHolder.java
@@ -1,9 +1,4 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
+
 package com.sandu.common.util;
 
 import org.springframework.web.context.request.RequestContextHolder;
diff --git a/sandu-common/src/main/java/com/sandu/common/util/SpringContextHolder.java b/sandu-common/src/main/java/com/sandu/common/util/SpringContextHolder.java
index 84df5b2..329d101 100644
--- a/sandu-common/src/main/java/com/sandu/common/util/SpringContextHolder.java
+++ b/sandu-common/src/main/java/com/sandu/common/util/SpringContextHolder.java
@@ -1,9 +1,4 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
+
 package com.sandu.common.util;
 
 import lombok.extern.slf4j.Slf4j;
diff --git a/sandu-common/src/main/java/com/sandu/common/util/ThrowableUtil.java b/sandu-common/src/main/java/com/sandu/common/util/ThrowableUtil.java
index 744b1bf..d4a68f8 100644
--- a/sandu-common/src/main/java/com/sandu/common/util/ThrowableUtil.java
+++ b/sandu-common/src/main/java/com/sandu/common/util/ThrowableUtil.java
@@ -1,9 +1,4 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
+
 package com.sandu.common.util;
 
 import java.io.PrintWriter;
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java
index ecd6c94..945dc01 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java
@@ -10,9 +10,11 @@
 import com.sandu.common.enums.ResponseStatusEnums;
 import com.sandu.common.execption.BusinessException;
 import com.sandu.common.object.BaseConditionVO;
+import com.sandu.common.security.LoginUserInfo;
 import com.sandu.common.security.annotation.AnonymousAccess;
 import com.sandu.common.security.config.SecurityProperties;
-import com.sandu.common.security.jwt.JwtTokenProvider;
+import com.sandu.common.security.token.TokenProvider;
+import com.sandu.common.util.IpUtil;
 import com.sandu.common.util.ResponseUtil;
 import com.sandu.ximon.admin.dto.AdminJwtUser;
 import com.sandu.ximon.admin.param.AdminLoginParam;
@@ -26,9 +28,6 @@
 import com.sandu.ximon.dao.enums.AdministratorEnums;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.web.bind.annotation.*;
@@ -56,7 +55,7 @@
     private final PasswordEncoder passwordEncoder;
     private final AdminService adminService;
     private final RoleService roleService;
-    private final JwtTokenProvider tokenProvider;
+    private final TokenProvider tokenProvider;
 
 
     @AnonymousAccess
@@ -70,16 +69,22 @@
             return ResponseUtil.error(ResponseStatusEnums.BAD_CREDENTIALS.getCode(), ResponseStatusEnums.BAD_CREDENTIALS.getMessage());
         }
         UserDetails userJwtUser = new AdminJwtUser(admin, roleService.mapToGrantedAuthorities(admin.getId()));
-        if(!userJwtUser.isEnabled()){
+        if (!userJwtUser.isEnabled()) {
             return ResponseUtil.error(ResponseStatusEnums.DISABLE_ACCOUNT.getCode(), ResponseStatusEnums.DISABLE_ACCOUNT.getMessage());
         }
-        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userJwtUser, AdministratorEnums.ADMIN.getCode(), userJwtUser.getAuthorities());
 
-        SecurityContextHolder.getContext().setAuthentication(authentication);
+        LoginUserInfo loginUserInfo = new LoginUserInfo();
+        loginUserInfo.setUserId(admin.getId());
+        loginUserInfo.setName(admin.getNickName());
+        loginUserInfo.setAccount(admin.getUsername());
+        loginUserInfo.setStatus(admin.getStatus());
+        loginUserInfo.setIp(IpUtil.getRealIp());
+        loginUserInfo.setAdministratorType(AdministratorEnums.ADMIN.getCode());
+        loginUserInfo.setPermission("tenant");
+
 
         // 鐢熸垚浠ょ墝
-        String token = tokenProvider.createToken(authentication);
-        final AdminJwtUser jwtUser = (AdminJwtUser) authentication.getPrincipal();
+        String token = tokenProvider.createToken(loginUserInfo);
 
         // 鏇存柊鏈�鍚庣櫥褰曟椂闂�
         Admin update = new Admin();
@@ -90,25 +95,23 @@
         // 杩斿洖 token 涓� 鐢ㄦ埛淇℃伅
         Map<String, Object> authInfo = new HashMap<String, Object>(2) {{
             put("token", properties.getTokenStartWith() + token);
-            put("user", jwtUser);
+            put("user", admin);
         }};
-//        if (singleLogin) {
-//            //韪㈡帀涔嬪墠宸茬粡鐧诲綍鐨則oken
-//            onlineUserService.checkLoginOnUser(authUser.getUsername(), token);
-//        }
         return ResponseUtil.success(authInfo);
     }
 
     @GetMapping(value = "/info")
     public ResponseVO<Object> getUserInfo() {
-        Integer administratorIdentity = SecurityUtils.getAdministratorIdentity();
         Long userId = SecurityUtils.getUserId();
         Admin admin = adminService.getById(userId);
         List<Role> roles = roleService.listByAdminId(admin.getId());
+        if(CollectionUtil.isEmpty(roles)){
+            return ResponseUtil.fail("鐢ㄦ埛娌℃湁瑙掕壊锛屾棤娉曡幏鍙栨暟鎹�");
+        }
         List<Menu> menus = menuService.listByRoleIds(roles.stream().map(Role::getId).collect(Collectors.toList()));
-        MapBuilder<Object, Object> builder = MapUtil.builder().put("info", admin);
-        if(CollectionUtil.isNotEmpty(menus)){
-        List<Menu> collect = menus.stream().filter(menu -> menu.getType() == 0).collect(Collectors.toList());
+        MapBuilder<Object, Object> builder = MapUtil.builder().put("admin", admin);
+        if (CollectionUtil.isNotEmpty(menus)) {
+            List<Menu> collect = menus.stream().filter(menu -> menu.getType() == 0 || menu.getType() == 1).collect(Collectors.toList());
             builder.put("menus", collect);
         }
         return ResponseUtil.success(builder.build());
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/MenuController.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/MenuController.java
new file mode 100644
index 0000000..abc710a
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/MenuController.java
@@ -0,0 +1,60 @@
+package com.sandu.ximon.admin.controller;
+
+import com.sandu.common.domain.ResponseVO;
+import com.sandu.common.util.ResponseUtil;
+import com.sandu.ximon.admin.param.MenuParam;
+import com.sandu.ximon.admin.service.MenuService;
+import com.sandu.ximon.dao.bo.MenuNode;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author chenjiantian
+ * @date 2021/4/27 18:47
+ */
+@AllArgsConstructor
+@RestController
+@RequestMapping("/admin/menu")
+public class MenuController {
+
+    private final MenuService menuService;
+
+//    @GetMapping("treeMenuList")
+//    @PreAuthorize("@el.check('menu:list','role:list')")
+//    public ResponseVO<Object> treeMenuList() {
+//        List<Menu> list = menuService.list(Wrappers.lambdaQuery(Menu.class).eq(Menu::getType, 0));
+//        List<MenuNode> menuTrees = menuService.buildTree(list);
+//        return ResponseUtil.success(menuTrees);
+//    }
+
+    @GetMapping("/treeList")
+    public ResponseVO<Object> treeList() {
+        List<MenuNode> menuTrees = menuService.treeList();
+        return ResponseUtil.success(menuTrees);
+    }
+
+    @PostMapping("/update/{menuId}")
+    public ResponseVO<Object> update(@PathVariable Long menuId, @Validated @RequestBody MenuParam param) {
+
+        boolean result = menuService.updateMenu(menuId,param);
+        if (result) {
+            return ResponseUtil.success("娣诲姞鎴愬姛");
+        } else {
+            return ResponseUtil.fail("娣诲姞澶辫触");
+        }
+    }
+
+    @PostMapping
+    public ResponseVO<Object> addMenu(@Validated @RequestBody MenuParam param) {
+
+        boolean result = menuService.addMenu(param);
+        if (result) {
+            return ResponseUtil.success("娣诲姞鎴愬姛");
+        } else {
+            return ResponseUtil.fail("娣诲姞澶辫触");
+        }
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java
index 13fb0de..a1f7eeb 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java
@@ -38,8 +38,10 @@
             log.info("蹇冭烦鐩稿簲");
             A5LightHeartbeatReportInnerFrame heartbeatReportInnerFrame = new A5LightHeartbeatReportInnerFrame().transformFrame(frame.getPayload());
 
-            SpringContextHolder.getBean(LightReportDataService.class).saveReportData(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage());
-            SpringContextHolder.getBean(LightService.class).saveLight(deviceName,heartbeatReportInnerFrame.getHeartBeatDataPackage());
+            if (heartbeatReportInnerFrame.isValidate()) {
+                SpringContextHolder.getBean(LightReportDataService.class).saveReportData(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage());
+                SpringContextHolder.getBean(LightService.class).saveLight(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage());
+            }
 
         } else if (A5LightReportEnum.Time_Synchronized.getCode().equals(functionCode)) {
 //            log.info("璇锋眰鏃堕棿鍚屾");
@@ -48,7 +50,7 @@
         } else if (A5LightReportEnum.Error_Code.getCode().equals(functionCode)) {
             log.info("鏁呴殰鐮佷笂鎶�");
             A5LightErrorCodeReportInnerFrame codeRespInnerFrame = new A5LightErrorCodeReportInnerFrame().transformFrame(frame.getPayload());
-            if (codeRespInnerFrame.getErrorCode() != 0) {
+            if (codeRespInnerFrame.isValidate() && codeRespInnerFrame.getErrorCode() != 0) {
                 SpringContextHolder.getBean(LightReportErrorService.class).saveReportError(deviceName, codeRespInnerFrame);
             }
         }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java
index 95de732..082ec44 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java
@@ -61,8 +61,7 @@
         result = result.replace("\\", "");
         Map map = JSON.parseObject(result, Map.class);
         result = (String) map.get("msg");
-        CommonFrame connectFrame = FrameUtils.transformMessageToFrame(result);
-        return connectFrame;
+        return FrameUtils.transformMessageToFrame(result);
     }
 
     /**
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/param/MenuParam.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/param/MenuParam.java
new file mode 100644
index 0000000..01b396d
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/param/MenuParam.java
@@ -0,0 +1,63 @@
+package com.sandu.ximon.admin.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author chenjiantian
+ * @date 2022/1/17 18:11
+ */
+@Data
+public class MenuParam {
+    /**
+     * 鑿滃崟title
+     */
+    @NotBlank(message = "鑿滃崟鍚嶇О涓嶈兘涓虹┖")
+    private String title;
+
+    /**
+     * 涓婄骇鑿滃崟ID
+     */
+    private Long pid;
+
+    /**
+     * 鎺掑簭
+     */
+    private Integer seq;
+
+    /**
+     * 鑿滃崟鍥炬爣
+     */
+    private String icon;
+
+    /**
+     * 璇锋眰璺緞
+     */
+    private String path;
+
+    /**
+     * 鑿滃崟鏄惁闅愯棌
+     */
+    private Boolean hidden;
+
+    /**
+     * 缁勪欢璺緞鏄犲皠
+     */
+    private String component;
+
+    /**
+     * 璺敱鍚嶇О
+     */
+    private String routerName;
+
+    /**
+     * 鏉冮檺鍚嶇О
+     */
+    private String permission;
+
+    /**
+     * 绫诲瀷锛�0锛氳彍鍗曪紝1锛氭寜閽�
+     */
+    private Integer type;
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java
index 0a2c449..0bbccb2 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/security/SecurityUtils.java
@@ -1,27 +1,11 @@
-/**
- * Copyright (C) 2018-2020
- * All rights reserved, Designed By www.yixiang.co
- * 娉ㄦ剰锛�
- * 鏈蒋浠朵负www.yixiang.co寮�鍙戠爺鍒�
- */
 package com.sandu.ximon.admin.security;
 
-import cn.hutool.json.JSONObject;
 import com.sandu.common.enums.ResponseStatusEnums;
 import com.sandu.common.execption.BusinessException;
-import com.sandu.common.redis.online.OnlineUser;
-import com.sandu.common.redis.online.OnlineUserService;
-import com.sandu.common.security.config.SecurityProperties;
-import com.sandu.common.security.jwt.JwtTokenProvider;
-import com.sandu.common.util.RequestHolder;
-import com.sandu.common.util.SpringContextHolder;
+import com.sandu.common.security.LoginUserInfo;
 import com.sandu.ximon.dao.enums.AdministratorEnums;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-
-import javax.servlet.http.HttpServletRequest;
 
 /**
  * 鑾峰彇褰撳墠鐧诲綍鐨勭敤鎴�
@@ -34,22 +18,18 @@
     /**
      * 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛淇℃伅
      */
-    private static UserDetails getUserDetails() {
+    private static LoginUserInfo getUserDetails() {
         final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
         if (authentication == null) {
             throw new BusinessException(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage());
         }
-        Integer administratorIdentity = getAdministratorIdentity();
-        if (AdministratorEnums.ADMIN.getCode().equals(administratorIdentity)) {
-            UserDetails userDetails = (UserDetails) authentication.getPrincipal();
-            UserDetailsService userDetailsService = SpringContextHolder.getBean("adminDetailsService");
-            return userDetailsService.loadUserByUsername(userDetails.getUsername());
-        } else if (AdministratorEnums.CUSTOMER.getCode().equals(administratorIdentity)) {
-            UserDetails userDetails = (UserDetails) authentication.getPrincipal();
-            UserDetailsService userDetailsService = SpringContextHolder.getBean("customerDetailsService");
-            return userDetailsService.loadUserByUsername(userDetails.getUsername());
+        if (authentication.getPrincipal() instanceof LoginUserInfo) {
+            LoginUserInfo loginUserInfo = (LoginUserInfo) authentication.getPrincipal();
+            if (!loginUserInfo.isEnabled()) {
+                throw new BusinessException(ResponseStatusEnums.DISABLE_ACCOUNT.getCode(), ResponseStatusEnums.DISABLE_ACCOUNT.getMessage());
+            }
+            return loginUserInfo;
         }
-
         return null;
     }
 
@@ -59,12 +39,11 @@
      * @return 褰撳墠鐧诲綍鐢ㄦ埛鐧诲綍鍚�
      */
     public static String getUsername() {
-        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        if (authentication == null) {
-            throw new BusinessException(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage());
+        LoginUserInfo loginUserInfo = getUserDetails();
+        if (loginUserInfo != null) {
+            return loginUserInfo.getUsername();
         }
-        UserDetails userDetails = (UserDetails) authentication.getPrincipal();
-        return userDetails.getUsername();
+        return null;
     }
 
     /**
@@ -73,11 +52,11 @@
      * @return
      */
     public static Integer getAdministratorIdentity() {
-        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        if (authentication == null) {
+        LoginUserInfo loginUserInfo = getUserDetails();
+        if (loginUserInfo == null) {
             throw new BusinessException(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage());
         }
-        return (Integer) authentication.getCredentials();
+        return loginUserInfo.getAdministratorType();
     }
 
     /**
@@ -86,39 +65,25 @@
      * @return 褰撳墠鐧诲綍璐﹀彿鐨刬d
      */
     public static Long getUserId() {
-        SecurityProperties properties = SpringContextHolder.getBean(SecurityProperties.class);
-        if (!properties.isCacheOnline()) {
-            UserDetails obj = getUserDetails();
-            if (obj == null) {
-                return null;
-            }
-            if (!obj.isEnabled()) {
-                throw new BusinessException(ResponseStatusEnums.DISABLE_ACCOUNT.getCode(), ResponseStatusEnums.DISABLE_ACCOUNT.getMessage());
-            }
-            JSONObject json = new JSONObject(obj);
-            return json.getJSONObject("user").get("id", Long.class);
-        } else {
-            HttpServletRequest httpServletRequest = RequestHolder.getHttpServletRequest();
-            JwtTokenProvider tokenProvider = SpringContextHolder.getBean(JwtTokenProvider.class);
-            OnlineUserService onlineUserService = SpringContextHolder.getBean(OnlineUserService.class);
-            String username = tokenProvider.getSubjectForce(tokenProvider.getToken(httpServletRequest));
-            OnlineUser one = onlineUserService.getOne(properties.getOnlineKey() + username);
-            if (one != null) {
-                return one.getUserId();
-            } else {
-                return null;
-            }
+        LoginUserInfo loginUserInfo = getUserDetails();
+        if (loginUserInfo != null) {
+            return loginUserInfo.getUserId();
         }
+        return null;
     }
 
     /**
      * 鑾峰彇瀹㈡埛璐﹀彿鐨刬d 濡傛灉褰撳墠韬唤鏄繍钀ヤ汉鍛橈紝杩斿洖null
+     *
      * @return
      */
     public static Long getClientId() {
-        Integer administratorIdentity = SecurityUtils.getAdministratorIdentity();
-        if (AdministratorEnums.CUSTOMER.getCode().equals(administratorIdentity)) {
-            return SecurityUtils.getUserId();
+        LoginUserInfo loginUserInfo = getUserDetails();
+        if (loginUserInfo == null) {
+            return null;
+        }
+        if (AdministratorEnums.CUSTOMER.getCode().equals(loginUserInfo.getAdministratorType())) {
+            return loginUserInfo.getUserId();
         }
         return null;
     }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java
index ec78044..65aeaad 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java
@@ -131,25 +131,30 @@
         for (LightControlParam param : paramList) {
             A5LightBrightnessReqInnerFrame lightControlFrame = new A5LightBrightnessReqInnerFrame(param.getBrightness());
             A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_LIGHT_DATA.getCode(), lightControlFrame);
-            WrapResponseCommonFrame<A5LightBrightnessRespInnerFrame> frame = MainBoardInvokeSyncService.getInstance()
-                    .sendRRPC(param.getDeviceCode(), a5Frame, A5LightBrightnessRespInnerFrame.class);
             Map<String, Object> map = new HashMap<>();
-            map.put("deviceCode", param.getDeviceCode());
-            if (frame == null) {
+            try {
+                map.put("deviceCode", param.getDeviceCode());
+                WrapResponseCommonFrame<A5LightBrightnessRespInnerFrame> frame = MainBoardInvokeSyncService.getInstance()
+                        .sendRRPC(param.getDeviceCode(), a5Frame, A5LightBrightnessRespInnerFrame.class);
+                if (frame == null) {
+                    map.put("status", DeviceRespStatusEnums.OTHER_ERROR.getCode());
+                    resultList.add(map);
+                    continue;
+                }
+                String responseStatus = frame.getResponseInnerFrame().getResponseStatus();
+                int status = HexUtil.hexToInt(responseStatus);
+                map.put("status", status);
+                resultList.add(map);
+
+                // 鏇存柊浜害鎴愬姛锛屼慨鏀瑰埌鏁版嵁搴�
+                if (DeviceRespStatusEnums.SUCCESS.getCode().equals(status)) {
+                    Light light = new Light();
+                    light.setLightPercent(param.getBrightness());
+                    update(light, Wrappers.lambdaUpdate(Light.class).eq(Light::getDeviceCode, param.getDeviceCode()));
+                }
+            }catch (BusinessException e){
                 map.put("status", DeviceRespStatusEnums.OTHER_ERROR.getCode());
                 resultList.add(map);
-                continue;
-            }
-            String responseStatus = frame.getResponseInnerFrame().getResponseStatus();
-            int status = HexUtil.hexToInt(responseStatus);
-            map.put("status", status);
-            resultList.add(map);
-
-            // 鏇存柊浜害鎴愬姛锛屼慨鏀瑰埌鏁版嵁搴�
-            if (DeviceRespStatusEnums.SUCCESS.getCode().equals(status)) {
-                Light light = new Light();
-                light.setLightPercent(param.getBrightness());
-                update(light, Wrappers.lambdaUpdate(Light.class).eq(Light::getDeviceCode, param.getDeviceCode()));
             }
         }
 
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskService.java
index a35919b..d17178b 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskService.java
@@ -85,7 +85,7 @@
         List<Long> poleIdList = param.getPoleIdList();
         if (CollectionUtil.isNotEmpty(poleIdList)) {
 
-            List<LightTaskPoleRelation> lightTaskPoleRelationList = sendControllerFrame(lightTask, poleIdList,lightTask.getFramePayload());
+            List<LightTaskPoleRelation> lightTaskPoleRelationList = sendControllerFrame(lightTask, poleIdList, lightTask.getFramePayload());
 
             // 娣诲姞缁戝畾鐏潌
             if (!lightTaskPoleRelationService.saveBatch(lightTaskPoleRelationList)) {
@@ -126,7 +126,7 @@
         List<Long> poleIdList = param.getPoleIdList();
         if (CollectionUtil.isNotEmpty(poleIdList)) {
 
-            List<LightTaskPoleRelation> lightTaskPoleRelationList = sendControllerFrame(lightTask, poleIdList,lightTask.getFramePayload());
+            List<LightTaskPoleRelation> lightTaskPoleRelationList = sendControllerFrame(lightTask, poleIdList, lightTask.getFramePayload());
 
             lightTaskPoleRelationService.remove(Wrappers.lambdaQuery(LightTaskPoleRelation.class).eq(LightTaskPoleRelation::getTaskId, lightTask.getTaskId()));
             // 娣诲姞缁戝畾鐏潌
@@ -181,7 +181,7 @@
     }
 
     // 姣忎釜璺伅鍙戦�佹帶鍒跺抚 杩斿洖鍏宠仈鍒楄〃
-    private List<LightTaskPoleRelation> sendControllerFrame(LightTask lightTask, List<Long> poleIdList,String framePayload) {
+    private List<LightTaskPoleRelation> sendControllerFrame(LightTask lightTask, List<Long> poleIdList, String framePayload) {
         List<LightTaskPoleRelation> lightTaskPoleRelationList = new ArrayList<>();
 
         List<Pole> poles = poleService.listByIds(poleIdList);
@@ -190,17 +190,21 @@
         }
 
         for (Pole pole : poles) {
-            // rrpc 鍙戠敓瀹氭椂鍛戒护
-            A5LightTimerRespInnerFrame a5LightTimerRespInnerFrame = sendTimeRRpc(framePayload, pole.getDeviceCode());
-
             LightTaskPoleRelation lightTaskPoleRelation = new LightTaskPoleRelation();
             lightTaskPoleRelation.setPoleId(pole.getId());
             lightTaskPoleRelation.setTaskId(lightTask.getTaskId());
-            if (a5LightTimerRespInnerFrame == null) {
+            // rrpc 鍙戠敓瀹氭椂鍛戒护
+            try {
+                A5LightTimerRespInnerFrame a5LightTimerRespInnerFrame = sendTimeRRpc(framePayload, pole.getDeviceCode());
+                if (a5LightTimerRespInnerFrame == null) {
+                    lightTaskPoleRelation.setIssueStatus(DeviceRespStatusEnums.OTHER_ERROR.getCode());
+                } else {
+                    lightTaskPoleRelation.setIssueStatus(HexUtil.hexToInt(a5LightTimerRespInnerFrame.getResponseStatus()));
+                }
+            } catch (BusinessException e) {
                 lightTaskPoleRelation.setIssueStatus(DeviceRespStatusEnums.OTHER_ERROR.getCode());
-            } else {
-                lightTaskPoleRelation.setIssueStatus(HexUtil.hexToInt(a5LightTimerRespInnerFrame.getResponseStatus()));
             }
+
             lightTaskPoleRelationList.add(lightTaskPoleRelation);
         }
         return lightTaskPoleRelationList;
@@ -288,7 +292,6 @@
 
     /**
      * 涓嬪彂鍗曚釜鐏潌鐨勪换鍔�
-     *
      */
     public boolean issueLightTask(LightTaskIssueParam param) {
         LightTask lightTask = getById(param.getTaskId());
@@ -296,7 +299,7 @@
             throw new BusinessException("鎵句笉鍒颁换鍔�");
         }
         String framePayload = buildControlFramePayload(lightTask.getOpenOrder(), lightTask.getCloseOrder(), lightTask.getControlOrder(), lightTask.getWeek());
-        List<LightTaskPoleRelation> lightTaskPoleRelationList = sendControllerFrame(lightTask, ListUtil.toList(param.getPoleId()),framePayload);
+        List<LightTaskPoleRelation> lightTaskPoleRelationList = sendControllerFrame(lightTask, ListUtil.toList(param.getPoleId()), framePayload);
         if (CollectionUtil.isNotEmpty(lightTaskPoleRelationList)) {
             return lightTaskPoleRelationService.update(lightTaskPoleRelationList.get(0),
                     Wrappers.lambdaUpdate(LightTaskPoleRelation.class).eq(LightTaskPoleRelation::getPoleId, param.getPoleId())
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/MenuService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/MenuService.java
index 7ed7d10..96ffa7d 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/MenuService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/MenuService.java
@@ -3,13 +3,18 @@
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.sandu.common.execption.BusinessException;
+import com.sandu.common.execption.EntityExistException;
 import com.sandu.common.service.impl.BaseServiceImpl;
+import com.sandu.ximon.admin.param.MenuParam;
+import com.sandu.ximon.dao.bo.MenuNode;
 import com.sandu.ximon.dao.domain.AdminRoleRelation;
 import com.sandu.ximon.dao.domain.Menu;
 import com.sandu.ximon.dao.domain.RoleMenuRelation;
 import com.sandu.ximon.dao.mapper.AdminRoleRelationMapper;
 import com.sandu.ximon.dao.mapper.MenuMapper;
 import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -34,7 +39,56 @@
         if (CollectionUtil.isEmpty(menuIdList)) {
             return null;
         }
-        List<Menu> menus = listByIds(menuIdList);
-        return menus;
+        return listByIds(menuIdList);
+    }
+
+    public boolean addMenu(MenuParam param) {
+        Menu menu = new Menu();
+        BeanUtils.copyProperties(param,menu);
+        return save(menu);
+    }
+
+//    public Set<Menu> listMenuByRoles(Set<Role> roles) {
+//        List<Long> roleIds = roles.stream().map(Role::getId).collect(Collectors.toList());
+//        Set<Menu> menus = menuDao.listMenuByRoleIds(roleIds);
+//        return menus;
+//    }
+//
+//    /**
+//     * 鎶婅彍鍗曡浆鎴愭爲褰㈢粨鏋�
+//     */
+//    public List<MenuNode> buildTree(List<Menu> menuList) {
+//        return menuList.stream()
+//                .filter(menu -> menu.getPid().equals(0L))
+//                .map(menu -> covertMenuNode(menu, menuList)).collect(Collectors.toList());
+//    }
+
+    private MenuNode covertMenuNode(Menu menu, List<Menu> menuList) {
+        MenuNode node = new MenuNode();
+        BeanUtils.copyProperties(menu, node);
+        List<MenuNode> children = menuList.stream()
+                .filter(subMenu -> subMenu.getPid().equals(menu.getId()))
+                .map(subMenu -> covertMenuNode(subMenu, menuList)).collect(Collectors.toList());
+        node.setChildren(children);
+        return node;
+    }
+
+    public boolean updateMenu(Long menuId,MenuParam param) {
+        Menu one = getById(menuId);
+        if (one == null) {
+            throw new BusinessException("鎵句笉鍒拌彍鍗曚俊鎭�");
+        }
+
+        Menu menu = new Menu();
+        BeanUtils.copyProperties(param,menu);
+        menu.setId(menuId);
+        return updateById(menu);
+    }
+
+    public List<MenuNode> treeList() {
+        List<Menu> list = list();
+        return list.stream()
+                .filter(menu -> menu.getPid().equals(0L))
+                .map(menu -> covertMenuNode(menu, list)).collect(Collectors.toList());
     }
 }
diff --git a/ximon-admin/src/main/resources/application-test.yml b/ximon-admin/src/main/resources/application-test.yml
index 71dc970..a509e4c 100644
--- a/ximon-admin/src/main/resources/application-test.yml
+++ b/ximon-admin/src/main/resources/application-test.yml
@@ -25,7 +25,7 @@
     # 浠ょ墝杩囨湡鏃堕棿 姝ゅ鍗曚綅/姣 锛屽彲鍦ㄦ缃戠珯鐢熸垚 https://www.convertworld.com/zh-hans/time/milliseconds.html 1涓湀
     token-validity-in-seconds: 2629800000
     # 鍦ㄧ嚎鐢ㄦ埛key
-    online-key: online-token
+    online-key: light-user
     # 鏄惁鍚姩redis缂撳瓨鐢ㄦ埛淇℃伅
     cache-online: false
   upload:
diff --git a/ximon-admin/src/test/java/com/sandu/ximon/admin/BaseTopicTests.java b/ximon-admin/src/test/java/com/sandu/ximon/admin/BaseTopicTests.java
index 7d3eca0..3d0d391 100644
--- a/ximon-admin/src/test/java/com/sandu/ximon/admin/BaseTopicTests.java
+++ b/ximon-admin/src/test/java/com/sandu/ximon/admin/BaseTopicTests.java
@@ -1,8 +1,10 @@
 package com.sandu.ximon.admin;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.aliyuncs.iot.model.v20180120.QueryDeviceDetailResponse;
 import com.aliyuncs.iot.model.v20180120.RegisterDeviceResponse;
 import com.sandu.common.execption.BusinessException;
+import com.sandu.ximon.admin.dto.DeviceStatus;
 import com.sandu.ximon.admin.manager.iot.frame.A1Frame;
 import com.sandu.ximon.admin.manager.iot.frame.A5Frame;
 import com.sandu.ximon.admin.manager.iot.frame.FrameBuilder;
@@ -18,31 +20,49 @@
 import com.sandu.ximon.admin.manager.iot.rrpc.enums.A2OrderEnum;
 import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
 import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
+import com.sandu.ximon.admin.service.PoleService;
+import com.sandu.ximon.admin.service.RoleMenuRelationService;
+import com.sandu.ximon.dao.domain.RoleMenuRelation;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.List;
 
 @SpringBootTest
 @Slf4j
 class BaseTopicTests {
+@Autowired
+    PoleService poleService;
+@Autowired
+    RoleMenuRelationService roleMenuRelationService;
 
 
     // 鏌ヨ璁惧璇︽儏
     @Test
     void queryDeviceDetail() {
-        QueryDeviceDetailResponse.Data data = MainBoardInvokeSyncService.getInstance().queryDeviceDetail("baseDevice", null);
+        QueryDeviceDetailResponse.Data data = MainBoardInvokeSyncService.getInstance().queryDeviceDetail("32313243305007ff8d60ffff", null);
         System.out.println(data.toString());
+
+        List<DeviceStatus> statusList = poleService.listStatusByDeviceCode(CollectionUtil.toList("32313243305008ff0805ffff","32313243305007ff8d60ffff"));
+        System.out.println(statusList);
     }
 
 
     // 鎺у埗鐏殑浜害绾у埆 0-100
     @Test
     void rrpcLightControl() {
+        // 32313243305008ff1a06ffff
         A5LightBrightnessReqInnerFrame lightControlFrame = new A5LightBrightnessReqInnerFrame(80);
         A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_LIGHT_DATA.getCode(), lightControlFrame);
-        WrapResponseCommonFrame<A5LightBrightnessRespInnerFrame> frame = MainBoardInvokeSyncService.getInstance()
-                .sendRRPC("32313243305008ff1a06ffff", a5Frame, A5LightBrightnessRespInnerFrame.class);
-        System.out.println(frame.toString());
+        try {
+            WrapResponseCommonFrame<A5LightBrightnessRespInnerFrame> frame = MainBoardInvokeSyncService.getInstance()
+                    .sendRRPC("32313243305005ff2930ffff", a5Frame, A5LightBrightnessRespInnerFrame.class);
+            System.out.println(frame.toString());
+        }catch (BusinessException e){
+            e.printStackTrace();
+        }
 
     }
 

--
Gitblit v1.9.3