Ver código fonte

🎨 优化乡源页,发现页显示

快乐的梦鱼 1 mês atrás
pai
commit
b528abca20

+ 5 - 1
src/components/loader/SimplePageListLoader.vue

@@ -2,7 +2,7 @@
   <slot />
   <slot />
   <Loadmore
   <Loadmore
     v-if="loader.status.value == 'loading' 
     v-if="loader.status.value == 'loading' 
-      || (loader.status.value == 'nomore' && !$slots.empty)" 
+      || (loader.status.value == 'nomore' && !$slots.empty && showNomore)" 
     :status="loader.status.value" 
     :status="loader.status.value" 
   />
   />
   <slot v-else-if="loader.status.value == 'empty'" name="empty">
   <slot v-else-if="loader.status.value == 'empty'" name="empty">
@@ -27,6 +27,10 @@ const props = defineProps({
     type: Object as PropType<ISimplePageListLoader<any, any>>,
     type: Object as PropType<ISimplePageListLoader<any, any>>,
     default: null,
     default: null,
   },
   },
+  showNomore: {
+    type: Boolean,
+    default: true,
+  },
   emptyView: {
   emptyView: {
     type: Object as PropType<{
     type: Object as PropType<{
       text: string;
       text: string;

+ 8 - 0
src/pages.json

@@ -94,6 +94,14 @@
       }
       }
     },
     },
     {
     {
+      "path": "pages/home/village/goods/index",
+      "style": {
+        "navigationBarTitleText": "乡源好物",
+        "navigationStyle": "custom",
+        "enablePullDownRefresh": true
+      }
+    },
+    {
       "path": "pages/home/village/goods/detail",
       "path": "pages/home/village/goods/detail",
       "style": {
       "style": {
         "navigationBarTitleText": "乡源好物详情",
         "navigationBarTitleText": "乡源好物详情",

+ 7 - 6
src/pages/dig/forms/common.vue

@@ -27,7 +27,7 @@
           </ProvideVar>
           </ProvideVar>
         </BackgroundBox>
         </BackgroundBox>
         <Height :height="20" />
         <Height :height="20" />
-        <Button v-if="querys.isView" type="primary" :loading="loading" @click="backPrev(false)">返回</Button>
+        <Button v-if="querys.isView" type="primary" :loading="loading" @click="backPrev(false, false)">返回</Button>
         <FlexCol v-else :gap="10" center>
         <FlexCol v-else :gap="10" center>
           <Height :height="20" />
           <Height :height="20" />
           <PrimaryButton 
           <PrimaryButton 
@@ -35,7 +35,7 @@
             width="560rpx"
             width="560rpx"
             @click="debounceSubmit.executeWithDelay()"
             @click="debounceSubmit.executeWithDelay()"
           />
           />
-          <Button v-if="querys.id" type="text" textColor="danger" :loading="loading" @click="deleteInfo">删除</Button>
+          <Button v-if="querys.id > 0" type="text" textColor="danger" :loading="loading" @click="deleteInfo">删除</Button>
         </FlexCol>
         </FlexCol>
       </FlexCol>
       </FlexCol>
       <XBarSpace />
       <XBarSpace />
@@ -143,7 +143,7 @@ const { querys } = useLoadQuerys({
   } catch (e) {
   } catch (e) {
     console.log(e);
     console.log(e);
     if (!(e instanceof RequestApiError && e.errorMessage.startsWith('请完成')))
     if (!(e instanceof RequestApiError && e.errorMessage.startsWith('请完成')))
-      showError(e, undefined, () => backPrev(false));
+      showError(e, undefined, () => backPrev(false, false));
   } finally {
   } finally {
     loading.value = false;
     loading.value = false;
   }
   }
@@ -212,7 +212,7 @@ async function submit() {
       cancelText: '继续编辑',
       cancelText: '继续编辑',
       confirmText: '返回列表',
       confirmText: '返回列表',
       icon: 'success',
       icon: 'success',
-      onConfirm: () => backPrev(true),
+      onConfirm: () => backPrev(true, false),
     })
     })
   } catch (e) {
   } catch (e) {
     showError(e);
     showError(e);
@@ -221,9 +221,10 @@ async function submit() {
     loading.value = false;
     loading.value = false;
   }
   }
 }
 }
-function backPrev(needRefresh: boolean) {
+function backPrev(needRefresh: boolean, isDeleted: boolean) {
   backAndCallOnPageBack('list', {
   backAndCallOnPageBack('list', {
     needRefresh,
     needRefresh,
+    isDeleted,
   });
   });
 }
 }
 
 
