Преглед на файлове

add 同步ruoyi 新增缓存列表菜单功能

疯狂的狮子li преди 2 години
родител
ревизия
c33aa5c969
променени са 31 файла, в които са добавени 581 реда и са изтрити 146 реда
  1. 3 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
  2. 67 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
  3. 3 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
  4. 36 36
      ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java
  5. 49 0
      ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
  6. 0 45
      ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
  7. 32 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java
  8. 2 2
      ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java
  9. 5 5
      ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java
  10. 54 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/SysCache.java
  11. 4 3
      ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java
  12. 2 1
      ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java
  13. 3 3
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
  14. 2 2
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
  15. 3 3
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
  16. 48 0
      ruoyi-ui/src/api/monitor/cache.js
  17. 2 0
      ruoyi-ui/src/assets/icons/svg/redis-list.svg
  18. 11 11
      ruoyi-ui/src/views/monitor/cache/index.vue
  19. 241 0
      ruoyi-ui/src/views/monitor/cache/list.vue
  20. 2 1
      ruoyi-ui/src/views/system/dict/data.vue
  21. 1 0
      ruoyi-ui/vue.config.js
  22. 1 0
      script/sql/oracle/oracle_ry_vue_4.X.sql
  23. 1 0
      script/sql/postgres/postgres_ry_vue_4.X.sql
  24. 1 0
      script/sql/ry_vue_4.X.sql
  25. 2 0
      script/sql/sqlserver/sqlserver_ry_vue_4.X.sql
  26. 1 0
      script/sql/update/oracle/update-4.2-4.3.sql
  27. 1 0
      script/sql/update/postgres/update-4.2-4.3.sql
  28. 1 26
      script/sql/update/sqlserver/update-4.1-4.2.sql
  29. 1 0
      script/sql/update/sqlserver/update-4.2-4.3.sql
  30. 2 0
      script/sql/update/update-4.2-4.3.sql
  31. 0 0
      sql/ry_20220613.sql

+ 3 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java

@@ -6,6 +6,7 @@ import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.RandomUtil;
 import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.CaptchaType;
@@ -60,7 +61,7 @@ public class CaptchaController {
         if (smsProperties.getEnabled()) {
             R.fail("当前系统没有开启短信功能!");
         }
-        String key = Constants.CAPTCHA_CODE_KEY + phonenumber;
+        String key = CacheConstants.CAPTCHA_CODE_KEY + phonenumber;
         String code = RandomUtil.randomNumbers(4);
         RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
         // 验证码模板id 自行处理 (查数据库或写死均可)
@@ -90,7 +91,7 @@ public class CaptchaController {
         }
         // 保存验证码信息
         String uuid = IdUtil.simpleUUID();
-        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
+        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
         // 生成验证码
         CaptchaType captchaType = captchaProperties.getType();
         boolean isMath = CaptchaType.MATH == captchaType;

+ 67 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java

@@ -1,17 +1,17 @@
 package com.ruoyi.web.controller.monitor;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.domain.SysCache;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.data.redis.connection.RedisServerCommands;
 import org.springframework.data.redis.core.RedisCallback;
 import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
 
@@ -28,6 +28,19 @@ public class CacheController {
 
     private final RedisTemplate<String, String> redisTemplate;
 
+    private final static List<SysCache> CACHES = new ArrayList<>();
+
+    static {
+        CACHES.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
+        CACHES.add(new SysCache(CacheConstants.ONLINE_TOKEN_KEY, "在线用户"));
+        CACHES.add(new SysCache(CacheConstants.LOGIN_ERROR, "登陆错误"));
+        CACHES.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
+        CACHES.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
+        CACHES.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
+        CACHES.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
+        CACHES.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
+    }
+
     @ApiOperation("获取缓存监控详细信息")
     @SaCheckPermission("monitor:cache:list")
     @GetMapping()
@@ -53,4 +66,55 @@ public class CacheController {
         result.put("commandStats", pieList);
         return R.ok(result);
     }
+
+    @ApiOperation("获取缓存名称列表")
+    @SaCheckPermission("monitor:cache:list")
+    @GetMapping("/getNames")
+    public R<List<SysCache>> cache() {
+        return R.ok(CACHES);
+    }
+
+    @ApiOperation("获取KEYS基于缓存名")
+    @SaCheckPermission("monitor:cache:list")
+    @GetMapping("/getKeys/{cacheName}")
+    public R<Set<String>> getCacheKeys(@PathVariable String cacheName) {
+        Set<String> cacheKyes = redisTemplate.keys(cacheName + "*");
+        return R.ok(cacheKyes);
+    }
+
+    @ApiOperation("获取值基于缓存名与KEY")
+    @SaCheckPermission("monitor:cache:list")
+    @GetMapping("/getValue/{cacheName}/{cacheKey}")
+    public R<SysCache> getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) {
+        String cacheValue = redisTemplate.opsForValue().get(cacheKey);
+        SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue);
+        return R.ok(sysCache);
+    }
+
+    @ApiOperation("清空缓存名")
+    @SaCheckPermission("monitor:cache:list")
+    @DeleteMapping("/clearCacheName/{cacheName}")
+    public R<Void> clearCacheName(@PathVariable String cacheName) {
+        Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
+        redisTemplate.delete(cacheKeys);
+        return R.ok();
+    }
+
+    @ApiOperation("清空缓存KEY")
+    @SaCheckPermission("monitor:cache:list")
+    @DeleteMapping("/clearCacheKey/{cacheKey}")
+    public R<Void> clearCacheKey(@PathVariable String cacheKey) {
+        redisTemplate.delete(cacheKey);
+        return R.ok();
+    }
+
+    @ApiOperation("清空所有缓存")
+    @SaCheckPermission("monitor:cache:list")
+    @DeleteMapping("/clearCacheAll")
+    public R<Void> clearCacheAll() {
+        Collection<String> cacheKeys = redisTemplate.keys("*");
+        redisTemplate.delete(cacheKeys);
+        return R.ok();
+    }
+
 }

