From 19b5a3d1d00db61fdd0f2093145cb092f8db53ac Mon Sep 17 00:00:00 2001 From: Jokul Date: Sat, 11 Jul 2026 21:44:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20key=20=E7=B1=BB=E5=9E=8B=E4=B8=BA=20none?= =?UTF-8?q?=20=E6=97=B6=E6=98=BE=E7=A4=BA=E8=BF=87=E6=9C=9F=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=B9=B6=E8=87=AA=E5=8A=A8=E7=A7=BB=E9=99=A4=E5=A4=B1?= =?UTF-8?q?=E6=95=88=20key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - KeyDetail: 新增 'none' 类型专用视图,显示过期提示 + 刷新按钮 - key store: TYPE 返回 none 时自动从列表移除失效 key 并重建 tree - 新增 i18n keyExpired 多语言 (zh-CN/en/ja/ko/de) --- src/renderer/src/components/key/KeyDetail.vue | 21 ++++++++++++++++++- src/renderer/src/i18n/locales/de.ts | 1 + src/renderer/src/i18n/locales/en.ts | 1 + src/renderer/src/i18n/locales/ja.ts | 1 + src/renderer/src/i18n/locales/ko.ts | 1 + src/renderer/src/i18n/locales/zh-CN.ts | 1 + src/renderer/src/stores/key.ts | 15 +++++++++++++ 7 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/renderer/src/components/key/KeyDetail.vue b/src/renderer/src/components/key/KeyDetail.vue index 41002bc..2ba279e 100644 --- a/src/renderer/src/components/key/KeyDetail.vue +++ b/src/renderer/src/components/key/KeyDetail.vue @@ -164,7 +164,12 @@ async function refreshKey() {
- +
+ +

{{ t('key.keyExpired') }}

+ {{ t('common.refresh') }} +
+ @@ -303,4 +308,18 @@ async function refreshKey() { margin-top: 12px; font-size: 13px; } + +.key-expired { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: var(--text-muted); +} + +.key-expired p { + margin: 12px 0 16px; + font-size: 13px; +} diff --git a/src/renderer/src/i18n/locales/de.ts b/src/renderer/src/i18n/locales/de.ts index e14fe97..265e059 100644 --- a/src/renderer/src/i18n/locales/de.ts +++ b/src/renderer/src/i18n/locales/de.ts @@ -101,6 +101,7 @@ export default { andMore: '...und {n} weitere', selected: '{n} ausgewählt', selectKey: 'Wählen Sie einen Schlüssel für Details', + keyExpired: 'Dieser Schlüssel existiert nicht mehr (möglicherweise abgelaufen oder gelöscht)', unsupported: 'Typ "{type}"-Anzeige noch nicht implementiert', patternPlaceholder: 'Schlüssel scannen (z.B. user:*, * ? unterstützt)', scanHint: 'Schlüssel auf dem Redis-Server scannen. * passt zu beliebigen Zeichen, ? zu einem einzelnen Zeichen. Enter zum Scannen.', diff --git a/src/renderer/src/i18n/locales/en.ts b/src/renderer/src/i18n/locales/en.ts index 17a321f..b4224d0 100644 --- a/src/renderer/src/i18n/locales/en.ts +++ b/src/renderer/src/i18n/locales/en.ts @@ -101,6 +101,7 @@ export default { andMore: '...and {n} more', selected: '{n} selected', selectKey: 'Select a key to view details', + keyExpired: 'This key no longer exists (may have expired or been deleted)', unsupported: 'Type "{type}" viewer not yet implemented', patternPlaceholder: 'Scan keys (e.g. user:*, supports * ?)', scanHint: 'Scan keys on Redis server. * matches any characters, ? matches a single character. Press Enter to scan.', diff --git a/src/renderer/src/i18n/locales/ja.ts b/src/renderer/src/i18n/locales/ja.ts index 8206aa0..c929fdb 100644 --- a/src/renderer/src/i18n/locales/ja.ts +++ b/src/renderer/src/i18n/locales/ja.ts @@ -101,6 +101,7 @@ export default { andMore: '...他 {n} 個', selected: '{n} 個選択済み', selectKey: 'キーを選択して詳細を表示', + keyExpired: 'このキーは存在しません(期限切れまたは削除された可能性があります)', unsupported: 'タイプ "{type}" のビューアーは未実装です', patternPlaceholder: 'キーをスキャン (例: user:*, * ? 対応)', scanHint: 'Redisサーバーでキーをスキャン。* は任意の文字列、? は1文字に一致。Enterでスキャン。', diff --git a/src/renderer/src/i18n/locales/ko.ts b/src/renderer/src/i18n/locales/ko.ts index 43a5847..4e19b1a 100644 --- a/src/renderer/src/i18n/locales/ko.ts +++ b/src/renderer/src/i18n/locales/ko.ts @@ -101,6 +101,7 @@ export default { andMore: '...그 외 {n}개', selected: '{n}개 선택됨', selectKey: '키를 선택하여 세부 정보 보기', + keyExpired: '이 키는 더 이상 존재하지 않습니다(만료되었거나 삭제되었을 수 있음)', unsupported: '"{type}" 유형 뷰어가 아직 구현되지 않았습니다', patternPlaceholder: '키 스캔 (예: user:*, * ? 지원)', scanHint: 'Redis 서버에서 키를 스캔합니다. * 는 임의의 문자, ? 는 단일 문자와 일치. Enter로 스캔.', diff --git a/src/renderer/src/i18n/locales/zh-CN.ts b/src/renderer/src/i18n/locales/zh-CN.ts index ac45b30..26bd5c4 100644 --- a/src/renderer/src/i18n/locales/zh-CN.ts +++ b/src/renderer/src/i18n/locales/zh-CN.ts @@ -101,6 +101,7 @@ export default { andMore: '...以及其他 {n} 个', selected: '已选 {n} 项', selectKey: '选择一个键查看详情', + keyExpired: '该键已不存在(可能已过期或被删除)', unsupported: '类型 "{type}" 查看器尚未实现', patternPlaceholder: '扫描 Key (如 user:*, 支持 * ?)', scanHint: '在 Redis 服务端按模式扫描 Key。* 匹配任意字符, ? 匹配单个字符。回车扫描。', diff --git a/src/renderer/src/stores/key.ts b/src/renderer/src/stores/key.ts index 80288a0..c97dcfc 100644 --- a/src/renderer/src/stores/key.ts +++ b/src/renderer/src/stores/key.ts @@ -138,6 +138,21 @@ export const useKeyStore = defineStore('key', () => { await loadKeyTypeAndTTL(connId, key) selectedKey.value = key + // Key no longer exists — show expired state and refresh list + if (selectedType.value === 'none') { + keyData.value = null + // Remove the stale key from the list + keys.value = keys.value.filter(k => k.name !== key) + // Rebuild tree if needed + if (useTree.value) { + const conn = (await window.electronAPI.storage.getConnections()) + .find((c: any) => c.id === connId) + const sep = conn?.separator || ':' + treeKeys.value = buildTree(keys.value.map(k => k.name), sep) + } + return + } + try { switch (selectedType.value) { case 'string':