新增缓存列表菜单功能
This commit is contained in:
		| @@ -6,12 +6,13 @@ import java.util.concurrent.TimeUnit; | ||||
| import javax.annotation.Resource; | ||||
| import javax.imageio.ImageIO; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
| import com.ruoyi.common.config.RuoYiConfig; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.util.FastByteArrayOutputStream; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import com.google.code.kaptcha.Producer; | ||||
| import com.ruoyi.common.config.RuoYiConfig; | ||||
| import com.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.constant.Constants; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.core.redis.RedisCache; | ||||
| @@ -54,7 +55,7 @@ public class CaptchaController | ||||
|  | ||||
|         // 保存验证码信息 | ||||
|         String uuid = IdUtils.simpleUUID(); | ||||
|         String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; | ||||
|         String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; | ||||
|  | ||||
|         String capStr = null, code = null; | ||||
|         BufferedImage image = null; | ||||
|   | ||||
| @@ -1,19 +1,25 @@ | ||||
| package com.ruoyi.web.controller.monitor; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Properties; | ||||
| import java.util.Set; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.data.redis.core.RedisCallback; | ||||
| import org.springframework.data.redis.core.RedisTemplate; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.web.bind.annotation.DeleteMapping; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import com.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.core.domain.AjaxResult; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.system.domain.SysCache; | ||||
|  | ||||
| /** | ||||
|  * 缓存监控 | ||||
| @@ -27,6 +33,16 @@ public class CacheController | ||||
|     @Autowired | ||||
|     private RedisTemplate<String, String> redisTemplate; | ||||
|  | ||||
|     private final static List<SysCache> caches = new ArrayList<SysCache>(); | ||||
|     { | ||||
|         caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息")); | ||||
|         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, "限流处理")); | ||||
|     } | ||||
|  | ||||
|     @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @GetMapping() | ||||
|     public AjaxResult getInfo() throws Exception | ||||
| @@ -50,4 +66,54 @@ public class CacheController | ||||
|         result.put("commandStats", pieList); | ||||
|         return AjaxResult.success(result); | ||||
|     } | ||||
|  | ||||
|     @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @GetMapping("/getNames") | ||||
|     public AjaxResult cache() | ||||
|     { | ||||
|         return AjaxResult.success(caches); | ||||
|     } | ||||
|  | ||||
|     @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @GetMapping("/getKeys/{cacheName}") | ||||
|     public AjaxResult getCacheKeys(@PathVariable String cacheName) | ||||
|     { | ||||
|         Set<String> cacheKyes = redisTemplate.keys(cacheName + "*"); | ||||
|         return AjaxResult.success(cacheKyes); | ||||
|     } | ||||
|  | ||||
|     @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @GetMapping("/getValue/{cacheName}/{cacheKey}") | ||||
|     public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) | ||||
|     { | ||||
|         String cacheValue = redisTemplate.opsForValue().get(cacheKey); | ||||
|         SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue); | ||||
|         return AjaxResult.success(sysCache); | ||||
|     } | ||||
|  | ||||
|     @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @DeleteMapping("/clearCacheName/{cacheName}") | ||||
|     public AjaxResult clearCacheName(@PathVariable String cacheName) | ||||
|     { | ||||
|         Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*"); | ||||
|         redisTemplate.delete(cacheKeys); | ||||
|         return AjaxResult.success(); | ||||
|     } | ||||
|  | ||||
|     @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @DeleteMapping("/clearCacheKey/{cacheKey}") | ||||
|     public AjaxResult clearCacheKey(@PathVariable String cacheKey) | ||||
|     { | ||||
|         redisTemplate.delete(cacheKey); | ||||
|         return AjaxResult.success(); | ||||
|     } | ||||
|  | ||||
|     @PreAuthorize("@ss.hasPermi('monitor:cache:list')") | ||||
|     @DeleteMapping("/clearCacheAll") | ||||
|     public AjaxResult clearCacheAll() | ||||
|     { | ||||
|         Collection<String> cacheKeys = redisTemplate.keys("*"); | ||||
|         redisTemplate.delete(cacheKeys); | ||||
|         return AjaxResult.success(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| 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.AjaxResult; | ||||
| import com.ruoyi.common.core.domain.model.LoginUser; | ||||
| @@ -42,7 +42,7 @@ public class SysUserOnlineController extends BaseController | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo list(String ipaddr, String userName) | ||||
|     { | ||||
|         Collection<String> keys = redisCache.keys(Constants.LOGIN_TOKEN_KEY + "*"); | ||||
|         Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); | ||||
|         List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>(); | ||||
|         for (String key : keys) | ||||
|         { | ||||
| @@ -86,7 +86,7 @@ public class SysUserOnlineController extends BaseController | ||||
|     @DeleteMapping("/{tokenId}") | ||||
|     public AjaxResult forceLogout(@PathVariable String tokenId) | ||||
|     { | ||||
|         redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId); | ||||
|         redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId); | ||||
|         return AjaxResult.success(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import java.lang.annotation.ElementType; | ||||
| import java.lang.annotation.Retention; | ||||
| import java.lang.annotation.RetentionPolicy; | ||||
| import java.lang.annotation.Target; | ||||
| import com.ruoyi.common.constant.Constants; | ||||
| import com.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.enums.LimitType; | ||||
|  | ||||
| /** | ||||
| @@ -21,7 +21,7 @@ public @interface RateLimiter | ||||
|     /** | ||||
|      * 限流key | ||||
|      */ | ||||
|     public String key() default Constants.RATE_LIMIT_KEY; | ||||
|     public String key() default CacheConstants.RATE_LIMIT_KEY; | ||||
|  | ||||
|     /** | ||||
|      * 限流时间,单位秒 | ||||
|   | ||||
| @@ -0,0 +1,39 @@ | ||||
| package com.ruoyi.common.constant; | ||||
|  | ||||
| /** | ||||
|  * 缓存的key 常量 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| public class CacheConstants | ||||
| { | ||||
|     /** | ||||
|      * 登录用户 redis key | ||||
|      */ | ||||
|     public static final String LOGIN_TOKEN_KEY = "login_tokens:"; | ||||
|  | ||||
|     /** | ||||
|      * 验证码 redis key | ||||
|      */ | ||||
|     public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; | ||||
|  | ||||
|     /** | ||||
|      * 参数管理 cache key | ||||
|      */ | ||||
|     public static final String SYS_CONFIG_KEY = "sys_config:"; | ||||
|  | ||||
|     /** | ||||
|      * 字典管理 cache key | ||||
|      */ | ||||
|     public static final String SYS_DICT_KEY = "sys_dict:"; | ||||
|  | ||||
|     /** | ||||
|      * 防重提交 redis key | ||||
|      */ | ||||
|     public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; | ||||
|  | ||||
|     /** | ||||
|      * 限流 redis key | ||||
|      */ | ||||
|     public static final String RATE_LIMIT_KEY = "rate_limit:"; | ||||
| } | ||||
| @@ -58,27 +58,7 @@ public class Constants | ||||
|      * 登录失败 | ||||
|      */ | ||||
|     public static final String LOGIN_FAIL = "Error"; | ||||
|  | ||||
|     /** | ||||
|      * 验证码 redis key | ||||
|      */ | ||||
|     public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; | ||||
|  | ||||
|     /** | ||||
|      * 登录用户 redis key | ||||
|      */ | ||||
|     public static final String LOGIN_TOKEN_KEY = "login_tokens:"; | ||||
|  | ||||
|     /** | ||||
|      * 防重提交 redis key | ||||
|      */ | ||||
|     public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; | ||||
|  | ||||
|     /** | ||||
|      * 限流 redis key | ||||
|      */ | ||||
|     public static final String RATE_LIMIT_KEY = "rate_limit:"; | ||||
|  | ||||
|   | ||||
|     /** | ||||
|      * 验证码有效期(分钟) | ||||
|      */ | ||||
| @@ -124,16 +104,6 @@ public class Constants | ||||
|      */ | ||||
|     public static final String JWT_AUTHORITIES = "authorities"; | ||||
|  | ||||
|     /** | ||||
|      * 参数管理 cache key | ||||
|      */ | ||||
|     public static final String SYS_CONFIG_KEY = "sys_config:"; | ||||
|  | ||||
|     /** | ||||
|      * 字典管理 cache key | ||||
|      */ | ||||
|     public static final String SYS_DICT_KEY = "sys_dict:"; | ||||
|  | ||||
|     /** | ||||
|      * 资源映射路径 前缀 | ||||
|      */ | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package com.ruoyi.common.utils; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import com.alibaba.fastjson2.JSONArray; | ||||
| import com.ruoyi.common.constant.Constants; | ||||
| import com.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.core.domain.entity.SysDictData; | ||||
| import com.ruoyi.common.core.redis.RedisCache; | ||||
| import com.ruoyi.common.utils.spring.SpringUtils; | ||||
| @@ -169,7 +169,7 @@ public class DictUtils | ||||
|      */ | ||||
|     public static void clearDictCache() | ||||
|     { | ||||
|         Collection<String> keys = SpringUtils.getBean(RedisCache.class).keys(Constants.SYS_DICT_KEY + "*"); | ||||
|         Collection<String> keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*"); | ||||
|         SpringUtils.getBean(RedisCache.class).deleteObject(keys); | ||||
|     } | ||||
|  | ||||
| @@ -181,6 +181,6 @@ public class DictUtils | ||||
|      */ | ||||
|     public static String getCacheKey(String configKey) | ||||
|     { | ||||
|         return Constants.SYS_DICT_KEY + configKey; | ||||
|         return CacheConstants.SYS_DICT_KEY + configKey; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -9,7 +9,7 @@ import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.stereotype.Component; | ||||
| import com.alibaba.fastjson2.JSON; | ||||
| import com.ruoyi.common.annotation.RepeatSubmit; | ||||
| import com.ruoyi.common.constant.Constants; | ||||
| import com.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.core.redis.RedisCache; | ||||
| import com.ruoyi.common.filter.RepeatedlyRequestWrapper; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| @@ -63,7 +63,7 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor | ||||
|         String submitKey = StringUtils.trimToEmpty(request.getHeader(header)); | ||||
|  | ||||
|         // 唯一标识(指定key + url + 消息头) | ||||
|         String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + url + submitKey; | ||||
|         String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey; | ||||
|  | ||||
|         Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); | ||||
|         if (sessionObj != null) | ||||
|   | ||||
| @@ -7,6 +7,7 @@ import org.springframework.security.authentication.BadCredentialsException; | ||||
| import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.stereotype.Component; | ||||
| import com.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.constant.Constants; | ||||
| import com.ruoyi.common.core.domain.entity.SysUser; | ||||
| import com.ruoyi.common.core.domain.model.LoginUser; | ||||
| @@ -17,8 +18,8 @@ import com.ruoyi.common.exception.user.CaptchaExpireException; | ||||
| import com.ruoyi.common.exception.user.UserPasswordNotMatchException; | ||||
| import com.ruoyi.common.utils.DateUtils; | ||||
| import com.ruoyi.common.utils.MessageUtils; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.common.utils.ServletUtils; | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.common.utils.ip.IpUtils; | ||||
| import com.ruoyi.framework.manager.AsyncManager; | ||||
| import com.ruoyi.framework.manager.factory.AsyncFactory; | ||||
| @@ -103,7 +104,7 @@ public class SysLoginService | ||||
|      */ | ||||
|     public void validateCaptcha(String username, String code, String uuid) | ||||
|     { | ||||
|         String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); | ||||
|         String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); | ||||
|         String captcha = redisCache.getCacheObject(verifyKey); | ||||
|         redisCache.deleteObject(verifyKey); | ||||
|         if (captcha == null) | ||||
|   | ||||
| @@ -2,6 +2,7 @@ package com.ruoyi.framework.web.service; | ||||
|  | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Component; | ||||
| 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; | ||||
| @@ -100,7 +101,7 @@ public class SysRegisterService | ||||
|      */ | ||||
|     public void validateCaptcha(String username, String code, String uuid) | ||||
|     { | ||||
|         String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); | ||||
|         String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); | ||||
|         String captcha = redisCache.getCacheObject(verifyKey); | ||||
|         redisCache.deleteObject(verifyKey); | ||||
|         if (captcha == null) | ||||
|   | ||||
| @@ -7,6 +7,7 @@ import javax.servlet.http.HttpServletRequest; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.stereotype.Component; | ||||
| import com.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.constant.Constants; | ||||
| import com.ruoyi.common.core.domain.model.LoginUser; | ||||
| import com.ruoyi.common.core.redis.RedisCache; | ||||
| @@ -220,6 +221,6 @@ public class TokenService | ||||
|  | ||||
|     private String getTokenKey(String uuid) | ||||
|     { | ||||
|         return Constants.LOGIN_TOKEN_KEY + uuid; | ||||
|         return CacheConstants.LOGIN_TOKEN_KEY + uuid; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,81 @@ | ||||
| package com.ruoyi.system.domain; | ||||
|  | ||||
| import com.ruoyi.common.utils.StringUtils; | ||||
|  | ||||
| /** | ||||
|  * 缓存信息 | ||||
|  *  | ||||
|  * @author ruoyi | ||||
|  */ | ||||
| public class SysCache | ||||
| { | ||||
|     /** 缓存名称 */ | ||||
|     private String cacheName = ""; | ||||
|  | ||||
|     /** 缓存键名 */ | ||||
|     private String cacheKey = ""; | ||||
|  | ||||
|     /** 缓存内容 */ | ||||
|     private String cacheValue = ""; | ||||
|  | ||||
|     /** 备注 */ | ||||
|     private String remark = ""; | ||||
|  | ||||
|     public SysCache() | ||||
|     { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     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; | ||||
|     } | ||||
|  | ||||
|     public String getCacheName() | ||||
|     { | ||||
|         return cacheName; | ||||
|     } | ||||
|  | ||||
|     public void setCacheName(String cacheName) | ||||
|     { | ||||
|         this.cacheName = cacheName; | ||||
|     } | ||||
|  | ||||
|     public String getCacheKey() | ||||
|     { | ||||
|         return cacheKey; | ||||
|     } | ||||
|  | ||||
|     public void setCacheKey(String cacheKey) | ||||
|     { | ||||
|         this.cacheKey = cacheKey; | ||||
|     } | ||||
|  | ||||
|     public String getCacheValue() | ||||
|     { | ||||
|         return cacheValue; | ||||
|     } | ||||
|  | ||||
|     public void setCacheValue(String cacheValue) | ||||
|     { | ||||
|         this.cacheValue = cacheValue; | ||||
|     } | ||||
|  | ||||
|     public String getRemark() | ||||
|     { | ||||
|         return remark; | ||||
|     } | ||||
|  | ||||
|     public void setRemark(String remark) | ||||
|     { | ||||
|         this.remark = remark; | ||||
|     } | ||||
| } | ||||
| @@ -1,7 +1,12 @@ | ||||
| package com.ruoyi.system.service.impl; | ||||
|  | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| import javax.annotation.PostConstruct; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | ||||
| import com.ruoyi.common.annotation.DataSource; | ||||
| import com.ruoyi.common.constant.Constants; | ||||
| import com.ruoyi.common.constant.CacheConstants; | ||||
| import com.ruoyi.common.constant.UserConstants; | ||||
| import com.ruoyi.common.core.redis.RedisCache; | ||||
| import com.ruoyi.common.core.text.Convert; | ||||
| @@ -11,11 +16,6 @@ import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.system.domain.SysConfig; | ||||
| import com.ruoyi.system.mapper.SysConfigMapper; | ||||
| import com.ruoyi.system.service.ISysConfigService; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | ||||
| import javax.annotation.PostConstruct; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * 参数配置 服务层实现 | ||||
| @@ -181,7 +181,7 @@ public class SysConfigServiceImpl implements ISysConfigService | ||||
|     @Override | ||||
|     public void clearConfigCache() | ||||
|     { | ||||
|         Collection<String> keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*"); | ||||
|         Collection<String> keys = redisCache.keys(CacheConstants.SYS_CONFIG_KEY + "*"); | ||||
|         redisCache.deleteObject(keys); | ||||
|     } | ||||
|  | ||||
| @@ -221,6 +221,6 @@ public class SysConfigServiceImpl implements ISysConfigService | ||||
|      */ | ||||
|     private String getCacheKey(String configKey) | ||||
|     { | ||||
|         return Constants.SYS_CONFIG_KEY + configKey; | ||||
|         return CacheConstants.SYS_CONFIG_KEY + configKey; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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
									
								
								ruoyi-ui/src/assets/icons/svg/redis-list.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								ruoyi-ui/src/assets/icons/svg/redis-list.svg
									
									
									
									
									
										Normal file
									
								
							| @@ -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> | ||||
| After Width: | Height: | Size: 2.6 KiB | 
							
								
								
									
										22
									
								
								ruoyi-ui/src/views/monitor/cache/index.vue
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								ruoyi-ui/src/views/monitor/cache/index.vue
									
									
									
									
										vendored
									
									
								
							| @@ -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
									
								
								ruoyi-ui/src/views/monitor/cache/list.vue
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								ruoyi-ui/src/views/monitor/cache/list.vue
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -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="form"> | ||||
|             <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> | ||||
| @@ -176,9 +176,10 @@ insert into sys_menu values('110',  '定时任务', '2',   '2', 'job',        'm | ||||
| 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',   '4', 'server',     'monitor/server/index',     '', 1, 0, 'C', '0', '0', 'monitor:server:list',     'server',        '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, '代码生成菜单'); | ||||
| insert into sys_menu values('116',  '系统接口', '3',   '3', 'swagger',    'tool/swagger/index',       '', 1, 0, 'C', '0', '0', 'tool:swagger:list',       'swagger',       'admin', sysdate(), '', null, '系统接口菜单'); | ||||
| insert into sys_menu values('114',  '缓存列表', '2',   '6', 'cacheList',  'monitor/cache/list',       '', 1, 0, 'C', '0', '0', 'monitor:cache:list',      'redis-list',    'admin', sysdate(), '', null, '缓存列表菜单'); | ||||
| insert into sys_menu values('115',  '表单构建', '3',   '1', 'build',      'tool/build/index',         '', 1, 0, 'C', '0', '0', 'tool:build:list',         'build',         'admin', sysdate(), '', null, '表单构建菜单'); | ||||
| insert into sys_menu values('116',  '代码生成', '3',   '2', 'gen',        'tool/gen/index',           '', 1, 0, 'C', '0', '0', 'tool:gen:list',           'code',          'admin', sysdate(), '', null, '代码生成菜单'); | ||||
| insert into sys_menu values('117',  '系统接口', '3',   '3', 'swagger',    'tool/swagger/index',       '', 1, 0, 'C', '0', '0', 'tool:swagger:list',       'swagger',       'admin', sysdate(), '', null, '系统接口菜单'); | ||||
| -- 三级菜单 | ||||
| insert into sys_menu values('500',  '操作日志', '108', '1', 'operlog',    'monitor/operlog/index',    '', 1, 0, 'C', '0', '0', 'monitor:operlog:list',    'form',          'admin', sysdate(), '', null, '操作日志菜单'); | ||||
| insert into sys_menu values('501',  '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor',    'admin', sysdate(), '', null, '登录日志菜单'); | ||||
| @@ -308,6 +309,7 @@ insert into sys_role_menu values ('2', '113'); | ||||
| insert into sys_role_menu values ('2', '114'); | ||||
| insert into sys_role_menu values ('2', '115'); | ||||
| insert into sys_role_menu values ('2', '116'); | ||||
| insert into sys_role_menu values ('2', '117'); | ||||
| insert into sys_role_menu values ('2', '500'); | ||||
| insert into sys_role_menu values ('2', '501'); | ||||
| insert into sys_role_menu values ('2', '1000'); | ||||
		Reference in New Issue
	
	Block a user