import { store } from "@/store"; import DictAPI, { type DictItemOption } from "@/api/system/dict-api"; import { STORAGE_KEYS } from "@/constants"; export const useDictStore = defineStore("dict", () => { // 字典数据缓存 const dictCache = useStorage>(STORAGE_KEYS.DICT_CACHE, {}); // 请求队列(防止重复请求) const requestQueue: Record> = {}; /** * 缓存字典数据 * @param dictCode 字典编码 * @param data 字典项列表 */ const cacheDictItems = (dictCode: string, data: DictItemOption[]) => { dictCache.value[dictCode] = data; }; /** * 加载字典数据(如果缓存中没有则请求) * @param dictCode 字典编码 */ const loadDictItems = async (dictCode: string) => { if (dictCache.value[dictCode]) return; // 防止重复请求 if (!requestQueue[dictCode]) { requestQueue[dictCode] = DictAPI.getDictItems(dictCode) .then((data) => { cacheDictItems(dictCode, data); Reflect.deleteProperty(requestQueue, dictCode); }) .catch((error) => { // 请求失败,清理队列,允许重试 Reflect.deleteProperty(requestQueue, dictCode); throw error; }); } await requestQueue[dictCode]; }; /** * 获取字典项列表 * @param dictCode 字典编码 * @returns 字典项列表 */ const getDictItems = (dictCode: string): DictItemOption[] => { return dictCache.value[dictCode] || []; }; /** * 移除指定字典项 * @param dictCode 字典编码 */ const removeDictItem = (dictCode: string) => { if (dictCache.value[dictCode]) { Reflect.deleteProperty(dictCache.value, dictCode); } }; /** * 清空字典缓存 */ const clearDictCache = () => { dictCache.value = {}; }; /** * 刷新指定字典项 * @param dictCode 字典编码 */ const refreshDictItems = async (dictCode: string) => { // 先移除缓存 removeDictItem(dictCode); // 重新加载 await loadDictItems(dictCode); }; return { loadDictItems, getDictItems, removeDictItem, clearDictCache, refreshDictItems, }; }); export function useDictStoreHook() { return useDictStore(store); }