Kaynağa Gözat

📦 按要求修改文字以及细节等

快乐的梦鱼 1 ay önce
ebeveyn
işleme
a40def8e73

+ 6 - 0
1.md

@@ -0,0 +1,6 @@
+1. 首页:增加精选推荐接口精选文章、贴图
+2. 乡源页:增加一个接口:获取指定村落乡源人列表
+3. followVillage:增加我已加入的村社列表
+4. addVillageClaim: 加入现在用的这个接口,目前需要审核,普通应该不需要审核(加入后立即在列表中显示),
+或者标记一个未审核状态,这个状态不能进行挖掘采编,建议可拆分接口。
+4. village/village/getVillageList:同上,增加返回一个状态,审核通过后允许采编内容,否则调用addVillageClaim进行申请

+ 24 - 0
src/pages.json

@@ -122,6 +122,30 @@
       }
       }
     },
     },
     {
     {
+      "path": "pages/home/village/task/index",
+      "style": {
+        "navigationBarTitleText": "任务中心",
+        "navigationStyle": "custom",
+        "enablePullDownRefresh": true
+      }
+    },
+    {
+      "path": "pages/home/village/task/archivement",
+      "style": {
+        "navigationBarTitleText": "我的成就",
+        "navigationStyle": "custom",
+        "enablePullDownRefresh": true
+      }
+    },
+    {
+      "path": "pages/home/village/volunteer/list",
+      "style": {
+        "navigationBarTitleText": "志愿者列表",
+        "navigationStyle": "custom",
+        "enablePullDownRefresh": true
+      }
+    },
+    {
       "path": "pages/home/village/gov/index",
       "path": "pages/home/village/gov/index",
       "style": {
       "style": {
         "navigationBarTitleText": "政贤连心",
         "navigationBarTitleText": "政贤连心",

+ 2 - 39
src/pages/home/dig.vue

@@ -76,29 +76,11 @@
                     text: '采编',
                     text: '采编',
                     onClick: () => goSubmitDigPage(item),
                     onClick: () => goSubmitDigPage(item),
                   },
                   },
-                  {
-                    icon: 'browse',
-                    text: '我的投稿',
-                    onClick: () => goMyDigPage(item),
-                  },
                 ]">
                 ]">
                   <Button v-if="authStore.isAdmin" icon="edit-filling" size="small">采编/管理</Button>
                   <Button v-if="authStore.isAdmin" icon="edit-filling" size="small">采编/管理</Button>
                 </BubbleBox>
                 </BubbleBox>
-                <BubbleBox :items="[
-                  {
-                    icon: 'edit-filling',
-                    text: '采编',
-                    onClick: () => goSubmitDigPage(item),
-                  },
-                  {
-                    icon: 'browse',
-                    text: '我的投稿',
-                    onClick: () => goMyDigPage(item),
-                  },
-                ]">
-                  <Button v-if="!authStore.isAdmin" icon="edit-filling" size="small">采编</Button>
-                </BubbleBox>
-                <Button type="primary" size="small" icon="edit-filling" @click="showOnlinePreviewDialog = true">线上展示</Button>            
+                <Button v-if="!authStore.isAdmin" icon="edit-filling" size="small" @click="goSubmitDigPage(item)">采编</Button>
+                <Button type="primary" size="small" icon="edit-filling" @click="goMyDigPage(item)">我的投稿</Button>            
               </ButtonGroup>
               </ButtonGroup>
             </FlexRow>
             </FlexRow>
           </FlexCol>
           </FlexCol>
@@ -128,21 +110,6 @@
         </FlexCol>
         </FlexCol>
       </BackgroundBox>
       </BackgroundBox>
     </FlexCol>
     </FlexCol>
-
-    <CommonDialog
-      ref="onlinePreviewDialogRef"
-      v-model:show="showOnlinePreviewDialog"
-    >
-      <FlexCol :padding="[40,20]" :gap="10" center>
-        <Image src="https://mn.wenlvti.net/app_static/xiangyuan/images/home/UnOpenIcon.png" width="300" mode="widthFix" />
-        <Height :size="20" />
-        <Text textAlign="center">尊敬的用户,您未开通线上村史的使用权限,开通后即可使用!</Text>
-        <Height :size="20" />
-        <Button size="large" type="primary" @click="showOnlinePreviewDialog = false; navTo('/pages/home/about/contract')">
-          联系客服开通功能
-        </Button>
-      </FlexCol>
-    </CommonDialog>
   </FlexCol>
   </FlexCol>
 </template>
 </template>
 
 
