| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- <template>
- <FlexCol>
- <FlexCol :margin="[10,0,0,0]">
- <Text textAlign="center" text="一人添果,全村增光;乡源树茂,故土名扬" fontConfig="primaryTitle" fontSize="35rpx" />
- </FlexCol>
- <VillageTree />
- <FlexCol :padding="30">
- <FlexCol>
- <FlexRow center>
- <Progress
- :value="60"
- :backgroundStyle="{
- background: 'linear-gradient(to bottom, #280502, #a44e17)',
- }"
- :progressStyle="{
- borderImageSource: 'url(https://xy.wenlvti.net/app_static/images/village/ImageProgress.png)',
- borderImageSlice: `5 25 5 25 fill`,
- borderImageWidth: `0px 15px`,
- borderImageRepeat: 'stretch',
- borderRadius: '10px',
- overflow: 'hidden',
- }"
- :width="300"
- :height="30"
- />
- </FlexRow>
- <Height height="space.lg" />
- <FlexRow center gap="gap.md">
- <Icon icon="https://xy.wenlvti.net/app_static/images/village/IconLight.png" :size="50" />
- <Text text="乡源光 30%" fontConfig="contentText" fontSize="30rpx" color="#E79412" />
- </FlexRow>
- <Height height="space.md" />
- <Text textAlign="center" text="再浇水5次 可升级" fontConfig="secondText" />
- </FlexCol>
- <Height height="space.xl" />
- <FlexRow justify="space-around" :padding="[0, 30]">
- <Touchable center direction="column" flexBasis="22%">
- <Image src="https://xy.wenlvti.net/app_static/images/village/IconCollect.png" :width="130" mode="widthFix" />
- <Text text="拾果" fontConfig="contentText" />
- </Touchable>
- <Touchable center direction="column" flexBasis="22%">
- <Image src="https://xy.wenlvti.net/app_static/images/village/IconFertilization.png" :width="130" mode="widthFix" />
- <Text text="施肥" fontConfig="contentText" />
- </Touchable>
- <Touchable center direction="column" flexBasis="22%">
- <Image src="https://xy.wenlvti.net/app_static/images/village/IconWatering.png" :width="130" mode="widthFix" />
- <Text text="浇水" fontConfig="contentText" textAlign="center" />
- </Touchable>
- <Touchable center direction="column" flexBasis="22%" @click="handleGoBless">
- <Image src="https://xy.wenlvti.net/app_static/images/village/IconBlessing.png" :width="130" mode="widthFix" />
- <Text text="赐福" fontConfig="contentText" textAlign="center" />
- </Touchable>
- </FlexRow>
- <HomeTitle title="最新动态" />
- <SimplePageContentLoader :loader="infoLoader" :emptyView="{ text: '冷冷清清,等你来添光加彩' }">
- <FlexCol gap="gap.lg">
- <FlexRow
- v-for="item in infoLoader.content.value" :key="item.id"
- backgroundColor="background.tertiary"
- radius="radius.md"
- :padding="[20, 30]"
- gap="gap.lg"
- align="center"
- >
- <Avatar
- :url="item.head"
- defaultAvatar="https://xy.wenlvti.net/app_static/images/village/PlaceholderVolunteer.png"
- :size="80"
- radius="50%"
- />
- <Text :text="item.content" fontConfig="contentText" :innerStyle="{ flex: 1 }" />
- <BackgroundBox
- backgroundImage="https://xy.wenlvti.net/app_static/images/village/TagNormal.png"
- :backgroundCutBorder="[10, 10, 10, 10]"
- :backgroundCutBorderSize="[10, 10, 10, 10]"
- :padding="[15, 30]"
- >
- <Text :text="item.levelText" fontConfig="contentText" />
- </BackgroundBox>
- </FlexRow>
- </FlexCol>
- </SimplePageContentLoader>
- <HomeTitle title="乡源赐福" />
- <FlexRow wrap>
- <Touchable
- v-for="(item, index) in blessingInfoLoader.content.value"
- :key="item.id"
- center
- flexBasis="30%"
- gap="gap.sm"
- direction="column"
- :margin="[10,0,0,0]"
- @click="handleBuyBless(item)"
- >
- <BackgroundBox
- backgroundImage="https://xy.wenlvti.net/app_static/images/village/ImageBlessingCount.png"
- backgroundPosition="center"
- :padding="[10, 20]"
- >
- <Text :text="index + 1" color="white" />
- </BackgroundBox>
- <Image :src="item.image" :width="210" :height="250" radius="radius.md" mode="aspectFill" />
- <BackgroundBox
- backgroundImage="https://xy.wenlvti.net/app_static/images/village/ImageBlessingBar.png"
- :padding="10"
- :width="210"
- >
- <Text textAlign="center" :text="item.name" fontConfig="contentText" fontFamily="SongtiSCBlack" color="white" />
- </BackgroundBox>
- </Touchable>
- </FlexRow>
- </FlexCol>
- </FlexCol>
- <BlessBuyDialog ref="blessBuyDialogRef" :currentBless="currentBless" />
- </template>
- <script setup lang="ts">
- import { ref, watch } from 'vue';
- import { useVillageStore } from '@/store/village';
- import { useSimpleDataLoader } from '@/components/composeabe/loader/SimpleDataLoader';
- import HomeTitle from '@/common/components/parts/HomeTitle.vue';
- import Text from '@/components/basic/Text.vue';
- import FlexCol from '@/components/layout/FlexCol.vue';
- import VillageTree from '../components/VillageTree.vue';
- import FlexRow from '@/components/layout/FlexRow.vue';
- import Icon from '@/components/basic/Icon.vue';
- import Touchable from '@/components/feedback/Touchable.vue';
- import Image from '@/components/basic/Image.vue';
- import Height from '@/components/layout/space/Height.vue';
- import Avatar from '@/components/display/Avatar.vue';
- import BackgroundBox from '@/components/display/block/BackgroundBox.vue';
- import Progress from '@/components/display/Progress.vue';
- import TreeApi, { type BlessPackageItem, type GrowthLogFeedItem } from '@/api/light/TreeApi';
- import SimplePageContentLoader from '@/components/loader/SimplePageContentLoader.vue';
- import BlessBuyDialog from '../dialogs/BlessBuyDialog.vue';
- const GROWTH_FEED_COUNT = 6;
- const DEFAULT_AVATAR = 'https://xy.wenlvti.net/app_static/images/village/PlaceholderVolunteer.png';
- const villageStore = useVillageStore();
- const blessBuyDialogRef = ref<InstanceType<typeof BlessBuyDialog>>();
- const currentBless = ref<BlessPackageItem>();
- const infoLoader = useSimpleDataLoader(async () => {
- const villageId = villageStore.currentVillage?.id;
- if (!villageId) return [];
- function mapGrowthFeedToInfoItem(feed: GrowthLogFeedItem) {
- const { item, logType } = feed;
- let content = item.remark?.trim() || '';
- let levelText = '';
- if (logType === 'task') {
- levelText = item.taskName || '任务';
- if (!content) {
- content = item.taskName ? `完成任务「${item.taskName}」` : '任务动态';
- }
- } else if (logType === 'fruit') {
- levelText = item.typeText || item.type || '乡源果';
- if (!content) {
- const delta = item.fruit > 0 ? `+${item.fruit}` : `${item.fruit}`;
- content = `${levelText} ${delta} 乡源果`;
- }
- } else {
- levelText = item.typeText || item.type || '乡源光';
- if (!content) {
- const delta = item.light > 0 ? `+${item.light}` : `${item.light}`;
- content = `${levelText} ${delta} 乡源光`;
- }
- }
- return {
- id: `${logType}-${item.id}`,
- head: DEFAULT_AVATAR,
- content,
- levelText,
- };
- }
- const { list } = await TreeApi.getRandomGrowthLogFeed(GROWTH_FEED_COUNT, { villageId });
- return list.map(mapGrowthFeedToInfoItem);
- });
- watch(() => villageStore.currentVillage?.id, () => {
- infoLoader.reload();
- });
- const blessingInfoLoader = useSimpleDataLoader(async () => {
- const res = await TreeApi.getBlessList({ page: 1, pageSize: 18 });
- return res.list;
- });
- function handleBuyBless(bless: BlessPackageItem) {
- currentBless.value = bless;
- blessBuyDialogRef.value?.show();
- }
- function handleGoBless() {
- uni.pageScrollTo({
- scrollTop: 1000,
- duration: 300,
- });
- }
- </script>
|