@@ -244,7 +245,7 @@ async function deleteInfo() {
     await waitTimeOut(800);
     await waitTimeOut(800);
     await VillageInfoApi.deleteInfo(querys.value.id);
     await VillageInfoApi.deleteInfo(querys.value.id);
     toast('删除成功');
     toast('删除成功');
-    backPrev(true);
+    backPrev(true, true);
   } catch (e) {
   } catch (e) {
     showError(e);
     showError(e);
   } finally {
   } finally {

+ 8 - 26
src/pages/home/components/VillageUserRankList.vue

@@ -21,8 +21,9 @@
         position="absolute"
         position="absolute"
         :left="15"
         :left="15"
         :right="15"
         :right="15"
-        :bottom="item.rank == 1 ? 62 : 36"
-        center
+        :bottom="item.rank == 1 ? 55 : 30"
+        justify="flex-end"
+        align="center"
       >
       >
         <Avatar 
         <Avatar 
           :url="item.image" :size="item.rank == 1 ? 100 : 90" mode="aspectFill" radius="radius.md" 
           :url="item.image" :size="item.rank == 1 ? 100 : 90" mode="aspectFill" radius="radius.md" 
@@ -30,7 +31,9 @@
         />
         />
         <Height :height="item.rank == 1 ? 15 : 10" />
         <Height :height="item.rank == 1 ? 15 : 10" />
         <Text fontConfig="h4" :text="item.title" color="white" />
         <Text fontConfig="h4" :text="item.title" color="white" />
-        <Text fontConfig="h2" :text="item.score" :color="scoreColors[item.rank - 1]" fontFamily="SongtiSCBlack" />
+        <Height :height="6" />
+        <Text fontConfig="h2" :text="`${item.score}`" :fontSize="30" :color="scoreColors[item.rank - 1]" fontFamily="SongtiSCBlack" />
+        <Text fontFamily="SongtiSCBlack" :fontSize="18" :text="scoreSuffix" :color="scoreColors[item.rank - 1]" />
       </FlexCol>
       </FlexCol>
     </Touchable>
     </Touchable>
   </FlexRow>
   </FlexRow>
@@ -59,30 +62,9 @@ withDefaults(defineProps<{
     rank: number;
     rank: number;
     score: number;
     score: number;
   }[];
   }[];
+  scoreSuffix?: string;
 }>(), {
 }>(), {
-  list: () => [
-    {
-      id: 2,
-      image: 'https://mncdn.wenlvti.net/app_static/minnan/images/test/ImageTest2.png',
-      title: '用户2',
-      rank: 2,
-      score: 90,
-    },
-    {
-      id: 1,
-      image: 'https://mncdn.wenlvti.net/app_static/minnan/images/test/ImageTest1.png',
-      title: '用户1',
-      rank: 1,
-      score: 100,
-    },
-    {
-      id: 3,
-      image: 'https://mncdn.wenlvti.net/app_static/minnan/images/test/ImageTest3.png',
-      title: '用户3',
-      rank: 3,
-      score: 80,
-    },
-  ],
+  list: () => [],
 });
 });
 
 
 const emit = defineEmits<{
 const emit = defineEmits<{

+ 4 - 4
src/pages/home/discover/index.vue

@@ -36,17 +36,18 @@
         :title="item.title"
         :title="item.title"
         :score="item.score"
         :score="item.score"
         :isAdmin="false"
         :isAdmin="false"
+        scoreSuffix="文化积分"
         @click="navTo('/pages/home/village/volunteer/detail', { id: item.id })"
         @click="navTo('/pages/home/village/volunteer/detail', { id: item.id })"
       />
       />
     </FlexCol>
     </FlexCol>
 
 
     <HomeTitle title="乡源好物" showMore @moreClicked="navTo('/pages/home/village/goods/index')" />
     <HomeTitle title="乡源好物" showMore @moreClicked="navTo('/pages/home/village/goods/index')" />
-    <SimplePageListLoader :loader="goodsLoader">
+    <SimplePageListLoader :loader="goodsLoader" :showNomore="false">
       <FlexRow wrap justify="space-around" gap="gap.sm">
       <FlexRow wrap justify="space-around" gap="gap.sm">
         <BoxMid
         <BoxMid
           v-for="good in goodsLoader.list.value" :key="good.id"
           v-for="good in goodsLoader.list.value" :key="good.id"
           :innerStyle="{
           :innerStyle="{
-            width: 'calc(50% - 80rpx)',
+            width: 'calc(50% - 70rpx)',
           }"
           }"
         >
         >
           <Touchable direction="column" gap="gap.lg" @click="handleGoodDetail(good)">
           <Touchable direction="column" gap="gap.lg" @click="handleGoodDetail(good)">
