Procházet zdrojové kódy

fix: 首页,知识库

lxf před 2 týdny
rodič
revize
1f5963422d

+ 33 - 25
src/App.vue

@@ -23,7 +23,7 @@
 
     <Tabbar class="tabbar" route fixed v-show="showTab" active-color="#2199F8" inactive-color="#898989">
         <!-- 托管农户:首页、作物档案、农事记录 -->
-        <template v-if="userType === 2">
+        <template v-if="userType == 2">
             <tabbar-item replace to="/home">
                 <span>首页</span>
                 <template #icon="props">
@@ -63,7 +63,7 @@
         </template>
 
         <!-- 普通农户:首页、农事服务、用户管理、个人中心(保留原逻辑) -->
-        <template v-else>
+        <template v-else-if="userType == 1">
             <tabbar-item replace to="/home" v-if="curRole == 0 || curRole == 2">
                 <span>首页</span>
                 <template #icon="props">
@@ -122,7 +122,7 @@
 <script setup>
 import { NumberKeyboard } from "vant";
 import { Tabbar, TabbarItem } from "vant";
-import { nextTick, watch, onMounted, ref } from "vue";
+import { nextTick, watch, onMounted, ref, computed } from "vue";
 import { useRoute, useRouter } from "vue-router";
 import { useStore } from "vuex";
 import { NH, NZ, EXPERT } from "@/common/user_role";
@@ -134,35 +134,43 @@ const router = useRouter();
 const showTab = ref(false);
 // 0: 农户, 1: 专家, 2:农资农服
 const curRole = ref(0);
-// USER_TYPE: 1 普通农户,2 托管农户
-const userType = ref(1);
 
 let tabBarHeight = 0;
 
+// USER_TYPE: 1 普通农户,2 托管农户
+const userType = ref(localStorage.getItem("USER_TYPE") || null);
+// 防止重复请求的标志
+const isFetchingUserType = ref(false);
+
 // 获取用户是否为托管农户,并缓存 USER_TYPE