@@ -164,20 +131,16 @@ import Text from '@/components/basic/Text.vue';
 import Height from '@/components/layout/space/Height.vue';
 import Height from '@/components/layout/space/Height.vue';
 import ButtonGroup from '@/components/basic/ButtonGroup.vue';
 import ButtonGroup from '@/components/basic/ButtonGroup.vue';
 import BubbleBox from '@/components/feedback/BubbleBox.vue';
 import BubbleBox from '@/components/feedback/BubbleBox.vue';
-import Result from '@/components/feedback/Result.vue';
-import Dialog from '@/components/dialog/Dialog.vue';
 import HomeTitle from '@/common/components/parts/HomeTitle.vue';
 import HomeTitle from '@/common/components/parts/HomeTitle.vue';
 import HomeLargeTitle from '@/common/components/parts/HomeLargeTitle.vue';
 import HomeLargeTitle from '@/common/components/parts/HomeLargeTitle.vue';
 import type { RequestApiError } from '@imengyu/imengyu-utils';
 import type { RequestApiError } from '@imengyu/imengyu-utils';
 import FrameButton from '@/common/components/FrameButton.vue';
 import FrameButton from '@/common/components/FrameButton.vue';
 import CommonDivider from '@/common/components/CommonDivider.vue';
 import CommonDivider from '@/common/components/CommonDivider.vue';
-import CommonDialog from '@/common/components/CommonDialog.vue';
 import Touchable from '@/components/feedback/Touchable.vue';
 import Touchable from '@/components/feedback/Touchable.vue';
 import Icon from '@/components/basic/Icon.vue';
 import Icon from '@/components/basic/Icon.vue';
 import { useStorageVar } from '@/components/composeabe/StorageVar';
 import { useStorageVar } from '@/components/composeabe/StorageVar';
 import BackgroundBox from '@/components/display/block/BackgroundBox.vue';
 import BackgroundBox from '@/components/display/block/BackgroundBox.vue';
 
 
-const showOnlinePreviewDialog = ref(false);
 const authStore = useAuthStore();
 const authStore = useAuthStore();
 const collectStore = useCollectStore();
 const collectStore = useCollectStore();
 const { value: currentCity } = useStorageVar('currentCityName', '');
 const { value: currentCity } = useStorageVar('currentCityName', '');

+ 8 - 53
src/pages/home/village/dialogs/JoinDialog.vue

@@ -2,32 +2,10 @@
   <CommonDialog v-model:show="show" title="加入村社" :showDivider="false">
   <CommonDialog v-model:show="show" title="加入村社" :showDivider="false">
     <FlexCol gap="gap.lg" padding="padding.md" width="600rpx">
     <FlexCol gap="gap.lg" padding="padding.md" width="600rpx">
       
       
-      <template v-if="step === 'chooseType'">
-        <FlexCol gap="gap.md">
-          <Text text="加入村社后,您即可为村社做贡献。请完善身份信息,解锁更多村社专属功能" fontConfig="contentSpeicalText" />
-          <Height :height="10" />
-
-          <BackgroundBox 
-            v-for="(item, k) in typeChoices"
-            :key="k"
-            backgroundImage="https://xy.wenlvti.net/app_static/images/village/BoxMid.png"
-            :backgroundCutBorder="32"
-            :backgroundCutBorderSize="36"
-            :padding="24"
-            direction="row"
-          >
-            <Touchable direction="row" gap="gap.md"center @click="handleChooseType(item.value)">
-              <Image :src="item.image" :radius="20" width="100" height="100" mode="aspectFill" />
-              <Width :width="20" />
-              <Text text="我是" fontConfig="lightImportantTitle" />
-              <Text :text="item.label" fontConfig="lightGoldTitle" />
-            </Touchable>
-          </BackgroundBox>
-        </FlexCol>
-      </template>
-      <template v-else-if="step === 'chooseIdentity'">
+      <template v-if="step === 'chooseIdentity'">
         <FlexCol gap="gap.md">
         <FlexCol gap="gap.md">
           <Text textAlign="center" text="请选择你的村民身份" fontConfig="contentSpeicalText" />
           <Text textAlign="center" text="请选择你的村民身份" fontConfig="contentSpeicalText" />
