From ed1a1e115c5fd7f3f2b6b3a5a4a47edd7548566c Mon Sep 17 00:00:00 2001 From: liuyun Date: Sun, 11 Oct 2026 16:43:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20401=20=E5=BC=BA=E9=80=80=E9=87=8D?= =?UTF-8?q?=E7=BD=AE=20authStore=20+=20dictStore=20=E6=94=AF=E6=8C=81=20fo?= =?UTF-8?q?rce=20=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- src/main.ts | 2 ++ src/pages/system/dict/index.vue | 18 ++++++++++++++---- src/stores/modules/auth.ts | 9 ++++++++- src/stores/modules/dict.ts | 4 ++-- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/main.ts b/src/main.ts index de75331..00719bf 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,6 +8,7 @@ import { installAssets } from '@/plugins/assets' import { Env } from '@/utils/env.ts' import { installI18n } from '@/i18n' import { setAuthExpiredHandler } from '@/api/http' +import { useAuthStore } from '@/stores/modules/auth' import { useMenuStore } from '@/stores/modules/menu' import { useDictStore } from '@/stores/modules/dict' import { usePermissionStore } from '@/stores/modules/permission' @@ -23,6 +24,7 @@ installStore(app) // 会话过期(401 刷新失败)时:清状态 + 跳登录 setAuthExpiredHandler(() => { + useAuthStore(pinia).reset() useMenuStore(pinia).reset() useDictStore(pinia).reset() usePermissionStore(pinia).reset() diff --git a/src/pages/system/dict/index.vue b/src/pages/system/dict/index.vue index 076098b..902c7f1 100644 --- a/src/pages/system/dict/index.vue +++ b/src/pages/system/dict/index.vue @@ -70,6 +70,7 @@ import TyForm from '@/components/ty-form.vue' import { showDialog } from '@/utils/dialog' import { useRequest } from '@/composables/useRequest' import { useDict } from '@/composables/useDict' +import { useDictStore } from '@/stores/modules/dict' import { createDictItem, createDictType, @@ -83,6 +84,7 @@ import { } from '@/api/dict' const { tagMap: commonStatusMap } = useDict('common_status') +const dictStore = useDictStore() /** 标签色中文名(UI 调色板,非业务字典)。 */ const COLOR_LABELS: Record = { @@ -149,6 +151,7 @@ async function openTypeCreate(): Promise { await createDictType({ code: data.code, name: data.name, remark: data.remark }) ElMessage.success('新增成功') await refreshTypes() + await dictStore.fetch(true) selectedType.value = types.value.find((t) => t.code === data.code) ?? selectedType.value } @@ -163,6 +166,7 @@ async function openTypeEdit(t: DictType): Promise { await updateDictType(t.id, { name: data.name, status: data.status, remark: data.remark }) ElMessage.success('更新成功') await refreshTypes() + await dictStore.fetch(true) } async function removeType(t: DictType): Promise { @@ -170,6 +174,7 @@ async function removeType(t: DictType): Promise { await deleteDictType(t.id) ElMessage.success('删除成功') await refreshTypes() + await dictStore.fetch(true) } // ---- 字典项(右) ---- @@ -233,23 +238,27 @@ const listItems = async (query: PageQuery, signal?: AbortSignal) => { } } -const createItem = (data: Record) => - createDictItem({ +const createItem = async (data: Record) => { + await createDictItem({ dictTypeCode: selectedType.value?.code ?? '', label: data.label, value: data.value, sort: data.sort ?? 0, colorType: data.colorType || undefined, }) + await dictStore.fetch(true) +} -const updateItem = (id: string, data: Record) => - updateDictItem(id, { +const updateItem = async (id: string, data: Record) => { + await updateDictItem(id, { label: data.label, value: data.value, sort: data.sort ?? 0, status: data.status, colorType: data.colorType || undefined, }) + await dictStore.fetch(true) +} const removeItem = (id: string) => deleteDictItem(id) @@ -265,6 +274,7 @@ async function removeWithConfirm(row: Record): Promise { await deleteDictItem(String(row.id)) ElMessage.success('删除成功') itemCrudRef.value?.reload() + await dictStore.fetch(true) } diff --git a/src/stores/modules/auth.ts b/src/stores/modules/auth.ts index 0c5ee8f..2e95ceb 100644 --- a/src/stores/modules/auth.ts +++ b/src/stores/modules/auth.ts @@ -34,5 +34,12 @@ export const useAuthStore = defineStore('authStore', () => { refreshToken.value = null; } - return { accessToken, refreshToken, isAuthenticated, login, logout }; + /** 本地清空会话状态(不调用登出接口,供 401 强退使用)。 */ + function reset(): void { + clearTokens(); + accessToken.value = null; + refreshToken.value = null; + } + + return { accessToken, refreshToken, isAuthenticated, login, logout, reset }; }); diff --git a/src/stores/modules/dict.ts b/src/stores/modules/dict.ts index 8cfb6a0..12e698e 100644 --- a/src/stores/modules/dict.ts +++ b/src/stores/modules/dict.ts @@ -8,8 +8,8 @@ export const useDictStore = defineStore('dictStore', () => { const loaded = ref(false) const loading = ref(false) - async function fetch(): Promise { - if (loaded.value || loading.value) return + async function fetch(force = false): Promise { + if (!force && (loaded.value || loading.value)) return loading.value = true try { const res = await listDicts()