Selaa lähdekoodia

```
feat(App): 优化无限滚动加载逻辑并修复防重复触发问题

- 添加isLoadingMore状态防止多次触发loadMore
- 新增isInfiniteScrollPage计算属性控制页面级别的无限滚动开关
- 实现infiniteDisabled计算属性统一控制滚动禁用状态
- 支持loadMore返回Promise的异步处理
- 修复scrollLoad方法中的边界条件检查

fix(FileUploader): 调整头像上传组件样式尺寸

- 将头像尺寸从148px调整为80px
- 更新CSS样式以匹配新的尺寸规格
- 隐藏上传状态标签以改善UI显示

style(PersonalCenter): 优化个人中心页面布局高度

- 设置右侧主内容区域最小高度为视窗高度减去350px
- 改善页面布局的自适应效果

refactor(workflowTrade): 替换工作流交易页面标签组件

- 将el-button替换为自定义tag样式组件
- 修改分类标签从el-tag为el-button small尺寸
- 添加新的tag样式类定义
```

zhangningning 1 viikko sitten
vanhempi
commit
da640c6bdc

+ 33 - 9
src/App.vue

@@ -5,7 +5,9 @@
     vipHomePage: $route.path === '/member',
     isScroll: appStore.isScroll,
   }"
-   v-infinite-scroll="scrollLoad" infinite-scroll-disabled="false" infinite-scroll-distance="0"
+   v-infinite-scroll="scrollLoad"
+   :infinite-scroll-disabled="infiniteDisabled"
+   infinite-scroll-distance="0"
    :infinite-scroll-immediate="false"
   >
     <ElConfigProvider :locale="langStore.elLocale">
@@ -196,15 +198,37 @@ provide('openLoginDialog', openLoginDialog);
 
 // 无限滚动加载
 const routerChildRef = ref(null);
+// 是否在加载中,防止多次触发 loadMore
+const isLoadingMore = ref(false);
+// 当前路由是否需要开启无限滚动(比如只有列表页开启)
+const isInfiniteScrollPage = computed(() => {
+  // 按需添加需要无限滚动的路由前缀
+  if (route.path.startsWith('/index')) return true;
+  if (route.path.startsWith('/learning-system')) return true;
+  if (route.path.startsWith('/learn-note')) return true;
+  if (route.path.startsWith('/workflow-trade')) return true;
+  return false;
+});
+// 控制 v-infinite-scroll 的禁用状态
+const infiniteDisabled = computed(() => {
+  return !isInfiniteScrollPage.value || isLoadingMore.value;
+});
+
 const scrollLoad = () => {
-  console.log('触发滚动加载',routerChildRef.value)
-  nextTick(() => {
-    const routerChild = routerChildRef.value;
-    
-    if (routerChild && typeof routerChild.loadMore === 'function') {
-      routerChild.loadMore();
-    }
-  });
+  if (infiniteDisabled.value) return;
+  const routerChild = routerChildRef.value;
+  if (!routerChild || typeof routerChild.loadMore !== 'function') return;
+
+  isLoadingMore.value = true;
+  // 兼容 loadMore 返回 Promise 或同步函数两种情况
+  const res = routerChild.loadMore();
+  if (res && typeof res.then === 'function') {
+    res.finally(() => {
+      isLoadingMore.value = false;
+    });
+  } else {
+    isLoadingMore.value = false;
+  }
 };
 </script>
 

+ 8 - 1
src/components/FileUploader.vue

@@ -39,7 +39,7 @@
       <template v-else-if="listType === 'picture-card'">
         <!-- 只有当文件数量小于limit且limit大于0时才显示加号按钮 -->
         <!--  v-if="!limit || fileList.length < limit" -->
-        <el-avatar :size="148" :src="fileList[0]?.url || appStore.avatarDefault" v-if="isUploadAvatar" />
+        <el-avatar :size="80" :src="fileList[0]?.url || appStore.avatarDefault" v-if="isUploadAvatar" />
         <el-icon v-else-if="!limit || fileList.length < limit" ><Plus /></el-icon>
       </template>
       <template v-else-if="listType === 'picture-user-card'">
@@ -592,9 +592,16 @@ defineExpose({
   &.is-upload-avatar{
     .el-upload--picture-card{
       border-color: transparent;
+      height: 80px;
+      width: 80px;
     }
     .el-upload-list__item{
       border-radius: 50%;
+      height: 80px;
+      width: 80px;
+      .el-upload-list__item-status-label{
+        display:none;
+      }
     }
     .el-upload-list__item-thumbnail{
       object-fit: fill

+ 2 - 0
src/pages/PersonalCenter.vue

@@ -1065,11 +1065,13 @@ div {
     flex: 1;
 
     margin-left: 16px;
+    
 
     .personal-right-main {
       padding: 0 16px;
       border-radius: 16px;
       background: #FFFFFF;
+      min-height: calc(100vh - 350px);
     }
   }
 }

+ 22 - 5
src/pages/workflowTrade/workflowTrade.vue

@@ -83,19 +83,23 @@
           <div  @click="goworkflowTradeDetail(item)" class="cursor-pointer">
             <div class="flex-between">
               <div class="gap10">
-                <el-button 
+                <!-- <el-button 
                 :type="item.applyStatus == 2 ? 'danger' : 'primary'" 
                 v-if="applyStatusInfo[item.applyStatus]">
                   {{item.applyStatus === '1' ? $t('workflowTrade.demandStatusSignUping') : $t('workflowTrade.demandStatusEnded')}}
-                </el-button>
+                </el-button> -->
+                <div class="tag"
+                :class="{ 'tag_red': item.applyStatus == 2 || item.applyStatus == null }">{{
+                  item.applyStatus == 1 ? $t('workflowTrade.demandStatusSignUping') :
+                    $t('workflowTrade.demandStatusEnded') }}</div>
                 <div class="bold font_size30">{{item.title}}</div>
               </div>
               <div class="font_size24 color_price bold">¥{{item.budgetMin}}-{{item.budgetMax}}</div>
             </div>
             <div class="gap10 mt10">
-              <el-tag type="primary" plain>{{item.categoryName1}}</el-tag>
-              <el-tag type="primary" plain>{{item.categoryName2}}</el-tag>
-              <el-tag type="primary" plain>{{item.categoryName3}}</el-tag>
+              <el-button type="primary" plain size="small">{{item.categoryName1}}</el-button>
+              <el-button type="primary" plain size="small">{{item.categoryName2}}</el-button>
+              <el-button type="primary" plain size="small">{{item.categoryName3}}</el-button>
               <div class="gap5">
                 <img :src="yuangong" alt="" style="width: 16px; height: 16px;">
                 <span class="font_size14">{{item.questApplyCount || 0}} {{$t('common.renbaoming')}}</span>
@@ -357,5 +361,18 @@
       }
     }
   }
+  .tag {
+    padding: 0 12px;
+    line-height: 30px;
+    color: #FFFFFF;
+    font-size: 14px;
+    background: #2D71FF;
+    border-radius: 4px;
+    margin-right: 8px;
+  }
+
+  .tag_red {
+    background: #E43434;
+  }
 }
 </style>