@@ -67,7 +68,7 @@
             </FlexRow>
             </FlexRow>
           </Touchable>
           </Touchable>
         </BoxMid>
         </BoxMid>
-        <FlexCol v-if="goodsLoader.list.value.length % 2 !== 0" width="calc(50% - 40rpx)" />
+        <FlexCol v-if="goodsLoader.list.value.length % 2 !== 0" width="calc(50%)" />
       </FlexRow>
       </FlexRow>
     </SimplePageListLoader>
     </SimplePageListLoader>
 
 
@@ -92,7 +93,6 @@
       </MasonryGrid>
       </MasonryGrid>
     </SimplePageListLoader>
     </SimplePageListLoader>
     
     
-    <Loadmore status="nomore" />
     <Height :height="150" />
     <Height :height="150" />
   </FlexCol>
   </FlexCol>
 </template>
 </template>

+ 2 - 1
src/pages/home/index.vue

@@ -144,7 +144,8 @@
       })" />
       })" />
       <VillageUserRankList 
       <VillageUserRankList 
         :list="villageUserRankListLoader.content.value ?? []" 
         :list="villageUserRankListLoader.content.value ?? []" 
-        @handleGoVillageDetails="navTo('/pages/home/village/volunteer/detail', { id: $event.id })"
+        scoreSuffix="积分"
+        @goDetails="navTo('/pages/home/village/volunteer/detail', { id: $event.id })"
       />
       />
 
 
       <HomeTitle title="精选记忆">
       <HomeTitle title="精选记忆">

+ 16 - 4
src/pages/home/light/submit-volunteer.vue

@@ -48,13 +48,13 @@
         <Result 
         <Result 
           v-else-if="step === 'finished'" 
           v-else-if="step === 'finished'" 
           status="success"
           status="success"
-          :title="finishedMode === 'claim' ? '认领申请已提交' : '注册志愿者成功'"
+          title="注册志愿者成功"
           :description="finishedMode === 'claim'
           :description="finishedMode === 'claim'
             ? '请等待管理员审核认领申请,审核通过后即可采编该村社文化资源'
             ? '请等待管理员审核认领申请,审核通过后即可采编该村社文化资源'
             : '请等待管理员审核,在此期间,可以在社区中先逛逛,学习如何采编村社文化资源信息吧'"
             : '请等待管理员审核,在此期间,可以在社区中先逛逛,学习如何采编村社文化资源信息吧'"
         >
         >
           <Height :size="20" />
           <Height :size="20" />
-          <PrimaryButton block text="进入首页" @click="back()" />
+          <PrimaryButton block text="进入首页" @click="finishAndBack()" />
         </Result>
         </Result>
         <!--错误-->
         <!--错误-->
         <Result 
         <Result 
@@ -109,12 +109,14 @@ import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
 import PrimaryButton from '@/common/components/PrimaryButton.vue';
 import PrimaryButton from '@/common/components/PrimaryButton.vue';
 import ProvideVar from '@/components/theme/ProvideVar.vue';
 import ProvideVar from '@/components/theme/ProvideVar.vue';
 import BoxMid from '@/common/components/box/BoxMid.vue';
 import BoxMid from '@/common/components/box/BoxMid.vue';
+import { useVillageStore } from '@/store/village';
 
 
 /**
 /**
  * 点亮村社页面
  * 点亮村社页面
  */
  */
 
 
 const authStore = useAuthStore();
 const authStore = useAuthStore();
