From db23586fd744582cd8ee237c34ff29d9277009ee Mon Sep 17 00:00:00 2001
From: whyclxw <810412026@qq.com>
Date: 星期一, 01 七月 2024 15:45:29 +0800
Subject: [PATCH] 用户管理添加

---
 src/main/java/com/whyc/controller/UserInfController.java      |   65 +
 src/main/java/com/whyc/util/HttpUtil.java                     |   97 ++
 src/main/java/com/whyc/util/JasyptUtils.java                  |   69 +
 src/main/java/com/whyc/mapper/OperationLogMapper.java         |    7 
 src/main/resources/mapper/UserInfMapper.xml                   |   37 +
 src/main/java/com/whyc/util/UserUtil.java                     |   25 
 src/main/resources/config/application-dev.yml                 |   13 
 src/main/java/com/whyc/service/OperationLogService.java       |  136 +++
 src/main/java/com/whyc/properties/PropertiesUtil.java         |   38 +
 src/main/java/com/whyc/config/CaffeineConfig.java             |   89 ++
 src/main/java/com/whyc/constant/YamlProperties.java           |  136 +--
 src/main/java/com/whyc/webSocket/LoginCheckSocket.java        |   92 ++
 pom.xml                                                       |   29 
 src/main/java/com/whyc/service/UserInfService.java            |  227 ++++++
 src/main/java/com/whyc/controller/OperationLogController.java |   31 
 src/main/java/com/whyc/pojo/UserInf.java                      |   46 +
 src/main/java/com/whyc/util/MD5Util.java                      |   47 +
 src/main/java/com/whyc/config/ShiroConfig.java                |  124 +++
 src/main/java/com/whyc/controller/IndexController.java        |   26 
 src/main/java/com/whyc/realm/CustomRealm.java                 |   55 +
 src/main/java/com/whyc/mapper/DocUserMapper.java              |   14 
 src/main/java/com/whyc/controller/LoginController.java        |   44 +
 src/main/java/com/whyc/anotation/Realm.java                   |   20 
 src/main/java/com/whyc/filter/RolesOrAuthorizationFilter.java |   36 +
 src/main/java/com/whyc/constant/OperationLogEnum.java         |   50 +
 src/main/java/com/whyc/mapper/UserInfMapper.java              |   26 
 src/main/resources/config/application-prod.yml                |   21 
 src/main/java/com/whyc/pojo/OperationLog.java                 |   39 +
 src/main/java/com/whyc/util/RSAUtil.java                      |  280 +++++++
 src/main/java/com/whyc/App.java                               |    2 
 src/main/java/com/whyc/service/UserBridgeService.java         |   76 ++
 src/main/java/com/whyc/properties/LinkProperties.java         |  146 ++++
 32 files changed, 2,059 insertions(+), 84 deletions(-)

diff --git a/pom.xml b/pom.xml
index 3dcd92d..80d3fd0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -106,6 +106,33 @@
             <artifactId>druid</artifactId>
             <version>1.1.10</version>
         </dependency>
+        <!--shiro-->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring-boot-web-starter</artifactId>
+            <version>1.5.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.15</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.ulisesbocchio</groupId>
+            <artifactId>jasypt-spring-boot-starter</artifactId>
+            <version>3.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context-support</artifactId>
+            <version>5.3.9</version>
+        </dependency>
+
         <!--<dependency>
             <groupId>org.springframework.plugin</groupId>
             <artifactId>spring-plugin-core</artifactId>
@@ -137,6 +164,8 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
+
+
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/whyc/App.java b/src/main/java/com/whyc/App.java
index 215147f..c4cb99a 100644
--- a/src/main/java/com/whyc/App.java
+++ b/src/main/java/com/whyc/App.java
@@ -16,7 +16,7 @@
 @EnableWebMvc
 @ServletComponentScan(basePackages = {"com.whyc.filter","com.whyc.servlet","com.whyc.listener"})
 @EnableCaching
