Jelajahi Sumber

fix: 优化数据字典初始化与重复请求处理

- 应用启动及登录成功后预加载数据字典
- 移除首页对数据字典加载的依赖
- 增加加载状态与请求复用,避免重复请求
Zimo 1 Minggu lalu
induk
melakukan
0a5f0dd155
4 mengubah file dengan 43 tambahan dan 11 penghapusan
  1. 7 0
      App.vue
  2. 0 2
      pages/home/index.vue
  3. 2 0
      pages/user/login.vue
  4. 34 9
      store/modules/dataDict.js

+ 7 - 0
App.vue

@@ -1,9 +1,11 @@
 <script>
 import { initAppDatabase } from '@/utils/appDb';
+import { getAccessToken } from '@/utils/auth';
 import {
 	HOT_UPDATE_CHECK_INTERVAL,
 	runWgtHotUpdate
 } from '@/utils/hot-update';
+import { useDataDictStore } from '@/store/modules/dataDict';
 
 let hotUpdateTimer = null;
 
@@ -23,6 +25,11 @@ const startHotUpdatePolling = () => {
 
 export default {
 	onLaunch: (options) => {
+		// 已登录用户在应用启动时预加载字典,避免依赖某个具体页面初始化。
+		if (getAccessToken()) {
+			useDataDictStore().loadDataDictList();
+		}
+
 		// #ifdef APP
 		initAppDatabase();
 		// #endif

+ 0 - 2
pages/home/index.vue

@@ -517,7 +517,6 @@ import { nextTick, onMounted, ref } from "vue";
 import { getUnreadMessageCount } from "@/api/message";
 import { getOvertimeTaskList } from "@/api/task";
 import { getLoginUserInfo } from "@/api/login";
-import { useDataDictStore } from "@/store/modules/dataDict";
 import { useDeptStore } from "@/store/modules/dept";
 import { useDeviceStore } from "@/store/modules/device";
 import { messageNavigate } from "@/utils/navigate";
@@ -572,7 +571,6 @@ const navigateToRuiYingReport = (url) => {
 const messageCount = ref(0);
 onMounted(async () => {
   await Promise.all([
-    useDataDictStore().loadDataDictList(),
     useDeptStore().loadDeptList(),
     useDeviceStore().loadDeviceTypeList(),
   ]);

+ 2 - 0
pages/user/login.vue

@@ -69,6 +69,7 @@ import config from "@/utils/config";
 import { saveUser } from "@/utils/appDb";
 // 引入本地存储操作
 import { setUserId, setToken, setDeptId, setUserInfo } from "@/utils/auth.js";
+import { useDataDictStore } from "@/store/modules/dataDict";
 // 引入组件
 import Upgrade from "@/components/upgrade.vue";
 import LanguagePopup from "@/components/language-popup.vue";
@@ -292,6 +293,7 @@ const handleLoginSuccess = async (result) => {
 
   await setUserInfo(data);
   await setDeptId(res.data.user.deptId);
+  await useDataDictStore().loadDataDictList();
   await uni.switchTab({
     url: "/pages/entry/index",
   });

+ 34 - 9
store/modules/dataDict.js

@@ -2,16 +2,41 @@ import { defineStore } from 'pinia';
 import { ref } from 'vue';
 import { getAllDataDictList as getList } from '@/api';
 
-export const useDataDictStore = defineStore('dataDict', () => {
-  const dataDict = ref([]);
-  const map = new Map();
+export const useDataDictStore = defineStore('dataDict', () => {
+  const dataDict = ref([]);
+  const map = new Map();
+  let isLoaded = false;
+  let loadingPromise = null;
 
-  /**
-   * 加载数据字典
-   */
-  const loadDataDictList = async () => {
-    dataDict.value = (await getList()).data;
-  };
+  /**
+   * 加载数据字典
+   */
+  const loadDataDictList = async () => {
+    if (isLoaded) {
+      return dataDict.value;
+    }
+
+    // 应用启动和页面初始化可能同时触发,复用同一个请求,避免重复加载。
+    if (loadingPromise) {
+      return loadingPromise;
+    }
+
+    loadingPromise = getList()
+      .then(response => {
+        if (Array.isArray(response?.data)) {
+          dataDict.value = response.data;
+          map.clear();
+          isLoaded = true;
+        }
+        return dataDict.value;
+      })
+      .catch(() => dataDict.value)
+      .finally(() => {
+        loadingPromise = null;
+      });
+
+    return loadingPromise;
+  };
   /**
    * 获取type对应字典列表
    * @param type