Commit 2372c25e8d80dd3768c060dfe111905e3a0d756d
1 parent
a0f7f0ff
完善 Redis 缓存的查询
Showing
6 changed files
with
107 additions
and
168 deletions
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/RedisController.java
| 1 | package cn.iocoder.yudao.module.infra.controller.admin.redis; | 1 | package cn.iocoder.yudao.module.infra.controller.admin.redis; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 4 | +import cn.hutool.core.util.StrUtil; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; | 6 | import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; |
| 5 | import cn.iocoder.yudao.framework.redis.core.RedisKeyRegistry; | 7 | import cn.iocoder.yudao.framework.redis.core.RedisKeyRegistry; |
| 6 | -import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisKeyRespVO; | 8 | +import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisKeyDefineRespVO; |
| 7 | import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisKeyValueRespVO; | 9 | import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisKeyValueRespVO; |
| 8 | import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisMonitorRespVO; | 10 | import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisMonitorRespVO; |
| 9 | import cn.iocoder.yudao.module.infra.convert.redis.RedisConvert; | 11 | import cn.iocoder.yudao.module.infra.convert.redis.RedisConvert; |
| 10 | import io.swagger.annotations.Api; | 12 | import io.swagger.annotations.Api; |
| 13 | +import io.swagger.annotations.ApiImplicitParam; | ||
| 11 | import io.swagger.annotations.ApiOperation; | 14 | import io.swagger.annotations.ApiOperation; |
| 12 | import org.springframework.data.redis.connection.RedisServerCommands; | 15 | import org.springframework.data.redis.connection.RedisServerCommands; |
| 13 | import org.springframework.data.redis.core.Cursor; | 16 | import org.springframework.data.redis.core.Cursor; |
| @@ -18,11 +21,7 @@ import org.springframework.security.access.prepost.PreAuthorize; | @@ -18,11 +21,7 @@ import org.springframework.security.access.prepost.PreAuthorize; | ||
| 18 | import org.springframework.web.bind.annotation.*; | 21 | import org.springframework.web.bind.annotation.*; |
| 19 | 22 | ||
| 20 | import javax.annotation.Resource; | 23 | import javax.annotation.Resource; |
| 21 | -import java.nio.charset.StandardCharsets; | ||
| 22 | -import java.util.HashSet; | ||
| 23 | -import java.util.List; | ||
| 24 | -import java.util.Properties; | ||
| 25 | -import java.util.Set; | 24 | +import java.util.*; |
| 26 | 25 | ||
| 27 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 26 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 28 | 27 | ||
| @@ -48,69 +47,66 @@ public class RedisController { | @@ -48,69 +47,66 @@ public class RedisController { | ||
| 48 | return success(RedisConvert.INSTANCE.build(info, dbSize, commandStats)); | 47 | return success(RedisConvert.INSTANCE.build(info, dbSize, commandStats)); |
| 49 | } | 48 | } |
| 50 | 49 | ||
| 51 | - @GetMapping("/get-key-list") | 50 | + @GetMapping("/get-key-define-list") |
| 52 | @ApiOperation("获得 Redis Key 模板列表") | 51 | @ApiOperation("获得 Redis Key 模板列表") |
| 53 | @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") | 52 | @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") |
| 54 | - public CommonResult<List<RedisKeyRespVO>> getKeyList() { | 53 | + public CommonResult<List<RedisKeyDefineRespVO>> getKeyDefineList() { |
| 55 | List<RedisKeyDefine> keyDefines = RedisKeyRegistry.list(); | 54 | List<RedisKeyDefine> keyDefines = RedisKeyRegistry.list(); |
| 56 | return success(RedisConvert.INSTANCE.convertList(keyDefines)); | 55 | return success(RedisConvert.INSTANCE.convertList(keyDefines)); |
| 57 | } | 56 | } |
| 58 | 57 | ||
| 59 | - @GetMapping("/get-key-Defines") | 58 | + @GetMapping("/get-key-list") |
| 60 | @ApiOperation("获得 Redis keys 键名列表") | 59 | @ApiOperation("获得 Redis keys 键名列表") |
| 60 | + @ApiImplicitParam(name = "keyTemplate", value = "Redis Key 定义", example = "true", dataTypeClass = String.class) | ||
| 61 | @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") | 61 | @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") |
| 62 | - public CommonResult<Set<String>> getKeyDefines(@RequestParam("keyDefine") String keyDefine) { | ||
| 63 | - Set<String> keys = new HashSet<>(); | ||
| 64 | - stringRedisTemplate.execute((RedisCallback<Set<String>>) connection -> { | ||
| 65 | - try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions() | ||
| 66 | - .match(keyDefine + "*") | ||
| 67 | - .count(Integer.MAX_VALUE).build())) { | ||
| 68 | - while (cursor.hasNext()) { | ||
| 69 | - keys.add(new String(cursor.next(), StandardCharsets.UTF_8)); | ||
| 70 | - } | 62 | + public CommonResult<Set<String>> getKeyDefineList(@RequestParam("keyTemplate") String keyTemplate) { |
| 63 | + return success(getKeyDefineList0(keyTemplate)); | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + private Set<String> getKeyDefineList0(String keyTemplate) { | ||
| 67 | + // key 格式化 | ||
| 68 | + String key = StrUtil.replace(keyTemplate, "%[s|c|b|d|x|o|f|a|e|g]", parameter -> "*"); | ||
| 69 | + // scan 扫描 key | ||
| 70 | + Set<String> keys = new LinkedHashSet<>(); | ||
| 71 | + stringRedisTemplate.execute((RedisCallback<Set<String>>) connection -> { | ||
| 72 | + try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().match(key).count(100).build())) { | ||
| 73 | + cursor.forEachRemaining(value -> keys.add(StrUtil.utf8Str(value))); | ||
| 71 | } catch (Exception e) { | 74 | } catch (Exception e) { |
| 72 | throw new RuntimeException(e); | 75 | throw new RuntimeException(e); |
| 73 | } | 76 | } |
| 74 | return keys; | 77 | return keys; |
| 75 | }); | 78 | }); |
| 76 | - return success(keys); | ||
| 77 | - } | ||
| 78 | - | ||
| 79 | - @DeleteMapping("/delete-key-defines") | ||
| 80 | - @ApiOperation("删除 Redis Key 根据模板") | ||
| 81 | - @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") | ||
| 82 | - public CommonResult<Boolean> deleteKeyDefines(@RequestParam("keyDefine") String keyDefine) { | ||
| 83 | - Set<String> keys = stringRedisTemplate.keys(keyDefine + "*"); | ||
| 84 | - if(keys != null && keys.isEmpty()){ | ||
| 85 | - stringRedisTemplate.delete(keys); | ||
| 86 | - } | ||
| 87 | - return success(Boolean.TRUE); | 79 | + return keys; |
| 88 | } | 80 | } |
| 89 | 81 | ||
| 90 | @GetMapping("/get-key-value") | 82 | @GetMapping("/get-key-value") |
| 91 | @ApiOperation("获得 Redis key 内容") | 83 | @ApiOperation("获得 Redis key 内容") |
| 84 | + @ApiImplicitParam(name = "key", value = "Redis Key", example = "oauth2_access_token:233", dataTypeClass = String.class) | ||
| 92 | @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") | 85 | @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") |
| 93 | - public CommonResult<RedisKeyValueRespVO> getKeyValue(@RequestParam("keyDefine") String keyDefine, @RequestParam("cacheKey") String cacheKey) { | ||
| 94 | - String cacheValue = stringRedisTemplate.opsForValue().get(cacheKey); | ||
| 95 | - return success(RedisKeyValueRespVO.of(keyDefine, cacheKey, cacheValue)); | 86 | + public CommonResult<RedisKeyValueRespVO> getKeyValue(@RequestParam("key") String key) { |
| 87 | + String value = stringRedisTemplate.opsForValue().get(key); | ||
| 88 | + return success(new RedisKeyValueRespVO(key, value)); | ||
| 96 | } | 89 | } |
| 97 | 90 | ||
| 98 | - @DeleteMapping("/delete-key-value") | ||
| 99 | - @ApiOperation("删除 Redis Key 根据key") | 91 | + @DeleteMapping("/delete-key") |
| 92 | + @ApiOperation("删除 Redis Key") | ||
| 93 | + @ApiImplicitParam(name = "key", value = "Redis Key", example = "oauth2_access_token:233", dataTypeClass = String.class) | ||
| 100 | @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") | 94 | @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") |
| 101 | - public CommonResult<Boolean> deleteKeyValue(@RequestParam("cacheKey") String cacheKey) { | ||
| 102 | - stringRedisTemplate.delete(cacheKey); | 95 | + public CommonResult<Boolean> deleteKey(@RequestParam("key") String key) { |
| 96 | + stringRedisTemplate.delete(key); | ||
| 103 | return success(Boolean.TRUE); | 97 | return success(Boolean.TRUE); |
| 104 | } | 98 | } |
| 105 | 99 | ||
| 106 | - @DeleteMapping("/delete-cache-all") | ||
| 107 | - @ApiOperation(value="删除 所有缓存", notes="不使用该接口") | 100 | + @DeleteMapping("/delete-keys") |
| 101 | + @ApiOperation("删除 Redis Key 根据模板") | ||
| 102 | + @ApiImplicitParam(name = "keyTemplate", value = "Redis Key 定义", example = "true", dataTypeClass = String.class) | ||
| 108 | @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") | 103 | @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") |
| 109 | - public CommonResult<Boolean> deleteCacheAll() { | ||
| 110 | - return success(stringRedisTemplate.execute((RedisCallback<Boolean>) connection -> { | ||
| 111 | - connection.flushAll(); | ||
| 112 | - return Boolean.TRUE; | ||
| 113 | - })); | 104 | + public CommonResult<Boolean> deleteKeys(@RequestParam("keyTemplate") String keyTemplate) { |
| 105 | + Set<String> keys = getKeyDefineList0(keyTemplate); | ||
| 106 | + if (CollUtil.isNotEmpty(keys)) { | ||
| 107 | + stringRedisTemplate.delete(keys); | ||
| 108 | + } | ||
| 109 | + return success(Boolean.TRUE); | ||
| 114 | } | 110 | } |
| 115 | 111 | ||
| 116 | } | 112 | } |
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/RedisKeyRespVO.java renamed to yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/RedisKeyDefineRespVO.java
| @@ -13,9 +13,9 @@ import java.time.Duration; | @@ -13,9 +13,9 @@ import java.time.Duration; | ||
| 13 | @Data | 13 | @Data |
| 14 | @Builder | 14 | @Builder |
| 15 | @AllArgsConstructor | 15 | @AllArgsConstructor |
| 16 | -public class RedisKeyRespVO { | 16 | +public class RedisKeyDefineRespVO { |
| 17 | 17 | ||
| 18 | - @ApiModelProperty(value = "login_user:%s", required = true, example = "String") | 18 | + @ApiModelProperty(value = "Key 模板", required = true, example = "login_user:%s") |
| 19 | private String keyTemplate; | 19 | private String keyTemplate; |
| 20 | 20 | ||
| 21 | @ApiModelProperty(value = "Key 类型的枚举", required = true, example = "String") | 21 | @ApiModelProperty(value = "Key 类型的枚举", required = true, example = "String") |
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/redis/vo/RedisKeyValueRespVO.java
| @@ -3,32 +3,17 @@ package cn.iocoder.yudao.module.infra.controller.admin.redis.vo; | @@ -3,32 +3,17 @@ package cn.iocoder.yudao.module.infra.controller.admin.redis.vo; | ||
| 3 | import io.swagger.annotations.ApiModel; | 3 | import io.swagger.annotations.ApiModel; |
| 4 | import io.swagger.annotations.ApiModelProperty; | 4 | import io.swagger.annotations.ApiModelProperty; |
| 5 | import lombok.AllArgsConstructor; | 5 | import lombok.AllArgsConstructor; |
| 6 | -import lombok.Builder; | ||
| 7 | import lombok.Data; | 6 | import lombok.Data; |
| 8 | -import org.apache.commons.lang3.StringUtils; | ||
| 9 | 7 | ||
| 10 | -@ApiModel("管理后台 - Redis Key Value onse VO") | 8 | +@ApiModel("管理后台 - 单个 Redis Key Value Response VO") |
| 11 | @Data | 9 | @Data |
| 12 | -@Builder | ||
| 13 | @AllArgsConstructor | 10 | @AllArgsConstructor |
| 14 | public class RedisKeyValueRespVO { | 11 | public class RedisKeyValueRespVO { |
| 15 | 12 | ||
| 16 | - @ApiModelProperty(value = "oauth2_access_token:%s", required = true, example = "String") | ||
| 17 | - private String keyTemplate; | ||
| 18 | - | ||
| 19 | @ApiModelProperty(value = "c5f6990767804a928f4bb96ca249febf", required = true, example = "String") | 13 | @ApiModelProperty(value = "c5f6990767804a928f4bb96ca249febf", required = true, example = "String") |
| 20 | private String key; | 14 | private String key; |
| 21 | 15 | ||
| 22 | @ApiModelProperty(required = true, example = "String") | 16 | @ApiModelProperty(required = true, example = "String") |
| 23 | private String value; | 17 | private String value; |
| 24 | 18 | ||
| 25 | - public static RedisKeyValueRespVO of(String keyTemplate, String key, String value){ | ||
| 26 | - return RedisKeyValueRespVO.builder() | ||
| 27 | - .keyTemplate(StringUtils.replace(keyTemplate, ":", "")) | ||
| 28 | - .key(StringUtils.replace(key, keyTemplate, "")) | ||
| 29 | - .value(value) | ||
| 30 | - .build(); | ||
| 31 | - } | ||
| 32 | - | ||
| 33 | - | ||
| 34 | } | 19 | } |
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/convert/redis/RedisConvert.java
| @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.convert.redis; | @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.infra.convert.redis; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.util.StrUtil; | 3 | import cn.hutool.core.util.StrUtil; |
| 4 | import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; | 4 | import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine; |
| 5 | -import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisKeyRespVO; | 5 | +import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisKeyDefineRespVO; |
| 6 | import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisMonitorRespVO; | 6 | import cn.iocoder.yudao.module.infra.controller.admin.redis.vo.RedisMonitorRespVO; |
| 7 | import org.mapstruct.Mapper; | 7 | import org.mapstruct.Mapper; |
| 8 | import org.mapstruct.factory.Mappers; | 8 | import org.mapstruct.factory.Mappers; |
| @@ -29,6 +29,6 @@ public interface RedisConvert { | @@ -29,6 +29,6 @@ public interface RedisConvert { | ||
| 29 | return respVO; | 29 | return respVO; |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | - List<RedisKeyRespVO> convertList(List<RedisKeyDefine> list); | 32 | + List<RedisKeyDefineRespVO> convertList(List<RedisKeyDefine> list); |
| 33 | 33 | ||
| 34 | } | 34 | } |
yudao-ui-admin/src/api/infra/redis.js
| @@ -9,34 +9,46 @@ export function getCache() { | @@ -9,34 +9,46 @@ export function getCache() { | ||
| 9 | } | 9 | } |
| 10 | 10 | ||
| 11 | // 获取模块 | 11 | // 获取模块 |
| 12 | -export function getKeyList() { | 12 | +export function getKeyDefineList() { |
| 13 | return request({ | 13 | return request({ |
| 14 | - url: '/infra/redis/get-key-list', | 14 | + url: '/infra/redis/get-key-define-list', |
| 15 | method: 'get' | 15 | method: 'get' |
| 16 | }) | 16 | }) |
| 17 | } | 17 | } |
| 18 | 18 | ||
| 19 | // 获取键名列表 | 19 | // 获取键名列表 |
| 20 | -export function getKeyDefines(keyDefine) { | 20 | +export function getKeyList(keyTemplate) { |
| 21 | return request({ | 21 | return request({ |
| 22 | - url: '/infra/redis/get-key-Defines?keyDefine=' + keyDefine, | ||
| 23 | - method: 'get' | 22 | + url: '/infra/redis/get-key-list', |
| 23 | + method: 'get', | ||
| 24 | + params: { | ||
| 25 | + keyTemplate | ||
| 26 | + } | ||
| 24 | }) | 27 | }) |
| 25 | } | 28 | } |
| 26 | 29 | ||
| 27 | // 获取缓存内容 | 30 | // 获取缓存内容 |
| 28 | -export function getKeyValue(keyDefine, key) { | 31 | +export function getKeyValue(key) { |
| 29 | return request({ | 32 | return request({ |
| 30 | - url: '/infra/redis/get-key-value?keyDefine=' + keyDefine + "&cacheKey=" + key, | 33 | + url: '/infra/redis/get-key-value?key=' + key, |
| 31 | method: 'get' | 34 | method: 'get' |
| 32 | }) | 35 | }) |
| 33 | } | 36 | } |
| 34 | 37 | ||
| 35 | // 根据键名删除缓存 | 38 | // 根据键名删除缓存 |
| 36 | -export function deleteKeyValue(key) { | 39 | +export function deleteKey(key) { |
| 37 | return request({ | 40 | return request({ |
| 38 | - url: '/infra/redis/delete-key-value?cacheKey=' + key, | 41 | + url: '/infra/redis/delete-key?key=' + key, |
| 39 | method: 'delete' | 42 | method: 'delete' |
| 40 | }) | 43 | }) |
| 41 | } | 44 | } |
| 42 | 45 | ||
| 46 | +export function deleteKeys(keyTemplate) { | ||
| 47 | + return request({ | ||
| 48 | + url: '/infra/redis/delete-keys?', | ||
| 49 | + method: 'delete', | ||
| 50 | + params: { | ||
| 51 | + keyTemplate | ||
| 52 | + } | ||
| 53 | + }) | ||
| 54 | +} |
yudao-ui-admin/src/views/infra/redis/index.vue
| @@ -31,7 +31,7 @@ | @@ -31,7 +31,7 @@ | ||
| 31 | </tr> | 31 | </tr> |
| 32 | <tr> | 32 | <tr> |
| 33 | <td><div class="cell">AOF是否开启</div></td> | 33 | <td><div class="cell">AOF是否开启</div></td> |
| 34 | - <td><div class="cell" v-if="cache.info">{{ cache.info.aof_enabled == "0" ? "否" : "是" }}</div></td> | 34 | + <td><div class="cell" v-if="cache.info">{{ cache.info.aof_enabled === "0" ? "否" : "是" }}</div></td> |
| 35 | <td><div class="cell">RDB是否成功</div></td> | 35 | <td><div class="cell">RDB是否成功</div></td> |
| 36 | <td><div class="cell" v-if="cache.info">{{ cache.info.rdb_last_bgsave_status }}</div></td> | 36 | <td><div class="cell" v-if="cache.info">{{ cache.info.rdb_last_bgsave_status }}</div></td> |
| 37 | <td><div class="cell">Key数量</div></td> | 37 | <td><div class="cell">Key数量</div></td> |
| @@ -66,12 +66,7 @@ | @@ -66,12 +66,7 @@ | ||
| 66 | </el-col> | 66 | </el-col> |
| 67 | </el-row> | 67 | </el-row> |
| 68 | 68 | ||
| 69 | - <el-table | ||
| 70 | - v-loading="keyListLoad" | ||
| 71 | - :data="keyList" | ||
| 72 | - row-key="id" | ||
| 73 | - @row-click="openCacheInfo" | ||
| 74 | - > | 69 | + <el-table v-loading="keyDefineListLoad" :data="keyDefineList" row-key="id" @row-click="openKeyTemplate"> |
| 75 | <el-table-column prop="keyTemplate" label="Key 模板" width="200" /> | 70 | <el-table-column prop="keyTemplate" label="Key 模板" width="200" /> |
| 76 | <el-table-column prop="keyType" label="Key 类型" width="100" /> | 71 | <el-table-column prop="keyType" label="Key 类型" width="100" /> |
| 77 | <el-table-column prop="valueType" label="Value 类型" /> | 72 | <el-table-column prop="valueType" label="Value 类型" /> |
| @@ -90,92 +85,44 @@ | @@ -90,92 +85,44 @@ | ||
| 90 | </el-table> | 85 | </el-table> |
| 91 | 86 | ||
| 92 | <!-- 缓存模块信息框 --> | 87 | <!-- 缓存模块信息框 --> |
| 93 | - <el-dialog | ||
| 94 | - :title="keyTemplate + '模块'" | ||
| 95 | - :visible.sync="open" | ||
| 96 | - width="60vw" | ||
| 97 | - append-to-body | ||
| 98 | - > | 88 | + <el-dialog :title="keyTemplate + ' 模板'" :visible.sync="open" width="70vw" append-to-body> |
| 99 | <el-row :gutter="10"> | 89 | <el-row :gutter="10"> |
| 100 | - <el-col :span="10" class="card-box"> | ||
| 101 | - <el-card style="height: 70vh"> | 90 | + <el-col :span="14" class="card-box"> |
| 91 | + <el-card style="height: 70vh; overflow: scroll"> | ||
| 102 | <div slot="header"> | 92 | <div slot="header"> |
| 103 | <span>键名列表</span> | 93 | <span>键名列表</span> |
| 104 | - <el-button | ||
| 105 | - style="float: right; padding: 3px 0" | ||
| 106 | - type="text" | ||
| 107 | - icon="el-icon-refresh-right" | ||
| 108 | - @click="refreshCacheKeys" | ||
| 109 | - ></el-button> | 94 | + <el-button style="float: right; padding: 3px 0" type="text" icon="el-icon-refresh-right" @click="refreshKeys" /> |
| 110 | </div> | 95 | </div> |
| 111 | - <el-table | ||
| 112 | - :data="cachekeys" | ||
| 113 | - style="width: 100%" | ||
| 114 | - @row-click="handleCacheValue" | ||
| 115 | - > | ||
| 116 | - <el-table-column | ||
| 117 | - label="序号" | ||
| 118 | - width="60" | ||
| 119 | - type="index" | ||
| 120 | - ></el-table-column> | ||
| 121 | - <el-table-column | ||
| 122 | - label="缓存键名" | ||
| 123 | - align="center" | ||
| 124 | - :show-overflow-tooltip="true" | ||
| 125 | - :formatter="keyFormatter" | ||
| 126 | - > | 96 | + <el-table :data="cacheKeys" style="width: 100%" @row-click="handleKeyValue"> |
| 97 | + <el-table-column label="缓存键名" align="center" :show-overflow-tooltip="true"> | ||
| 98 | + <template slot-scope="scope">{{ scope.row }}</template> | ||
| 127 | </el-table-column> | 99 | </el-table-column> |
| 128 | - <el-table-column | ||
| 129 | - label="操作" | ||
| 130 | - width="60" | ||
| 131 | - align="center" | ||
| 132 | - class-name="small-padding fixed-width" | ||
| 133 | - > | 100 | + <el-table-column label="操作" width="60" align="center" class-name="small-padding fixed-width"> |
| 134 | <template slot-scope="scope"> | 101 | <template slot-scope="scope"> |
| 135 | - <el-button | ||
| 136 | - size="mini" | ||
| 137 | - type="text" | ||
| 138 | - icon="el-icon-delete" | ||
| 139 | - @click="handleClearCacheKey(scope.row)" | ||
| 140 | - ></el-button> | 102 | + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDeleteKey(scope.row)" /> |
| 141 | </template> | 103 | </template> |
| 142 | </el-table-column> | 104 | </el-table-column> |
| 143 | </el-table> | 105 | </el-table> |
| 144 | </el-card> | 106 | </el-card> |
| 145 | </el-col> | 107 | </el-col> |
| 146 | 108 | ||
| 147 | - <el-col :span="14"> | 109 | + <el-col :span="10"> |
| 148 | <el-card :bordered="false" style="height: 70vh"> | 110 | <el-card :bordered="false" style="height: 70vh"> |
| 149 | <div slot="header"> | 111 | <div slot="header"> |
| 150 | <span>缓存内容</span> | 112 | <span>缓存内容</span> |
| 151 | - <!-- <el-button | ||
| 152 | - style="float: right; padding: 3px 0" | ||
| 153 | - type="text" | ||
| 154 | - icon="el-icon-refresh-right" | ||
| 155 | - @click="handleClearCacheAll()" | ||
| 156 | - >清理全部</el-button> | ||
| 157 | - --> | 113 | + <el-button style="float: right; padding: 3px 0" type="text" icon="el-icon-refresh-right" |
| 114 | + @click="handleDeleteKeys(keyTemplate)">清理全部</el-button> | ||
| 158 | </div> | 115 | </div> |
| 159 | <el-form :model="cacheForm"> | 116 | <el-form :model="cacheForm"> |
| 160 | <el-row :gutter="32"> | 117 | <el-row :gutter="32"> |
| 161 | <el-col :offset="1" :span="22"> | 118 | <el-col :offset="1" :span="22"> |
| 162 | - <el-form-item label="缓存名称:" prop="keyTemplate"> | ||
| 163 | - <el-input v-model="cacheForm.keyTemplate" :readOnly="true" /> | ||
| 164 | - </el-form-item> | ||
| 165 | - </el-col> | ||
| 166 | - <el-col :offset="1" :span="22"> | ||
| 167 | <el-form-item label="缓存键名:" prop="key"> | 119 | <el-form-item label="缓存键名:" prop="key"> |
| 168 | <el-input v-model="cacheForm.key" :readOnly="true" /> | 120 | <el-input v-model="cacheForm.key" :readOnly="true" /> |
| 169 | </el-form-item> | 121 | </el-form-item> |
| 170 | </el-col> | 122 | </el-col> |
| 171 | <el-col :offset="1" :span="22"> | 123 | <el-col :offset="1" :span="22"> |
| 172 | <el-form-item label="缓存内容:" prop="value"> | 124 | <el-form-item label="缓存内容:" prop="value"> |
| 173 | - <el-input | ||
| 174 | - v-model="cacheForm.value" | ||
| 175 | - type="textarea" | ||
| 176 | - :rows="12" | ||
| 177 | - :readOnly="true" | ||
| 178 | - /> | 125 | + <el-input v-model="cacheForm.value" type="textarea" :rows="12" :readOnly="true"/> |
| 179 | </el-form-item> | 126 | </el-form-item> |
| 180 | </el-col> | 127 | </el-col> |
| 181 | </el-row> | 128 | </el-row> |
| @@ -188,7 +135,7 @@ | @@ -188,7 +135,7 @@ | ||
| 188 | </template> | 135 | </template> |
| 189 | 136 | ||
| 190 | <script> | 137 | <script> |
| 191 | -import { getCache, getKeyList, getKeyDefines, getKeyValue, deleteKeyValue } from "@/api/infra/redis"; | 138 | +import {getCache, getKeyDefineList, getKeyList, getKeyValue, deleteKey, deleteKeys} from "@/api/infra/redis"; |
| 192 | import echarts from "echarts"; | 139 | import echarts from "echarts"; |
| 193 | 140 | ||
| 194 | export default { | 141 | export default { |
| @@ -202,12 +149,12 @@ export default { | @@ -202,12 +149,12 @@ export default { | ||
| 202 | // cache 信息 | 149 | // cache 信息 |
| 203 | cache: [], | 150 | cache: [], |
| 204 | // key 列表 | 151 | // key 列表 |
| 205 | - keyListLoad: true, | ||
| 206 | - keyList: [], | 152 | + keyDefineListLoad: true, |
| 153 | + keyDefineList: [], | ||
| 207 | // 模块弹出框 | 154 | // 模块弹出框 |
| 208 | open: false, | 155 | open: false, |
| 209 | keyTemplate: "", | 156 | keyTemplate: "", |
| 210 | - cachekeys: [], | 157 | + cacheKeys: [], |
| 211 | cacheForm: {} | 158 | cacheForm: {} |
| 212 | }; | 159 | }; |
| 213 | }, | 160 | }, |
| @@ -275,9 +222,9 @@ export default { | @@ -275,9 +222,9 @@ export default { | ||
| 275 | }); | 222 | }); |
| 276 | 223 | ||
| 277 | // 查询 Redis Key 列表 | 224 | // 查询 Redis Key 列表 |
| 278 | - getKeyList().then(response => { | ||
| 279 | - this.keyList = response.data; | ||
| 280 | - this.keyListLoad = false; | 225 | + getKeyDefineList().then(response => { |
| 226 | + this.keyDefineList = response.data; | ||
| 227 | + this.keyDefineListLoad = false; | ||
| 281 | }); | 228 | }); |
| 282 | }, | 229 | }, |
| 283 | 230 | ||
| @@ -287,46 +234,45 @@ export default { | @@ -287,46 +234,45 @@ export default { | ||
| 287 | }, | 234 | }, |
| 288 | 235 | ||
| 289 | // 打开缓存弹窗 | 236 | // 打开缓存弹窗 |
| 290 | - openCacheInfo (e) { | 237 | + openKeyTemplate (keyDefine) { |
| 291 | this.open = true; | 238 | this.open = true; |
| 292 | - let keyDefine = e.keyTemplate.substring(0, e.keyTemplate.length - 2); | ||
| 293 | - this.keyTemplate = keyDefine; | ||
| 294 | // 加载键名列表 | 239 | // 加载键名列表 |
| 295 | - this.handleCacheKeys(keyDefine); | ||
| 296 | - }, | ||
| 297 | - | ||
| 298 | - /** 键名前缀去除 */ | ||
| 299 | - keyFormatter (cacheKey) { | ||
| 300 | - return cacheKey.replace(this.keyTemplate, ""); | 240 | + this.keyTemplate = keyDefine.keyTemplate; |
| 241 | + this.doGetKeyList(this.keyTemplate); | ||
| 301 | }, | 242 | }, |
| 302 | 243 | ||
| 303 | // 获取键名列表 | 244 | // 获取键名列表 |
| 304 | - handleCacheKeys (keyDefine){ | ||
| 305 | - const cacheName = keyDefine !== undefined ? keyDefine : this.keyTemplate; | ||
| 306 | - getKeyDefines(cacheName).then(response => { | ||
| 307 | - this.cachekeys = response.data | 245 | + doGetKeyList (keyTemplate) { |
| 246 | + getKeyList(keyTemplate).then(response => { | ||
| 247 | + this.cacheKeys = response.data | ||
| 308 | this.cacheForm = {} | 248 | this.cacheForm = {} |
| 309 | }) | 249 | }) |
| 310 | }, | 250 | }, |
| 311 | 251 | ||
| 312 | // 获取缓存值 | 252 | // 获取缓存值 |
| 313 | - handleCacheValue (e){ | ||
| 314 | - getKeyValue(this.keyTemplate, e).then(response => { | 253 | + handleKeyValue (key) { |
| 254 | + getKeyValue(key).then(response => { | ||
| 315 | this.cacheForm = response.data | 255 | this.cacheForm = response.data |
| 316 | }) | 256 | }) |
| 317 | }, | 257 | }, |
| 318 | 258 | ||
| 319 | // 刷新键名列表 | 259 | // 刷新键名列表 |
| 320 | - refreshCacheKeys(){ | 260 | + refreshKeys() { |
| 321 | this.$modal.msgSuccess("刷新键名列表成功"); | 261 | this.$modal.msgSuccess("刷新键名列表成功"); |
| 322 | - this.handleCacheKeys(); | 262 | + this.doGetKeyList(this.keyTemplate); |
| 323 | }, | 263 | }, |
| 324 | 264 | ||
| 325 | // 删除缓存 | 265 | // 删除缓存 |
| 326 | - handleClearCacheKey(key){ | ||
| 327 | - deleteKeyValue(key).then(response =>{ | 266 | + handleDeleteKey(key){ |
| 267 | + deleteKey(key).then(response => { | ||
| 328 | this.$modal.msgSuccess("清理缓存键名[" + key + "]成功"); | 268 | this.$modal.msgSuccess("清理缓存键名[" + key + "]成功"); |
| 329 | - this.handleCacheKeys(); | 269 | + this.doGetKeyList(this.keyTemplate); |
| 270 | + }) | ||
| 271 | + }, | ||
| 272 | + handleDeleteKeys(keyTemplate){ | ||
| 273 | + deleteKeys(keyTemplate).then(response => { | ||
| 274 | + this.$modal.msgSuccess("清空[" + keyTemplate + "]成功"); | ||
| 275 | + this.doGetKeyList(this.keyTemplate); | ||
| 330 | }) | 276 | }) |
| 331 | }, | 277 | }, |
| 332 | }, | 278 | }, |