diff --git a/mock/menu.mock.ts b/mock/menu.mock.ts index 2f2550d1..02d72db0 100644 --- a/mock/menu.mock.ts +++ b/mock/menu.mock.ts @@ -388,6 +388,32 @@ export default defineMock([ params: null, }, }, + { + path: "drag", + component: "demo/drag", + name: "Drag", + meta: { + title: "拖拽组件", + icon: "", + hidden: false, + keepAlive: true, + alwaysShow: false, + params: null, + }, + }, + { + path: "text-scroll", + component: "demo/text-scroll", + name: "TextScroll", + meta: { + title: "滚动文本", + icon: "", + hidden: false, + keepAlive: true, + alwaysShow: false, + params: null, + }, + }, ], }, { diff --git a/src/store/modules/dict.store.ts b/src/store/modules/dict.store.ts index 0e1dea10..e053ed94 100644 --- a/src/store/modules/dict.store.ts +++ b/src/store/modules/dict.store.ts @@ -4,8 +4,10 @@ import DictAPI, { type DictItemOption } from "@/api/system/dict.api"; export const useDictStore = defineStore("dict", () => { // 字典数据缓存 const dictCache = useStorage>("dict_cache", {}); + // 请求队列(防止重复请求) const requestQueue: Record> = {}; + /** * 缓存字典数据 * @param dictCode 字典编码 @@ -14,6 +16,7 @@ export const useDictStore = defineStore("dict", () => { const cacheDictItems = (dictCode: string, data: DictItemOption[]) => { dictCache.value[dictCode] = data; }; + /** * 加载字典数据(如果缓存中没有则请求) * @param dictCode 字典编码 @@ -29,6 +32,7 @@ export const useDictStore = defineStore("dict", () => { } await requestQueue[dictCode]; }; + /** * 获取字典项列表 * @param dictCode 字典编码 @@ -37,12 +41,14 @@ export const useDictStore = defineStore("dict", () => { const getDictItems = (dictCode: string): DictItemOption[] => { return dictCache.value[dictCode] || []; }; + /** * 清空字典缓存 */ const clearDictCache = () => { dictCache.value = {}; }; + return { loadDictItems, getDictItems, diff --git a/src/store/modules/user.store.ts b/src/store/modules/user.store.ts index eec6decf..d4de3587 100644 --- a/src/store/modules/user.store.ts +++ b/src/store/modules/user.store.ts @@ -97,6 +97,7 @@ export const useUserStore = defineStore("user", () => { clearToken(); usePermissionStoreHook().resetRouter(); useDictStoreHook().clearDictCache(); + userInfo.value = {} as UserInfo; resolve(); }); } diff --git a/src/types/components.d.ts b/src/types/components.d.ts index ca45a035..f1a615a6 100644 --- a/src/types/components.d.ts +++ b/src/types/components.d.ts @@ -36,6 +36,7 @@ declare module "vue" { ElIcon: (typeof import("element-plus/es"))["ElIcon"]; ElImage: (typeof import("element-plus/es"))["ElImage"]; ElInput: (typeof import("element-plus/es"))["ElInput"]; + ElInputTag: (typeof import("element-plus/es"))["ElInputTag"]; ElInputNumber: (typeof import("element-plus/es"))["ElInputNumber"]; ElLink: (typeof import("element-plus/es"))["ElLink"]; ElMenu: (typeof import("element-plus/es"))["ElMenu"]; diff --git a/vite.config.ts b/vite.config.ts index a44f96d3..c40347f3 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -94,7 +94,8 @@ export default defineConfig(({ mode }: ConfigEnv) => { "pinia", "axios", "@vueuse/core", - "sortablejs", + "codemirror-editor-vue3", + "default-passive-events", "exceljs", "path-to-regexp", "echarts/core", @@ -103,8 +104,10 @@ export default defineConfig(({ mode }: ConfigEnv) => { "echarts/components", "vue-i18n", "nprogress", + "sortablejs", "qs", "path-browserify", + "@stomp/stompjs", "@element-plus/icons-vue", "element-plus/es", "element-plus/es/locale/lang/en", @@ -139,6 +142,7 @@ export default defineConfig(({ mode }: ConfigEnv) => { "element-plus/es/components/image-viewer/style/index", "element-plus/es/components/image/style/index", "element-plus/es/components/input-number/style/index", + "element-plus/es/components/input-tag/style/index", "element-plus/es/components/input/style/index", "element-plus/es/components/link/style/index", "element-plus/es/components/loading/style/index",