+ 3 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java

@@ -5,7 +5,7 @@ import cn.dev33.satoken.exception.NotLoginException;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.domain.dto.UserOnlineDTO;
@@ -43,12 +43,12 @@ public class SysUserOnlineController extends BaseController {
         List<String> keys = StpUtil.searchTokenValue("", -1, 0);
         List<UserOnlineDTO> userOnlineDTOList = new ArrayList<>();
         for (String key : keys) {
-            String token = key.replace(Constants.LOGIN_TOKEN_KEY, "");
+            String token = key.replace(CacheConstants.LOGIN_TOKEN_KEY, "");
             // 如果已经过期则踢下线
             if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < 0) {
                 continue;
             }
-            userOnlineDTOList.add(RedisUtils.getCacheObject(Constants.ONLINE_TOKEN_KEY + token));
+            userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token));
         }
         if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) {
             userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline ->

+ 36 - 36
ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java

@@ -1,36 +1,36 @@
-package com.ruoyi.common.annotation;
-
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.enums.LimitType;
-
-import java.lang.annotation.*;
-
-/**
- * 限流注解
- *
- * @author Lion Li
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface RateLimiter {
-    /**
-     * 限流key
-     */
-    String key() default Constants.RATE_LIMIT_KEY;
-
-    /**
-     * 限流时间,单位秒
-     */
-    int time() default 60;
-
-    /**
-     * 限流次数
-     */
-    int count() default 100;
-
-    /**
-     * 限流类型
-     */
-    LimitType limitType() default LimitType.DEFAULT;
-}
+package com.ruoyi.common.annotation;
+
+import com.ruoyi.common.constant.CacheConstants;
+import com.ruoyi.common.enums.LimitType;
+
+import java.lang.annotation.*;
+
+/**
+ * 限流注解
+ *
+ * @author Lion Li
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface RateLimiter {
+    /**
+     * 限流key
+     */
+    String key() default CacheConstants.RATE_LIMIT_KEY;
+
+    /**
+     * 限流时间,单位秒
+     */
+    int time() default 60;
+
+    /**
+     * 限流次数
+     */
+    int count() default 100;
+
+    /**
+     * 限流类型
+     */
+    LimitType limitType() default LimitType.DEFAULT;
+}

+ 49 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java

@@ -0,0 +1,49 @@
+package com.ruoyi.common.constant;
+
+/**
+ * 缓存的key 常量
+ *
+ * @author ruoyi
+ */
+public interface CacheConstants {
+
+    /**
+     * 登录用户 redis key
+     */
+    String LOGIN_TOKEN_KEY = "Authorization:login:token:";
+
+    /**
+     * 在线用户 redis key
+     */
+    String ONLINE_TOKEN_KEY = "online_tokens:";
+
+    /**
+     * 登陆错误 redis key
+     */
+    String LOGIN_ERROR = "login_error:";
+
+    /**
+     * 验证码 redis key
+     */
+    String CAPTCHA_CODE_KEY = "captcha_codes:";
+
+    /**
+     * 参数管理 cache key
+     */
+    String SYS_CONFIG_KEY = "sys_config:";
+
+    /**
+     * 字典管理 cache key
+     */
+    String SYS_DICT_KEY = "sys_dict:";
+
+    /**
+     * 防重提交 redis key
+     */
+    String REPEAT_SUBMIT_KEY = "repeat_submit:";
+
+    /**
+     * 限流 redis key
+     */
+    String RATE_LIMIT_KEY = "rate_limit:";
+}

+ 0 - 45
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java

