Просмотр исходного кода

🎨 按要求显示村社等级和政贤连兴

快乐的梦鱼 недель назад: 3
Родитель
Сommit
f5ea9468c4

BIN
server/images/village/IconGov.png


BIN
server/images/village/banner@2x.png


+ 1 - 1
src/common/components/RequireLogin.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <slot v-if="isLogged" />
   <slot v-if="isLogged" />
-  <BoxMid v-else-if="showLoginView" center :height="300" :gap="30">
+  <BoxMid v-else-if="showLoginView" center :gap="30">
     <FlexCol center :gap="20">
     <FlexCol center :gap="20">
       <Icon name="smile-filling" :size="80" />
       <Icon name="smile-filling" :size="80" />
       <Text :text="unLoginMessage" textAlign="center" fontConfig="contentSpeicalText" />
       <Text :text="unLoginMessage" textAlign="center" fontConfig="contentSpeicalText" />

+ 1 - 0
src/common/components/parts/ImageSwiper.vue

@@ -1,5 +1,6 @@
 <template>
 <template>
   <swiper 
   <swiper 
+    v-if="images.length > 0"
     class="image-swiper" 
     class="image-swiper" 
     circular
     circular
     :indicator-dots="true"
     :indicator-dots="true"

+ 85 - 79
src/pages/home/index.vue

@@ -72,29 +72,31 @@
       </FlexRow>
       </FlexRow>
 
 
       <HomeTitle title="今日推荐" showMore @moreClicked="emit('goDiscover')" />
       <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" />
       <Height :height="10" />
 
 
@@ -166,63 +168,66 @@
       </FlexRow>
       </FlexRow>
 
 
       <HomeTitle title="今日共建任务" showMore @moreClicked="navTo('/pages/home/village/task/index')" />
       <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"
             radius="radius.md"
-            padding="padding.md"
-            shadow="default"
+            :padding="[20, 30]"
             gap="gap.lg"
             gap="gap.lg"
-            direction="row"
             align="center"
             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', {})" />
       <HomeTitle title="乡村排名" showMore @moreClicked="navTo('/pages/home/village/rank/village', {})" />
       <VillageRankList :list="villageRankListLoader.content.value ?? []" :jumpToSingle="false" @goDetails="handleGoVillageDetails" />
       <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 { useRequireLogin } from '@/common/composeabe/RequireLogin';
 import { useUserTools } from '@/common/composeabe/UserTools';
 import { useUserTools } from '@/common/composeabe/UserTools';
 import { useGetNotice } from './village/composeabe/GetNotice';
 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 { navTo } from '@/components/utils/PageAction';
 import { injectAppConfiguration } from '@/api/system/useAppConfiguration';
 import { injectAppConfiguration } from '@/api/system/useAppConfiguration';
+import { DynamicColor, statusBarHeight } from '@/components/theme/ThemeTools';
 import Image from '@/components/basic/Image.vue';
 import Image from '@/components/basic/Image.vue';
 import FlexCol from '@/components/layout/FlexCol.vue';
 import FlexCol from '@/components/layout/FlexCol.vue';
 import FlexRow from '@/components/layout/FlexRow.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 BubbleTip from '@/components/feedback/BubbleTip.vue';
 import BannerApi from '@/api/system/Banner';
 import BannerApi from '@/api/system/Banner';
 import Tabs from '@/components/nav/Tabs.vue';
 import Tabs from '@/components/nav/Tabs.vue';