+const villageStore = useVillageStore();
 const { init } = useAppInit();
 const { init } = useAppInit();
 
 
 const { querys } = useLoadQuerys({ 
 const { querys } = useLoadQuerys({ 
@@ -131,6 +133,8 @@ onMounted(async () => {
     return;
     return;
   }
   }
 
 
+  await waitTimeOut(600);
+
   //如果已登录,则尝试获取志愿者信息,有注册志愿者,则显示认领当前村社表单
   //如果已登录,则尝试获取志愿者信息,有注册志愿者,则显示认领当前村社表单
   if (authStore.isLogged) {
   if (authStore.isLogged) {
     try {
     try {
@@ -148,8 +152,6 @@ onMounted(async () => {
     }
     }
   }
   }
 
 
-
-  await waitTimeOut(1000);
   registerFormDefine.value = getVolunteerForm({
   registerFormDefine.value = getVolunteerForm({
     canSetCatalog: false,
     canSetCatalog: false,
     villageId: querys.value.villageId,
     villageId: querys.value.villageId,
@@ -267,4 +269,14 @@ async function suscribePassMessage() {
     });
     });
   });
   });
 }
 }
+
+async function finishAndBack() {
+  uni.showLoading({ title: '请稍后...' });
+  try {
+    await villageStore.loadMyJoinedVillages();
+  } finally {
+    uni.hideLoading();
+    back();
+  }
+}
 </script>
 </script>

+ 43 - 1
src/pages/home/village/goods/detail.vue

@@ -29,6 +29,12 @@
           <Divider />
           <Divider />
           <Parse :content="goodLoader.content.value.content" fontConfig="contentText" />
           <Parse :content="goodLoader.content.value.content" fontConfig="contentText" />
         </BoxMid>
         </BoxMid>
+        <Button
+          v-if="isMyPost"
+          text="修改内容"
+          type="text"
+          @click="handleModify"
+        />
         <Height :height="160" />
         <Height :height="160" />
         <FlexRow center>
         <FlexRow center>
           <PrimaryButton
           <PrimaryButton
@@ -61,17 +67,53 @@ import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
 import VillageInfoApi from '@/api/inhert/VillageInfoApi';
 import VillageInfoApi from '@/api/inhert/VillageInfoApi';
 import Parse from '@/components/display/parse/Parse.vue';
 import Parse from '@/components/display/parse/Parse.vue';
 import ImageSwiper from '@/common/components/parts/ImageSwiper.vue';
 import ImageSwiper from '@/common/components/parts/ImageSwiper.vue';
+import Button from '@/components/basic/Button.vue';
+import { useAuthStore } from '@/store/auth';
+import { computed, onMounted } from 'vue';
+import { backAndCallOnPageBack, navTo } from '@/components/utils/PageAction';
+import { useUserTools } from '@/common/composeabe/UserTools';
 
 
 const { querys } = useLoadQuerys({
 const { querys } = useLoadQuerys({
   id: 0,
   id: 0,
 });
 });
+const { volunteerInfo, getIsVolunteer } = useUserTools();
 
 
 const goodLoader = useSimpleDataLoader(async () => {
 const goodLoader = useSimpleDataLoader(async () => {
   return await VillageInfoApi.getInfoForDiscover(querys.value.id);
   return await VillageInfoApi.getInfoForDiscover(querys.value.id);
 });
 });
+const isMyPost = computed(() => {
+  return goodLoader.content.value?.villageVolunteerId === volunteerInfo.value?.id;
+});
 
 
-
+const handleModify = () => {
+  if (!goodLoader.content.value) {
+    return;
+  }
+  navTo('/pages/dig/forms/common', {
+    id: querys.value.id,
+    villageId: goodLoader.content.value.villageId,
+    villageVolunteerId: goodLoader.content.value.villageVolunteerId || 0,
+    catalogId: goodLoader.content.value.catalogId || 0,
+    collectModuleId: goodLoader.content.value.collectModuleId || 0,
+  });
+};
 const handleConsult = () => {
 const handleConsult = () => {
   toast('暂未开放,敬请期待!');
   toast('暂未开放,敬请期待!');
 };
 };
+
+onMounted(() => {
+  getIsVolunteer();
+});
+defineExpose({
+  onPageBack(name: string, data: any) {
+    if (data.isDeleted) {
+      toast('已删除');
+      setTimeout(() => {
+        backAndCallOnPageBack('list', {
+          needRefresh: true,
+        });
+      }, 200);
+    }
+  },
+});
 </script>
 </script>

+ 7 - 3
src/pages/home/village/goods/index.vue

@@ -4,7 +4,7 @@
       <FlexRow justify="space-between" align="center" gap="gap.sm">
       <FlexRow justify="space-between" align="center" gap="gap.sm">
         <SearchBar v-model:value="searchValue" placeholder="搜索乡源好物" :innerStyle="{ width: '270rpx' }" />
         <SearchBar v-model:value="searchValue" placeholder="搜索乡源好物" :innerStyle="{ width: '270rpx' }" />
         <FrameButton text="我要发布" @click="handlePublish" size="small" />
         <FrameButton text="我要发布" @click="handlePublish" size="small" />
-        <FrameButton text="开通微信小店" size="small" />
+        <FrameButton text="开通微信小店" @click="handleOpen" size="small" />
       </FlexRow>
       </FlexRow>
       <SimplePageListLoader :loader="goodsLoader">
       <SimplePageListLoader :loader="goodsLoader">
         <FlexRow wrap justify="space-around" gap="gap.sm">
         <FlexRow wrap justify="space-around" gap="gap.sm">
@@ -45,6 +45,7 @@ import { onMounted, ref } from 'vue';
 import { useSimplePageListLoader } from '@/components/composeabe/loader/SimplePageListLoader';
 import { useSimplePageListLoader } from '@/components/composeabe/loader/SimplePageListLoader';
 import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
 import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
 import { useUserTools } from '@/common/composeabe/UserTools';
 import { useUserTools } from '@/common/composeabe/UserTools';
+import { confirm } from '@/components/utils/DialogAction';
 import BoxMid from '@/common/components/box/BoxMid.vue';
 import BoxMid from '@/common/components/box/BoxMid.vue';
 import FrameButton from '@/common/components/FrameButton.vue';
 import FrameButton from '@/common/components/FrameButton.vue';
 import Image from '@/components/basic/Image.vue';
 import Image from '@/components/basic/Image.vue';
@@ -57,7 +58,7 @@ import FlexRow from '@/components/layout/FlexRow.vue';
 import SimplePageListLoader from '@/components/loader/SimplePageListLoader.vue';
 import SimplePageListLoader from '@/components/loader/SimplePageListLoader.vue';
 import VillageInfoApi from '@/api/inhert/VillageInfoApi';
 import VillageInfoApi from '@/api/inhert/VillageInfoApi';
 import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
 import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
-import { confirm } from '@/components/utils/DialogAction';
+import { toast } from '@/components/dialog/CommonRoot';
 
 
 const { querys } = useLoadQuerys({
 const { querys } = useLoadQuerys({
   villageId: 0,
   villageId: 0,
@@ -77,7 +78,7 @@ const goodsLoader = useSimplePageListLoader(20, async (page, pageSize, params) =
 });
 });
 const searchValue = ref('');
 const searchValue = ref('');
 
 
-function handleJoin() {
+const handleJoin = () => {
   navTo('/pages/home/light/submit-volunteer', {
   navTo('/pages/home/light/submit-volunteer', {
     villageId: querys.value.villageId,
     villageId: querys.value.villageId,
   });
   });
@@ -108,6 +109,9 @@ const handlePublish = () => {
     subTitle: '乡源好物',
     subTitle: '乡源好物',
   });
   });
 }
 }