+          <Text text="加入村社后,您即可为村社做贡献。请完善身份信息,解锁更多村社专属功能" fontConfig="contentSpeicalText" />
           <Height :height="10" />
           <Height :height="10" />
 
 
           <BackgroundBox 
           <BackgroundBox 
@@ -69,7 +47,7 @@
         </ProvideVar>
         </ProvideVar>
         <Height :height="20" />
         <Height :height="20" />
         <FlexRow justify="space-around" gap="gap.md">
         <FlexRow justify="space-around" gap="gap.md">
-          <FrameButton text="返回" @click="step = 'chooseType'" width="220rpx" />
+          <FrameButton text="返回" @click="step = 'chooseIdentity'" width="220rpx" />
           <FrameButton primary text="提交" @click="addSubmit" :loading="addFormLoading" width="220rpx" />
           <FrameButton primary text="提交" @click="addSubmit" :loading="addFormLoading" width="220rpx" />
         </FlexRow>
         </FlexRow>
       </template>
       </template>
@@ -116,30 +94,7 @@ const props = defineProps<{
 }>();
 }>();
 const emit = defineEmits(['apply']);
 const emit = defineEmits(['apply']);
 
 
-const step = ref('chooseType');
-
-const typeChoices = ref([
-  {
-    label: '志愿者',
-    value: 'volunteer',
-    image: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconTypeExternal.png',
-  },
-  {
-    label: '管理人员',
-    value: 'staff',
-    image: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconTypeLocal.png',
-  },
-  {
-    label: '村民',
-    value: 'villager',
-    image: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconTypeWork.png',
-  },
-]);
-
-function handleChooseType(type: string) {
-  step.value = 'chooseIdentity';
-  addFormModel.value.type = type;
-}
+const step = ref('chooseIdentity');
 
 
 const identityChoices = ref([
 const identityChoices = ref([
   {
   {
@@ -189,7 +144,7 @@ const addFormDefine : IDynamicFormOptions = {
       additionalProps: { placeholder: '请输入手机号' },
       additionalProps: { placeholder: '请输入手机号' },
       rules: [{ required: true, message: '请输入联系方式' }],
       rules: [{ required: true, message: '请输入联系方式' }],
     },
     },
-    {
+     {
       label: '性别',
       label: '性别',
       name: 'sex',
       name: 'sex',
       type: 'radio-value',
       type: 'radio-value',
@@ -202,7 +157,7 @@ const addFormDefine : IDynamicFormOptions = {
         ],
         ],
       } as RadioValueProps,
       } as RadioValueProps,
     },
     },
-    {
+    /*{
       label: '居住地址',
       label: '居住地址',
       name: 'address',
       name: 'address',
       type: 'text',
       type: 'text',
@@ -239,7 +194,7 @@ const addFormDefine : IDynamicFormOptions = {
         showWordLimit: true,
         showWordLimit: true,
         maxLength: 200,
         maxLength: 200,
       } as FieldProps,
       } as FieldProps,
-    },
+    }, */
   ]
   ]
 }
 }
 
 