@@ -57,41 +57,11 @@ public interface Constants {
      */
     String LOGIN_FAIL = "Error";
 
-    /**
-     * 验证码 redis key
-     */
-    String CAPTCHA_CODE_KEY = "captcha_codes:";
-
-    /**
-     * 登录用户 redis key
-     */
-    String LOGIN_TOKEN_KEY = "Authorization:login:token:";
-
-    /**
-     * 在线用户 redis key
-     */
-    String ONLINE_TOKEN_KEY = "online_tokens:";
-
-    /**
-     * 防重提交 redis key
-     */
-    String REPEAT_SUBMIT_KEY = "repeat_submit:";
-
-    /**
-     * 限流 redis key
-     */
-    String RATE_LIMIT_KEY = "rate_limit:";
-
     /**
      * 验证码有效期(分钟)
      */
     Integer CAPTCHA_EXPIRATION = 2;
 
-    /**
-     * 登陆错误 redis key
-     */
-    String LOGIN_ERROR = "login_error:";
-
     /**
      * 登录错误次数
      */
@@ -107,20 +77,5 @@ public interface Constants {
      */
     String TOKEN = "token";
 
-    /**
-     * 令牌前缀
-     */
-    String LOGIN_USER_KEY = "login_user_key";
-
-    /**
-     * 参数管理 cache key
-     */
-    String SYS_CONFIG_KEY = "sys_config:";
-
-    /**
-     * 字典管理 cache key
-     */
-    String SYS_DICT_KEY = "sys_dict:";
-
 }
 

+ 32 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java

@@ -3,6 +3,7 @@ package com.ruoyi.common.utils;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.extra.servlet.ServletUtil;
 import cn.hutool.http.HttpStatus;
+import com.ruoyi.common.constant.Constants;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.springframework.http.MediaType;
@@ -14,6 +15,9 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 
 /**
@@ -139,4 +143,32 @@ public class ServletUtils extends ServletUtil {
         return getClientIP(getRequest());
     }
 
+    /**
+     * 内容编码
+     *
+     * @param str 内容
+     * @return 编码后的内容
+     */
+    public static String urlEncode(String str) {
+        try {
+            return URLEncoder.encode(str, Constants.UTF8);
+        } catch (UnsupportedEncodingException e) {
+            return StringUtils.EMPTY;
+        }
+    }
+
+    /**
+     * 内容解码
+     *
+     * @param str 内容
+     * @return 解码后的内容
+     */
+    public static String urlDecode(String str) {
+        try {
+            return URLDecoder.decode(str, Constants.UTF8);
+        } catch (UnsupportedEncodingException e) {
+            return StringUtils.EMPTY;
+        }
+    }
+
 }

+ 2 - 2
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RepeatSubmitAspect.java

@@ -4,7 +4,7 @@ import cn.dev33.satoken.SaManager;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.crypto.SecureUtil;
 import com.ruoyi.common.annotation.RepeatSubmit;
-import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.JsonUtils;
@@ -63,7 +63,7 @@ public class RepeatSubmitAspect {
 
         submitKey = SecureUtil.md5(submitKey + ":" + nowParams);
         // 唯一标识(指定key + url + 消息头)
-        String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + url + submitKey;
+        String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey;
         String key = RedisUtils.getCacheObject(cacheRepeatKey);
         if (key == null) {
             RedisUtils.setCacheObject(cacheRepeatKey, "", Duration.ofMillis(interval));

+ 5 - 5
ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java

@@ -5,7 +5,7 @@ import cn.dev33.satoken.listener.SaTokenListener;
 import cn.dev33.satoken.stp.SaLoginModel;
 import cn.hutool.http.useragent.UserAgent;
 import cn.hutool.http.useragent.UserAgentUtil;
-import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.core.domain.dto.UserOnlineDTO;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.enums.UserType;
@@ -50,7 +50,7 @@ public class UserActionListener implements SaTokenListener {
             dto.setTokenId(tokenValue);
             dto.setUserName(user.getUsername());
             dto.setDeptName(user.getDeptName());
-            RedisUtils.setCacheObject(Constants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout()));
+            RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout()));
             log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue);
         } else if (userType == UserType.APP_USER) {
             // app端 自行根据业务编写
@@ -62,7 +62,7 @@ public class UserActionListener implements SaTokenListener {
      */
     @Override
     public void doLogout(String loginType, Object loginId, String tokenValue) {
-        RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue);
+        RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
         log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue);
     }
 
@@ -71,7 +71,7 @@ public class UserActionListener implements SaTokenListener {
      */
     @Override
     public void doKickout(String loginType, Object loginId, String tokenValue) {
-        RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue);
+        RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
         log.info("user doLogoutByLoginId, userId:{}, token:{}", loginId, tokenValue);
     }
 
@@ -80,7 +80,7 @@ public class UserActionListener implements SaTokenListener {
      */
     @Override
     public void doReplaced(String loginType, Object loginId, String tokenValue) {
-        RedisUtils.deleteObject(Constants.ONLINE_TOKEN_KEY + tokenValue);
+        RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue);
         log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue);
     }
 

+ 54 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysCache.java

@@ -0,0 +1,54 @@
+package com.ruoyi.system.domain;
+
+import com.ruoyi.common.utils.StringUtils;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 缓存信息
+ *
+ * @author Lion Li
+ */
+@Data
+@NoArgsConstructor
+@ApiModel("缓存信息")
+public class SysCache {
+
+    /**
+     * 缓存名称
+     */
+    @ApiModelProperty(value = "缓存名称")
+    private String cacheName = "";
+
+    /**
+     * 缓存键名
+     */
+    @ApiModelProperty(value = "缓存键名")
+    private String cacheKey = "";
+
+    /**
+     * 缓存内容
+     */
+    @ApiModelProperty(value = "缓存内容")
+    private String cacheValue = "";
+
+    /**
+     * 备注
+     */
+    @ApiModelProperty(value = "备注")
+    private String remark = "";
+
+    public SysCache(String cacheName, String remark) {
+        this.cacheName = cacheName;
+        this.remark = remark;
+    }
+
+    public SysCache(String cacheName, String cacheKey, String cacheValue) {
+        this.cacheName = StringUtils.replace(cacheName, ":", "");
+        this.cacheKey = StringUtils.replace(cacheKey, cacheName, "");
+        this.cacheValue = cacheValue;
+    }
+
+}

+ 4 - 3
ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java

@@ -5,6 +5,7 @@ import cn.dev33.satoken.secure.BCrypt;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.dto.RoleDTO;
 import com.ruoyi.common.core.domain.entity.SysUser;