+const handleOpen = () => {
+  toast('暂未开放,敬请期待!');
+}
 
 
 onMounted(async () => {
 onMounted(async () => {
   await getIsVolunteer();
   await getIsVolunteer();

+ 3 - 2
src/pages/home/village/introd/card.vue

@@ -141,9 +141,10 @@
         villageId: villageStore.currentVillage?.id ?? undefined,
         villageId: villageStore.currentVillage?.id ?? undefined,
       })" 
       })" 
     />
     />
-    <RoundTags v-model:active="rankActiveTag" :tags="['乡源果', '志愿者', '乡源光']" />
+    <!-- <RoundTags v-model:active="rankActiveTag" :tags="['乡源果', '乡源光', '文化积分' ]" /> -->
     <VillageUserRankList 
     <VillageUserRankList 
       :list="villageUserRankListLoader.content.value ?? []" 
       :list="villageUserRankListLoader.content.value ?? []" 
+      :scoreSuffix="rankActiveTag"
       @goDetails="navTo('/pages/home/village/volunteer/detail', { id: $event.id })"
       @goDetails="navTo('/pages/home/village/volunteer/detail', { id: $event.id })"
     />
     />
 
 
@@ -303,7 +304,7 @@ const emit = defineEmits<{
   (e: 'goJoin'): void;
   (e: 'goJoin'): void;
 }>();
 }>();
 
 
