| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import { defineStore } from "pinia";
- import { localForage } from "@/utils/localforage";
- import { getDictDataByType } from "@/api/system/dict";
- const DICT_PREFIX = "dict:";
- const DEFAULT_TTL_MINUTES = 60;
- export const useDictStore = defineStore("dict", {
- state: () => ({
- dict: [] as Array<{ key: string; value: any[] }>
- }),
- actions: {
- // 内存读取
- getDict(key: string) {
- try {
- const item = this.dict.find(item => item.key === key);
- return item ? item.value : null;
- } catch (e) {
- console.error("获取字典失败:", e);
- return null;
- }
- },
- // 内存写入
- setDict(key: string, value: any[]) {
- if (!key || typeof key !== "string") return;
- const index = this.dict.findIndex(item => item.key === key);
- if (index !== -1) {
- this.dict[index].value = value;
- } else {
- this.dict.push({ key, value });
- }
- },
- // 从持久层加载(未过期则返回)
- async loadFromStorage(key: string) {
- const cacheKey = `${DICT_PREFIX}${key}`;
- const cached = await localForage().getItem<any[]>(cacheKey);
- if (cached && cached.length) {
- this.setDict(key, cached);
- return cached;
- }
- return null;
- },
- // 写入持久层(带 TTL,单位分钟)
- async persistDict(
- key: string,
- value: any[],
- ttlMinutes = DEFAULT_TTL_MINUTES
- ) {
- const cacheKey = `${DICT_PREFIX}${key}`;
- await localForage().setItem(cacheKey, value, ttlMinutes);
- },
- // 统一拉取入口(内存→持久层→后端)
- async fetchDictByType(
- key: string,
- opts?: { forceRefresh?: boolean; ttlMinutes?: number }
- ) {
- // 1) 内存命中
- const inMemory = this.getDict(key);
- if (inMemory && !opts?.forceRefresh) return inMemory;
- // 2) 持久层命中
- const fromStorage = await this.loadFromStorage(key);
- if (fromStorage && !opts?.forceRefresh) return fromStorage;
- // 3) 后端拉取
- const resp = await getDictDataByType(key);
- const dictData = resp.data.map((p: any) => ({
- label: p.dictLabel,
- value: p.dictValue,
- class: p.listClass
- }));
- this.setDict(key, dictData);
- await this.persistDict(
- key,
- dictData,
- opts?.ttlMinutes ?? DEFAULT_TTL_MINUTES
- );
- return dictData;
- },
- // 删除:内存 + 持久层
- async removeDict(key: string) {
- try {
- const index = this.dict.findIndex(item => item.key === key);
- if (index !== -1) this.dict.splice(index, 1);
- await localForage().removeItem(`${DICT_PREFIX}${key}`);
- return true;
- } catch (e) {
- console.error("移除字典失败:", e);
- return false;
- }
- },
- // 清空:内存 + 持久层(仅清理字典前缀)
- async clearAll() {
- this.dict = [];
- const keys = await localForage().keys();
- const dictKeys = keys.filter(k => k.startsWith(DICT_PREFIX));
- await Promise.all(dictKeys.map(k => localForage().removeItem(k)));
- }
- }
- });
|