@@ -130,7 +131,7 @@ public class SysLoginService {
      * 校验短信验证码
      */
     private boolean validateSmsCode(String phonenumber, String smsCode, HttpServletRequest request) {
-        String code = RedisUtils.getCacheObject(Constants.CAPTCHA_CODE_KEY + phonenumber);
+        String code = RedisUtils.getCacheObject(CacheConstants.CAPTCHA_CODE_KEY + phonenumber);
         if (StringUtils.isBlank(code)) {
             asyncService.recordLogininfor(phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"), request);
             throw new CaptchaExpireException();
@@ -146,7 +147,7 @@ public class SysLoginService {
      * @param uuid     唯一标识
      */
     public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) {
-        String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
+        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
         String captcha = RedisUtils.getCacheObject(verifyKey);
         RedisUtils.deleteObject(verifyKey);
         if (captcha == null) {
@@ -242,7 +243,7 @@ public class SysLoginService {
      */
     private void checkLogin(LoginType loginType, String username, Supplier<Boolean> supplier) {
         HttpServletRequest request = ServletUtils.getRequest();
-        String errorKey = Constants.LOGIN_ERROR + username;
+        String errorKey = CacheConstants.LOGIN_ERROR + username;
         Integer errorLimitTime = Constants.LOGIN_ERROR_LIMIT_TIME;
         Integer setErrorNumber = Constants.LOGIN_ERROR_NUMBER;
         String loginFail = Constants.LOGIN_FAIL;

+ 2 - 1
ruoyi-system/src/main/java/com/ruoyi/system/service/SysRegisterService.java

@@ -1,6 +1,7 @@
 package com.ruoyi.system.service;
 
 import cn.dev33.satoken.secure.BCrypt;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.entity.SysUser;
@@ -72,7 +73,7 @@ public class SysRegisterService {
      * @return 结果
      */
     public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) {
-        String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
+        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
         String captcha = RedisUtils.getCacheObject(verifyKey);
         RedisUtils.deleteObject(verifyKey);
         if (captcha == null) {

+ 3 - 3
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java

@@ -5,7 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.page.TableDataInfo;
@@ -182,7 +182,7 @@ public class SysConfigServiceImpl implements ISysConfigService, ConfigService {
      */
     @Override
     public void clearConfigCache() {
-        Collection<String> keys = RedisUtils.keys(Constants.SYS_CONFIG_KEY + "*");
+        Collection<String> keys = RedisUtils.keys(CacheConstants.SYS_CONFIG_KEY + "*");
         RedisUtils.deleteObject(keys);
     }
 
@@ -234,6 +234,6 @@ public class SysConfigServiceImpl implements ISysConfigService, ConfigService {
      * @return 缓存键key
      */
     private String getCacheKey(String configKey) {
-        return Constants.SYS_CONFIG_KEY + configKey;
+        return CacheConstants.SYS_CONFIG_KEY + configKey;
     }
 }

+ 2 - 2
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java

@@ -2,7 +2,7 @@ package com.ruoyi.system.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.common.core.page.TableDataInfo;
@@ -133,6 +133,6 @@ public class SysDictDataServiceImpl implements ISysDictDataService {
      * @return 缓存键key
      */
     String getCacheKey(String configKey) {
-        return Constants.SYS_DICT_KEY + configKey;
+        return CacheConstants.SYS_DICT_KEY + configKey;
     }
 }

+ 3 - 3
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java

@@ -5,7 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.domain.entity.SysDictData;
@@ -157,7 +157,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
      */
     @Override
     public void clearDictCache() {
-        Collection<String> keys = RedisUtils.keys(Constants.SYS_DICT_KEY + "*");
+        Collection<String> keys = RedisUtils.keys(CacheConstants.SYS_DICT_KEY + "*");
         RedisUtils.deleteObject(keys);
     }
 
@@ -294,6 +294,6 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
      * @return 缓存键key
      */
     String getCacheKey(String configKey) {
-        return Constants.SYS_DICT_KEY + configKey;
+        return CacheConstants.SYS_DICT_KEY + configKey;
     }
 }

+ 48 - 0
ruoyi-ui/src/api/monitor/cache.js

@@ -7,3 +7,51 @@ export function getCache() {
     method: 'get'
   })
 }
+
+// 查询缓存名称列表
+export function listCacheName() {
+  return request({
+    url: '/monitor/cache/getNames',
+    method: 'get'
+  })
+}
+
+// 查询缓存键名列表
+export function listCacheKey(cacheName) {
+  return request({
+    url: '/monitor/cache/getKeys/' + cacheName,
+    method: 'get'
+  })
+}
+
+// 查询缓存内容
+export function getCacheValue(cacheName, cacheKey) {
+  return request({
+    url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey,
+    method: 'get'
+  })
+}
+
+// 清理指定名称缓存
+export function clearCacheName(cacheName) {
+  return request({
+    url: '/monitor/cache/clearCacheName/' + cacheName,
+    method: 'delete'
+  })
+}
+
+// 清理指定键名缓存
+export function clearCacheKey(cacheKey) {
+  return request({
+    url: '/monitor/cache/clearCacheKey/' + cacheKey,
+    method: 'delete'
+  })
+}
+
+// 清理全部缓存
+export function clearCacheAll() {
+  return request({
+    url: '/monitor/cache/clearCacheAll',
+    method: 'delete'
+  })
+}

+ 2 - 0
ruoyi-ui/src/assets/icons/svg/redis-list.svg

@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1656035183065" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3395" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M958.88 730.06H65.12c-18.28 0-33.12-14.82-33.12-33.12V68.91c0-18.29 14.83-33.12 33.12-33.12h893.77c18.28 0 33.12 14.82 33.12 33.12v628.03c-0.01 18.3-14.84 33.12-33.13 33.12zM98.23 663.83h827.53v-561.8H98.23v561.8z" p-id="3396"></path><path d="M512 954.55c-18.28 0-33.12-14.82-33.12-33.12V733.92c0-18.29 14.83-33.12 33.12-33.12s33.12 14.82 33.12 33.12v187.51c0 18.3-14.84 33.12-33.12 33.12z" p-id="3397"></path><path d="M762.01 988.21H261.99c-18.28 0-33.12-14.82-33.12-33.12 0-18.29 14.83-33.12 33.12-33.12h500.03c18.28 0 33.12 14.82 33.12 33.12-0.01 18.29-14.84 33.12-33.13 33.12zM514.74 578.55c-21.63 0-43.31-3.87-64.21-11.65-45.95-17.13-82.49-51.13-102.86-95.74-5.07-11.08-0.19-24.19 10.89-29.26 11.08-5.09 24.19-0.18 29.26 10.91 15.5 33.88 43.25 59.7 78.14 72.71 34.93 12.99 72.79 11.64 106.66-3.85 33.22-15.17 58.8-42.26 72.03-76.3 4.42-11.37 17.21-17.01 28.57-12.58 11.36 4.42 16.99 17.22 12.57 28.58-17.42 44.82-51.1 80.5-94.82 100.47-24.34 11.12-50.25 16.71-76.23 16.71z" p-id="3398"></path><path d="M325.27 528.78c-1.66 0-3.34-0.18-5.02-0.57-11.88-2.77-19.28-14.63-16.49-26.51l18.84-81c1.34-5.82 5-10.84 10.13-13.92 5.09-3.09 11.3-3.96 17.03-2.41l80.51 21.43c11.79 3.14 18.8 15.23 15.67 27.02-3.15 11.79-15.42 18.75-27.02 15.65l-58.49-15.57-13.69 58.81c-2.37 10.2-11.45 17.07-21.47 17.07zM360.8 351.01c-2.65 0-5.37-0.49-8-1.51-11.36-4.41-16.99-17.21-12.59-28.57 17.4-44.79 51.06-80.47 94.8-100.48 92.15-42.06 201.25-1.39 243.31 90.68 5.07 11.08 0.19 24.19-10.89 29.26-11.13 5.07-24.19 0.17-29.26-10.91-31.97-69.91-114.9-100.82-184.79-68.86-33.22 15.19-58.8 42.28-71.99 76.29-3.41 8.74-11.75 14.1-20.59 14.1z" p-id="3399"></path><path d="M684.68 376.74c-1.47 0-2.95-0.15-4.42-0.44l-81.61-16.68c-11.94-2.45-19.64-14.11-17.21-26.06 2.44-11.96 14.1-19.64 26.04-17.22l59.29 12.12 10.23-59.5c2.05-12 13.52-20.19 25.48-18.01 12.03 2.06 20.09 13.48 18.02 25.5l-14.08 81.96a22.089 22.089 0 0 1-9.29 14.49c-3.7 2.51-8.03 3.84-12.45 3.84z" p-id="3400"></path></svg>

+ 11 - 11
ruoyi-ui/src/views/monitor/cache/index.vue

@@ -71,7 +71,7 @@ import { getCache } from "@/api/monitor/cache";
 import echarts from "echarts";
 
 export default {
-  name: "Server",
+  name: "Cache",
   data() {
     return {
       // 统计命令信息
@@ -79,8 +79,8 @@ export default {
       // 使用内存
       usedmemory: null,
       // cache信息
-      cache: [],
-    };
+      cache: []
+    }
   },
   created() {
     this.getList();
@@ -109,8 +109,8 @@ export default {
               data: response.data.commandStats,
               animationEasing: "cubicInOut",
               animationDuration: 1000,
-            },
-          ],
+            }
+          ]
         });
         this.usedmemory = echarts.init(this.$refs.usedmemory, "macarons");
         this.usedmemory.setOption({
@@ -130,17 +130,17 @@ export default {
                 {
                   value: parseFloat(this.cache.info.used_memory_human),
                   name: "内存消耗",
-                },
-              ],
-            },
-          ],
+                }
+              ]
+            }
+          ]
         });
       });
     },
     // 打开加载层
     openLoading() {
       this.$modal.loading("正在加载缓存监控数据,请稍候!");
-    },
-  },
+    }
+  }
 };
 </script>