-const rankActiveTag = ref('乡源果');
+const rankActiveTag = ref('文化积分');
 const listActiveTag = ref('广场');
 const listActiveTag = ref('广场');
 
 
 const villageUserRankListLoader = useSimpleDataLoader(async () => {
 const villageUserRankListLoader = useSimpleDataLoader(async () => {

+ 3 - 2
src/pages/home/village/rank/components/RankVolunteerItem.vue

@@ -41,10 +41,10 @@
           center
           center
           direction="row"
           direction="row"
           gap="gap.md"
           gap="gap.md"
-          width="100"
+          width="200"
         >
         >
           <Image src="https://xy.wenlvti.net/app_static/images/village/IconFruit.png" width="30rpx" height="30rpx" mode="aspectFill" />
           <Image src="https://xy.wenlvti.net/app_static/images/village/IconFruit.png" width="30rpx" height="30rpx" mode="aspectFill" />
-          <Text :text="score" fontConfig="contentText" />
+          <Text :text="`${scoreSuffix} ${score}`" fontConfig="contentText" />
         </BackgroundBox>
         </BackgroundBox>
       </FlexRow>
       </FlexRow>
     </BackgroundBox>
     </BackgroundBox>
@@ -67,6 +67,7 @@ const props = defineProps<{
   title: string;
   title: string;
   score: number;
   score: number;
   isAdmin: boolean;
   isAdmin: boolean;
+  scoreSuffix: string;
 }>();
 }>();
 
 
 const emit = defineEmits<{
 const emit = defineEmits<{

+ 6 - 4
src/pages/home/village/rank/volunteer.vue

@@ -1,11 +1,12 @@
 <template>
 <template>
   <CommonTopBanner title="志愿者排名">
   <CommonTopBanner title="志愿者排名">
     <SimplePageContentLoader :loader="villageUserRankListLoader">
     <SimplePageContentLoader :loader="villageUserRankListLoader">
-      <VillageUserRankList 
-        :list="villageUserRankListFirst3" 
-        @goDetails="goDetails" 
-      />
       <FlexCol gap="gap.lg" padding="space.md">
       <FlexCol gap="gap.lg" padding="space.md">
+        <VillageUserRankList 
+          :list="villageUserRankListFirst3" 
+          scoreSuffix="文化积分"
+          @goDetails="goDetails" 
+        />
         <RankVolunteerItem
         <RankVolunteerItem
           v-for="(item, index) in villageUserRankListAfter3"
           v-for="(item, index) in villageUserRankListAfter3"
           :key="item.id"
           :key="item.id"
@@ -15,6 +16,7 @@
           :title="item.title"
           :title="item.title"
           :score="item.score"
           :score="item.score"
           :isAdmin="item.isAdmin"
           :isAdmin="item.isAdmin"
+          scoreSuffix="文化积分"
           @click="goDetails(item)"
           @click="goDetails(item)"
         />
         />
       </FlexCol>
       </FlexCol>

+ 2 - 1
src/pages/home/village/volunteer/detail.vue

@@ -57,7 +57,7 @@
 
 
         <HomeTitle title="最新动态" />
         <HomeTitle title="最新动态" />
         <FlexCol gap="gap.lg">
         <FlexCol gap="gap.lg">
-          <Loadmore v-if="activityLoader.content.value?.length == 0" status="nomore" />
+          <Empty v-if="activityLoader.content.value?.length == 0" description="ta很懒,还没有任何动态" />
           <FlexRow 
           <FlexRow 
             v-for="item in activityLoader.content.value" :key="item.id"
             v-for="item in activityLoader.content.value" :key="item.id"
             backgroundColor="background.tertiary"
             backgroundColor="background.tertiary"
@@ -101,6 +101,7 @@ import Width from '@/components/layout/space/Width.vue';
 import BoxMid from '@/common/components/box/BoxMid.vue';
 import BoxMid from '@/common/components/box/BoxMid.vue';
 import TreeApi from '@/api/light/TreeApi';
 import TreeApi from '@/api/light/TreeApi';
 import Loadmore from '@/components/display/loading/Loadmore.vue';
 import Loadmore from '@/components/display/loading/Loadmore.vue';
+import Empty from '@/components/feedback/Empty.vue';
 
 
 const { querys } = useLoadQuerys({
 const { querys } = useLoadQuerys({
   id: 0,
   id: 0,

+ 1 - 0
src/store/village.ts

@@ -1,6 +1,7 @@
 import { ref } from 'vue'
 import { ref } from 'vue'
 import { defineStore } from 'pinia'
 import { defineStore } from 'pinia'
 import type { VillageListItem } from '@/api/light/LightVillageApi';
 import type { VillageListItem } from '@/api/light/LightVillageApi';
+import type { VolunteerInfo } from '@/api/inhert/VillageApi';
 import FollowVillageApi from '@/api/light/FollowVillageApi';
 import FollowVillageApi from '@/api/light/FollowVillageApi';
 import LightVillageApi from '@/api/light/LightVillageApi';
 import LightVillageApi from '@/api/light/LightVillageApi';