-public class App extends WebMvcConfigurerAdapter  implements WebMvcConfigurer {
+public class App  {
 
     public static void main(String[] args) {
         SpringApplication.run(App.class, args);
diff --git a/src/main/java/com/whyc/anotation/Realm.java b/src/main/java/com/whyc/anotation/Realm.java
new file mode 100644
index 0000000..0823c2d
--- /dev/null
+++ b/src/main/java/com/whyc/anotation/Realm.java
@@ -0,0 +1,20 @@
+package com.whyc.anotation;
+
+import org.springframework.core.annotation.AliasFor;
+import org.springframework.stereotype.Component;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Component
+public @interface Realm {
+    @AliasFor(
+            annotation = Component.class
+    )
+    String value() default "";
+
+}
diff --git a/src/main/java/com/whyc/config/CaffeineConfig.java b/src/main/java/com/whyc/config/CaffeineConfig.java
new file mode 100644
index 0000000..b785d8e
--- /dev/null
+++ b/src/main/java/com/whyc/config/CaffeineConfig.java
@@ -0,0 +1,89 @@
+package com.whyc.config;
+
+import com.github.benmanes.caffeine.cache.Caffeine;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.caffeine.CaffeineCache;
+import org.springframework.cache.support.SimpleCacheManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import java.util.ArrayList;
+
+/**
+ * Caffeine閰嶇疆
+ */
+@Configuration
+public class CaffeineConfig {
+
+    public static enum Caches{
+        defaultCache(500),
+        defaultCache2Exp(500,24)
+        ;
+
+        Caches() {
+        }
+
+        Caches(int maxSize) {
+            this.maxSize = maxSize;
+        }
+
+        Caches(int maxSize, int ttl) {
+            this.maxSize = maxSize;
+            this.ttl = ttl;
+        }
+
+        private int maxSize;
+        private int ttl;
+
+        public int getMaxSize() {
+            return maxSize;
+        }
+
+        public void setMaxSize(int maxSize) {
+            this.maxSize = maxSize;
+        }
+
+        public int getTtl() {
+            return ttl;
+        }
+
+        public void setTtl(int ttl) {
+            this.ttl = ttl;
+        }
+    }
+
+    @Bean
+    @Primary
+    public CacheManager caffeineCacheManager() {
+        SimpleCacheManager cacheManager = new SimpleCacheManager();
+        ArrayList<CaffeineCache> caffeineCaches = new ArrayList<>();
+
+        for (Caches cache : Caches.values()) {
+            caffeineCaches.add(new CaffeineCache(cache.name(),
+                    Caffeine.newBuilder().recordStats()
+                    .maximumSize(cache.getMaxSize())
+                    .build()
+            ));
+        }
+        cacheManager.setCaches(caffeineCaches);
+        return cacheManager;
+
+    }
+
+    /*@Bean(value = "defaultCache")
+    public Cache<String,Object> defaultCache(){
+        return Caffeine.newBuilder().recordStats()
+                        .maximumSize(Caches.defaultCache.getMaxSize())
+                        .build();
+    }
+
+    @Bean(value = "defaultCache2Exp")
+    public Cache<String,Object> defaultCache2Exp(){
+        return Caffeine.newBuilder().recordStats()
+                        .maximumSize(Caches.defaultCache2Exp.getMaxSize())
+                        .expireAfterWrite(Caches.defaultCache2Exp.ttl, TimeUnit.HOURS)
+                        .build();
+    }*/
+
+}
diff --git a/src/main/java/com/whyc/config/ShiroConfig.java b/src/main/java/com/whyc/config/ShiroConfig.java
new file mode 100644
index 0000000..4323ba8
--- /dev/null
+++ b/src/main/java/com/whyc/config/ShiroConfig.java
@@ -0,0 +1,124 @@
+package com.whyc.config;
+
+import com.whyc.constant.YamlProperties;
+import com.whyc.filter.RolesOrAuthorizationFilter;
+import com.whyc.properties.PropertiesUtil;
+import com.whyc.realm.CustomRealm;
+import org.apache.shiro.session.mgt.SessionManager;
+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.servlet.Cookie;
+import org.apache.shiro.web.servlet.ShiroHttpSession;
+import org.apache.shiro.web.servlet.SimpleCookie;
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.DependsOn;
+
+import javax.servlet.Filter;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏆傛椂鎻愪緵鏉冮檺绠$悊,浼氳瘽绠$悊鍚庣画鏇存柊 TODO
+ */
+@Configuration
+//@Log4j2
+@DependsOn("yamlProperties")
+public class ShiroConfig {
+
+    @Autowired
+    CustomRealm customRealm;
+
+    public SessionManager sessionManager() {
+        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
+        Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
+        cookie.setHttpOnly(false);
+        cookie.setSameSite(Cookie.SameSiteOptions.NONE);
+        cookie.setSecure(true);
+        cookie.setName("MSManager");
+        sessionManager.setSessionIdCookie(cookie);
+        sessionManager.setSessionIdCookieEnabled(true);
+        sessionManager.setSessionIdUrlRewritingEnabled(true);
+
+        return sessionManager;
+    }
+
+
+    /**鏉冮檺绠$悊鍣�*/
+    @Bean(name = "securityManager")
+    public DefaultWebSecurityManager defaultWebSecurityManager(){
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+        securityManager.setRealm(customRealm);
+        if(YamlProperties.runModel == 1){
+            securityManager.setSessionManager(sessionManager());
+        }
+        return securityManager;
+    }
+
+    /**
+     * 淇濊瘉瀹炵幇Shiro鍐呴儴lifecycle鍑芥暟鐨刡ean鎵ц
+     */
+    @Bean(name = "lifecycleBeanPostProcessor")
+    public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor(){
+        return new  LifecycleBeanPostProcessor();
+    }
+
+    /**AOP寮忔柟娉曠骇鏉冮檺妫�楠�*/
+    @Bean
+    @DependsOn("lifecycleBeanPostProcessor")
+    public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
+        DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
+        advisorAutoProxyCreator.setProxyTargetClass(true);
+        return advisorAutoProxyCreator;
+    }
+
+    /**閰嶅悎DefaultAdvisorAutoProxyCreator 娉ㄨВ鏉冮檺鏍¢獙*/
+    @Bean
+    public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(){
+        AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
+        aasa.setSecurityManager(defaultWebSecurityManager());
+        return aasa;
+    }
+
+    /**杩囨护鍣ㄩ摼*/
+    private Map<String, String> filterChainDefinition(){
+        List<Object> list  = PropertiesUtil.propertiesShiro.getKeyList();
+        Map<String, String> map = new LinkedHashMap<>();
+        for (Object object : list) {
+            String key = object.toString();
+            String value = PropertiesUtil.getShiroValue(key);
+            //log.info("璇诲彇闃叉鐩楅摼鎺у埗锛�---key{},---value:{}",key,value);
+            map.put(key, value);
+        }
+        return map;
+    }
+
+    /**鑷畾涔夎繃婊ゅ櫒*/
+    private Map<String, Filter> filters(){
+        HashMap<String, Filter> map = new HashMap<>();
+        map.put("rolesOr",new RolesOrAuthorizationFilter());
+        return map;
+    }
+
+    /**杩囨护鍣�*/
+//    @Bean("shiroFilter")
+    @Bean
+    public ShiroFilterFactoryBean shiroFilterFactoryBean(){
+        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
+        //娉ㄥ叆鏂板畾涔夌殑杩囨护鍣�
+        shiroFilter.setFilters(filters());
+        shiroFilter.setSecurityManager(defaultWebSecurityManager());
+        shiroFilter.setFilterChainDefinitionMap(filterChainDefinition());
+        shiroFilter.setLoginUrl("/login.html");
+        //shiroFilter.setLoginUrl("/index.html#login");
+        shiroFilter.setUnauthorizedUrl("/login/unauthorized");
+        return shiroFilter;
+    }
+}
diff --git a/src/main/java/com/whyc/constant/OperationLogEnum.java b/src/main/java/com/whyc/constant/OperationLogEnum.java
new file mode 100644
index 0000000..4311883
--- /dev/null
+++ b/src/main/java/com/whyc/constant/OperationLogEnum.java
@@ -0,0 +1,50 @@
+package com.whyc.constant;
+
+/**
+ * 瀹¤鏃ュ織/鎿嶄綔鏃ュ織 鎿嶄綔绫诲瀷瀹氫箟
+ */
+public enum OperationLogEnum {
+    TYPE_1_SYS(10,"绯荤粺绾т簨浠�"),
+    TYPE_1_SERVICE(20,"涓氬姟绾т簨浠�"),
+
+    //瀛愮骇鍒�-绯荤粺绾�
+    TYPE_2_LOGIN(101,"鐢ㄦ埛鐧诲綍"),
+    TYPE_2_LOGIN_FAIL(102,"鐢ㄦ埛鐧诲綍澶辫触"),
+    TYPE_2_LOGOUT(103,"鐢ㄦ埛閫�鍑�"),
+    TYPE_2_USER_UPDATE(104,"鐢ㄦ埛淇℃伅淇敼"),
+    TYPE_2_USER_ADD(105,"鐢ㄦ埛淇℃伅澧炲姞"),
+    TYPE_2_USER_DELETE(106,"鐢ㄦ埛淇℃伅鍒犻櫎"),
+    TYPE_2_USER_UPDATE_PASSWORD(107,"瀵嗙爜閲嶇疆"),
+    TYPE_2_UNAUTHORIZED_ACCESS(108,"瓒婃潈璁块棶"),
+    TYPE_2_CONNECTION_TIMEOUT(109,"杩炴帴瓒呮椂"),
+    TYPE_2_EXCEPTION(110,"璋冪敤寮傚父"),
+
+    //瀛愮骇鍒�-涓氬姟绾�
+    TYPE_2_POWER_UPDATE(201,"鐢垫簮璁惧璁剧疆"),
+    TYPE_2_BATTERY_UPDATE(202,"鏍稿璁惧淇℃伅鐩稿叧璁剧疆"),
+    TYPE_2_BATTERY_TEST_PARAM_UPDATE(203,"鏍稿璁惧閬ヨ皟閬ユ帶"),
+    TYPE_2_ALARM(204,"鍛婅鐩稿叧璁剧疆"),
+    TYPE_2_BREAKER(205,"鏂矾鍣ㄤ俊鎭浉鍏虫搷浣�"),
+    TYPE_2_BREAKER_CONTROL(206,"鏂矾鍣ㄦ帶鍒剁浉鍏虫搷浣�"),
+    TYPE_2_GATEWAY(207,"缃戝叧鐩稿叧鎿嶄綔"),
+    TYPE_2_POWER_MODE_CONTROL(208,"鐢垫簮璁惧妯″潡鎺у埗鎿嶄綔"),
+    TYPE_2_POWER_MODE_PARAM(209,"鐢垫簮璁惧妯″潡鍙傛暟鎿嶄綔"),
+
+    ;
+
+    private Integer type;
+    private String name;
+
+    OperationLogEnum(Integer type, String name) {
+        this.type = type;
+        this.name = name;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public String getName() {
+        return name;
+    }
+}
diff --git a/src/main/java/com/whyc/constant/YamlProperties.java b/src/main/java/com/whyc/constant/YamlProperties.java
index 4d17866..b2c8633 100644
--- a/src/main/java/com/whyc/constant/YamlProperties.java
+++ b/src/main/java/com/whyc/constant/YamlProperties.java
@@ -22,41 +22,55 @@
     public static Integer systemType;
 
     /**浜鸿劯璇嗗埆瀵规瘮闃堝��*/
-    public static Float faceThreshold;
+    //public static Float faceThreshold;
 
     /**鍛婅鐭俊寮�鍏�*/
-    public static String messageSwitch;
+   /* public static String messageSwitch;
     public static String messageSecretId;
     public static String messageSecretKey;
     public static String messageRegion;
     public static String messageSdkAppId;
     public static String messageSignName;
-    public static String messageTemplateId;
-    public static String appId4Win;
+    public static String messageTemplateId;*/
+   /* public static String appId4Win;
     public static String sdkKey4Win;
     public static String appId4Linux;
-    public static String sdkKey4Linux;
-    public static String activeKey;
-    public static Integer faceType;
+    public static String sdkKey4Linux;*/
 
     /**鍛婅宸ュ崟寮�鍏�*/
-    public static String alarmTaskSwitch;
+    //public static String alarmTaskSwitch;
 
     /**绯荤粺杩愯妯″紡*/
     public static Integer runModel;
 
-    /**鑷畾涔夊父閲�*/
-    public static String fontDynamicCodeSwitch;
+    /**FTP淇℃伅*/
+    /*public static String ftpIp;
+    public static Integer ftpPort;
+    public static String ftpUserName;
+    public static String ftpPassword;*/
+
+    /*====== 鑷畾涔変俊鎭� ======*/
+
+    /**璺ㄥ煙鐧藉悕鍗�*/
     public static String allowedCORSDomainList;
-    public static String restartPasswd;
-    public static String publicKeyOld;
-    public static String privateKeyOld;
+
     public static String publicKey;
     public static String privateKey;
-    public static String aesDefaultKey;
-    public static String aesIv;
-    public static String i18nLanguage;
 
+    @Value("${custom.rsa.publicKey}")
+    public void setPublicKey(String publicKey) {
+        YamlProperties.publicKey = publicKey;
+    }
+
+    @Value("${custom.rsa.privateKey}")
+    public void setPrivateKey(String privateKey) {
+        YamlProperties.privateKey = privateKey;
+    }
+
+    @Value("${custom.cors}")
+    public void setAllowedCORSDomainList(String allowedCORSDomainList) {
+        YamlProperties.allowedCORSDomainList = allowedCORSDomainList;
+    }
     @Value("${spring.profiles.active}")
     public void setProfileType(String profileType) {
         YamlProperties.profileType = profileType;
@@ -66,23 +80,25 @@
     public void setSystemType(Integer systemType) {
         YamlProperties.systemType = systemType;
     }
-
-    /* @Value("${custom.face.threshold}")
+/*
+    @Value("${custom.face.threshold}")
     private void setFaceThreshold(Float faceThreshold) {
         YamlProperties.faceThreshold = faceThreshold;
-    }
-
-   @Value("${custom.message.switch}")
+    }*/
+/*
+    @Value("${custom.message.switch}")
     private void setMessageSwitch(String messageSwitch) {
         YamlProperties.messageSwitch = messageSwitch;
-    }
+    }*/
+/*
 
     @Value("${custom.message.secret_id}")
     private void setMessageSecretId(String messageSecretId) {
         YamlProperties.messageSecretId = messageSecretId;
     }
+*/
 
-    @Value("${custom.message.secret_key}")
+    /*@Value("${custom.message.secret_key}")
     private void setMessageSecretKey(String messageSecretKey) {
         YamlProperties.messageSecretKey = messageSecretKey;
     }
@@ -105,14 +121,14 @@
     @Value("${custom.message.templateId}")
     private void setMessageTemplateId(String messageTemplateId) {
         YamlProperties.messageTemplateId = messageTemplateId;
-    }
+    }*/
 
-    @Value("${custom.alarm.task.switch}")
+   /* @Value("${custom.alarm.task.switch}")
     private void setAlarmTaskSwitch(String alarmTaskSwitch) {
         YamlProperties.alarmTaskSwitch = alarmTaskSwitch;
     }
-
-    @Value("${custom.face.appId4Win}")
+*/
+    /*@Value("${custom.face.appId4Win}")
     private void setAppId4Win(String appId4Win) {
         YamlProperties.appId4Win = appId4Win;
     }
@@ -130,70 +146,32 @@
     @Value("${custom.face.sdkKey4Linux}")
     private void setSdkKey4Linux(String sdkKey4Linux) {
         YamlProperties.sdkKey4Linux = sdkKey4Linux;
-    }
-
-    @Value("${custom.face.activeKey}")
-    private void setActiveKey(String activeKey) {
-        YamlProperties.activeKey = activeKey;
-    }
-
-    @Value("${custom.face.type}")
-    public void setFaceType(Integer faceType) {
-        YamlProperties.faceType = faceType;
-    }
-*/
-    @Value("${custom.fontDynamicCode}")
-    public void setFontDynamicCodeSwitch(String fontDynamicCodeSwitch) {
-        YamlProperties.fontDynamicCodeSwitch = fontDynamicCodeSwitch;
-    }
+    }*/
 
     @Value("${configFile.type}")
     public void setRunModel(Integer runModel) {
         YamlProperties.runModel = runModel;
     }
 
-    @Value("${custom.cors}")
-    public void setAllowedCORSDomainList(String allowedCORSDomainList) {
-        YamlProperties.allowedCORSDomainList = allowedCORSDomainList;
+    /*@Value("${ftpInforMation.ftpIp}")
+    public void setFtpIp(String ftpIp){
+        YamlProperties.ftpIp=ftpIp;
     }
 
-    @Value("${custom.restartPasswd}")
-    public void setRestartPasswd(String restartPasswd) {
-        YamlProperties.restartPasswd = restartPasswd;
+    @Value("${ftpInforMation.ftpPort}")
+    public void setFtpPort(Integer ftpPort){
+        YamlProperties.ftpPort=ftpPort;
     }
 
-    @Value("${custom.rsa.publicKeyOld}")
-    public void setPublicKeyOld(String publicKeyOld) {
-        YamlProperties.publicKeyOld = publicKeyOld;
+    @Value("${ftpInforMation.ftpUserName}")
+    public void setFtpUserName(String ftpUserName){
+        YamlProperties.ftpUserName=ftpUserName;
     }
 
-    @Value("${custom.rsa.privateKeyOld}")
-    public void setPrivateKeyOld(String privateKeyOld) {
-        YamlProperties.privateKeyOld = privateKeyOld;
-    }
+    @Value("${ftpInforMation.ftpPassword}")
+    public void setFtpPassword(String ftpPassword){
+        YamlProperties.ftpPassword=ftpPassword;
+    }*/
 
-    @Value("${custom.rsa.publicKey}")
-    public void setPublicKey(String publicKey) {
-        YamlProperties.publicKey = publicKey;
-    }
 
-    @Value("${custom.rsa.privateKey}")
-    public void setPrivateKey(String privateKey) {
-        YamlProperties.privateKey = privateKey;
-    }
-
-    @Value("${custom.aes.defaultKey}")
-    public void setAesDefaultKey(String aesDefaultKey) {
-        YamlProperties.aesDefaultKey = aesDefaultKey;
-    }
-
-    @Value("${custom.aes.iv}")
-    public void setAesIv(String aesIv) {
-        YamlProperties.aesIv = aesIv;
-    }
-
-    @Value("${custom.i18n}")
-    public void setI18nLanguage(String i18nLanguage) {
-        YamlProperties.i18nLanguage = i18nLanguage;
-    }
 }
diff --git a/src/main/java/com/whyc/controller/IndexController.java b/src/main/java/com/whyc/controller/IndexController.java
new file mode 100644
index 0000000..f27ed9b
--- /dev/null
+++ b/src/main/java/com/whyc/controller/IndexController.java
@@ -0,0 +1,26 @@
+package com.whyc.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Controller
+@Api(tags = "index")
+public class IndexController {
+
+    @RequestMapping("/")
+    @ApiOperation("榛樿璺宠浆,鏃犻渶璋冪敤")
+    public void index(HttpServletResponse response, HttpServletRequest request){
+        try {
+            response.sendRedirect("/ms/index.html?n="+System.currentTimeMillis());
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/src/main/java/com/whyc/controller/LoginController.java b/src/main/java/com/whyc/controller/LoginController.java
new file mode 100644
index 0000000..59e4e69
--- /dev/null
+++ b/src/main/java/com/whyc/controller/LoginController.java
@@ -0,0 +1,44 @@
+package com.whyc.controller;
+
+
+import com.whyc.dto.Response;
+import com.whyc.pojo.UserInf;
+import com.whyc.service.UserInfService;
+import com.whyc.util.UserUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+@RequestMapping("login")
+@RestController
+@Api(tags = "鐧诲綍")
+public class LoginController {
+
+    @Autowired
+    private UserInfService service;
+
+
+    @PostMapping("login")
+    @ApiOperation(value ="鐧诲綍")
+    public Response login(@RequestParam String uname, String usnId, HttpServletRequest request){
+        return service.login(uname,usnId,request);
+    }
+
+    @ApiOperation(value = "淇敼瀵嗙爜")
+    @GetMapping("changeSnId")
+    public Response changeSnId(@RequestParam String oldSnId,@RequestParam String newSnId){
+        UserInf uinf= UserUtil.getUser();
+        return service.changeSnId(uinf.getUname(),oldSnId,newSnId);
+    }
+
+
+    @PostMapping("logout")
+    @ApiOperation(value ="閫�鍑虹櫥褰�")
+    public void logout(){
+        service.logout();
+    }
+
+}
diff --git a/src/main/java/com/whyc/controller/OperationLogController.java b/src/main/java/com/whyc/controller/OperationLogController.java
new file mode 100644
index 0000000..85cdbeb
--- /dev/null
+++ b/src/main/java/com/whyc/controller/OperationLogController.java
@@ -0,0 +1,31 @@
+package com.whyc.controller;
+
+import com.whyc.dto.Response;
+import com.whyc.pojo.OperationLog;
+import com.whyc.service.OperationLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("operationLog")
+@Api(tags = "鎿嶄綔鏃ュ織")
+public class OperationLogController {
+
+    @Autowired
+    private OperationLogService service;
+
+    @PostMapping("getPage")
+    @ApiOperation("鍒嗛〉-鏌ヨ")
+    public Response getPage(@RequestBody OperationLog param){
+        return service.getPage(param);
+    }
+
+    @GetMapping("getTypes")
+    @ApiOperation("浜嬩欢绫诲瀷-鏌ヨ")
+    public Response getEnumTypes(){
+        return service.getEnumTypes();
+    }
+
+}
diff --git a/src/main/java/com/whyc/controller/UserInfController.java b/src/main/java/com/whyc/controller/UserInfController.java
new file mode 100644
index 0000000..0d4cd72
--- /dev/null
+++ b/src/main/java/com/whyc/controller/UserInfController.java
@@ -0,0 +1,65 @@
+package com.whyc.controller;
+
+import com.whyc.dto.Response;
+import com.whyc.pojo.UserInf;
+import com.whyc.service.UserInfService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@Api(tags = "鐢ㄦ埛绠$悊")
+@RequestMapping("userInf")
+public class UserInfController {
+    @Autowired
+    private UserInfService service;
+
+    @ApiOperation(value = "鏌ヨ鎵�鏈夌敤鎴蜂俊鎭�",notes = "鎺掗櫎uid鍦�100浠ュ唴鐨�(100浠ュ唴榛樿鏄鐞嗗憳)")
+    @GetMapping("getAllUser")
+    public Response getAllUser(@RequestParam int pageCurr, @RequestParam int pageSize){
+        return service.getAllUser(pageCurr,pageSize);
+    }
+
+    @ApiOperation(value = "缂栬緫鐢ㄦ埛鏉冮檺鍜岀敤鎴峰悕")
+    @GetMapping("updateUser")
+    public Response updateUser(@RequestParam int uid,@RequestParam(required = false) String uname,@RequestParam(required = false) int udownloadRole){
+        return service.updateUser(uid,uname,udownloadRole);
+    }
+    @ApiOperation(value = "鏂版坊鍔犵敤鎴蜂俊鎭�")
+    @PostMapping("addUser")
+    public Response addUser(@RequestBody UserInf uinf){
+        return service.addUser(uinf);
+    }
+    @ApiOperation(value = "鍒犻櫎鐢ㄦ埛淇℃伅")
+    @GetMapping("deleteUser")
+    public Response deleteUser(@RequestParam int uid){
+        return service.delUser(uid);
+    }
+
+    @ApiOperation(value = "灏嗙敤鎴锋坊鍔犺嚦100~1000绠$悊鍛�")
+    @GetMapping("improveRole")
+    public Response improveRole(@RequestParam int uid){
+        return service.improveRole(uid);
+    }
+
+    @ApiOperation(value = "灏嗙鐞嗗憳鍙樻垚鏅�氱敤鎴�")
+    @GetMapping("dropRole")
+    public Response dropRole(@RequestParam int uid, HttpServletRequest request){
+        return service.dropRole(uid,request);
+    }
+
+    @GetMapping("getUserNameList")
+    @ApiOperation(tags = "鎿嶄綔鏃ュ織",value = "鎿嶄綔浜哄鍚�-鏌ヨ-鎿嶄綔鏃ュ織浣跨敤")
+    public Response getUserNameList(){
+        return service.getUserNameList();
+    }
+
+    @GetMapping("resetSnId")
+    @ApiOperation(value = "閲嶇疆瀵嗙爜")
+    public Response resetSnId(@RequestParam int uid){
+        return service.resetSnId( uid);
+    }
+}
diff --git a/src/main/java/com/whyc/filter/RolesOrAuthorizationFilter.java b/src/main/java/com/whyc/filter/RolesOrAuthorizationFilter.java
new file mode 100644
index 0000000..71962dc
--- /dev/null
+++ b/src/main/java/com/whyc/filter/RolesOrAuthorizationFilter.java
@@ -0,0 +1,36 @@
+package com.whyc.filter;
+
+import com.whyc.pojo.UserInf;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.util.CollectionUtils;
+import org.apache.shiro.web.filter.authz.AuthorizationFilter;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import java.util.Set;
+
+/**
+ * 鑷畾涔夎繃婊よ鍒�,鍙渶瑕佸寘鍚煇涓鑹�,灏辨巿鏉�
+ */
+public class RolesOrAuthorizationFilter extends AuthorizationFilter {
+    @Override
+    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
+        Subject subject = getSubject(request, response);
+        String[] rolesArray = (String[]) mappedValue;
+
+        if (rolesArray == null || rolesArray.length == 0) {
+            return true;
+        }
+
+        Set<String> roles = CollectionUtils.asSet(rolesArray);
+
+        //鍒ゆ柇涓簅r
+        UserInf user = (UserInf) subject.getPrincipals().getPrimaryPrincipal();
+        for (String role :roles){
+            if (subject.hasRole(role)){
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/src/main/java/com/whyc/mapper/DocUserMapper.java b/src/main/java/com/whyc/mapper/DocUserMapper.java
new file mode 100644
index 0000000..992a4e4
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/DocUserMapper.java
@@ -0,0 +1,14 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.UserInf;
+
+import java.util.List;
+
+public interface DocUserMapper extends CustomMapper<UserInf>{
+    //鏌ヨ鎵�鏈夌敤鎴蜂俊鎭�
+    List<UserInf> getAllUser(UserInf userInf);
+    //鏌ヨ瀵嗙爜
+    String selectSnId(String name);
+    //鏌ヨ鎵�鏈夌敤鎴�(鏉冮檺绠$悊鐢�)
+    List<UserInf> getAllDocUser();
+}
diff --git a/src/main/java/com/whyc/mapper/OperationLogMapper.java b/src/main/java/com/whyc/mapper/OperationLogMapper.java
new file mode 100644
index 0000000..19875e4
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/OperationLogMapper.java
@@ -0,0 +1,7 @@
+package com.whyc.mapper;
+
+import com.whyc.mapper.CustomMapper;
+import com.whyc.pojo.OperationLog;
+
+public interface OperationLogMapper extends CustomMapper<OperationLog> {
+}
diff --git a/src/main/java/com/whyc/mapper/UserInfMapper.java b/src/main/java/com/whyc/mapper/UserInfMapper.java
new file mode 100644
index 0000000..d92a400
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/UserInfMapper.java
@@ -0,0 +1,26 @@
+package com.whyc.mapper;
+
+import com.whyc.mapper.CustomMapper;
+import com.whyc.pojo.UserInf;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface UserInfMapper extends CustomMapper<UserInf> {
+    //鏌ヨ瀵嗙爜
+    String selectSnId(String uname);
+    //鍒ゆ柇鏄惁瀛樺湪鏅�氱敤鎴�(uid>100)锛岃嫢鏃�,鍒濆涓�1001
+    int judgeUname();
+    //鏌ヨ鎵�鏈夌敤鎴蜂俊鎭�
+    List<UserInf> getAllUser();
+    //鏌ヨ100~1000涓渶澶х殑uid
+    String getIn1000();
+    //鍒涘缓100~1000鐨刬d琛�,涓嶅瓨鍦ㄥ垯鍒涘缓
+    void createNumber();
+    //鍒ゆ柇琛ㄦ槸鍚﹀瓨鍦�
+    String existTable();
+    //鎻掑叆榛樿鏁版嵁
+    void setUnumber(@Param("sql") String sql);
+    //鏌ヨ鏈�澶х殑uid
+    String getMaxUid();
+}
diff --git a/src/main/java/com/whyc/pojo/OperationLog.java b/src/main/java/com/whyc/pojo/OperationLog.java
new file mode 100644
index 0000000..4f5070d
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/OperationLog.java
@@ -0,0 +1,39 @@
+package com.whyc.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 瀹¤鏃ュ織/鎿嶄綔鏃ュ織
+ */
+@Data
+@TableName(schema = "db_user",value = "operation_log")
+public class OperationLog {
+
+    private Integer id;
+    private Integer userId;
+    private String userName;
+    private Integer type1;
+    private Integer type2;
+    private String msg;
+    private String detail;
+    private String ip;
+    private Date createTime;
+
+    @TableField(exist = false)
+    private String type1Name;
+    @TableField(exist = false)
+    private String type2Name;
+
+    @TableField(exist = false)
+    private Date startTime;
+    @TableField(exist = false)
+    private Date endTime;
+    @TableField(exist = false)
+    private Integer pageNum;
+    @TableField(exist = false)
+    private Integer pageSize;
+}
diff --git a/src/main/java/com/whyc/pojo/UserInf.java b/src/main/java/com/whyc/pojo/UserInf.java
new file mode 100644
index 0000000..a00de25
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/UserInf.java
@@ -0,0 +1,46 @@
+package com.whyc.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author lxw
+ * @since 2022-07-13
+ */
+@Data
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(schema = "db_user",value = "user_inf")
+@ApiModel(value="User瀵硅薄", description="")
+public class UserInf implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private int uid;
+
+    @ApiModelProperty(value = "rsa鍔犲瘑瀵嗙爜")
+    private String usnid;
+
+    @ApiModelProperty(value = "鐢ㄦ埛鍚�")
+    private String uname;
+
+    @ApiModelProperty(value = "涓嬭浇鏉冮檺")
+    private int udownloadRole;
+
+    public UserInf(int uid, String uname) {
+        this.uid = uid;
+        this.uname = uname;
+    }
+}
diff --git a/src/main/java/com/whyc/properties/LinkProperties.java b/src/main/java/com/whyc/properties/LinkProperties.java
new file mode 100644
index 0000000..96d1ea7
--- /dev/null
+++ b/src/main/java/com/whyc/properties/LinkProperties.java
@@ -0,0 +1,146 @@
+package com.whyc.properties;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * @Description 鏈夊簭Properties绫�
+ */
+
+public class LinkProperties extends Properties{
+
+	/** serialVersionUID */
+	private static final long serialVersionUID = 7573016303908223266L;
+	
+	private List<Object> keyList = new ArrayList<Object>();  
+    
+    /** 
+     * 榛樿鏋勯�犳柟娉� 
+     */  
+    public LinkProperties() {  
+          
+    }  
+      
+    /** 
+     * 浠庢寚瀹氳矾寰勫姞杞戒俊鎭埌Properties 
+     * @param path 
+     */  
+    public LinkProperties(String path) {  
+        try {  
+            InputStream is = new FileInputStream(path);  
+            this.load(is);  
+        } catch (FileNotFoundException e) {  
+            e.printStackTrace();  
+            throw new RuntimeException("鎸囧畾鏂囦欢涓嶅瓨鍦紒");  
+        } catch (IOException e) {  
+            e.printStackTrace();  
+        }  
+    }  
+      
+    /** 
+     * 閲嶅啓put鏂规硶锛屾寜鐓roperty鐨勫瓨鍏ラ『搴忎繚瀛榢ey鍒発eyList锛岄亣鍒伴噸澶嶇殑鍚庤�呭皢瑕嗙洊鍓嶈�呫�� 
+     */  
+    @Override  
+    public synchronized Object put(Object key, Object value) {  
+        this.removeKeyIfExists(key);  
+        keyList.add(key);  
+        return super.put(key, value);  
+    }  
+      
+  
+    /** 
+     * 閲嶅啓remove鏂规硶锛屽垹闄ゅ睘鎬ф椂娓呴櫎keyList涓搴旂殑key銆� 
+     */  
+    @Override  
+    public synchronized Object remove(Object key) {  
+        this.removeKeyIfExists(key);  
+        return super.remove(key);  
+    }  
+      
+    /** 
+     * keyList涓瓨鍦ㄦ寚瀹氱殑key鏃跺垯灏嗗叾鍒犻櫎 
+     */  
+    private void removeKeyIfExists(Object key) {  
+        keyList.remove(key);  
+    }  
+      
+    /** 
+     * 鑾峰彇Properties涓璳ey鐨勬湁搴忛泦鍚� 
+     * @return 
+     */  
+    public List<Object> getKeyList() {  
+        return keyList;  
+    }  
+      
+    /** 
+     * 淇濆瓨Properties鍒版寚瀹氭枃浠讹紝榛樿浣跨敤UTF-8缂栫爜 
+     * @param path 鎸囧畾鏂囦欢璺緞 
+     */  
+    public void store(String path) {  
+        this.store(path, "UTF-8");  
+    }  
+      
+    /** 
+     * 淇濆瓨Properties鍒版寚瀹氭枃浠讹紝骞舵寚瀹氬搴斿瓨鏀剧紪鐮� 
+     * @param path 鎸囧畾璺緞 
+     * @param charset 鏂囦欢缂栫爜 
+     */  
+    public void store(String path, String charset) {  
+        if (path != null && !"".equals(path)) {  
+            try {  
+                OutputStream os = new FileOutputStream(path);  
+                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, charset));  
+                this.store(bw, null);  
+                bw.close();  
+            } catch (FileNotFoundException e) {  
+                e.printStackTrace();  
+            } catch (IOException e) {  
+                e.printStackTrace();  
+            }  
+        } else {  
+            throw new RuntimeException("瀛樺偍璺緞涓嶈兘涓虹┖!");  
+        }  
+    }  
+  
+    /** 
+     * 閲嶅啓keys鏂规硶锛岃繑鍥炴牴鎹甼eyList閫傞厤鐨凟numeration锛屼笖淇濇寔HashTable keys()鏂规硶鐨勫師鏈夎涔夛紝 
+     * 姣忔閮借皟鐢ㄨ繑鍥炰竴涓柊鐨凟numeration瀵硅薄锛屼笖鍜屼箣鍓嶇殑涓嶄骇鐢熷啿绐� 
+     */  
+    @Override  
+    public synchronized Enumeration<Object> keys() {  
+        return new EnumerationAdapter<Object>(keyList);  
+    }  
+      
+    /** 
+     * List鍒癊numeration鐨勯�傞厤鍣� 
+     */  
+    private class EnumerationAdapter<T> implements Enumeration<T> {  
+        private int index = 0;  
+        private final List<T> list;  
+        private final boolean isEmpty;  
+          
+        public EnumerationAdapter(List<T> list) {  
+            this.list = list;  
+            this.isEmpty = list.isEmpty();  
+        }  
+          
+        public boolean hasMoreElements() {  
+            //isEmpty鐨勫紩鍏ユ槸涓轰簡鏇磋创杩慔ashTable鍘熸湁鐨勮涔夛紝鍦℉ashTable涓坊鍔犲厓绱犲墠璋冪敤鍏秌eys()鏂规硶鑾峰緱涓�涓狤numeration鐨勫紩鐢紝  
+            //涔嬪悗寰�HashTable涓坊鍔犳暟鎹悗锛岃皟鐢ㄤ箣鍓嶈幏鍙栧埌鐨凟numeration鐨刪asMoreElements()灏嗚繑鍥瀎alse锛屼絾濡傛灉姝ゆ椂閲嶆柊鑾峰彇涓�涓�  
+            //Enumeration鐨勫紩鐢紝鍒欐柊Enumeration鐨刪asMoreElements()灏嗚繑鍥瀟rue锛岃�屼笖涔嬪悗瀵笻ashTable鏁版嵁鐨勫銆佸垹銆佹敼閮芥槸鍙互鍦�  
+            //nextElement涓幏鍙栧埌鐨勩��  
+            return !isEmpty && index < list.size();  
+        }  
+  
+        public T nextElement() {  
+            if (this.hasMoreElements()) {  
+                return list.get(index++);  
+            }  
+            return null;  
+        }  
+          
+    }  
+}
diff --git a/src/main/java/com/whyc/properties/PropertiesUtil.java b/src/main/java/com/whyc/properties/PropertiesUtil.java
new file mode 100644
index 0000000..caea098
--- /dev/null
+++ b/src/main/java/com/whyc/properties/PropertiesUtil.java
@@ -0,0 +1,38 @@
+package com.whyc.properties;
+
+import lombok.extern.log4j.Log4j2;
+
+/**
+ * @Description 璇诲彇Properties鐨勫伐鍏风被
+ */
+@Log4j2
+public class PropertiesUtil {
+
+    public static LinkProperties propertiesShiro = new LinkProperties();
+
+    /**
+     * 璇诲彇properties閰嶇疆鏂囦欢淇℃伅
+     */
+    static {
+        /*String sysName = System.getProperty("sys.name");
+        if (StringUtils.isEmpty(sysName)) {
+            sysName = "application.properties";
+        } else {
+            sysName += ".properties";
+        }*/
+        try {
+            propertiesShiro.load(PropertiesUtil.class.getClassLoader()
+                    .getResourceAsStream("config/authentication.properties"));
+        } catch (Exception e) {
+            log.warn("璧勬簮璺緞涓笉瀛樺湪authentication.properties鏉冮檺鏂囦欢锛屽拷鐣ヨ鍙栵紒");
+        }
+    }
+
+    /**
+     * 鏍规嵁key寰楀埌value鐨勫��
+     */
+    public static String getShiroValue(String key) {
+        return propertiesShiro.getProperty(key);
+    }
+
+}
diff --git a/src/main/java/com/whyc/realm/CustomRealm.java b/src/main/java/com/whyc/realm/CustomRealm.java
new file mode 100644
index 0000000..ab5abd1
--- /dev/null
+++ b/src/main/java/com/whyc/realm/CustomRealm.java
@@ -0,0 +1,55 @@
+package com.whyc.realm;
+
+import com.whyc.anotation.Realm;
+import com.whyc.pojo.UserInf;
+import com.whyc.service.UserBridgeService;
+import com.whyc.util.RSAUtil;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+
+/**
+ * 瀹為檯澶勭悊璁よ瘉鎺堟潈,璺熸暟鎹簱浜や簰
+ */
+@Realm
+public class CustomRealm extends AuthorizingRealm {
+
+    /**蹇呴』@Lazy娉ㄨВ,@Lazy涓嶡Autowired缁勫悎,浣垮緱渚濊禆浜嶴ervice鐩稿叧鐨凚ean閮芥槸lazy-resolution proxy*/
+    @Lazy
+    @Autowired
+    UserBridgeService userBridgeService;
+
+    /**
+     * 璁よ瘉
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
+        String userName = (String) authenticationToken.getPrincipal();
+        UserInf user = userBridgeService.findPasswordByUserName(userName);
+        if(user.getUid()==0){
+            throw new UnknownAccountException("璐﹀彿涓嶅瓨鍦�");
+        }
+        String password = RSAUtil.decrypt(user.getUsnid(),RSAUtil.getPrivateKey());
+        return new SimpleAuthenticationInfo(user,password,getName());
+    }
+
+    /**
+     * 鎺堟潈
+     */
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
+        UserInf user = (UserInf) principalCollection.getPrimaryPrincipal();
+        return userBridgeService.getAuthorizationInfo(user);
+    }
+
+    /**鍔犲瘑*//*
+    @PostConstruct
+    public void initCredentialsMatcher() {
+        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(SuperConstant.HASH_ALGORITHM_MD5);
+        matcher.setHashIterations(SuperConstant.HASH_INTEGRATIONS_ONE);
+        setCredentialsMatcher(matcher);
+    }*/
+}
diff --git a/src/main/java/com/whyc/service/OperationLogService.java b/src/main/java/com/whyc/service/OperationLogService.java
new file mode 100644
index 0000000..0e3b272
--- /dev/null
+++ b/src/main/java/com/whyc/service/OperationLogService.java
@@ -0,0 +1,136 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.whyc.constant.OperationLogEnum;
+import com.whyc.dto.Response;
+import com.whyc.mapper.OperationLogMapper;
+import com.whyc.pojo.OperationLog;
+import com.whyc.pojo.UserInf;
+import com.whyc.util.HttpUtil;
+import com.whyc.util.UserUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+@Service
+public class OperationLogService {
+
+    @Resource
+    private OperationLogMapper mapper;
+
+
+    public void record(Integer type1, Integer type2, String msg, String detail) {
+        OperationLog log = new OperationLog();
+        UserInf user = UserUtil.getUser();
+        log.setUserId(user.getUid());
+        log.setUserName(user.getUname());
+        log.setType1(type1);
+        log.setType2(type2);
+        log.setMsg(msg);
+        log.setDetail(detail);
+        log.setIp(HttpUtil.getRequest().getRemoteAddr());
+        log.setCreateTime(new Date());
+        mapper.insert(log);
+    }
+
+    public void record(Integer type1, Integer type2, String msg, String detail,String remoteIp) {
+        OperationLog log = new OperationLog();
+        UserInf user = UserUtil.getUser();
+        log.setUserId(user.getUid());
+        log.setUserName(user.getUname());
+        log.setType1(type1);
+        log.setType2(type2);
+        log.setMsg(msg);
+        log.setDetail(detail);
+        log.setIp(remoteIp);
+        log.setCreateTime(new Date());
+        mapper.insert(log);
+    }
+
+
+    public Response getEnumTypes() {
+        Map<OperationLog, List<OperationLog>> map = new HashMap<>();
+        OperationLogEnum[] instances = OperationLogEnum.values();
+        for (OperationLogEnum instance : instances) {
+            Set<OperationLog> type1Logs = map.keySet();
+            //涓や綅鏁颁负涓�绾�,闈炰袱浣嶆暟涓轰簩绾�
+            Integer type = instance.getType();
+            String name = instance.getName();
+            if(type.toString().length() == 2){ //涓�绾�
+                OperationLog log = new OperationLog();
+                log.setType1(type);
+                log.setType1Name(name);
+                map.put(log,new LinkedList<>());
+            }else{ //浜岀骇
+                for (OperationLog type1Log : type1Logs) {
+                    if(type.toString().startsWith(type1Log.getType1().toString())){
+                        List<OperationLog> type2Logs = map.get(type1Log);
+                        OperationLog type2Log = new OperationLog();
+                        type2Log.setType2(type);
+                        type2Log.setType2Name(name);
+                        type2Logs.add(type2Log);
+                    }
+                }
+            }
+        }
+        return new Response().set(1,map);
+    }
+
+    public Response getPage(OperationLog param) {
+        Integer pageNum = param.getPageNum();
+        Integer pageSize = param.getPageSize();
+        PageHelper.startPage(pageNum,pageSize);
+        QueryWrapper<OperationLog> query = Wrappers.query();
+        if(param.getUserName() != null){
+            query.eq("user_name",param.getUserName());
+        }
+        if(param.getType1() != null){
+            query.eq("type1",param.getType1());
+        }
+        if(param.getType2() != null){
+            query.eq("type2",param.getType2());
+        }
+        if(param.getStartTime() != null) {
+            query.ge("create_time", param.getStartTime());
+        }
+        if(param.getEndTime() != null) {
+            query.le("create_time", param.getEndTime());
+        }
+        query.orderByDesc("id");
+        List<OperationLog> operationLogs = mapper.selectList(query);
+        injectTypeName(operationLogs);
+        PageInfo<OperationLog> pageInfo = new PageInfo<>(operationLogs);
+        return new Response().set(1,pageInfo);
+    }
+
+    /**娉ㄥ叆type鍊煎搴旂殑name*/
+    private void injectTypeName(List<OperationLog> operationLogs) {
+        for (OperationLog log : operationLogs) {
+            Integer type1 = log.getType1();
+            Integer type2 = log.getType2();
+
+            Map<OperationLog, List<OperationLog>> logConstantMap = (Map<OperationLog, List<OperationLog>>) getEnumTypes().getData();
+            Set<OperationLog> type1Set = logConstantMap.keySet();
+
+            for (OperationLog temp : type1Set) {
+                if(type1 == temp.getType1().intValue()){
+                    //娉ㄥ叆type1浜嬩欢绫诲瀷
+                    log.setType1Name(temp.getType1Name());
+                    //娉ㄥ叆type2浜嬩欢绫诲瀷
+                    List<OperationLog> type2List = logConstantMap.get(temp);
+                    for (OperationLog temp2 : type2List) {
+                        if(type2 == temp2.getType2().intValue()){
+                            log.setType2Name(temp2.getType2Name());
+                            break;
+                        }
+                    }
+                    break;
+                }
+            }
+        }
+    }
+}
diff --git a/src/main/java/com/whyc/service/UserBridgeService.java b/src/main/java/com/whyc/service/UserBridgeService.java
new file mode 100644
index 0000000..c9e8ed9
--- /dev/null
+++ b/src/main/java/com/whyc/service/UserBridgeService.java
@@ -0,0 +1,76 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.whyc.mapper.DocUserMapper;
+import com.whyc.pojo.UserInf;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.springframework.cache.CacheManager;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 澶勭悊 shiro璁よ瘉,鎺堟潈,鍜屾暟鎹簱浜や簰
+ */
+@Service
+//Unified Naming
+//@CacheConfig(cacheNames ={"userBridge"})
+@DependsOn("caffeineCacheManager")
+public class UserBridgeService {
+
+    @Resource
+    private DocUserMapper userMapper;
+
+    @Resource
+    private CacheManager caffeineCacheManager;
+
+    public UserInf findPasswordByUserName(String userName) {
+        UserInf userInf = null;
+        QueryWrapper<UserInf> queryWrapper = Wrappers.query();
+        queryWrapper.select("uid","uname","usnid","udownload_role").eq("uname",userName);
+        userInf = userMapper.selectOne(queryWrapper);
+
+        return userInf==null?new UserInf(0,"鐢ㄦ埛涓嶅瓨鍦�"):userInf;
+    }
+
+/*    public UserInf findUserByMobilephone(String mobilephone){
+        QueryWrapper<UserInf> queryWrapper = Wrappers.query();
+        queryWrapper.select("uId","uName","upassword","UKey_ID","uRole","uMobilephone").eq("uMobilephone",mobilephone);
+        List<UserInf> list = userMapper.selectList(queryWrapper);
+        return list.size()==0?new UserInf(0,"鐢ㄦ埛涓嶅瓨鍦�"):list.get(0);
+    }*/
+
+    /**
+     * TODO 閲囩敤caffeineCache閲嶅啓
+     * @param user
+     * @return
+     */
+    //@Cacheable(key = "#root.methodName+#p0.id")
+    public AuthorizationInfo getAuthorizationInfo(UserInf user) {
+        System.out.println("=========鎵ц浜哢serBridgeService.getAuthorization鏂规硶==========");
+        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
+        /*//娣诲姞Roles鍜孭ermissions
+        List<String> roles = findRolesByUserId(user.getId());
+        List<String> perms = findPermissionsByUserId(user.getId());
+
+        authorizationInfo.addRoles(roles);
+        authorizationInfo.addStringPermissions(perms);*/
+        return authorizationInfo;
+    }
+
+    private List<String> findPermissionsByUserId(Long userId) {
+       /* List<String> perms = rolePermissionMapper.findPermissionsByUserId(userId);
+        return perms;*/
+       return null;
+    }
+
+    private List<String> findRolesByUserId(Long userId) {
+        //List<String> roles =userRoleMapper.findRolesByUserId(userId);
+        //roles.add("dev");
+        return null;
+    }
+}
diff --git a/src/main/java/com/whyc/service/UserInfService.java b/src/main/java/com/whyc/service/UserInfService.java
new file mode 100644
index 0000000..64a83fa
--- /dev/null
+++ b/src/main/java/com/whyc/service/UserInfService.java
@@ -0,0 +1,227 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.whyc.dto.Response;
+import com.whyc.mapper.UserInfMapper;
+import com.whyc.pojo.UserInf;
+import com.whyc.util.MD5Util;
+import com.whyc.util.RSAUtil;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.UnknownAccountException;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class UserInfService {
+    @Autowired(required = false)
+    private UserInfMapper mapper;
+
+    //鏌ヨ鎵�鏈夌敤鎴蜂俊鎭�
+    public Response getAllUser( int pageCurr, int pageSize) {
+        PageHelper.startPage(pageCurr,pageSize);
+        List<UserInf> list=mapper.getAllUser();
+        PageInfo pageInfo=new PageInfo(list);
+        return new Response().setII(1,list!=null,pageInfo,"鏁版嵁杩斿洖");
+    }
+    //缂栬緫鏉冮檺
+    public Response updateUser(int uid,String uname, int udownloadRole) {
+        UpdateWrapper wrapper=new UpdateWrapper();
+        wrapper.set("udownload_role",udownloadRole);
+        if(uname!=null){
+            wrapper.set("uname",uname);
+        }
+        wrapper.eq("uid",uid);
+        int bl=mapper.update(null,wrapper);
+        return new Response().set(1,bl>0);
+    }
+
+    //鏂版坊鍔犵敤鎴蜂俊鎭�
+    public Response addUser(UserInf uinf) {
+        QueryWrapper wrapper=new QueryWrapper();
+        //鍒ゆ柇鏄惁瀛樺湪鏅�氱敤鎴�(uid>100)锛岃嫢鏃�,鍒濆涓�1001
+        int judgecount=mapper.judgeUname();
+        if(judgecount==0){
+            uinf.setUid(101);
+        }
+        String pwd= RSAUtil.encrypt("123456", RSAUtil.getPublicKey());
+        uinf.setUsnid(pwd);
+        wrapper.eq("uname",uinf.getUname());
+        List list=mapper.selectList(wrapper);
+        if(list!=null&&list.size()>0){
+            return new Response().setII(1,false,list,"鐢ㄦ埛鍚嶅凡瀛樺湪");
+        }
+        int bl=mapper.insert(uinf);
+        return new Response().set(1,bl>0);
+    }
+    //淇敼瀵嗙爜
+    public Response changeSnId(String uname,String oldSnId, String newSnId) {
+        if(uname==null||uname.equals("")){
+            return new Response().set(1,false,"鎵句笉鍒扮敤鎴�");
+        }
+        //楠岃瘉鑰佸瘑鐮佹槸鍚︽纭�
+        String snIdRsa=mapper.selectSnId(uname);
+        //瑙e瘑
+        String snId=RSAUtil.decrypt(snIdRsa,RSAUtil.getPrivateKey());
+        String[] decOld=RSAUtil.decryptFrontP(oldSnId,RSAUtil.fontSeparator);
+        String oldId=decOld[0];
+        String[] newOld=RSAUtil.decryptFrontP(newSnId,RSAUtil.fontSeparator);
+        String newId=newOld[0];
+        if(oldId.equals(snId)){
+            UpdateWrapper wrapper=new UpdateWrapper();
+            wrapper.set("usnid",RSAUtil.encrypt(newId,RSAUtil.getPublicKey()));
+            wrapper.eq("uname",uname);
+            int flag=mapper.update(null,wrapper);
+            return  new Response().set(1,flag>0,flag>0?"淇敼鎴愬姛":"淇敼澶辫触");
+        }else {
+            return new Response().set(1,false,"鍘熷瘑鐮佷笉姝g‘");
+        }
+    }
+    //閲嶇疆瀵嗙爜
+    public Response resetSnId(int uid ) {
+        UpdateWrapper wrapper=new UpdateWrapper();
+        wrapper.set("usnid",RSAUtil.encrypt("123456",RSAUtil.getPublicKey()));
+        wrapper.eq("uid",uid);
+        int flag=mapper.update(null,wrapper);
+        return  new Response().set(1,flag>0,flag>0?"淇敼鎴愬姛":"淇敼澶辫触");
+
+    }
+    //鍒犻櫎鐢ㄦ埛淇℃伅
+    public Response delUser(int uid) {
+        UpdateWrapper wrapper=new UpdateWrapper();
+        wrapper.eq("uid",uid);
+        int bl=mapper.delete(wrapper);
+        return new Response().setII(1,bl>0,bl,"鍒犻櫎杩斿洖");
+    }
+
+    public Response login(String uname, String usnId, HttpServletRequest request) {
+        Response response = new Response();
+        String[] dataArr = RSAUtil.decryptFrontP(usnId, RSAUtil.fontSeparator);
+        //楠岀md5
+        if(dataArr[0]==null||dataArr[1]==null){
+            return response.set(1, false, "瀵嗙爜楠岀澶辫触");
+        }
+        if (!dataArr[1].equals(MD5Util.encryptMD5(org.apache.commons.lang3.StringUtils.trim(dataArr[0])))) {
+            return response.set(1, false, "瀵嗙爜楠岀澶辫触");
+        }
+        UsernamePasswordToken userToken = new UsernamePasswordToken(uname, dataArr[0]);
+        Subject subject = SecurityUtils.getSubject();
+        try {
+            subject.login(userToken);
+        } catch (Exception e) {
+            if(e instanceof UnknownAccountException){
+                return response.set(1,false,"璐﹀彿涓嶅瓨鍦�");
+            }
+            return response.set(1,false,"瀵嗙爜閿欒");
+        }
+        //鐧诲綍鎴愬姛
+        ServletContext servletContext = request.getServletContext();
+        servletContext.setAttribute(uname, request.getSession().getId());
+        //Session瀛樺偍褰撳墠鐢ㄦ埛鍙婃潈闄愮粍鍒楄〃
+        UserInf userDB = (UserInf) subject.getPrincipal();
+        userDB.setUsnid(null);
+        request.getSession().setAttribute("user", userDB);
+        return response.setII(1,true, userDB,"鐧诲綍鎴愬姛");
+    }
+
+    public void logout() {
+        Subject subject = SecurityUtils.getSubject();
+        subject.logout();
+    }
+    //灏嗙敤鎴锋坊鍔犺嚦100~1000绠$悊鍛�
+    public Response improveRole(int uid) {
+        //鍒ゆ柇琛ㄦ槸鍚﹀瓨鍦�
+        String tableName = mapper.existTable();
+        if(tableName==null){
+            ///鍒涘缓100~1000鐨刬d琛�,涓嶅瓨鍦ㄥ垯鍒涘缓
+            mapper.createNumber();
+            //鎻掑叆榛樿鏁版嵁
+            String sql=" INSERT INTO db_user.temp_numbers(unumber) " +
+                    " VALUES ";
+            for(int i=101;i<=1000;i++){
+                sql+="("+i+")";
+                if(i!=1000){
+                    sql+=",";
+                }
+            }
+            mapper.setUnumber(sql);
+        }
+        String minUid=mapper.getIn1000();
+        if(minUid==null){
+            return new Response().set(1,false,"绠$悊鍛樹釜鏁拌秴杩囦笂闄�");
+        }
+        UpdateWrapper wrapper =new UpdateWrapper();
+        wrapper.set("uid",Integer.valueOf(minUid));
+        wrapper.eq("uid",Integer.valueOf(uid));
+        int flag= mapper.update(null,wrapper);
+        return new Response().set(1,flag>0,flag>0?"韬唤鍙樻洿鎴愬姛":"韬唤鍙樻洿澶辫触");
+    }
+    //灏嗙鐞嗗憳鍙樻垚鏅�氱敤鎴�
+    public Response dropRole(int uid, HttpServletRequest request) {
+        //鏌ヨ鏈�澶х殑uid
+        String maxUid=mapper.getMaxUid();
+        if(maxUid==null){
+            maxUid="1001";
+        }
+        //鏍规嵁鐢ㄦ埛id鏌ヨ鐢ㄦ埛淇℃伅
+        QueryWrapper qWrapper=new QueryWrapper();
+        qWrapper.eq("uid",uid);
+        qWrapper.last("limit 1");
+        UserInf uinf=mapper.selectOne(qWrapper);
+        //缂栬緫
+        UpdateWrapper wrapper =new UpdateWrapper();
+        wrapper.set("uid",Integer.valueOf(maxUid)+1);
+        wrapper.eq("uid",uid);
+        int flag= mapper.update(null,wrapper);
+        //濡傛灉鏄櫘閫氱敤鎴疯嚜宸卞己閫�锛屽皢鐢ㄦ埛鍚嶅搴旂殑sessionId鍙樻洿
+        ServletContext servletContext = request.getServletContext();
+        servletContext.setAttribute(uinf.getUname(),"123456");
+        return new Response().set(1,flag>0,flag>0?"韬唤鍙樻洿鎴愬姛":"韬唤鍙樻洿澶辫触");
+    }
+
+    public Response getUserNameList() {
+        QueryWrapper<UserInf> query = Wrappers.query();
+        query.select("uname");
+        List<String> userNameList = mapper.selectList(query).stream().map(UserInf::getUname).collect(Collectors.toList());
+        return new Response().set(1,userNameList);
+    }
+
+    //鐧诲綍妫�娴�
+    public Response checkUserWebSocket(HttpSession httpSession){
+        Response model = new Response();
+        try {
+            UserInf user = (UserInf) httpSession.getAttribute("user");
+            if(user!=null){
+                String sessionId = (String) httpSession.getServletContext().getAttribute(user.getUname());
+                if(httpSession.getId().equals(sessionId)){
+                    model.set(1,user,null);
+                }else{
+                    if(sessionId.equals("123456")){
+                        model.set(1,false,"韬唤鏉冮檺鍙樻洿,璇烽噸鏂扮櫥褰�");
+                    }else{
+                        model.set(1,false,"涓嶅悓涓绘満鐧诲綍");
+                    }
+                    //鐢ㄦ埛鍦ㄥ叾浠栦富鏈虹櫥褰�,寮鸿揩鐢ㄦ埛鍦ㄦ湰鏈虹殑session澶辨晥
+                    httpSession.invalidate();
+                }
+            }
+            else {
+                model.set(1,false,"鐢ㄦ埛淇℃伅澶辨晥,璇烽噸鏂扮櫥褰�");
+            }
+        }catch (Exception e){
+            model.set(1,false,"鐧诲綍淇℃伅澶辨晥,閲嶆柊鐧诲綍");
+        }
+        return model;
+    }
+}
diff --git a/src/main/java/com/whyc/util/HttpUtil.java b/src/main/java/com/whyc/util/HttpUtil.java
new file mode 100644
index 0000000..b3f9f8d
--- /dev/null
+++ b/src/main/java/com/whyc/util/HttpUtil.java
@@ -0,0 +1,97 @@
+package com.whyc.util;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonSyntaxException;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.lang.reflect.Type;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class HttpUtil {
+
+	/*
+	 * 鑾峰彇HttpServletRequest
+	 */
+	public static HttpServletRequest getRequest(){
+		ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+		HttpServletRequest request = requestAttributes.getRequest();
+		return request;
+	}
+	
+	/*
+	 * 鑾峰彇HttpServletResponse
+	 */
+	public static HttpServletResponse getResponse(){
+		ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+		HttpServletResponse response = requestAttributes.getResponse();
+		return response;
+	}
+	
+	/*
+	 * 鑾峰彇HttpSession
+	 */
+	public static HttpSession getSession(){
+		return getRequest().getSession();
+	} 
+	
+	/**
+	 * 
+	 * @return	杩斿洖application
+	 */
+	public static ServletContext getApplication(){
+		return getSession().getServletContext();
+	}
+
+	/*
+	 * 鑾峰彇灏嗗璞¤浆鎹㈡垚json鏍煎紡
+	 */
+	public static String toJson(Object obj){
+		Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
+		return gson.toJson(obj);
+	}
+	
+	public static String chageDateToString(Date time,String type){
+		String msg = "";
+		SimpleDateFormat sdf = new SimpleDateFormat(type);
+		msg = sdf.format(time);
+		return msg;
+	}
+
+	
+	/**
+	 * 
+	 * @param datetype	闇�瑕佽В鏋愮殑鏃ユ湡鐨勬牸寮忓锛�"yyyy-MM-dd HH:mm:ss"
+	 * @return	寰楀埌瀵瑰簲鐨刧son瀵硅薄
+	 */
+	public static Gson getGson(String datetype){
+		return new  GsonBuilder().setDateFormat(datetype).create();
+	}
+	
+	/**
+	 * 鑾峰彇榛樿鐨刧son瀵硅薄
+	 * @return
+	 */
+	public static Gson getGson(){
+		return new Gson();
+	}
+	
+	
+	public static <T> T getObject(String jsonstring,Type listtype){
+		Gson gson=new Gson();
+		T t=null;
+		try {
+			t=gson.fromJson(jsonstring, listtype);
+		} catch (JsonSyntaxException e) {
+			e.printStackTrace();
+		}
+		return t;
+	}
+
+}	
diff --git a/src/main/java/com/whyc/util/JasyptUtils.java b/src/main/java/com/whyc/util/JasyptUtils.java
new file mode 100644
index 0000000..6fe1249
--- /dev/null
+++ b/src/main/java/com/whyc/util/JasyptUtils.java
@@ -0,0 +1,69 @@
+package com.whyc.util;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.jasypt.properties.PropertyValueEncryptionUtils;
+import org.jasypt.util.text.BasicTextEncryptor;
+
+import java.util.Objects;
+
+@Slf4j
+public final class JasyptUtils {
+
+    public static void main(String[] args) {
+        //String a = encrypt("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");
+        //String a = encrypt("MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAI+kneP5IdDr2Wqr5KFXt14DjRj7ytitrquvhF44n5QTt6Ty2wkmtzLXEw7VKimEl0ddfBI1tlaGclb0aUirVSboimWTAVz8C3Kh4kM/cQm1RmAjkfp9LPQE8sUefXwLQ3HPUGvXT1TTsOpB0yxqtwGYpdhDD7ahk7PQqkDlvQVrAgMBAAECgYA8ASdX4W2n6a4kKnRSleLqqg8aHazqAPvTinmAJqU65VW02SJ42yxyV3gFnTSErXfIfxviO3/U+0ruWiFVEwV5oDEh0dOd+HHGm4YzFXIRglMeRBgLuVJ+owzoVDwZstiIBa69DIjaJtmpSf5FjwxAth+gtCv3e11IXHraKN720QJBAMPMB1WtmpRGYHxWVYjKSL+RGw+h3gMQLk3exZjhmYRlXuqfVZ2Zol+NazDc59K5f+geMdJ0/X2kKnKLVjWzYHMCQQC7z1cFYswtLemxGfj+dwlVC01VL4pKa7HGHl/FAQ2UNYZY2d5hE/nXYbTpfI0gMowX926/aFpia7NbAUJO7WEpAkAyUFa+LJthaOhYazMVsK2bFKW4kabkcJ8Fga6TR73UaNxIPGOa2SUBmuylpM6ptuNoeYHiDBAr3ijOQIIJ0KuDAkBy9fPahCNe9F+73J4hhVPdDtIDdto7u7hSAX215XMeabUW5iXNXqDsSg6nbWolb0t50CemWoYZALwE1Lx1+7AhAkEAoZtFt+2skjAxHEqNUye4vKBqB2Ng/wmfitCfT34lXWQsxs4BGk/8eQMzkam9bcB7FcinolxHF/1UjsUYpI+AgA==");
+        String a = encrypt("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPpJ3j+SHQ69lqq+ShV7deA40Y+8rYra6rr4ReOJ+UE7ek8tsJJrcy1xMO1SophJdHXXwSNbZWhnJW9GlIq1Um6IplkwFc/AtyoeJDP3EJtUZgI5H6fSz0BPLFHn18C0Nxz1Br109U07DqQdMsarcBmKXYQw+2oZOz0KpA5b0FawIDAQAB");
+        decrypt(a);
+
+    }
+
+    /**
+     * 鍔犲瘑浣跨敤瀵嗛挜
+     */
+    //private static final String PRIVATE_KEY = "hELEEWWEEr9Lu6HgEvttjj8vYhy3ID+PqPbumuXhcHhe";
+
+    private static BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();
+
+    static {
+        basicTextEncryptor.setPassword(Objects.requireNonNull(RSAUtil.decrypt("DF3lSrjXSHClZgQzagH0D038z1gCoG+FcZLPMZ93Ucz1MeNCN+J5iawqQKzMXusXPuHeygfuLSajiCNi8ad2F7H7lpL9FhzjH+2Q9d9d1H2xRe+ElHh0SC8aT4FHgrazhx73wn2MlxX8SIm2PvC8oBLXbM+7KQ4r5bNwiQl0uUOC7D9ONbYzQAy8zCkCBke+h4Q6b5SlGaGz2OswKJPe7Wjpsf/3hnUKV6KP+ACYfFry9Nq13Wb3nsPfjuMnwsmUe8sRxj77pIVmrbEIMaO12GJMJbErA0/1ZjfPkzH3YFZe/mmSOmHegM/jiXnnPemh+LRyZGrKF3Y19B8Cl1EMxp106ss8/7ypYiFn0XWb7gRQqfuqQ8zsU0lOWxCWuk2jyWKxBdftt3edDzmoROHJfllHRffgPZ/MPYg6C6JqBXz7Xqngb0mClwt7OQVSvTau+NdTlMoYdcULOTZqa8IJi4rtUMMnVdhj0Avpl6ekXBPeVcvWsqTpGoep5T0yQJ9M")));
+    }
+
+    /**
+     * 绉佹湁鏋勯�犳柟娉曪紝闃叉琚剰澶栧疄渚嬪寲
+     */
+    private JasyptUtils() {
+    }
+
+    /**
+     * 鏄庢枃鍔犲瘑
+     *
+     * @param plaintext 鏄庢枃
+     * @return String
+     */
+    public static String encrypt(String plaintext) {
+        log.info("鏄庢枃瀛楃涓蹭负锛歿}", plaintext);
+        // 浣跨敤鐨勫姞瀵嗙畻娉曞弬鑰�2.2鑺傚唴瀹癸紝涔熷彲浠ュ湪婧愮爜鐨勭被娉ㄩ噴涓湅鍒�
+        String ciphertext = basicTextEncryptor.encrypt(plaintext);
+        log.info("瀵嗘枃瀛楃涓蹭负锛歿}", ciphertext);
+        return ciphertext;
+    }
+
+    /**
+     * 瑙e瘑
+     *
+     * @param ciphertext 瀵嗘枃
+     * @return String
+     */
+    public static String decrypt(String ciphertext) {
+        log.info("瀵嗘枃瀛楃涓蹭负锛歿}", ciphertext);
+        ciphertext = "ENC(" + ciphertext + ")";
+        if (PropertyValueEncryptionUtils.isEncryptedValue(ciphertext)) {
+            String plaintext = PropertyValueEncryptionUtils.decrypt(ciphertext, basicTextEncryptor);
+            log.info("鏄庢枃瀛楃涓蹭负锛歿}", plaintext);
+            return plaintext;
+        }
+        log.error("瑙e瘑澶辫触锛�");
+        return "";
+    }
+}
diff --git a/src/main/java/com/whyc/util/MD5Util.java b/src/main/java/com/whyc/util/MD5Util.java
new file mode 100644
index 0000000..0dc3d03
--- /dev/null
+++ b/src/main/java/com/whyc/util/MD5Util.java
@@ -0,0 +1,47 @@
+package com.whyc.util;
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+public class MD5Util {
+
+    /**鍔犲瘑*/
+    public static String encryptMD5(String data){
+        String result=null;
+        if(data!=null && data.length()>0){
+            result= DigestUtils.md5Hex(data);
+        }
+        return result;
+    }
+
+    /**
+     * 浣跨敤timestamp+鐩愭柟寮�,杩涜绛惧悕楠岃瘉
+     * 褰撳墠鏃堕棿鎴充负13浣嶆暟
+     */
+    public static boolean checkSignMD5(String time,String randomStr,String sign){
+        String usefulNum = randomStr;
+        //鍔犵洂鏂瑰紡,鏍规嵁鏈熬鐨勫�艰繘琛屼笉鍚岀殑鍔犲瘑瑙勫垯
+        char lastChar = time.charAt(12);
+        int lastNum = Integer.parseInt(String.valueOf(lastChar));
+        switch (lastNum){
+            //鍦ㄧ涓�浣嶅姞瀛楃涓� rd@c3doed
+            case 0: usefulNum += time.replace(String.valueOf(lastChar),"rd@c3dozero");break;
+            case 1: usefulNum += time.replace(String.valueOf(lastChar),"rd@c3doenoe");break;
+            case 2: usefulNum += time.replace(String.valueOf(lastChar),"rd@c3doktwo");break;
+            case 3: usefulNum += time.replace(String.valueOf(lastChar),"rd@c3dolthree");break;
+            case 4: usefulNum += time.replace(String.valueOf(lastChar),"rd@c3doexfour");break;
+            case 5: usefulNum += time.replace(String.valueOf(lastChar),"rd@c3doedefive");break;
+            case 6: usefulNum += time.replace(String.valueOf(lastChar),"rd@c3doedhsix");break;
+            case 7: usefulNum += time.replace(String.valueOf(lastChar),"rd@c3doedtseven");break;
+            case 8: usefulNum += time.replace(String.valueOf(lastChar),"rd@c3doedbeight");break;
+            case 9: usefulNum += time.replace(String.valueOf(lastChar),"rd@c3doedrnine");break;
+        }
+        //MD5鍔犲瘑鍚�
+        String signNow = encryptMD5(usefulNum);
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < 10; i++) {
+            sb.append(signNow.charAt(i * 2));
+        }
+        String signResult = sb.append(signNow).toString();
+        return sign.equals(signResult);
+    }
+}
diff --git a/src/main/java/com/whyc/util/RSAUtil.java b/src/main/java/com/whyc/util/RSAUtil.java
new file mode 100644
index 0000000..14bda4b
--- /dev/null
+++ b/src/main/java/com/whyc/util/RSAUtil.java
@@ -0,0 +1,280 @@
+package com.whyc.util;
+
+import com.whyc.constant.YamlProperties;
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.security.*;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.LinkedList;
+import java.util.List;
+
+public class RSAUtil {
+
+    /**
+     * 鍥哄畾鍏閽�
+     */
+    private static final  String publicKey = YamlProperties.publicKey;
+    private static final  String privateKey = YamlProperties.privateKey;
+    /**
+     * RSA鏈�澶у姞瀵嗘槑鏂囧ぇ灏�
+     */
+    private static final int MAX_ENCRYPT_BLOCK = 117;
+    /**
+     * RSA鏈�澶цВ瀵嗗瘑鏂囧ぇ灏�
+     */
+    private static final int MAX_DECRYPT_BLOCK = 384;
+
+    public static final String fontSeparator = "&&&&&&&&&&";
+    /**
+     * 鑾峰彇瀵嗛挜瀵�
+     *
+     * @return 瀵嗛挜瀵�
+     */
+    public static List<String> getKeyPair() throws Exception {
+        LinkedList<String> list = new LinkedList<>();
+        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
+        generator.initialize(3072);
+        KeyPair keyPair = generator.generateKeyPair();
+        String publicKey = Base64.encodeBase64String(keyPair.getPublic().getEncoded());
+        String privateKey = Base64.encodeBase64String(keyPair.getPrivate().getEncoded());
+        System.out.println("鍏挜:"+publicKey);
+        System.out.println("绉侀挜:"+privateKey);
+        list.add(publicKey);
+        list.add(privateKey);
+        return list;
+    }
+    /**
+     * 鑾峰彇绉侀挜
+     *
+     * @param privateKey 绉侀挜瀛楃涓�
+     * @return
+     */
+    public static PrivateKey getPrivateKey(String privateKey) {
+        try {
+            KeyFactory keyFactory = null;
+            keyFactory = KeyFactory.getInstance("RSA");
+
+            byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());
+            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
+            return keyFactory.generatePrivate(keySpec);
+        }catch (NoSuchAlgorithmException | InvalidKeySpecException e){
+            return null;
+        }
+    }
+
+    /**
+     * 鑾峰彇绉侀挜
+     *
+     * @return
+     */
+    public static PrivateKey getPrivateKey() {
+        try {
+            KeyFactory keyFactory = null;
+            keyFactory = KeyFactory.getInstance("RSA");
+
+            byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());
+            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
+            return keyFactory.generatePrivate(keySpec);
+        }catch (NoSuchAlgorithmException | InvalidKeySpecException e){
+            return null;
+        }
+    }
+    /**
+     * 鑾峰彇鍏挜
+     *
+     * @param publicKey 鍏挜瀛楃涓�
+     * @return
+     */
+    public static PublicKey getPublicKey(String publicKey) throws Exception {
+        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+        byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes());
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);
+        return keyFactory.generatePublic(keySpec);
+    }
+
+    /**
+     * 鑾峰彇鍏挜
+     *
+     * @return
+     */
+    public static PublicKey getPublicKey(){
+        try {
+            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+            byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes());
+            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);
+            return keyFactory.generatePublic(keySpec);
+        }catch (Exception e){
+            return null;
+        }
+    }
+
+    /**
+     * RSA鍔犲瘑
+     *
+     * @param data 寰呭姞瀵嗘暟鎹�
+     * @param publicKey 鍏挜
+     * @return
+     */
+    public static String encrypt(String data, PublicKey publicKey) {
+        try {
+            Cipher cipher = Cipher.getInstance("RSA");
+            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+            int inputLen = data.getBytes().length;
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            int offset = 0;
+            byte[] cache;
+            int i = 0;
+            // 瀵规暟鎹垎娈靛姞瀵�
+            while (inputLen - offset > 0) {
+                if (inputLen - offset > MAX_ENCRYPT_BLOCK) {
+                    cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offset = i * MAX_ENCRYPT_BLOCK;
+            }
+            byte[] encryptedData = out.toByteArray();
+            out.close();
+            // 鑾峰彇鍔犲瘑鍐呭浣跨敤base64杩涜缂栫爜,骞朵互UTF-8涓烘爣鍑嗚浆鍖栨垚瀛楃涓�
+            // 鍔犲瘑鍚庣殑瀛楃涓�
+            return new String(Base64.encodeBase64String(encryptedData));
+        }catch (Exception e){
+            return null;
+        }
+    }
+    /**
+     * RSA瑙e瘑
+     *
+     * @param data 寰呰В瀵嗘暟鎹�
+     * @param privateKey 绉侀挜
+     * @return
+     */
+    public static String decrypt(String data, PrivateKey privateKey) {
+        try {
+            Cipher cipher = Cipher.getInstance("RSA");
+            cipher.init(Cipher.DECRYPT_MODE, privateKey);
+            byte[] dataBytes = Base64.decodeBase64(data);
+            int inputLen = dataBytes.length;
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            int offset = 0;
+            byte[] cache;
+            int i = 0;
+            // 瀵规暟鎹垎娈佃В瀵�
+            while (inputLen - offset > 0) {
+                if (inputLen - offset > MAX_DECRYPT_BLOCK) {
+                    cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offset = i * MAX_DECRYPT_BLOCK;
+            }
+            byte[] decryptedData = out.toByteArray();
+            out.close();
+            // 瑙e瘑鍚庣殑鍐呭
+            return new String(decryptedData, "UTF-8");
+        }catch (Exception e){
+            return null;
+        }
+    }
+    /**
+     * RSA瑙e瘑
+     *
+     * @param data 寰呰В瀵嗘暟鎹�
+     * @return
+     */
+    public static String decrypt(String data) {
+        try {
+            Cipher cipher = Cipher.getInstance("RSA");
+            cipher.init(Cipher.DECRYPT_MODE, getPrivateKey());
+            byte[] dataBytes = Base64.decodeBase64(data);
+            int inputLen = dataBytes.length;
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            int offset = 0;
+            byte[] cache;
+            int i = 0;
+            // 瀵规暟鎹垎娈佃В瀵�
+            while (inputLen - offset > 0) {
+                if (inputLen - offset > MAX_DECRYPT_BLOCK) {
+                    cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offset = i * MAX_DECRYPT_BLOCK;
+            }
+            byte[] decryptedData = out.toByteArray();
+            out.close();
+            // 瑙e瘑鍚庣殑鍐呭
+            return new String(decryptedData, "UTF-8");
+        }catch (Exception e){
+            return null;
+        }
+    }
+
+    /**
+     * 鍓嶇鍔犲瘑鏁版嵁RSA[鏄庢枃+MD5(鏄庢枃)]瑙e瘑涓烘槑鏂囧拰MD5[鏄庢枃]
+     * @param frontEncryptData
+     * @return
+     */
+    public static String[] decryptFront(String frontEncryptData,String separatorStr){
+        String[] dataArr = new String[2];
+        String dataMD5Mix = RSAUtil.decrypt(frontEncryptData, RSAUtil.getPrivateKey());
+        int index = dataMD5Mix.lastIndexOf(separatorStr);
+        String data = dataMD5Mix.substring(0, index);
+        String dataMD5 = dataMD5Mix.substring(index+separatorStr.length());
+        dataArr[0] = data;
+        dataArr[1] = dataMD5;
+        return dataArr;
+    }
+
+    /**
+     * 鍏圲RL瑙g爜,鍐嶈繘琛屽瘑鏂囪В鏋怺rsa(鏄庢枃+md5)]
+     */
+    public static String[] decryptFrontP(String frontEncryptData,String separatorStr){
+        try {
+            frontEncryptData = URLDecoder.decode(frontEncryptData, "utf-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        String[] dataArr = new String[2];
+        String dataMD5Mix = RSAUtil.decrypt(frontEncryptData, RSAUtil.getPrivateKey());
+        if(dataMD5Mix!=null){
+            int index = dataMD5Mix.lastIndexOf(separatorStr);
+            String data = dataMD5Mix.substring(0, index);
+            String dataMD5 = dataMD5Mix.substring(index+separatorStr.length());
+            dataArr[0] = data;
+            dataArr[1] = dataMD5;
+        }
+        return dataArr;
+    }
+
+    public static void main(String[] args) {
+        try {
+            //String word = "123456";
+            //String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPpJ3j+SHQ69lqq+ShV7deA40Y+8rYra6rr4ReOJ+UE7ek8tsJJrcy1xMO1SophJdHXXwSNbZWhnJW9GlIq1Um6IplkwFc/AtyoeJDP3EJtUZgI5H6fSz0BPLFHn18C0Nxz1Br109U07DqQdMsarcBmKXYQw+2oZOz0KpA5b0FawIDAQAB";
+            //String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAI+kneP5IdDr2Wqr5KFXt14DjRj7ytitrquvhF44n5QTt6Ty2wkmtzLXEw7VKimEl0ddfBI1tlaGclb0aUirVSboimWTAVz8C3Kh4kM/cQm1RmAjkfp9LPQE8sUefXwLQ3HPUGvXT1TTsOpB0yxqtwGYpdhDD7ahk7PQqkDlvQVrAgMBAAECgYA8ASdX4W2n6a4kKnRSleLqqg8aHazqAPvTinmAJqU65VW02SJ42yxyV3gFnTSErXfIfxviO3/U+0ruWiFVEwV5oDEh0dOd+HHGm4YzFXIRglMeRBgLuVJ+owzoVDwZstiIBa69DIjaJtmpSf5FjwxAth+gtCv3e11IXHraKN720QJBAMPMB1WtmpRGYHxWVYjKSL+RGw+h3gMQLk3exZjhmYRlXuqfVZ2Zol+NazDc59K5f+geMdJ0/X2kKnKLVjWzYHMCQQC7z1cFYswtLemxGfj+dwlVC01VL4pKa7HGHl/FAQ2UNYZY2d5hE/nXYbTpfI0gMowX926/aFpia7NbAUJO7WEpAkAyUFa+LJthaOhYazMVsK2bFKW4kabkcJ8Fga6TR73UaNxIPGOa2SUBmuylpM6ptuNoeYHiDBAr3ijOQIIJ0KuDAkBy9fPahCNe9F+73J4hhVPdDtIDdto7u7hSAX215XMeabUW5iXNXqDsSg6nbWolb0t50CemWoYZALwE1Lx1+7AhAkEAoZtFt+2skjAxHEqNUye4vKBqB2Ng/wmfitCfT34lXWQsxs4BGk/8eQMzkam9bcB7FcinolxHF/1UjsUYpI+AgA==";
+
+            //List<String> keyPair = getKeyPair();
+            //String encryptWord = encrypt(word, getPublicKey(keyPair.get(0)));
+            //System.out.println("鍔犲瘑鍚庣殑瀛楃涓�:"+encryptWord);
+
+            //String encryptWord = "NTDEt29l3QqDjgbK5AToix14GQNMi2qPDgsIy7JQf0586wEhOr6LgQ3YuZo9gEYLgmRxdOtxTcVCMugIJnXr6xukoopYfdH7epnQlszMYcM73a7mOrI1DJQA8%2B7AnMkm0s3X3GR7CdpT2OHrdogOAywFWhBirETaeY36ZH%2FOrXQ%3D";
+            //encryptWord=URLDecoder.decode(encryptWord, "utf-8");
+            String encrypt = encrypt("hELEEWWEEr9Lu6HgEvttjj8vYhy3ID+PqPbumuXhcHhe", getPublicKey());
+            System.out.println(encrypt);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/java/com/whyc/util/UserUtil.java b/src/main/java/com/whyc/util/UserUtil.java
new file mode 100644
index 0000000..0cd574b
--- /dev/null
+++ b/src/main/java/com/whyc/util/UserUtil.java
@@ -0,0 +1,25 @@
+package com.whyc.util;
+
+
+import com.whyc.pojo.UserInf;
+import org.apache.shiro.SecurityUtils;
+
+/**
+ * 浠嶴hiro涓洿鎺ヨ幏鍙栫敤鎴蜂俊鎭�
+ */
+public class UserUtil {
+
+    public static UserInf getUser(){
+
+        UserInf principal = (UserInf) SecurityUtils.getSubject().getPrincipal();
+        if(principal == null){
+            UserInf user = new UserInf();
+            user.setUname("unlogged user");
+            user.setUid(0);
+            user.setUdownloadRole(0);
+            return user;
+        }else {
+            return principal;
+        }
+    }
+}
diff --git a/src/main/java/com/whyc/webSocket/LoginCheckSocket.java b/src/main/java/com/whyc/webSocket/LoginCheckSocket.java
new file mode 100644
index 0000000..9a5d48e
--- /dev/null
+++ b/src/main/java/com/whyc/webSocket/LoginCheckSocket.java
@@ -0,0 +1,92 @@
+package com.whyc.webSocket;
+
+import com.whyc.config.WebSocketConfig;
+import com.whyc.dto.Response;
+import com.whyc.service.UserInfService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpSession;
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 璐﹀彿閲嶅鐧诲綍妫�鏌�
+ */
+@Component
+@ServerEndpoint(value = "/loginCheck",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
+public class LoginCheckSocket {
+
+    private Session session;
+
+    private Thread thread;
+    private static UserInfService uinfService;
+
+    @Autowired
+    public void setLoginService(UserInfService uinfService) {
+        LoginCheckSocket.uinfService = uinfService;
+    }
+
+    @OnOpen
+    public void onOpen(Session session, EndpointConfig config){
+        this.session = session;
+        HttpSession httpSession = (HttpSession) config.getUserProperties().get("httpSession");
+        if(httpSession == null){
+            Map<String, Response> res = new HashMap<>();
+            Response resp1 = new Response().set(1, false, "鐧诲綍淇℃伅澶辨晥,閲嶆柊鐧诲綍");
+            res.put("checkLogin", resp1);
+            try {
+                session.getBasicRemote().sendObject(new Response().set(1,res));
+            } catch (IOException | EncodeException e) {
+                e.printStackTrace();
+            }
+        }else {
+            Thread thread = new Thread() {
+                @Override
+                public void run() {
+                    try {
+                        Map<String, Response> res = new HashMap<>();
+                        Response sessionRes = new Response().set(1, httpSession.getId());
+                        while (!currentThread().isInterrupted()) {
+                            Response response = uinfService.checkUserWebSocket(httpSession);
+                            res.put("checkLogin", response);
+                            res.put("session", sessionRes);
+                            session.getBasicRemote().sendObject(new Response().set(1, res));
+                            if (response.getData() instanceof Boolean) {
+                                if(response.getData().equals(false)) {
+                                    this.interrupt();
+                                }
+                            }
+                            sleep(4000);
+                        }
+                    } catch (Exception e) {
+                        this.interrupt();
+                    }
+                }
+            };
+            thread.start();
+            this.thread = thread;
+        }
+    }
+
+    @OnClose
+    public void onClose(CloseReason closeReason) throws IOException {
+        System.err.println("closeReason = " + closeReason);
+        if(session.isOpen()){
+            session.close();
+        }
+    }
+
+    @OnError
+    public void onError(Throwable error) throws IOException {
+        error.printStackTrace();
+        thread.isInterrupted();
+        if(session.isOpen()){
+            session.close();
+        }
+    }
+
+}
diff --git a/src/main/resources/config/application-dev.yml b/src/main/resources/config/application-dev.yml
index 6ec5b1d..8c932f1 100644
--- a/src/main/resources/config/application-dev.yml
+++ b/src/main/resources/config/application-dev.yml
@@ -74,6 +74,11 @@
   community: public
   retries: 1
   timeout: 5000
+jasypt:
+  encryptor:
+    password: hELEEWWEEr9Lu6HgEvttjj8vYhy3ID+PqPbumuXhcHhe
+    algorithm: PBEWithMD5AndDES
+    iv-generator-classname: org.jasypt.iv.NoIvGenerator
 custom:
   #鐧诲綍楠岃瘉鐮� on/off
   fontDynamicCode: on
@@ -82,10 +87,10 @@
   #閲嶅惎瀵嗙爜
   restartPasswd: ENC(AKxTGQo6bAABeC62B8Dtxw==)
   rsa:
-    publicKeyOld: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPpJ3j+SHQ69lqq+ShV7deA40Y+8rYra6rr4ReOJ+UE7ek8tsJJrcy1xMO1SophJdHXXwSNbZWhnJW9GlIq1Um6IplkwFc/AtyoeJDP3EJtUZgI5H6fSz0BPLFHn18C0Nxz1Br109U07DqQdMsarcBmKXYQw+2oZOz0KpA5b0FawIDAQAB
-    privateKeyOld: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAI+kneP5IdDr2Wqr5KFXt14DjRj7ytitrquvhF44n5QTt6Ty2wkmtzLXEw7VKimEl0ddfBI1tlaGclb0aUirVSboimWTAVz8C3Kh4kM/cQm1RmAjkfp9LPQE8sUefXwLQ3HPUGvXT1TTsOpB0yxqtwGYpdhDD7ahk7PQqkDlvQVrAgMBAAECgYA8ASdX4W2n6a4kKnRSleLqqg8aHazqAPvTinmAJqU65VW02SJ42yxyV3gFnTSErXfIfxviO3/U+0ruWiFVEwV5oDEh0dOd+HHGm4YzFXIRglMeRBgLuVJ+owzoVDwZstiIBa69DIjaJtmpSf5FjwxAth+gtCv3e11IXHraKN720QJBAMPMB1WtmpRGYHxWVYjKSL+RGw+h3gMQLk3exZjhmYRlXuqfVZ2Zol+NazDc59K5f+geMdJ0/X2kKnKLVjWzYHMCQQC7z1cFYswtLemxGfj+dwlVC01VL4pKa7HGHl/FAQ2UNYZY2d5hE/nXYbTpfI0gMowX926/aFpia7NbAUJO7WEpAkAyUFa+LJthaOhYazMVsK2bFKW4kabkcJ8Fga6TR73UaNxIPGOa2SUBmuylpM6ptuNoeYHiDBAr3ijOQIIJ0KuDAkBy9fPahCNe9F+73J4hhVPdDtIDdto7u7hSAX215XMeabUW5iXNXqDsSg6nbWolb0t50CemWoYZALwE1Lx1+7AhAkEAoZtFt+2skjAxHEqNUye4vKBqB2Ng/wmfitCfT34lXWQsxs4BGk/8eQMzkam9bcB7FcinolxHF/1UjsUYpI+AgA==
-    publicKey: MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAu7CdCMIoWXUX584JpmE1bTE1r1MtmZGswsSbsm4s9zqETQ4BmUT2kz/wvvGsI8T3ZvTT4KIyKP4Ez+yNVejMM5XwR95KF4e3UwMc724buWKl4pVL09kvkCZt8ZKf359VAvhyHHz80wIiVmJs6xbho7OBsv/s7Hwho0n4HPL4u/eNR5vWa2rtgQG1+fi1XP0UiSRKKW15Va9R2CI3zB+sffquhyX5fi+06NibWzk7OPU+EGvAwkaJtrmfLAvpwr4+G0MBLIsPVFV17Sgpoj62rtfbhHwmLSo1JTw+/JskDQOjxXfw+w3uHAZgPTlEmn2Ya9ssIljqCBfvM9nbGUWcnmppKlPm6kECa4RsgPiRgPFV+nT/Q98kfUTb798Sy63x4NIZkLQn1DDbmcAgUqLR6y1r0fD8Ne3vVtuZlVR/8ZlcRAfb+th2cNN0rytrnUreJo7kPtTFdkNtmj0KdUkRO8ea0YymEQal+b0tCl3V8osSy+qO2OVRd7yCvpOWEYOBAgMBAAE=
-    privateKey: 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
+    #publicKeyOld: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPpJ3j+SHQ69lqq+ShV7deA40Y+8rYra6rr4ReOJ+UE7ek8tsJJrcy1xMO1SophJdHXXwSNbZWhnJW9GlIq1Um6IplkwFc/AtyoeJDP3EJtUZgI5H6fSz0BPLFHn18C0Nxz1Br109U07DqQdMsarcBmKXYQw+2oZOz0KpA5b0FawIDAQAB
+    #privateKeyOld: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAI+kneP5IdDr2Wqr5KFXt14DjRj7ytitrquvhF44n5QTt6Ty2wkmtzLXEw7VKimEl0ddfBI1tlaGclb0aUirVSboimWTAVz8C3Kh4kM/cQm1RmAjkfp9LPQE8sUefXwLQ3HPUGvXT1TTsOpB0yxqtwGYpdhDD7ahk7PQqkDlvQVrAgMBAAECgYA8ASdX4W2n6a4kKnRSleLqqg8aHazqAPvTinmAJqU65VW02SJ42yxyV3gFnTSErXfIfxviO3/U+0ruWiFVEwV5oDEh0dOd+HHGm4YzFXIRglMeRBgLuVJ+owzoVDwZstiIBa69DIjaJtmpSf5FjwxAth+gtCv3e11IXHraKN720QJBAMPMB1WtmpRGYHxWVYjKSL+RGw+h3gMQLk3exZjhmYRlXuqfVZ2Zol+NazDc59K5f+geMdJ0/X2kKnKLVjWzYHMCQQC7z1cFYswtLemxGfj+dwlVC01VL4pKa7HGHl/FAQ2UNYZY2d5hE/nXYbTpfI0gMowX926/aFpia7NbAUJO7WEpAkAyUFa+LJthaOhYazMVsK2bFKW4kabkcJ8Fga6TR73UaNxIPGOa2SUBmuylpM6ptuNoeYHiDBAr3ijOQIIJ0KuDAkBy9fPahCNe9F+73J4hhVPdDtIDdto7u7hSAX215XMeabUW5iXNXqDsSg6nbWolb0t50CemWoYZALwE1Lx1+7AhAkEAoZtFt+2skjAxHEqNUye4vKBqB2Ng/wmfitCfT34lXWQsxs4BGk/8eQMzkam9bcB7FcinolxHF/1UjsUYpI+AgA==
+    publicKey: ENC(QR8EpIC0jzG2E29Dhtq/vqrwt99WtUix/h2J8OvD90w0fosfUM1EFpdHJ2nsdP84BOeVNoPmudqXCYWVeCuTrVkqfb2z8mMLDl8cry78P8Tu4il3m9hGxqjdeNJbdYA6z6eRaInoJj5BHUyNpAJDaNacMZoOUJU6lMySwujyrD8PfSY97St0XPL5GIFP9rP1FCnlVWBeH4tqZKZ6MGncYJaITUZ/BIPkhpDYxi+i4CnMIBqytCJ6OJCzjLBI44UsQOzsdLgppAE2O0fmgyXA6bh0VRdIaRhqDIrjur2e4sOEvjadORN0Kg==)
+    privateKey: ENC(fDshYRxHSlpJ2v+CmDGzH/PlFIKr9+hcPg0patE+nOFMKQaEVNLj9XxOlGEDFabSLFvy1imSRmOF08EE/z9cmlsp+hfbF6feR6YABRHgDxOGWusZ9QKYLhv6vDD6pebKb2W3FCuIHnLicMiJfzpM5KGylTMv7rvtM7tFR8ZhDzn3s8uYotz6ORcfCPdgOcUcNHXT0WS2KA0NigsRH5YMF5IOCP2jNTaOFDDXYacjfGOwjFIGE71BMJCnMRp6RnukbAY1ZN3J88GpYRzYCYD/S9DbGFVY9giH0T7FZs5cgPsCoDZ1dIeJhmjbOxoQpwKoDZzvlYbsstMH+6wApaWgx9TJfBoNjEJdqM1S3asukV4bUq4cZnmryCeSWSYkR2FDuH792rXL3Msh2Jc2hB2Cg9ZPB5hljN5GWV0fYiKNjJW2ovgBZZRWURorkrfBReKsxuLcHlbBcdHBF9DZDJyy40fg9GP6w40uG3hBKd/OlA9IYWNWEgqgeMkNmesG9RTc4X7EG2Ar4MEDa1p6o3unIve/zTCpLoFzKCRIjYcqlW1pZfSwZD4wu6JJf+5tUoXaEEf5YD4dcWCD4DzUcv4qhOpHXDBtM3E45VdacMWZNdE7fXcDzWpgYdUSQ88HsXRjmaW0O/x5irdN5KGa89yj5bDYQeMzR7Cervxml3MUZSrkHVKsa9yWverlLaRXzTue3+MXgDudm1stHju5p2x55GWG9ZfcErDoTNqhgPwcbJnW7/vXFpoTt6AF3t8vbD7f5G+FXnvYLDUWtdNS8KN6X+EOkh4GWootC+QMEKArDr8AyL+5D2TkBGIDMAag/LVwAKSwvBs2+e/xsSlw+AuAsWcfb9whJCZNVogpA1jE56SIdIBtw4G4Lw9LMlJ2MprkV6e2VAtBwpou3fd5pUsKpu51WBfISRy60vls7Fu0mQXrT7cCzThptrk9KgIhjMtiI2jf6YpultF1+Hg5+IK863wKpiNmJbxmA+AOc171LVmNlqiSdDp2fptfIgaI5IMcLMJj8zvY2gghAGoRrchpSkteTLc48om87Duw1gR5lAZjUYzNON9wETte9bfUvQ6/ZkQE3rjEUY6TfyokKJf4X/0ZxKFz0YzkcHDXBaPefrIWxQGygeTsy0kZO7UKpYZo)
   aes:
     defaultKey: ENC(KdXXhvt6v7BDw7MgsR4J1OgahZgjl3kEil10+147oGA=)
     iv: ENC(Gtzf6s+BRoC1iQsRLMswSlBDSMom0kWtx5+SMJgaVDg=)
diff --git a/src/main/resources/config/application-prod.yml b/src/main/resources/config/application-prod.yml
index 51d5fc7..63f1b1c 100644
--- a/src/main/resources/config/application-prod.yml
+++ b/src/main/resources/config/application-prod.yml
@@ -62,4 +62,25 @@
   community: public
   retries: 1
   timeout: 5000
+jasypt:
+  encryptor:
+    password: hELEEWWEEr9Lu6HgEvttjj8vYhy3ID+PqPbumuXhcHhe
+    algorithm: PBEWithMD5AndDES
+    iv-generator-classname: org.jasypt.iv.NoIvGenerator
+custom:
+  #鐧诲綍楠岃瘉鐮� on/off
+  fontDynamicCode: on
+  #鍏佽璺ㄥ煙鐨勭櫧鍚嶅崟 http://192.168.10.132:8080,http://192.168.10.109:8080
+  cors: http://localhost:8080,http://192.168.10.114:8080,,http://192.168.10.86:8080
+  #閲嶅惎瀵嗙爜
+  restartPasswd: ENC(AKxTGQo6bAABeC62B8Dtxw==)
+  rsa:
+    #publicKeyOld: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPpJ3j+SHQ69lqq+ShV7deA40Y+8rYra6rr4ReOJ+UE7ek8tsJJrcy1xMO1SophJdHXXwSNbZWhnJW9GlIq1Um6IplkwFc/AtyoeJDP3EJtUZgI5H6fSz0BPLFHn18C0Nxz1Br109U07DqQdMsarcBmKXYQw+2oZOz0KpA5b0FawIDAQAB
+    #privateKeyOld: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAI+kneP5IdDr2Wqr5KFXt14DjRj7ytitrquvhF44n5QTt6Ty2wkmtzLXEw7VKimEl0ddfBI1tlaGclb0aUirVSboimWTAVz8C3Kh4kM/cQm1RmAjkfp9LPQE8sUefXwLQ3HPUGvXT1TTsOpB0yxqtwGYpdhDD7ahk7PQqkDlvQVrAgMBAAECgYA8ASdX4W2n6a4kKnRSleLqqg8aHazqAPvTinmAJqU65VW02SJ42yxyV3gFnTSErXfIfxviO3/U+0ruWiFVEwV5oDEh0dOd+HHGm4YzFXIRglMeRBgLuVJ+owzoVDwZstiIBa69DIjaJtmpSf5FjwxAth+gtCv3e11IXHraKN720QJBAMPMB1WtmpRGYHxWVYjKSL+RGw+h3gMQLk3exZjhmYRlXuqfVZ2Zol+NazDc59K5f+geMdJ0/X2kKnKLVjWzYHMCQQC7z1cFYswtLemxGfj+dwlVC01VL4pKa7HGHl/FAQ2UNYZY2d5hE/nXYbTpfI0gMowX926/aFpia7NbAUJO7WEpAkAyUFa+LJthaOhYazMVsK2bFKW4kabkcJ8Fga6TR73UaNxIPGOa2SUBmuylpM6ptuNoeYHiDBAr3ijOQIIJ0KuDAkBy9fPahCNe9F+73J4hhVPdDtIDdto7u7hSAX215XMeabUW5iXNXqDsSg6nbWolb0t50CemWoYZALwE1Lx1+7AhAkEAoZtFt+2skjAxHEqNUye4vKBqB2Ng/wmfitCfT34lXWQsxs4BGk/8eQMzkam9bcB7FcinolxHF/1UjsUYpI+AgA==
+    publicKey: ENC(QR8EpIC0jzG2E29Dhtq/vqrwt99WtUix/h2J8OvD90w0fosfUM1EFpdHJ2nsdP84BOeVNoPmudqXCYWVeCuTrVkqfb2z8mMLDl8cry78P8Tu4il3m9hGxqjdeNJbdYA6z6eRaInoJj5BHUyNpAJDaNacMZoOUJU6lMySwujyrD8PfSY97St0XPL5GIFP9rP1FCnlVWBeH4tqZKZ6MGncYJaITUZ/BIPkhpDYxi+i4CnMIBqytCJ6OJCzjLBI44UsQOzsdLgppAE2O0fmgyXA6bh0VRdIaRhqDIrjur2e4sOEvjadORN0Kg==)
+    privateKey: ENC(fDshYRxHSlpJ2v+CmDGzH/PlFIKr9+hcPg0patE+nOFMKQaEVNLj9XxOlGEDFabSLFvy1imSRmOF08EE/z9cmlsp+hfbF6feR6YABRHgDxOGWusZ9QKYLhv6vDD6pebKb2W3FCuIHnLicMiJfzpM5KGylTMv7rvtM7tFR8ZhDzn3s8uYotz6ORcfCPdgOcUcNHXT0WS2KA0NigsRH5YMF5IOCP2jNTaOFDDXYacjfGOwjFIGE71BMJCnMRp6RnukbAY1ZN3J88GpYRzYCYD/S9DbGFVY9giH0T7FZs5cgPsCoDZ1dIeJhmjbOxoQpwKoDZzvlYbsstMH+6wApaWgx9TJfBoNjEJdqM1S3asukV4bUq4cZnmryCeSWSYkR2FDuH792rXL3Msh2Jc2hB2Cg9ZPB5hljN5GWV0fYiKNjJW2ovgBZZRWURorkrfBReKsxuLcHlbBcdHBF9DZDJyy40fg9GP6w40uG3hBKd/OlA9IYWNWEgqgeMkNmesG9RTc4X7EG2Ar4MEDa1p6o3unIve/zTCpLoFzKCRIjYcqlW1pZfSwZD4wu6JJf+5tUoXaEEf5YD4dcWCD4DzUcv4qhOpHXDBtM3E45VdacMWZNdE7fXcDzWpgYdUSQ88HsXRjmaW0O/x5irdN5KGa89yj5bDYQeMzR7Cervxml3MUZSrkHVKsa9yWverlLaRXzTue3+MXgDudm1stHju5p2x55GWG9ZfcErDoTNqhgPwcbJnW7/vXFpoTt6AF3t8vbD7f5G+FXnvYLDUWtdNS8KN6X+EOkh4GWootC+QMEKArDr8AyL+5D2TkBGIDMAag/LVwAKSwvBs2+e/xsSlw+AuAsWcfb9whJCZNVogpA1jE56SIdIBtw4G4Lw9LMlJ2MprkV6e2VAtBwpou3fd5pUsKpu51WBfISRy60vls7Fu0mQXrT7cCzThptrk9KgIhjMtiI2jf6YpultF1+Hg5+IK863wKpiNmJbxmA+AOc171LVmNlqiSdDp2fptfIgaI5IMcLMJj8zvY2gghAGoRrchpSkteTLc48om87Duw1gR5lAZjUYzNON9wETte9bfUvQ6/ZkQE3rjEUY6TfyokKJf4X/0ZxKFz0YzkcHDXBaPefrIWxQGygeTsy0kZO7UKpYZo)
+  aes:
+    defaultKey: ENC(KdXXhvt6v7BDw7MgsR4J1OgahZgjl3kEil10+147oGA=)
+    iv: ENC(Gtzf6s+BRoC1iQsRLMswSlBDSMom0kWtx5+SMJgaVDg=)
+  i18n: zh-CN
 
diff --git a/src/main/resources/mapper/UserInfMapper.xml b/src/main/resources/mapper/UserInfMapper.xml
new file mode 100644
index 0000000..53d112d
--- /dev/null
+++ b/src/main/resources/mapper/UserInfMapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.whyc.mapper.UserInfMapper">
+    <update id="createNumber">
+        CREATE TABLE if not exists db_user.temp_numbers (unumber INT);
+    </update>
+    <update id="setUnumber">
+        ${sql}
+    </update>
+    <select id="existTable" resultType="java.lang.String">
+        select
+            DISTINCT table_name
+        from information_schema.tables
+        where table_name = 'temp_numbers'
+          and TABLE_SCHEMA = 'db_user'
+    </select>
+
+    <select id="selectSnId" resultType="java.lang.String">
+        select usnid from db_user.user_inf where uname=#{uname} limit 1
+    </select>
+    <select id="judgeUname" resultType="java.lang.Integer">
+        select count(*) from  db_user.user_inf where uid>100
+    </select>
+    <select id="getAllUser" resultType="UserInf">
+        select uid,uname,udownload_role from db_user.user_inf where uid>100
+    </select>
+    <select id="getIn1000" resultType="java.lang.String">
+        SELECT min(unumber)
+        FROM db_user.temp_numbers t
+        WHERE t.unumber NOT IN (SELECT uid FROM db_user.user_inf);
+    </select>
+    <select id="getMaxUid" resultType="java.lang.String">
+        SELECT max(uid)
+        FROM db_user.user_inf  where uid>1000
+    </select>
+
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1