| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- 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<Record<string, DictItemOption[]>>(STORAGE_KEYS.DICT_CACHE, {});
- // 请求队列(防止重复请求)
- const requestQueue: Record<string, Promise<void>> = {};
- /**
- * 缓存字典数据
- * @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);
- }
|