@@ -269,7 +224,7 @@ async function addSubmit() {
 defineExpose({
 defineExpose({
   show: () => {
   show: () => {
     show.value = true;
     show.value = true;
-    step.value = 'chooseType';
+    step.value = 'chooseIdentity';
     addFormModel.value = new VillageClaimInfo();
     addFormModel.value = new VillageClaimInfo();
     addFormModel.value.type = 'villager';
     addFormModel.value.type = 'villager';
     addFormModel.value.villageId = props.villageId;
     addFormModel.value.villageId = props.villageId;

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

@@ -98,17 +98,24 @@
         <FlexCol center gap="gap.sm" flexBasis="25%">
         <FlexCol center gap="gap.sm" flexBasis="25%">
           <Text text="乡源光" fontConfig="secondText" />
           <Text text="乡源光" fontConfig="secondText" />
           <Text :text="villageInfoLoader.content.value?.light" fontConfig="importantTitle" />
           <Text :text="villageInfoLoader.content.value?.light" fontConfig="importantTitle" />
+          <Button type="text" size="mini" text="做任务" @click="navTo('/pages/home/village/task/index')" />
         </FlexCol>
         </FlexCol>
         <Divider type="vertical" />
         <Divider type="vertical" />
         <FlexCol center gap="gap.sm" flexBasis="25%">
         <FlexCol center gap="gap.sm" flexBasis="25%">
           <Text text="乡源人数" fontConfig="contentText" />
           <Text text="乡源人数" fontConfig="contentText" />
           <Text :text="villageInfoLoader.content.value?.memberCount" fontConfig="importantTitle" />
           <Text :text="villageInfoLoader.content.value?.memberCount" fontConfig="importantTitle" />
+          <WxButton openType="share">
+            <Button type="text" size="mini" text="邀请加入" @click="navTo('/pages/home/village/task/index')" />
+          </WxButton>
         </FlexCol>
         </FlexCol>
         <Divider type="vertical" />
         <Divider type="vertical" />
-        <FlexCol center gap="gap.sm" flexBasis="25%">
+        <Touchable direction="column" center gap="gap.sm" flexBasis="25%" @click="navTo('/pages/home/village/volunteer/list', {
+          villageId: villageStore.currentVillage?.id ?? undefined,
+        })">
           <Text text="关注人数" fontConfig="contentText" />
           <Text text="关注人数" fontConfig="contentText" />
           <Text :text="villageInfoLoader.content.value?.followerCount" fontConfig="importantTitle" />
           <Text :text="villageInfoLoader.content.value?.followerCount" fontConfig="importantTitle" />
-        </FlexCol>
+          <Height :size="36" />
+        </Touchable>
         <Divider type="vertical" />
         <Divider type="vertical" />
         <Button 
         <Button 
           :padding="0" 
           :padding="0" 
@@ -264,6 +271,8 @@ import OfficialAccountPublishWrap from '@/common/components/OfficialAccountPubli
 import ApplyGoodsDialog from '../dialogs/ApplyGoodsDialog.vue';
 import ApplyGoodsDialog from '../dialogs/ApplyGoodsDialog.vue';
 import JoinDialog from '../dialogs/JoinDialog.vue';
 import JoinDialog from '../dialogs/JoinDialog.vue';
 import VillageGallery from '../components/VillageGallery.vue';
 import VillageGallery from '../components/VillageGallery.vue';
+import WxButton from '@/components/basic/WxButton.vue';
+import Height from '@/components/layout/space/Height.vue';
 
 
 const authStore = useAuthStore();
 const authStore = useAuthStore();
 const { getIsVolunteer } = useUserTools();
 const { getIsVolunteer } = useUserTools();

+ 12 - 0
src/pages/home/village/task/archivement.vue

@@ -0,0 +1,12 @@
+<template>
+  <CommonTopBanner title="我的成就">
+    
+
+  </CommonTopBanner>
+</template>
+
+<script setup lang="ts">
+import FlexCol from '@/components/layout/FlexCol.vue';
+import Text from '@/components/basic/Text.vue';
+import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
+</script>

+ 12 - 0
src/pages/home/village/task/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <CommonTopBanner title="任务中心">
+    
+
+  </CommonTopBanner>
+</template>
+
+<script setup lang="ts">
+import FlexCol from '@/components/layout/FlexCol.vue';
+import Text from '@/components/basic/Text.vue';
+import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
+</script>

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

@@ -121,7 +121,7 @@ const infoGrids = computed(() => {
       value: infoLoader.content.value?.userId as number,
       value: infoLoader.content.value?.userId as number,
     },
     },
     {
     {
-      label: '点赞/评论',
+      label: '文化积分',
       unit: '/次',
       unit: '/次',
       value: infoLoader.content.value?.userId as number,
       value: infoLoader.content.value?.userId as number,
       logo: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconLikes.png',
       logo: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconLikes.png',

+ 114 - 0
src/pages/home/village/volunteer/list.vue

@@ -0,0 +1,114 @@
+<template>
+  <CommonTopBanner title="乡源人数">
+    <FlexCol gap="gap.lg" padding="space.md">
+      <Touchable
+        v-for="(item, index) in villageUserRankListLoader.content.value"
+        :key="item.id"
+        direction="column"
+        @click="goDetails(item)"
+      >
+        <BackgroundBox
+          backgroundImage="https://xy.wenlvti.net/app_static/images/village/BoxDark.png"
+          :backgroundCutBorder="[6,6,6,6]"
+          :backgroundCutBorderSize="[10,10,10,10]"
+          :padding="[25,25]"
+          direction="row"
+          justify="space-between"
+          align="center"
+          gap="gap.md"
+          
+        >
+          <FlexRow align="center" gap="gap.lg">
+            <BackgroundBox
+              backgroundImage="https://xy.wenlvti.net/app_static/images/village/BoxOrder.png"
+              width="120rpx"
+              height="90rpx"
+              center
+            >
+              <Text :text="index + 4" fontConfig="h5" color="white" />
+            </BackgroundBox>
+            <Avatar 
+              :url="item.image" 
+              defaultAvatar="https://xy.wenlvti.net/app_static/images/village/PlaceholderVolunteer.png"
+              :size="70" 
+              mode="aspectFill" 
+              radius="radius.md" 
+            />
+            <Text :text="item.title" fontConfig="contentText" />
+          </FlexRow>
+          <FlexRow center gap="gap.md">
+            <Tag v-if="item.isAdmin" text="管理员" size="small" />
+            <BackgroundBox
+              backgroundImage="https://xy.wenlvti.net/app_static/images/village/TagNormal.png"
+              :backgroundCutBorder="[10,10,10,10]"
+              :backgroundCutBorderSize="[10,10,10,10]"
+              :padding="[15,10]"
+              center
+              direction="row"
+              gap="gap.md"
+              width="100"
+            >
+              <Image src="https://xy.wenlvti.net/app_static/images/village/IconFruit.png" width="30rpx" height="30rpx" mode="aspectFill" />
+              <Text :text="item.score" fontConfig="contentText" />
+            </BackgroundBox>
+          </FlexRow>
+        </BackgroundBox>
+      </Touchable>
+    </FlexCol>
+  </CommonTopBanner>
+</template>
+
+<script setup lang="ts">
+import { useSimpleDataLoader } from '@/components/composeabe/loader/SimpleDataLoader';
+import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
+import { ArrayUtils } from '@imengyu/imengyu-utils';
+import { navTo } from '@/components/utils/PageAction';
+import FlexCol from '@/components/layout/FlexCol.vue';
+import LightVillageApi from '@/api/light/LightVillageApi';
+import BackgroundBox from '@/components/display/block/BackgroundBox.vue';
+import Text from '@/components/basic/Text.vue';
+import Avatar from '@/components/display/Avatar.vue';
+import Tag from '@/components/display/Tag.vue';
+import Image from '@/components/basic/Image.vue';
+import FlexRow from '@/components/layout/FlexRow.vue';
+import Touchable from '@/components/feedback/Touchable.vue';
+import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
+
+const { querys } = useLoadQuerys({
+  regionId: 0,
+  villageId: 0,
+}, () => {
+  villageUserRankListLoader.reload();
+}); 
+
+const villageUserRankListLoader = useSimpleDataLoader(async () => {
+  //TODO: 获取指定村落乡源人列表
+  const res = (await LightVillageApi.getVolunteerRankList({ 
+    region_id: querys.value.regionId || undefined, 
+    village_id: querys.value.villageId || undefined,
+    num: 30,
+  }))
+    .map((item, i) => ({
+      id: item.id,
+      image: item.image ?? '',
+      title: item.name,
+      rank: i + 1,
+      score: item.points,
+      isAdmin: item.type === 'admin',
+    }));
+  return res
+});
+
+function goDetails(item: {
+  id: number;
+  image: string;
+  title: string;
+  rank: number;
+  score: number;
+}) {
+  console.log(item);
+  
+  navTo('../volunteer/detail', { id: item.id });
+}
+
+</script>

+ 45 - 14
src/pages/index.vue

@@ -41,6 +41,11 @@
 import { onMounted, ref } from 'vue';
 import { onMounted, ref } from 'vue';
 import { onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app';
 import { onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app';
 import { useTheme } from '@/components/theme/ThemeDefine';
 import { useTheme } from '@/components/theme/ThemeDefine';
+import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
+import { useVillageStore } from '@/store/village';
+import { useAuthStore } from '@/store/auth';
+import { isDevEnv } from '@/common/config/AppCofig';
+import { navTo } from '@/components/utils/PageAction';
 import StatusBarSpace from '@/components/layout/space/StatusBarSpace.vue';
 import StatusBarSpace from '@/components/layout/space/StatusBarSpace.vue';
 import NavBar from '@/components/nav/NavBar.vue';
 import NavBar from '@/components/nav/NavBar.vue';
 import TabBar from '@/components/nav/TabBar.vue';
 import TabBar from '@/components/nav/TabBar.vue';
@@ -51,21 +56,55 @@ import HomeIndex from './home/index.vue';
 import DiscoverIndex from './home/discover/index.vue';
 import DiscoverIndex from './home/discover/index.vue';
 import VillageIndex from './home/village/index.vue';
 import VillageIndex from './home/village/index.vue';
 import CommonRoot from '@/components/dialog/CommonRoot.vue';
 import CommonRoot from '@/components/dialog/CommonRoot.vue';
-import { isDevEnv } from '@/common/config/AppCofig';
-import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
-import { navTo } from '@/components/utils/PageAction';
+import LightVillageApi from '@/api/light/LightVillageApi';
 
 
 const tabIndex = ref(0);
 const tabIndex = ref(0);
 const themeContext = useTheme();
 const themeContext = useTheme();
+const villageStore = useVillageStore();
+const authStore = useAuthStore();
 
 
-useLoadQuerys({ 
+const { querys } = useLoadQuerys({ 
   openLogin: false,
   openLogin: false,
+  villageId: 0,
+  userId: 0,
 }, (querys) => {
 }, (querys) => {
   if (querys.openLogin) {
   if (querys.openLogin) {
     navTo('/pages/user/login');
     navTo('/pages/user/login');
   }
   }
+  if (querys.villageId) {
+    loadShareVillageInfo();
+  }
+  if (querys.userId) {
+    villageStore.setShareFromVillageUserId(querys.userId);
+  }
 });
 });
 
 
+async function loadShareVillageInfo() {
+  try {
+    const res = await LightVillageApi.getVillageDetails(querys.value.villageId as number);
+    villageStore.setCurrentVillage(res);
+  } catch (error) {
+    console.error(error);
+    return;
+  }
+  tabIndex.value = 1;
+}
+function getShareVillageInfo() {
+  if (villageStore.currentVillage) {
+    //分享村社信息
+    return {
+      title: `邀请您加入${villageStore.currentVillage.name}村社`,
+      path: `/pages/index?villageId=${villageStore.currentVillage.id}&userId=${authStore.userInfo?.id || 0}`,
+      imageUrl: villageStore.currentVillage.image || 'https://mn.wenlvti.net/app_static/xiangyuan/images/index-post.jpg',
+    }
+  }
+  return {
+    title: '村社文化资源挖掘平台',
+    path: '/pages/index',
+    imageUrl: 'https://mn.wenlvti.net/app_static/xiangyuan/images/index-post.jpg',
+  };
+}
+
 defineExpose({
 defineExpose({
   onPageBack: (name: string, data: Record<string, unknown>) => {
   onPageBack: (name: string, data: Record<string, unknown>) => {
     if (data.type === 'goVillage') {
     if (data.type === 'goVillage') {
@@ -74,18 +113,10 @@ defineExpose({
   }
   }
 })
 })
 onShareAppMessage(() => {
 onShareAppMessage(() => {
-  return {
-    title: '村社文化资源挖掘平台',
-    path: '/pages/index',
-    imageUrl: 'https://mn.wenlvti.net/app_static/xiangyuan/images/index-post.jpg',
-  }
+  return getShareVillageInfo();
 })
 })
 onShareTimeline(() => {
 onShareTimeline(() => {
-  return {
-    title: '村社文化资源挖掘平台',
-    path: '/pages/index',
-    imageUrl: 'https://mn.wenlvti.net/app_static/xiangyuan/images/index-post.jpg',
-  }
+  return getShareVillageInfo();
 })
 })
 onMounted(() => {
 onMounted(() => {
   if (isDevEnv) {
   if (isDevEnv) {

+ 3 - 3
src/pages/user/index.vue

@@ -34,9 +34,9 @@
     }">
     }">
       <Grid :borderGrid="false" :mainAxisCount="4">
       <Grid :borderGrid="false" :mainAxisCount="4">
         <GridItem title="乡源等级" icon="https://xy.wenlvti.net/app_static/images/mine/IconLevel.png" touchable @click="toast('暂未开放,敬请期待')" />
         <GridItem title="乡源等级" icon="https://xy.wenlvti.net/app_static/images/mine/IconLevel.png" touchable @click="toast('暂未开放,敬请期待')" />
-        <GridItem title="我的成就" icon="https://xy.wenlvti.net/app_static/images/mine/IconArchive.png" touchable @click="toast('暂未开放,敬请期待')" />
-        <GridItem title="任务中心" icon="https://xy.wenlvti.net/app_static/images/mine/IconTask.png" touchable @click="toast('暂未开放,敬请期待')" />
-        <GridItem title="积分商城" icon="https://xy.wenlvti.net/app_static/images/mine/IconShop.png" touchable @click="toast('暂未开放,敬请期待')" />
+        <GridItem title="我的成就" icon="https://xy.wenlvti.net/app_static/images/mine/IconArchive.png" touchable @click="navTo('/pages/home/village/task/archivement')" />
+        <GridItem title="任务中心" icon="https://xy.wenlvti.net/app_static/images/mine/IconTask.png" touchable @click="navTo('/pages/home/village/task/index')" />
+        <GridItem title="兑换商城" icon="https://xy.wenlvti.net/app_static/images/mine/IconShop.png" touchable @click="toast('暂未开放,敬请期待')" />
       </Grid>
       </Grid>
     </ProvideVar>
     </ProvideVar>
     <ProvideVar :vars="{
     <ProvideVar :vars="{

+ 6 - 0
src/store/village.ts

@@ -14,6 +14,7 @@ export const useVillageStore = defineStore('village', () => {
   const currentRegion = ref<string | null>(null);
   const currentRegion = ref<string | null>(null);
   const myFollowVillages = ref<VillageListItem[]>([]);
   const myFollowVillages = ref<VillageListItem[]>([]);
   const myJoinedVillages = ref<VillageListItem[]>([]);
   const myJoinedVillages = ref<VillageListItem[]>([]);
+  const shareFromVillageUserId = ref(0);
 
 
   async function setCurrentVillage(village: VillageListItem) {
   async function setCurrentVillage(village: VillageListItem) {
     currentVillage.value = await LightVillageApi.getVillageDetails(village.id);
     currentVillage.value = await LightVillageApi.getVillageDetails(village.id);
@@ -36,6 +37,9 @@ export const useVillageStore = defineStore('village', () => {
   function setMyJoinedVillages(villages: VillageListItem[]) {
   function setMyJoinedVillages(villages: VillageListItem[]) {
     myJoinedVillages.value = villages;
     myJoinedVillages.value = villages;
   }
   }
+  function setShareFromVillageUserId(userId: number) {
+    shareFromVillageUserId.value = userId;
+  }
 
 
   return { 
   return { 
     currentVillage,
     currentVillage,
@@ -43,11 +47,13 @@ export const useVillageStore = defineStore('village', () => {
     currentRegion,
     currentRegion,
     myFollowVillages,
     myFollowVillages,
     myJoinedVillages,
     myJoinedVillages,
+    shareFromVillageUserId,
     loadCurrentVillage,
     loadCurrentVillage,
     setCurrentVillage,
     setCurrentVillage,
     setCurrentLonlat,
     setCurrentLonlat,
     setCurrentRegion,
     setCurrentRegion,
     loadMyFollowVillages,
     loadMyFollowVillages,
     setMyJoinedVillages,
     setMyJoinedVillages,
+    setShareFromVillageUserId,
   }
   }
 })
 })