+ 241 - 0
ruoyi-ui/src/views/monitor/cache/list.vue

@@ -0,0 +1,241 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="10">
+      <el-col :span="8">
+        <el-card style="height: calc(100vh - 125px)">
+          <div slot="header">
+            <span>缓存列表</span>
+            <el-button
+              style="float: right; padding: 3px 0"
+              type="text"
+              icon="el-icon-refresh-right"
+              @click="refreshCacheNames()"
+            ></el-button>
+          </div>
+          <el-table
+            v-loading="loading"
+            :data="cacheNames"
+            :height="tableHeight"
+            highlight-current-row
+            @row-click="getCacheKeys"
+            style="width: 100%"
+          >
+            <el-table-column
+              label="序号"
+              width="60"
+              type="index"
+            ></el-table-column>
+
+            <el-table-column
+              label="缓存名称"
+              align="center"
+              prop="cacheName"
+              :show-overflow-tooltip="true"
+              :formatter="nameFormatter"
+            ></el-table-column>
+
+            <el-table-column
+              label="备注"
+              align="center"
+              prop="remark"
+              :show-overflow-tooltip="true"
+            />
+            <el-table-column
+              label="操作"
+              width="60"
+              align="center"
+              class-name="small-padding fixed-width"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleClearCacheName(scope.row)"
+                ></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-card>
+      </el-col>
+
+      <el-col :span="8">
+        <el-card style="height: calc(100vh - 125px)">
+          <div slot="header">
+            <span>键名列表</span>
+            <el-button
+              style="float: right; padding: 3px 0"
+              type="text"
+              icon="el-icon-refresh-right"
+              @click="refreshCacheKeys()"
+            ></el-button>
+          </div>
+          <el-table
+            v-loading="subLoading"
+            :data="cacheKeys"
+            :height="tableHeight"
+            highlight-current-row
+            @row-click="handleCacheValue"
+            style="width: 100%"
+          >
+            <el-table-column
+              label="序号"
+              width="60"
+              type="index"
+            ></el-table-column>
+            <el-table-column
+              label="缓存键名"
+              align="center"
+              :show-overflow-tooltip="true"
+              :formatter="keyFormatter"
+            >
+            </el-table-column>
+            <el-table-column
+              label="操作"
+              width="60"
+              align="center"
+              class-name="small-padding fixed-width"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleClearCacheKey(scope.row)"
+                ></el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-card>
+      </el-col>
+
+      <el-col :span="8">
+        <el-card :bordered="false" style="height: calc(100vh - 125px)">
+          <div slot="header">
+            <span>缓存内容</span>
+            <el-button
+              style="float: right; padding: 3px 0"
+              type="text"
+              icon="el-icon-refresh-right"
+              @click="handleClearCacheAll()"
+              >清理全部</el-button
+            >
+          </div>
+          <el-form :model="cacheForm">
+            <el-row :gutter="32">
+              <el-col :offset="1" :span="22">
+                <el-form-item label="缓存名称:" prop="cacheName">
+                  <el-input v-model="cacheForm.cacheName" :readOnly="true" />
+                </el-form-item>
+              </el-col>
+              <el-col :offset="1" :span="22">
+                <el-form-item label="缓存键名:" prop="cacheKey">
+                  <el-input v-model="cacheForm.cacheKey" :readOnly="true" />
+                </el-form-item>
+              </el-col>
+              <el-col :offset="1" :span="22">
+                <el-form-item label="缓存内容:" prop="cacheValue">
+                  <el-input
+                    v-model="cacheForm.cacheValue"
+                    type="textarea"
+                    :rows="8"
+                    :readOnly="true"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { listCacheName, listCacheKey, getCacheValue, clearCacheName, clearCacheKey, clearCacheAll } from "@/api/monitor/cache";
+
+export default {
+  name: "CacheList",
+  data() {
+    return {
+      cacheNames: [],
+      cacheKeys: [],
+      cacheForm: {},
+      loading: true,
+      subLoading: false,
+      nowCacheName: "",
+      tableHeight: window.innerHeight - 200
+    };
+  },
+  created() {
+    this.getCacheNames();
+  },
+  methods: {
+    /** 查询缓存名称列表 */
+    getCacheNames() {
+      this.loading = true;
+      listCacheName().then(response => {
+        this.cacheNames = response.data;
+        this.loading = false;
+      });
+    },
+    /** 刷新缓存名称列表 */
+    refreshCacheNames() {
+      this.getCacheNames();
+      this.$modal.msgSuccess("刷新缓存列表成功");
+    },
+    /** 清理指定名称缓存 */
+    handleClearCacheName(row) {
+      clearCacheName(row.cacheName).then(response => {
+        this.$modal.msgSuccess("清理缓存名称[" + this.nowCacheName + "]成功");
+        this.getCacheKeys();
+      });
+    },
+    /** 查询缓存键名列表 */
+    getCacheKeys(row) {
+      const cacheName = row !== undefined ? row.cacheName : this.nowCacheName;
+      if (cacheName === "") {
+        return;
+      }
+      this.subLoading = true;
+      listCacheKey(cacheName).then(response => {
+        this.cacheKeys = response.data;
+        this.subLoading = false;
+        this.nowCacheName = cacheName;
+      });
+    },
+    /** 刷新缓存键名列表 */
+    refreshCacheKeys() {
+      this.getCacheKeys();
+      this.$modal.msgSuccess("刷新键名列表成功");
+    },
+    /** 清理指定键名缓存 */
+    handleClearCacheKey(cacheKey) {
+      clearCacheKey(cacheKey).then(response => {
+        this.$modal.msgSuccess("清理缓存键名[" + cacheKey + "]成功");
+        this.getCacheKeys();
+      });
+    },
+    /** 列表前缀去除 */
+    nameFormatter(row) {
+      return row.cacheName.replace(":", "");
+    },
+    /** 键名前缀去除 */
+    keyFormatter(cacheKey) {
+      return cacheKey.replace(this.nowCacheName, "");
+    },
+    /** 查询缓存内容详细 */
+    handleCacheValue(cacheKey) {
+      getCacheValue(this.nowCacheName, cacheKey).then(response => {
+        this.cacheForm = response.data;
+      });
+    },
+    /** 清理全部缓存 */
+    handleClearCacheAll() {
+      clearCacheAll().then(response => {
+        this.$modal.msgSuccess("清理全部缓存成功");
+      });
+    }
+  },
+};
+</script>

