Sfoglia il codice sorgente

📦 去做任务页面

快乐的梦鱼 4 settimane fa
parent
commit
d2381915fe

+ 5 - 1
src/api/light/TreeApi.ts

@@ -261,7 +261,7 @@ export class GrowthTaskItem extends DataModel<GrowthTaskItem> {
   desc = '';
   points = 0;
   /** 限制类型: unlimited=无限制, day=每日限制, total=次数限制 */
-  limitType = '' as 'unlimited' | 'day' | 'total' | string;
+  limitType = '' as 'unlimited' | 'day' | 'total';
   limitNum = 0;
   rewardWater = 0;
   rewardLight = 0;
@@ -269,6 +269,8 @@ export class GrowthTaskItem extends DataModel<GrowthTaskItem> {
   /** 状态: 0=未启用, 1=启用 */
   status = 0;
   weight = 0;
+  /** tree=乡源树页面,collect=挖掘页面,post=发贴图页面 */
+  taskType = '' as 'tree'|'collect'|'post';
   limitTypeText = '';
   statusText = '';
   createtime = '' as string | null;
@@ -523,6 +525,7 @@ export class TreeApi extends AppServerRequestModule<DataModel> {
     page?: number;
     pageSize?: number;
     keywords?: string;
+    villageId?: number;
   }) {
     const res = await this.post<PagedGrowthResponse>(
       '/village/growth/taskList',
@@ -531,6 +534,7 @@ export class TreeApi extends AppServerRequestModule<DataModel> {
         page: options?.page,
         pageSize: options?.pageSize,
         keywords: options?.keywords,
+        village_id: options?.villageId,
       },
     );
     return this.parsePagedList<GrowthTaskItem>(

+ 3 - 1
src/common/components/FrameButton.vue

@@ -6,7 +6,7 @@
     :backgroundCutBorderSize="36"
     :padding="padding"
     :width="width"
-    :touchable="!loading"
+    :touchable="!loading && touchable"
     center
     gap="gap.md"
     @click="emit('click')"
@@ -29,9 +29,11 @@ const props = withDefaults(defineProps<{
   width?: string|number;
   innerStyle?: object;
   loading?: boolean;
+  touchable?: boolean;
 }>(), {
   text: '去发布',
   primary: false,
+  touchable: true,
   size: 'large',
 }); 
 

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

@@ -152,4 +152,16 @@ onMounted(async () => {
     topTab.value = 'around';
   }
 });
+
+defineExpose({
+  goTreePage: () => {
+    tab.value = 'tree';
+  },
+  goCollectPage: () => {
+    tab.value = 'card';
+    uni.pageScrollTo({
+      scrollTop: 1000
+    })
+  },
+})
 </script>

+ 96 - 2
src/pages/home/village/task/index.vue

@@ -1,12 +1,106 @@
 <template>
   <CommonTopBanner title="任务中心">
-    
-
+    <FlexCol padding="padding.md">
+      <SimplePageListLoader :loader="listLoader">
+        <FlexCol gap="gap.md">
+          <BoxMid
+            v-for="item in listLoader.list.value"
+            :key="item.id" 
+            direction="row"
+            :padding="[16, 30]"
+          >
+            <Touchable
+              :gap="20"
+              :padding="[15,20]"
+              touchable
+              flex="1"
+              direction="row"
+              justify="space-between"
+              align="center"
+            >
+              <FlexCol gap="gap.md">
+                <Text fontConfig="lightImportantTitle" fontFamily="SongtiSCBlack">{{ item.name }}</Text>
+                <Text :fontSize="23" :text="item.desc" />
+                <Text v-if="item.points > 0" fontConfig="secondText">+{{ item.points }}文化积分</Text>
+                <FlexRow align="center" gap="gap.md">
+                  <Button v-if="item.rewardFruit > 0" icon="https://xy.wenlvti.net/app_static/images/village/IconFruit.png" size="mini" :text="`+${item.rewardFruit}乡源果`" />
+                  <Button v-if="item.rewardLight > 0" icon="https://xy.wenlvti.net/app_static/images/village/IconLight.png" size="mini" :text="`+${item.rewardLight}乡源光`" />
+                  <Button v-if="item.rewardWater > 0" icon="https://xy.wenlvti.net/app_static/images/village/IconWatering.png" size="mini" :text="`+${item.rewardWater}浇水次数`" />
+                </FlexRow>
+              </FlexCol>
+              <FlexRow gap="gap.xl" align="center">
+                <FlexCol align="flex-end">
+                  <FrameButton
+                    v-if="item.limitNum > 0 || item.limitType === 'unlimited'"
+                    primary
+                    text="去完成"
+                    width="100rpx"
+                    size="small"
+                    @click="handleDoTask(item)"
+                  />
+                  <FrameButton
+                    v-else
+                    primary
+                    text="已完成"
+                    :touchable="false"
+                    width="100rpx"
+                    size="small"
+                  />
+                  <Text v-if="item.limitType === 'day' && item.limitNum > 0" fontConfig="subText">今日可完成{{ item.limitNum }}次</Text>
+                  <Text v-else-if="item.limitType === 'total' && item.limitNum > 0" fontConfig="subText">还可完成{{ item.limitNum }}次</Text>
+                </FlexCol>
+              </FlexRow>
+            </Touchable>
+          </BoxMid>
+        </FlexCol>
+      </SimplePageListLoader>
+    </FlexCol>
   </CommonTopBanner>
 </template>
 
 <script setup lang="ts">
+import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
+import { useSimplePageListLoader } from '@/components/composeabe/loader/SimplePageListLoader';
+import SimplePageListLoader from '@/components/loader/SimplePageListLoader.vue';
 import FlexCol from '@/components/layout/FlexCol.vue';
 import Text from '@/components/basic/Text.vue';
 import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
+import TreeApi, { GrowthTaskItem } from '@/api/light/TreeApi';
+import BoxMid from '@/common/components/box/BoxMid.vue';
+import Touchable from '@/components/feedback/Touchable.vue';
+import FlexRow from '@/components/layout/FlexRow.vue';
+import FrameButton from '@/common/components/FrameButton.vue';
+import Button from '@/components/basic/Button.vue';
+import { backAndCallOnPageBack } from '@/components/utils/PageAction';
+
+const { querys } = useLoadQuerys({
+  villageId: 0,
+}, () => {
+  listLoader.load();
+});
+
+const listLoader = useSimplePageListLoader(20, async (page, pageSize) => {
+  const res = await TreeApi.getTaskList({
+    page,
+    pageSize,
+    villageId: querys.value.villageId || undefined,
+  });
+  return {
+    list: res.list,
+    total: res.total,
+  };
+}, false);
+
+function handleDoTask(item: GrowthTaskItem) {
+  switch (item.taskType) {
+    case 'collect':
+    case 'post':
+    case 'tree':
+      backAndCallOnPageBack('goVillage', {
+        id: querys.value.villageId,
+        taskType: item.taskType,
+      });
+      break;
+  }
+}
 </script>

+ 16 - 0
src/pages/index.vue

@@ -64,6 +64,8 @@ const themeContext = useTheme();
 const villageStore = useVillageStore();
 const authStore = useAuthStore();
 
+const villageIndex = ref<InstanceType<typeof VillageIndex>>();
+
 const { querys } = useLoadQuerys({ 
   openLogin: false,
   villageId: 0,
@@ -130,6 +132,20 @@ defineExpose({
       if (data.id) {
         loadShareVillageInfo(data.id as number);
       }
+      if (data.taskType) {
+        setTimeout(() => {
+          switch (data.taskType) {
+            case 'collect':
+              villageIndex.value?.goCollectPage();
+              break;
+            case 'post':
+              break;
+            case 'tree':
+              villageIndex.value?.goTreePage();
+              break;
+          }
+        }, 500);
+      }
     } else if (name === 'paySuccessAndRefresh') {
       paySuccessAndRefresh();
     }