-const fetchUserType = () => {
-    VE_API.farm
-        .userFarmSelectOption({ userType: 2 })
-        .then(({ data }) => {
-            if (Array.isArray(data) && data.length > 0) {
-                // 有托管农户数据
-                userType.value = 2;
-                localStorage.setItem("USER_TYPE", "2");
-            } else {
-                userType.value = 1;
-                localStorage.setItem("USER_TYPE", "1");
-            }
-        })
-        .catch(() => {
-            // 请求失败时保留默认值,并写入一次缓存
-            localStorage.setItem("USER_TYPE", String(userType.value));
-        });
+const fetchUserType = async () => {
+    if (isFetchingUserType.value) return;
+    isFetchingUserType.value = true;
+    try {
+        const { data } = await VE_API.farm.userFarmSelectOption({ userType: 2 });
+        if (Array.isArray(data) && data.length > 0) {
+            localStorage.setItem("USER_TYPE", "2");
+            userType.value = "2";
+        } else {
+            localStorage.setItem("USER_TYPE", "1");
+            userType.value = "1";
+        }
+    } catch (error) {
+        // 获取用户类型失败时的错误处理
+    } finally {
+        isFetchingUserType.value = false;
+    }
 };
 
-onMounted(() => {
-    // 进入首页时请求接口,确定是否为托管农户
-    fetchUserType();
+// 监听 token 变化,当有 token 时获取用户类型
+const token = computed(() => store.getters.token);
+watch(token, async (newToken) => {
+    if (newToken) {
+        await fetchUserType();
+    }
+}, { immediate: true });
 
+onMounted(() => {
     setTimeout(() => {
         curRole.value = store.state.app.curRole;
         if (route.meta.showTabbar) {

+ 13 - 0
src/views/old_mini/dev_login.vue

@@ -60,6 +60,8 @@ onMounted(async () => {
         // store.dispatch(`app/${SET_USER_CUR_ROLE}`, curRole);
         store.dispatch(`app/${SET_USER_CUR_ROLE}`, roles[roles.length - 1]);
     }
+    // 进入首页时请求接口,确定是否为托管农户
+    await fetchUserType();
     await getFarmList();
     localStorage.setItem("MINI_USER_LOCATION", route.query.point)
     localStorage.setItem("MINI_USER_LOCATION_POINT", `POINT(${pointXy[0]} ${pointXy[1]})`)
@@ -80,6 +82,17 @@ const getFarmList = async () => {
     }
 }
 
+
+// 获取用户是否为托管农户,并缓存 USER_TYPE
+const fetchUserType = async () => {
+    const { data } = await VE_API.farm.userFarmSelectOption({ userType: 2 });
+    if (Array.isArray(data) && data.length > 0) {
+        localStorage.setItem("USER_TYPE", "2");
+    } else {
+        localStorage.setItem("USER_TYPE", "1");
+    }
+};
+
 </script>
 
 <style scoped></style>

+ 8 - 17
src/views/old_mini/home/components/knowledgeCard.vue

@@ -79,23 +79,14 @@ const formatDate = (dateString) => {
 const getKnowledgeList = async () => {
     try {
         let data = [];
-        
-        if (activeKnowledgeId.value === 6) {
-            // 种植知识库:使用新接口
-            const { data: result } = await VE_API.user.listWithAnswer({ 
-                farmId: store.state.home.gardenId 
-            });
-            data = result || [];
-        } else {
-            // 实战知识库:使用原接口
-            const params = {
-                page: 1,
-                limit: 10,
-                topicId: activeKnowledgeId.value,
-            };
-            const { data: result } = await VE_API.home.warningPageList(params);
-            data = result || [];
-        }
+        // 实战知识库:使用原接口
+        const params = {
+            page: 1,
+            limit: 10,
+            topicId: activeKnowledgeId.value,
+        };
+        const { data: result } = await VE_API.home.warningPageList(params);
+        data = result || [];
 
         knowledgeList.value = data;
         // 按当前 topicId 缓存,后续切换直接读取

+ 29 - 57
src/views/old_mini/home/subPages/knowledgeList.vue

@@ -2,12 +2,7 @@
     <div class="service-records-page">
         <custom-header name="知识库"></custom-header>
         <div class="record-list">
-            <list
-                v-model:loading="listLoading"
-                :finished="listFinished"
-                finished-text=""
-                @load="getKnowledgeList"
-            >
+            <list v-model:loading="listLoading" :finished="listFinished" finished-text="" @load="getKnowledgeList">
                 <div v-for="(item, index) in knowledgeList" :key="index" class="record-card">
                     <img class="thumb" :src="item.media && item.media[0]" alt="暂无图片" />
                     <div class="card-body" @click="handleItemClick(item)">
@@ -98,58 +93,26 @@ const getKnowledgeList = async () => {
 
     try {
         let list = [];
-
-        if (topicId.value === 6) {
-            // 种植知识库:使用新接口
-            // 如果是第一页,重新请求接口;否则使用缓存数据
-            if (page.value === 1) {
-                const { data } = await VE_API.user.listWithAnswer({ 
-                    farmId: store.state.home.gardenId 
-                });
-                allDataCache.value = data || [];
-            }
-            
-            list = allDataCache.value;
-            
-            // 新接口可能返回全部数据,需要手动分页处理
-            const startIndex = (page.value - 1) * pageSize.value;
-            const endIndex = startIndex + pageSize.value;
-            const paginatedList = list.slice(startIndex, endIndex);
-
-            if (page.value === 1) {
-                knowledgeList.value = paginatedList;
-            } else {
-                knowledgeList.value = [...knowledgeList.value, ...paginatedList];
-            }
-
-            // 如果已经取完所有数据,标记为完成
-            if (endIndex >= list.length) {
-                listFinished.value = true;
-            } else {
-                page.value += 1;
-            }
+        // 实战知识库:使用原接口(支持分页)
+        const params = {
+            page: page.value,
+            limit: pageSize.value,
+            topicId: topicId.value,
+        };
+        const { data } = await VE_API.home.warningPageList(params);
+        list = data || [];
+
+        if (page.value === 1) {
+            knowledgeList.value = list;
         } else {
-            // 实战知识库:使用原接口(支持分页)
-            const params = {
-                page: page.value,
-                limit: pageSize.value,
-                topicId: topicId.value,
-            };
-            const { data } = await VE_API.home.warningPageList(params);
-            list = data || [];
-
-            if (page.value === 1) {
-                knowledgeList.value = list;
-            } else {
-                knowledgeList.value = [...knowledgeList.value, ...list];
-            }
+            knowledgeList.value = [...knowledgeList.value, ...list];
+        }
 
-            // 如果返回数量小于页大小,认为没有更多数据了
-            if (list.length < pageSize.value) {
-                listFinished.value = true;
-            } else {
-                page.value += 1;
-            }
+        // 如果返回数量小于页大小,认为没有更多数据了
+        if (list.length < pageSize.value) {
+            listFinished.value = true;
+        } else {
+            page.value += 1;
         }
     } catch (error) {
         console.error("获取知识列表失败:", error);
@@ -174,6 +137,7 @@ const handleItemClick = (item) => {
     width: 100%;
     background: #f5f5f5;
     height: 100vh;
+
     .record-list {
         padding: 10px 12px;
         display: flex;
@@ -182,6 +146,7 @@ const handleItemClick = (item) => {
         height: calc(100% - 60px);
         overflow-y: auto;
     }
+
     .record-card {
         display: flex;
         gap: 12px;
@@ -191,6 +156,7 @@ const handleItemClick = (item) => {
         align-items: center;
         height: 98px;
         box-sizing: border-box;
+
         .thumb {
             width: 112px;
             height: 74px;
@@ -198,18 +164,21 @@ const handleItemClick = (item) => {
             object-fit: cover;
             flex: none;
         }
+
         .card-body {
             flex: 1;
             height: 100%;
             display: flex;
             align-items: center;
             justify-content: space-between;
+
             .card-body-left {
                 width: 100%;
                 height: 95%;
                 display: flex;
                 flex-direction: column;
                 justify-content: space-between;
+
                 .date {
                     font-size: 13px;
                     color: #86909c;
@@ -218,12 +187,15 @@ const handleItemClick = (item) => {
             }
         }
     }
-    .record-card + .record-card {
+
+    .record-card+.record-card {
         margin-top: 10px;
     }
+
     .empty-wrap {
         padding-top: 40px;
         text-align: center;
+
         .empty-text {
             font-size: 14px;
             color: #86909c;