-import { DynamicColor, statusBarHeight } from '@/components/theme/ThemeTools';
 import SimpleTransition from '@/components/anim/SimpleTransition.vue';
 import SimpleTransition from '@/components/anim/SimpleTransition.vue';
 import RecommendTab from './recommend/RecommendTab.vue';
 import RecommendTab from './recommend/RecommendTab.vue';
 import GoodsTab from './recommend/GoodsTab.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 TreeApi from '@/api/light/TreeApi';
 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 SimplePageContentLoader from '@/components/loader/SimplePageContentLoader.vue';
 
 
 const props = defineProps({
 const props = defineProps({
   currentScrollTop: {
   currentScrollTop: {

+ 0 - 1
src/pages/home/village/composeabe/GetNotice.ts

@@ -10,7 +10,6 @@ export function useGetNotice(getVillageId?: () => number) {
     const res = (await TreeApi.getRandomGrowthLogFeed(10, {
     const res = (await TreeApi.getRandomGrowthLogFeed(10, {
       villageId: getVillageId?.(),
       villageId: getVillageId?.(),
     })).list;
     })).list;
-    console.log(res);
     return res;
     return res;
   });
   });
   const noticeList = computed(() => noticeListLoader.content.value?.map((item) => (item.item.title)) || []);
   const noticeList = computed(() => noticeListLoader.content.value?.map((item) => (item.item.title)) || []);

+ 2 - 3
src/pages/home/village/index.vue

@@ -99,6 +99,8 @@ import { useVillageStore } from '@/store/village';
 import { useFollow } from './composeabe/Follow';
 import { useFollow } from './composeabe/Follow';
 import { isDevEnv } from '@/common/config/AppCofig';
 import { isDevEnv } from '@/common/config/AppCofig';
 import { waitTimeOut } from '@imengyu/imengyu-utils';
 import { waitTimeOut } from '@imengyu/imengyu-utils';
+import { navTo } from '@/components/utils/PageAction';
+import { useRequireLogin } from '@/common/composeabe/RequireLogin';
 import type { VillageListItem } from '@/api/light/LightVillageApi';
 import type { VillageListItem } from '@/api/light/LightVillageApi';
 import FlexCol from '@/components/layout/FlexCol.vue';
 import FlexCol from '@/components/layout/FlexCol.vue';
 import Height from '@/components/layout/space/Height.vue';
 import Height from '@/components/layout/space/Height.vue';
@@ -120,9 +122,6 @@ import JoinDialog from './dialogs/JoinDialog.vue';
 import BubbleTip from '@/components/feedback/BubbleTip.vue';
 import BubbleTip from '@/components/feedback/BubbleTip.vue';
 import MemoryTimeOut from '@/components/composeabe/MemoryTimeOut';
 import MemoryTimeOut from '@/components/composeabe/MemoryTimeOut';
 import LoadingPage from '@/components/display/loading/LoadingPage.vue';
 import LoadingPage from '@/components/display/loading/LoadingPage.vue';
-import { navTo } from '@/components/utils/PageAction';
-import { useRequireLogin } from '@/common/composeabe/RequireLogin';
-import { useStorageVar } from '@/components/composeabe/StorageVar';
 
 
 const tab = ref('card');
 const tab = ref('card');
 const delayShow = ref(false);
 const delayShow = ref(false);

+ 7 - 4
src/pages/home/village/introd/card.vue

@@ -91,7 +91,7 @@
           @expand="descOpen = true;"
           @expand="descOpen = true;"
           @collapse="descOpen = false;"
           @collapse="descOpen = false;"
         />
         />
-        <Button size="mini" icon="edit-filling" text="编辑简介" @click="handleGoEdit" />
+        <Button v-if="isStaff" size="mini" icon="edit-filling" text="编辑简介" @click="handleGoEdit" />
       </FlexView>
       </FlexView>
 
 
       <!-- 状态与申请 -->
       <!-- 状态与申请 -->
@@ -103,7 +103,10 @@
       >
       >
         <FlexRow align="center">
         <FlexRow align="center">
           <FlexCol gap="gap.md"> 
           <FlexCol gap="gap.md"> 
-            <Text :text="`${villageInfoLoader.content.value?.levelText || '默认级别'}`" fontConfig="secondText" />  
+            <FlexRow gap="gap.lg" align="center">
+              <Icon v-if="villageInfoLoader.content.value?.level === 4" name="https://xy.wenlvti.net/app_static/images/village/IconGov.png" :size="70" />
+              <Text :text="`${villageInfoLoader.content.value?.levelText || '默认级别'}`" fontConfig="secondText" />  
+            </FlexRow>
             <Text v-if="villageInfoLoader.content.value?.sizeLimit" :text="`存储空间:${villageInfoLoader.content.value?.sizeText || ''}`" :fontSize="22" fontConfig="secondText" />
             <Text v-if="villageInfoLoader.content.value?.sizeLimit" :text="`存储空间:${villageInfoLoader.content.value?.sizeText || ''}`" :fontSize="22" fontConfig="secondText" />
             <Text v-else text="无限存储空间" :fontSize="22" fontConfig="secondText" />
             <Text v-else text="无限存储空间" :fontSize="22" fontConfig="secondText" />
           </FlexCol>
           </FlexCol>
@@ -455,8 +458,8 @@ const villageInfoLoader = useSimpleDataLoader(async () => {
     address: village?.address,
     address: village?.address,
     sizeText: `${FormatUtils.formatSize(village?.storageUsed || 0)}/${FormatUtils.formatSize(village?.storageLimit || 0)}`,
     sizeText: `${FormatUtils.formatSize(village?.storageUsed || 0)}/${FormatUtils.formatSize(village?.storageLimit || 0)}`,
     sizeLimit: (village?.storageLimit || 0) >= 0,
     sizeLimit: (village?.storageLimit || 0) >= 0,
-    level: village?.level.toString() || '',
-    levelText: village?.levelText || '',
+    level: village?.vipLevel || '',
+    levelText: village?.vipName ? `已升级 · ${village?.vipName}` : '',
     rankText: village?.rank.toString() || '',
     rankText: village?.rank.toString() || '',
     light: village?.light || 0,
     light: village?.light || 0,
     memberCount: village?.volunteerCount || 0,
     memberCount: village?.volunteerCount || 0,

+ 6 - 5
src/pages/user/index.vue

@@ -66,6 +66,7 @@
     </BoxMid>
     </BoxMid>
 
 
     <ImageSwiper
     <ImageSwiper
+      v-if="authStore.isLogged"
       :images="appConfig?.banners?.userAd?.images || []"
       :images="appConfig?.banners?.userAd?.images || []"
       :height="appConfig?.banners?.userAd?.height || 0"
       :height="appConfig?.banners?.userAd?.height || 0"
       :width="690"
       :width="690"
@@ -78,17 +79,17 @@
       CellBottomBorder: false,
       CellBottomBorder: false,
     }">
     }">
       <CellGroup round>
       <CellGroup round>
-        <Cell v-if="userInfo" icon="https://xy.wenlvti.net/app_static/images/mine/IconMyArticle.png" title="我的投稿" showArrow touchable @click="navTo('/pages/dig/forms/submits', { 
+        <Cell v-if="authStore.isLogged" icon="https://xy.wenlvti.net/app_static/images/mine/IconMyArticle.png" title="我的投稿" showArrow touchable @click="navTo('/pages/dig/forms/submits', { 
           villageVolunteerId: volunteerInfo?.id || 0 
           villageVolunteerId: volunteerInfo?.id || 0 
         })" />
         })" />
