|
|
@@ -72,29 +72,31 @@
|
|
|
</FlexRow>
|
|
|
|
|
|
<HomeTitle title="今日推荐" showMore @moreClicked="emit('goDiscover')" />
|
|
|
- <FlexRow gap="gap.lg" align="stretch" justify="space-between">
|
|
|
- <Touchable
|
|
|
- v-for="item in recommendLoader.content.value"
|
|
|
- :key="item.id"
|
|
|
- position="relative"
|
|
|
- radius="radius.md"
|
|
|
- shadow="default"
|
|
|
- gap="gap.lg"
|
|
|
- direction="row"
|
|
|
- align="center"
|
|
|
- overflow="hidden"
|
|
|
- border="1px solid #fff"
|
|
|
- :flexShrink="0"
|
|
|
- width="48%"
|
|
|
- @click="handleGoRecommendDetails(item)"
|
|
|
- >
|
|
|
- <Image :src="item.image" :width="400" :height="270" />
|
|
|
- <FlexCol position="absolute" :inset="{ b: -1, l: -1, r: -1 }" backgroundColor="background.primary" padding="padding.md" gap="gap.md">
|
|
|
- <Text fontConfig="contentSpeicalText" fontFamily="SongtiSCBlack" :lines="1" :wrap="false">{{ item.title }}</Text>
|
|
|
- <Text fontSize="fontSize.sm" :text="item.desc" :lines="1" :maxWidth="200" />
|
|
|
- </FlexCol>
|
|
|
- </Touchable>
|
|
|
- </FlexRow>
|
|
|
+ <SimplePageContentLoader :loader="recommendLoader">
|
|
|
+ <FlexRow gap="gap.lg" align="stretch" justify="space-between">
|
|
|
+ <Touchable
|
|
|
+ v-for="item in recommendLoader.content.value"
|
|
|
+ :key="item.id"
|
|
|
+ position="relative"
|
|
|
+ radius="radius.md"
|
|
|
+ shadow="default"
|
|
|
+ gap="gap.lg"
|
|
|
+ direction="row"
|
|
|
+ align="center"
|
|
|
+ overflow="hidden"
|
|
|
+ border="1px solid #fff"
|
|
|
+ :flexShrink="0"
|
|
|
+ width="48%"
|
|
|
+ @click="handleGoRecommendDetails(item)"
|
|
|
+ >
|
|
|
+ <Image :src="item.image" :width="400" :height="270" />
|
|
|
+ <FlexCol position="absolute" :inset="{ b: -1, l: -1, r: -1 }" backgroundColor="background.primary" padding="padding.md" gap="gap.md">
|
|
|
+ <Text fontConfig="contentSpeicalText" fontFamily="SongtiSCBlack" :lines="1" :wrap="false">{{ item.title }}</Text>
|
|
|
+ <Text fontSize="fontSize.sm" :text="item.desc" :lines="1" :maxWidth="200" />
|
|
|
+ </FlexCol>
|
|
|
+ </Touchable>
|
|
|
+ </FlexRow>
|
|
|
+ </SimplePageContentLoader>
|
|
|
|
|
|
<Height :height="10" />
|
|
|
|
|
|
@@ -166,63 +168,66 @@
|
|
|
</FlexRow>
|
|
|
|
|
|
<HomeTitle title="今日共建任务" showMore @moreClicked="navTo('/pages/home/village/task/index')" />
|
|
|
- <scroll-view scroll-x>
|
|
|
- <FlexRow gap="gap.lg" align="stretch">
|
|
|
- <Touchable
|
|
|
- v-for="item in taskListLoader.content.value"
|
|
|
- :key="item.id"
|
|
|
- backgroundColor="white"
|
|
|
+ <SimplePageContentLoader :loader="taskListLoader">
|
|
|
+ <scroll-view scroll-x>
|
|
|
+ <FlexRow gap="gap.lg" align="stretch">
|
|
|
+ <Touchable
|
|
|
+ v-for="item in taskListLoader.content.value"
|
|
|
+ :key="item.id"
|
|
|
+ backgroundColor="white"
|
|
|
+ radius="radius.md"
|
|
|
+ padding="padding.md"
|
|
|
+ shadow="default"
|
|
|
+ gap="gap.lg"
|
|
|
+ direction="row"
|
|
|
+ align="center"
|
|
|
+ :flexShrink="0"
|
|
|
+ :innerStyle="{ minWidth: '400rpx' }"
|
|
|
+ >
|
|
|
+ <Icon :icon="item.image || 'space'" :size="100" />
|
|
|
+ <FlexCol gap="gap.md">
|
|
|
+ <Text fontConfig="contentSpeicalText" fontFamily="SongtiSCBlack">{{ item.name }}</Text>
|
|
|
+ <Text fontSize="fontSize.sm" :text="item.desc" :lines="1" :maxWidth="400" />
|
|
|
+ <Text v-if="item.points > 0" fontConfig="secondText">+{{ item.points }}文化积分</Text>
|
|
|
+ <FlexRow>
|
|
|
+ <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>
|
|
|
+ </Touchable>
|
|
|
+ </FlexRow>
|
|
|
+ </scroll-view>
|
|
|
+ </SimplePageContentLoader>
|
|
|
+
|
|
|
+ <HomeTitle title="最新动态" />
|
|
|
+ <SimplePageContentLoader :loader="noticeListLoader">
|
|
|
+ <FlexCol gap="gap.lg">
|
|
|
+ <FlexRow
|
|
|
+ v-for="item in noticeListLoader.content.value?.slice(0, 3) || [] "
|
|
|
+ :key="item.item.id"
|
|
|
+ backgroundColor="background.tertiary"
|
|
|
radius="radius.md"
|
|
|
- padding="padding.md"
|
|
|
- shadow="default"
|
|
|
+ :padding="[20, 30]"
|
|
|
gap="gap.lg"
|
|
|
- direction="row"
|
|
|
align="center"
|
|
|
- :flexShrink="0"
|
|
|
- :innerStyle="{ minWidth: '400rpx' }"
|
|
|
- >
|
|
|
- <Icon :icon="item.image || 'space'" :size="100" />
|
|
|
- <FlexCol gap="gap.md">
|
|
|
- <Text fontConfig="contentSpeicalText" fontFamily="SongtiSCBlack">{{ item.name }}</Text>
|
|
|
- <Text fontSize="fontSize.sm" :text="item.desc" :lines="1" :maxWidth="400" />
|
|
|
- <Text v-if="item.points > 0" fontConfig="secondText">+{{ item.points }}文化积分</Text>
|
|
|
- <FlexRow>
|
|
|
- <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>
|
|
|
- </Touchable>
|
|
|
- </FlexRow>
|
|
|
- </scroll-view>
|
|
|
-
|
|
|
-
|
|
|
- <HomeTitle title="最新动态" />
|
|
|
- <FlexCol gap="gap.lg">
|
|
|
- <FlexRow
|
|
|
- v-for="item in noticeListLoader.content.value?.slice(0, 3) || [] "
|
|
|
- :key="item.item.id"
|
|
|
- backgroundColor="background.tertiary"
|
|
|
- radius="radius.md"
|
|
|
- :padding="[20, 30]"
|
|
|
- gap="gap.lg"
|
|
|
- align="center"
|
|
|
- >
|
|
|
- <Avatar
|
|
|
- :src="(item.item.avatar as string)"
|
|
|
- :size="80"
|
|
|
- :round="false"
|
|
|
- :radius="10"
|
|
|
- />
|
|
|
- <FlexCol>
|
|
|
- <Text :text="item.item.title" fontConfig="contentText" />
|
|
|
- <Text
|
|
|
- :text="`来自${item.item.villageName}`"
|
|
|
- fontConfig="secondText"
|
|
|
+ >
|
|
|
+ <Avatar
|
|
|
+ :src="(item.item.avatar as string)"
|
|
|
+ :size="80"
|
|
|
+ :round="false"
|
|
|
+ :radius="10"
|
|
|
/>
|
|
|
- </FlexCol>
|
|
|
- </FlexRow>
|
|
|
- </FlexCol>
|
|
|
+ <FlexCol>
|
|
|
+ <Text :text="item.item.title" fontConfig="contentText" />
|
|
|
+ <Text
|
|
|
+ :text="`来自${item.item.villageName}`"
|
|
|
+ fontConfig="secondText"
|
|
|
+ />
|
|
|
+ </FlexCol>
|
|
|
+ </FlexRow>
|
|
|
+ </FlexCol>
|
|
|
+ </SimplePageContentLoader>
|
|
|
|
|
|
<HomeTitle title="乡村排名" showMore @moreClicked="navTo('/pages/home/village/rank/village', {})" />
|
|
|
<VillageRankList :list="villageRankListLoader.content.value ?? []" :jumpToSingle="false" @goDetails="handleGoVillageDetails" />
|
|
|
@@ -301,10 +306,11 @@ import { useAuthStore } from '@/store/auth';
|
|
|
import { useRequireLogin } from '@/common/composeabe/RequireLogin';
|
|
|
import { useUserTools } from '@/common/composeabe/UserTools';
|
|
|
import { useGetNotice } from './village/composeabe/GetNotice';
|
|
|
-import { DateUtils, waitTimeOut } from '@imengyu/imengyu-utils';
|
|
|
-import { toast, loading, hideLoading, confirm } from '@/components/utils/DialogAction';
|
|
|
+import { waitTimeOut } from '@imengyu/imengyu-utils';
|
|
|
+import { toast, loading, hideLoading } from '@/components/utils/DialogAction';
|
|
|
import { navTo } from '@/components/utils/PageAction';
|
|
|
import { injectAppConfiguration } from '@/api/system/useAppConfiguration';
|
|
|
+import { DynamicColor, statusBarHeight } from '@/components/theme/ThemeTools';
|
|
|
import Image from '@/components/basic/Image.vue';
|
|
|
import FlexCol from '@/components/layout/FlexCol.vue';
|
|
|
import FlexRow from '@/components/layout/FlexRow.vue';
|
|
|
@@ -332,7 +338,6 @@ import type { RegionItem } from '@/api/map/RegionApi';
|
|
|
import BubbleTip from '@/components/feedback/BubbleTip.vue';
|
|
|
import BannerApi from '@/api/system/Banner';
|
|
|
import Tabs from '@/components/nav/Tabs.vue';
|
|
|
-import { DynamicColor, statusBarHeight } from '@/components/theme/ThemeTools';
|
|
|
import SimpleTransition from '@/components/anim/SimpleTransition.vue';
|
|
|
import RecommendTab from './recommend/RecommendTab.vue';
|
|
|
import GoodsTab from './recommend/GoodsTab.vue';
|
|
|
@@ -343,6 +348,7 @@ import Text from '@/components/basic/Text.vue';
|
|
|
import TreeApi from '@/api/light/TreeApi';
|
|
|
import Touchable from '@/components/feedback/Touchable.vue';
|
|
|
import Icon from '@/components/basic/Icon.vue';
|
|
|
+import SimplePageContentLoader from '@/components/loader/SimplePageContentLoader.vue';
|
|
|
|
|
|
const props = defineProps({
|
|
|
currentScrollTop: {
|