+ 2 - 1
ruoyi-ui/src/views/system/dict/data.vue

@@ -163,7 +163,7 @@
             <el-option
               v-for="item in listClassOptions"
               :key="item.value"
-              :label="item.label"
+              :label="item.label + '(' + item.value + ')'"
               :value="item.value"
             ></el-option>
           </el-select>
@@ -397,3 +397,4 @@ export default {
   }
 };
 </script>
+

+ 1 - 0
ruoyi-ui/vue.config.js

@@ -61,6 +61,7 @@ module.exports = {
     plugins: [
       // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
       new CompressionPlugin({
+        cache: false,                   // 不启用文件缓存
         test: /\.(js|css|html)?$/i,     // 压缩文件格式
         filename: '[path].gz[query]',   // 压缩后的文件名
         algorithm: 'gzip',              // 使用gzip压缩

+ 1 - 0
script/sql/oracle/oracle_ry_vue_4.X.sql

@@ -258,6 +258,7 @@ insert into sys_menu values('107',  '通知公告', '1',   '8', 'notice',     's
 insert into sys_menu values('108',  '日志管理', '1',   '9', 'log',        '',                         '', 1, 0, 'M', '0', '0', '',                        'log',           'admin', sysdate, '', null, '日志管理菜单');
 insert into sys_menu values('109',  '在线用户', '2',   '1', 'online',     'monitor/online/index',     '', 1, 0, 'C', '0', '0', 'monitor:online:list',     'online',        'admin', sysdate, '', null, '在线用户菜单');
 insert into sys_menu values('111',  '数据监控', '2',   '3', 'druid',      'monitor/druid/index',      '', 1, 0, 'C', '0', '0', 'monitor:druid:list',      'druid',         'admin', sysdate, '', null, '数据监控菜单');
+insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', sysdate, '', null, '缓存列表菜单');
 insert into sys_menu values('113',  '缓存监控', '2',   '5', 'cache',      'monitor/cache/index',      '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis',         'admin', sysdate, '', null, '缓存监控菜单');
 insert into sys_menu values('114',  '表单构建', '3',   '1', 'build',      'tool/build/index',         '', 1, 0, 'C', '0', '0', 'tool:build:list',         'build',         'admin', sysdate, '', null, '表单构建菜单');
 insert into sys_menu values('115',  '代码生成', '3',   '2', 'gen',        'tool/gen/index',           '', 1, 0, 'C', '0', '0', 'tool:gen:list',           'code',          'admin', sysdate, '', null, '代码生成菜单');

+ 1 - 0
script/sql/postgres/postgres_ry_vue_4.X.sql

@@ -261,6 +261,7 @@ insert into sys_menu values('107',  '通知公告', '1',   '8', 'notice',     's
 insert into sys_menu values('108',  '日志管理', '1',   '9', 'log',        '',                         '', '1', '0', 'M', '0', '0', '',                        'log',           'admin', now(), '', null, '日志管理菜单');
 insert into sys_menu values('109',  '在线用户', '2',   '1', 'online',     'monitor/online/index',     '', '1', '0', 'C', '0', '0', 'monitor:online:list',     'online',        'admin', now(), '', null, '在线用户菜单');
 insert into sys_menu values('111',  '数据监控', '2',   '3', 'druid',      'monitor/druid/index',      '', '1', '0', 'C', '0', '0', 'monitor:druid:list',      'druid',         'admin', now(), '', null, '数据监控菜单');
+insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', '1', '0', 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', now(), '', null, '缓存列表菜单');
 insert into sys_menu values('113',  '缓存监控', '2',   '5', 'cache',      'monitor/cache/index',      '', '1', '0', 'C', '0', '0', 'monitor:cache:list',      'redis',         'admin', now(), '', null, '缓存监控菜单');
 insert into sys_menu values('114',  '表单构建', '3',   '1', 'build',      'tool/build/index',         '', '1', '0', 'C', '0', '0', 'tool:build:list',         'build',         'admin', now(), '', null, '表单构建菜单');
 insert into sys_menu values('115',  '代码生成', '3',   '2', 'gen',        'tool/gen/index',           '', '1', '0', 'C', '0', '0', 'tool:gen:list',           'code',          'admin', now(), '', null, '代码生成菜单');

+ 1 - 0
script/sql/ry_vue_4.X.sql

@@ -173,6 +173,7 @@ insert into sys_menu values('107',  '通知公告', '1',   '8', 'notice',     's
 insert into sys_menu values('108',  '日志管理', '1',   '9', 'log',        '',                         '', 1, 0, 'M', '0', '0', '',                        'log',           'admin', sysdate(), '', null, '日志管理菜单');
 insert into sys_menu values('109',  '在线用户', '2',   '1', 'online',     'monitor/online/index',     '', 1, 0, 'C', '0', '0', 'monitor:online:list',     'online',        'admin', sysdate(), '', null, '在线用户菜单');
 insert into sys_menu values('111',  '数据监控', '2',   '3', 'druid',      'monitor/druid/index',      '', 1, 0, 'C', '0', '0', 'monitor:druid:list',      'druid',         'admin', sysdate(), '', null, '数据监控菜单');
+insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', sysdate(), '', null, '缓存列表菜单');
 insert into sys_menu values('113',  '缓存监控', '2',   '5', 'cache',      'monitor/cache/index',      '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis',         'admin', sysdate(), '', null, '缓存监控菜单');
 insert into sys_menu values('114',  '表单构建', '3',   '1', 'build',      'tool/build/index',         '', 1, 0, 'C', '0', '0', 'tool:build:list',         'build',         'admin', sysdate(), '', null, '表单构建菜单');
 insert into sys_menu values('115',  '代码生成', '3',   '2', 'gen',        'tool/gen/index',           '', 1, 0, 'C', '0', '0', 'tool:gen:list',           'code',          'admin', sysdate(), '', null, '代码生成菜单');

+ 2 - 0
script/sql/sqlserver/sqlserver_ry_vue_4.X.sql

@@ -1078,6 +1078,8 @@ INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [co
 GO
 INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query_param], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (111, N'数据监控', 2, 3, N'druid', N'monitor/druid/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:druid:list', N'druid', N'admin', getdate(), N'', NULL, N'数据监控菜单')
 GO
+INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query_param], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (112, N'缓存列表', 2, 6, N'cacheList', N'monitor/cache/list', N'', 1, 0, N'C', N'0', N'0', N'monitor:cache:list', N'redis-list', N'admin', getdate(), N'', NULL, N'缓存列表菜单')
+GO
 INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query_param], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (113, N'缓存监控', 2, 5, N'cache', N'monitor/cache/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:cache:list', N'redis', N'admin', getdate(), N'', NULL, N'缓存监控菜单')
 GO
 INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query_param], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (114, N'表单构建', 3, 1, N'build', N'tool/build/index', N'', 1, 0, N'C', N'0', N'0', N'tool:build:list', N'build', N'admin', getdate(), N'', NULL, N'表单构建菜单')

+ 1 - 0
script/sql/update/oracle/update-4.2-4.3.sql

@@ -0,0 +1 @@
+insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', sysdate, '', null, '缓存列表菜单');

+ 1 - 0
script/sql/update/postgres/update-4.2-4.3.sql

@@ -0,0 +1 @@
+insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', '1', '0', 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', now(), '', null, '缓存列表菜单');

+ 1 - 26
script/sql/update/sqlserver/update-4.1-4.2.sql

@@ -1,27 +1,2 @@
-ALTER TABLE [sys_oss_config] ADD [domain] nvarchar(255) DEFAULT '' NULL
-GO
-
-EXEC sp_addextendedproperty
-'MS_Description', N'自定义域名',
-'SCHEMA', N'dbo',
-'TABLE', N'sys_oss_config',
-'COLUMN', N'domain'
-GO
-
-UPDATE [sys_oss_config] SET [access_key] = N'ruoyi', [secret_key] = N'ruoyi123', [endpoint] = N'127.0.0.1:9000' WHERE [oss_config_id] = 1
-GO
-
-UPDATE [sys_oss_config] SET [endpoint] = N's3-cn-north-1.qiniucs.com' WHERE [oss_config_id] = 2
-GO
-
-UPDATE [sys_oss_config] SET [endpoint] = N'oss-cn-beijing.aliyuncs.com' WHERE [oss_config_id] = 3
-GO
-
-UPDATE [sys_oss_config] SET [endpoint] = N'cos.ap-beijing.myqcloud.com' WHERE [oss_config_id] = 4
-GO
-
-INSERT INTO [sys_oss_config] ([oss_config_id], [config_key], [access_key], [secret_key], [bucket_name], [prefix], [endpoint], [domain], [is_https], [region], [status], [ext1], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (N'5', N'image',  N'ruoyi', N'ruoyi123', N'ruoyi', N'image', N'127.0.0.1:9000', N'',N'N', N'', N'1', N'', N'admin', getdate(), N'admin', getdate(), NULL)
-GO
-
-ALTER TABLE [gen_table_column] ALTER COLUMN [table_id] bigint NULL
+INSERT [sys_menu] ([menu_id], [menu_name], [parent_id], [order_num], [path], [component], [query_param], [is_frame], [is_cache], [menu_type], [visible], [status], [perms], [icon], [create_by], [create_time], [update_by], [update_time], [remark]) VALUES (112, N'缓存列表', 2, 6, N'cacheList', N'monitor/cache/list', N'', 1, 0, N'C', N'0', N'0', N'monitor:cache:list', N'redis-list', N'admin', getdate(), N'', NULL, N'缓存列表菜单')
 GO

+ 1 - 0
script/sql/update/sqlserver/update-4.2-4.3.sql

@@ -0,0 +1 @@
+insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', '1', '0', 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', now(), '', null, '缓存列表菜单');

+ 2 - 0
script/sql/update/update-4.2-4.3.sql

@@ -0,0 +1,2 @@
+insert into sys_menu values('112',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', sysdate(), '', null, '缓存列表菜单');
+

+ 0 - 0
sql/ry_20220613.sql