|
|
@@ -14,50 +14,62 @@
|
|
|
|
|
|
<HomeTitle title="乡村排名" showMore @moreClicked="navTo('/pages/home/village/rank/village')" />
|
|
|
<FlexCol gap="gap.lg">
|
|
|
- <Touchable
|
|
|
- v-for="item in villageRankListLoader.content.value" :key="item.id"
|
|
|
- backgroundColor="background.tertiary"
|
|
|
- radius="radius.md"
|
|
|
- :padding="[20, 30]"
|
|
|
- gap="gap.lg"
|
|
|
- align="center"
|
|
|
+ <RankVillageItem
|
|
|
+ v-for="item in villageRankListLoader.content.value"
|
|
|
+ :key="item.id"
|
|
|
+ :id="item.id"
|
|
|
+ :image="item.image"
|
|
|
+ :rank="item.rank"
|
|
|
+ :title="item.title"
|
|
|
+ :points="item.points"
|
|
|
@click="handleGoVillageDetails(item as any)"
|
|
|
- >
|
|
|
- <Image
|
|
|
- :src="item.image"
|
|
|
- defaultImage="https://xy.wenlvti.net/app_static/images/village/PlaceholderVillage.jpg"
|
|
|
- :width="280"
|
|
|
- :height="80"
|
|
|
- :round="false"
|
|
|
- :radius="10"
|
|
|
- />
|
|
|
- <Text :text="item.title" fontConfig="contentText" :innerStyle="{ flex: 1 }" />
|
|
|
- </Touchable>
|
|
|
+ />
|
|
|
</FlexCol>
|
|
|
|
|
|
<HomeTitle title="志愿者排名" showMore :lightCount="3" @moreClicked="navTo('/pages/home/village/rank/volunteer')" />
|
|
|
<FlexCol gap="gap.lg">
|
|
|
- <Touchable
|
|
|
- v-for="item in villageRankListLoader.content.value" :key="item.id"
|
|
|
- backgroundColor="background.tertiary"
|
|
|
- radius="radius.md"
|
|
|
- :padding="[20, 30]"
|
|
|
- gap="gap.lg"
|
|
|
- align="center"
|
|
|
- @click="navTo('/pages/home/village/volunteer/detail', { id: $event.id })"
|
|
|
- >
|
|
|
- <Image
|
|
|
- :src="item.image"
|
|
|
- defaultImage="https://xy.wenlvti.net/app_static/images/village/PlaceholderVolunteer.jpg"
|
|
|
- :width="80"
|
|
|
- :height="80"
|
|
|
- :round="true"
|
|
|
- />
|
|
|
- <Text :text="item.title" fontConfig="contentText" :innerStyle="{ flex: 1 }" />
|
|
|
- </Touchable>
|
|
|
+ <RankVolunteerItem
|
|
|
+ v-for="(item, index) in villageUserRankListLoader.content.value" :key="item.id"
|
|
|
+ :id="item.id"
|
|
|
+ :image="item.image"
|
|
|
+ :rank="index + 1"
|
|
|
+ :title="item.title"
|
|
|
+ :score="item.score"
|
|
|
+ :isAdmin="false"
|
|
|
+ @click="navTo('/pages/home/village/volunteer/detail', { id: item.id })"
|
|
|
+ />
|
|
|
</FlexCol>
|
|
|
|
|
|
- <HomeTitle title="乡源好物" showMore @moreClicked="navTo('/pages/home/village/rank/village')" />
|
|
|
+ <HomeTitle title="乡源好物" showMore @moreClicked="navTo('/pages/home/village/goods/index')" />
|
|
|
+ <SimplePageListLoader :loader="goodsLoader">
|
|
|
+ <FlexRow wrap justify="space-around" gap="gap.sm">
|
|
|
+ <BoxMid
|
|
|
+ v-for="good in goodsLoader.list.value" :key="good.id"
|
|
|
+ :innerStyle="{
|
|
|
+ width: 'calc(50% - 80rpx)',
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <Touchable direction="column" gap="gap.lg" @click="handleGoodDetail(good)">
|
|
|
+ <Image
|
|
|
+ :src="good.image"
|
|
|
+ :radius="20"
|
|
|
+ width="100%"
|
|
|
+ height="300rpx"
|
|
|
+ mode="aspectFill"
|
|
|
+ />
|
|
|
+ <Text :text="good.title" fontConfig="titleText" />
|
|
|
+ <FlexRow align="center" gap="gap.md">
|
|
|
+ <Avatar
|
|
|
+ :src="good.villageVolunteerAvatar"
|
|
|
+ :size="40"
|
|
|
+ />
|
|
|
+ <Text :text="`发布人: ${good.villageVolunteerName}`" fontConfig="contentText" />
|
|
|
+ </FlexRow>
|
|
|
+ </Touchable>
|
|
|
+ </BoxMid>
|
|
|
+ <FlexCol v-if="goodsLoader.list.value.length % 2 !== 0" width="calc(50% - 40rpx)" />
|
|
|
+ </FlexRow>
|
|
|
+ </SimplePageListLoader>
|
|
|
|
|
|
<HomeTitle title="最新推荐" />
|
|
|
<SimplePageListLoader :loader="discoverLoader">
|
|
|
@@ -108,6 +120,10 @@ import Touchable from '@/components/feedback/Touchable.vue';
|
|
|
import Text from '@/components/basic/Text.vue';
|
|
|
import Image from '@/components/basic/Image.vue';
|
|
|
import { waitTimeOut } from '@imengyu/imengyu-utils';
|
|
|
+import FlexRow from '@/components/layout/FlexRow.vue';
|
|
|
+import BoxMid from '@/common/components/box/BoxMid.vue';
|
|
|
+import RankVolunteerItem from '../village/rank/components/RankVolunteerItem.vue';
|
|
|
+import RankVillageItem from '../village/rank/components/RankVillageItem.vue';
|
|
|
|
|
|
const emit = defineEmits([ 'goVillage' ]);
|
|
|
|
|
|
@@ -123,10 +139,11 @@ const villageRankListLoader = useSimpleDataLoader(async () => {
|
|
|
title: item.name,
|
|
|
rank: i + 1,
|
|
|
id: item.id,
|
|
|
+ points: item.points,
|
|
|
}));
|
|
|
});
|
|
|
const villageUserRankListLoader = useSimpleDataLoader(async () => {
|
|
|
- const res = (await LightVillageApi.getVolunteerRankList({ num: 10 }))
|
|
|
+ const res = (await LightVillageApi.getVolunteerRankList({ num: 6 }))
|
|
|
.map((item, i) => ({
|
|
|
id: item.id,
|
|
|
image: item.image ?? '',
|
|
|
@@ -136,8 +153,18 @@ const villageUserRankListLoader = useSimpleDataLoader(async () => {
|
|
|
}));
|
|
|
return res
|
|
|
});
|
|
|
+const goodsLoader = useSimplePageListLoader(20, async (page, pageSize, params) => {
|
|
|
+ return await VillageInfoApi.getList({
|
|
|
+ collectModuleId: 24,
|
|
|
+ page, pageSize,
|
|
|
+ });
|
|
|
+});
|
|
|
|
|
|
-
|
|
|
+function handleGoodDetail(good: { id: number }) {
|
|
|
+ navTo('/pages/home/village/goods/detail', {
|
|
|
+ id: good.id,
|
|
|
+ });
|
|
|
+};
|
|
|
function handleGoRecommendDetails(item: CommonInfoModel) {
|
|
|
navTo(`/pages/home/discover/details`, { id: item.id });
|
|
|
}
|