-        <Cell v-if="userInfo" icon="https://xy.wenlvti.net/app_static/images/mine/IconMyRecord.png" title="赐福记录" showArrow touchable @click="requireLogin(() => navTo('/pages/home/village/bless/my-orders'), '登录后查看我的福泽记录哦')" />
-        <Cell v-if="userInfo" icon="share" :iconProps="{ color: '#833e27' }" title="邀请记录" showArrow touchable @click="navTo('/pages/home/village/task/share-reward')" />
-        <Cell v-if="userInfo" icon="https://xy.wenlvti.net/app_static/images/mine/IconMyReward.png" title="兑换记录" showArrow touchable @click="goStoreList" />
+        <Cell v-if="authStore.isLogged" icon="https://xy.wenlvti.net/app_static/images/mine/IconMyRecord.png" title="赐福记录" showArrow touchable @click="requireLogin(() => navTo('/pages/home/village/bless/my-orders'), '登录后查看我的福泽记录哦')" />
+        <Cell v-if="authStore.isLogged" icon="share" :iconProps="{ color: '#833e27' }" title="邀请记录" showArrow touchable @click="navTo('/pages/home/village/task/share-reward')" />
+        <Cell v-if="authStore.isLogged" icon="https://xy.wenlvti.net/app_static/images/mine/IconMyReward.png" title="兑换记录" showArrow touchable @click="goStoreList" />
         <Cell icon="https://xy.wenlvti.net/app_static/images/mine/IconAbout.png" title="关于我们" showArrow touchable @click="navTo('/pages/home/about/about')" />
         <Cell icon="https://xy.wenlvti.net/app_static/images/mine/IconAbout.png" title="关于我们" showArrow touchable @click="navTo('/pages/home/about/about')" />
         <button open-type="contact" class="remove-button-style">
         <button open-type="contact" class="remove-button-style">
           <Cell icon="https://xy.wenlvti.net/app_static/images/mine/IconContract.png" title="联系客服" showArrow touchable />
           <Cell icon="https://xy.wenlvti.net/app_static/images/mine/IconContract.png" title="联系客服" showArrow touchable />
         </button>
         </button>
-        <Cell v-if="userInfo" icon="https://xy.wenlvti.net/app_static/images/mine/IconQuit.png" title="退出登录" showArrow touchable @click="doLogout" />
+        <Cell v-if="authStore.isLogged" icon="https://xy.wenlvti.net/app_static/images/mine/IconQuit.png" title="退出登录" showArrow touchable @click="doLogout" />
       </CellGroup>
       </CellGroup>
     </ProvideVar>
     </ProvideVar>
     <DebugButton />
     <DebugButton />