dict-store.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { store } from "@/store";
  2. import DictAPI, { type DictItemOption } from "@/api/system/dict-api";
  3. import { STORAGE_KEYS } from "@/constants";
  4. export const useDictStore = defineStore("dict", () => {
  5. // 字典数据缓存
  6. const dictCache = useStorage<Record<string, DictItemOption[]>>(STORAGE_KEYS.DICT_CACHE, {});
  7. // 请求队列(防止重复请求)
  8. const requestQueue: Record<string, Promise<void>> = {};
  9. /**
  10. * 缓存字典数据
  11. * @param dictCode 字典编码
  12. * @param data 字典项列表
  13. */
  14. const cacheDictItems = (dictCode: string, data: DictItemOption[]) => {
  15. dictCache.value[dictCode] = data;
  16. };
  17. /**
  18. * 加载字典数据(如果缓存中没有则请求)
  19. * @param dictCode 字典编码
  20. */
  21. const loadDictItems = async (dictCode: string) => {
  22. if (dictCache.value[dictCode]) return;
  23. // 防止重复请求
  24. if (!requestQueue[dictCode]) {
  25. requestQueue[dictCode] = DictAPI.getDictItems(dictCode)
  26. .then((data) => {
  27. cacheDictItems(dictCode, data);
  28. Reflect.deleteProperty(requestQueue, dictCode);
  29. })
  30. .catch((error) => {
  31. // 请求失败,清理队列,允许重试
  32. Reflect.deleteProperty(requestQueue, dictCode);
  33. throw error;
  34. });
  35. }
  36. await requestQueue[dictCode];
  37. };
  38. /**
  39. * 获取字典项列表
  40. * @param dictCode 字典编码
  41. * @returns 字典项列表
  42. */
  43. const getDictItems = (dictCode: string): DictItemOption[] => {
  44. return dictCache.value[dictCode] || [];
  45. };
  46. /**
  47. * 移除指定字典项
  48. * @param dictCode 字典编码
  49. */
  50. const removeDictItem = (dictCode: string) => {
  51. if (dictCache.value[dictCode]) {
  52. Reflect.deleteProperty(dictCache.value, dictCode);
  53. }
  54. };
  55. /**
  56. * 清空字典缓存
  57. */
  58. const clearDictCache = () => {
  59. dictCache.value = {};
  60. };
  61. /**
  62. * 刷新指定字典项
  63. * @param dictCode 字典编码
  64. */
  65. const refreshDictItems = async (dictCode: string) => {
  66. // 先移除缓存
  67. removeDictItem(dictCode);
  68. // 重新加载
  69. await loadDictItems(dictCode);
  70. };
  71. return {
  72. loadDictItems,
  73. getDictItems,
  74. removeDictItem,
  75. clearDictCache,
  76. refreshDictItems,
  77. };
  78. });
  79. export function useDictStoreHook() {
  80. return useDictStore(store);
  81. }