소스 검색

🎨 优化地图上方消息显示细节

快乐的梦鱼 1 주 전
부모
커밋
6e0d0c25e3

+ 17 - 0
src/api/light/TreeApi.ts

@@ -18,6 +18,8 @@ abstract class GrowthLogBase extends DataModel<GrowthLogBase> {
   nickname = '';
   username = '';
   volunteerName = '';
+
+  title = '';
 }
 
 export class GrowthTaskLogItem extends GrowthLogBase {
@@ -30,6 +32,15 @@ export class GrowthTaskLogItem extends GrowthLogBase {
       rewardLight: { clientSide: 'number', serverSide: 'number' },
       rewardFruit: { clientSide: 'number', serverSide: 'number' },
     };
+    this._afterSolveServer = () => {
+      this.title = this.nickname + ' ' + this.taskName + ' ';
+      if (this.rewardWater)
+        this.title += ' +' + this.rewardWater + '乡源水 ';
+      if (this.rewardLight)
+        this.title += ' +' + this.rewardLight + '乡源光 ';
+      if (this.rewardFruit)
+        this.title += ' +' + this.rewardFruit + '乡源果 ';
+    }
   }
 
   taskKey = '';
@@ -49,6 +60,9 @@ export class GrowthFruitLogItem extends GrowthLogBase {
       beforeFruit: { clientSide: 'number', serverSide: 'number' },
       afterFruit: { clientSide: 'number', serverSide: 'number' },
     };
+    this._afterSolveServer = () => {
+      this.title = this.nickname + ' ' + this.typeText + '获得 ' + this.fruit + ' 乡源果';
+    }
   }
 
   type = '' as 'pick' | 'task' | 'bless' | 'exchange' | string;
@@ -68,6 +82,9 @@ export class GrowthLightLogItem extends GrowthLogBase {
       beforeLight: { clientSide: 'number', serverSide: 'number' },
       afterLight: { clientSide: 'number', serverSide: 'number' },
     };
+    this._afterSolveServer = () => {
+      this.title = this.nickname + ' ' + this.typeText + '获得 ' + this.light + ' 乡源光';
+    }
   }
 
   type = '' as 'water' | 'fertilize' | 'task' | 'bless' | string;

+ 1 - 1
src/pages/home/components/VillageMiniMap.vue

@@ -67,7 +67,7 @@ const props = withDefaults(defineProps<{
   currentNoticeContent?: string;
   lonlat?: LonLat| undefined;
 }>(), {
-  currentNoticeContent: '目前厦门市已被点亮一个社区,刚刚小亮贡献了10个光源,让湖里区点亮了一个社区',
+  currentNoticeContent: '',
   lonlat: () => ({
     longitude: 0,
     latitude: 0,

+ 6 - 2
src/pages/home/index.vue

@@ -214,7 +214,7 @@
 </template>
 
 <script setup lang="ts">
-import { onMounted, ref, watch } from 'vue';
+import { onBeforeMount, onMounted, ref, watch } from 'vue';
 import { useTheme } from '@/components/theme/ThemeDefine';
 import { useSimpleDataLoader } from '@/components/composeabe/loader/SimpleDataLoader';
 import { useStorageVar } from '@/components/composeabe/StorageVar';
@@ -259,6 +259,9 @@ import { useSimplePageListLoader } from '@/components/composeabe/loader/SimplePa
 import VillageInfoApi, { type CommonInfoModel } from '@/api/inhert/VillageInfoApi';
 import SimplePageListLoader from '@/components/loader/SimplePageListLoader.vue';
 import PostIndex from './village/dialogs/PostIndex.vue';
+import TreeApi from '@/api/light/TreeApi';
+import { SimpleTimer } from '@/components/utils/Timer';
+import { useGetNotice } from './village/composeabe/GetNotice';
 
 const emit = defineEmits(['goVillage','goDig']);
 const authStore = useAuthStore();
@@ -284,7 +287,8 @@ const currentLocation = useGetCurrentLocation({
     currentDistrict.value = district || '';
   },
 });
-const currentNoticeContent = ref('目前厦门市已被点亮一个社区,刚刚小亮贡献了10个光源,让湖里区点亮了一个社区');
+
+const { currentNoticeContent } = useGetNotice();
 
 const villageRankListLoader = useSimpleDataLoader(async () => {
   const res = await LightVillageApi.getVillageRankList({ num: 3 });

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

@@ -0,0 +1,43 @@
+import TreeApi from "@/api/light/TreeApi";
+import { useSimpleDataLoader } from "@/components/composeabe/loader/SimpleDataLoader";
+import { SimpleTimer } from "@imengyu/imengyu-utils";
+import { onBeforeMount, ref } from "vue";
+
+export function useGetNotice(getVillageId?: () => number) {
+  const currentNoticeContent = ref('');
+  const currentNoticeIndex = ref(0);
+  const noticeListLoader = useSimpleDataLoader(async () => {
+    const arr = (await TreeApi.getRandomGrowthLogFeed(10, {
+      villageId: getVillageId?.(),
+    })).list.map((item) => (item.item.title));
+    currentNoticeIndex.value = 0;
+    currentNoticeContent.value = arr[0];
+    noticeTimer.start();
+    return arr
+  });
+
+  let prevSkipped = false;
+  const noticeTimer = new SimpleTimer(undefined, () => {
+    if (!noticeListLoader.content.value)
+      return;
+    const current = noticeListLoader.content.value[currentNoticeIndex.value]; 
+    if (current.length > 50 && !prevSkipped) {
+      prevSkipped = true;
+      return;
+    }
+    prevSkipped = false;
+    currentNoticeIndex.value ++;
+    if (currentNoticeIndex.value >= noticeListLoader.content.value.length)
+      currentNoticeIndex.value = 0;
+    currentNoticeContent.value = noticeListLoader.content.value[currentNoticeIndex.value]; 
+  }, 10000);
+
+  onBeforeMount(() => {
+    noticeTimer.stop();
+  });
+
+  return {
+    currentNoticeContent,
+    noticeListLoader,
+  }
+}

+ 5 - 0
src/pages/home/village/introd/card.vue

@@ -100,6 +100,7 @@
           longitude: villageInfoLoader.content.value.longitude, 
           latitude: villageInfoLoader.content.value.latitude 
         }" 
+        :currentNoticeContent="currentNoticeContent"
       />
 
       <FlexRow justify="space-between" align="center">
@@ -312,6 +313,7 @@ import BubbleTip from '@/components/feedback/BubbleTip.vue';
 import MemoryTimeOut from '@/components/composeabe/MemoryTimeOut';
 import TextEllipsis from '@/components/display/TextEllipsis.vue';
 import { toast } from '@/components/dialog/CommonRoot';
+import { useGetNotice } from '../composeabe/GetNotice';
 
 const authStore = useAuthStore();
 const { getIsVolunteer } = useUserTools();
@@ -462,12 +464,15 @@ function handleGoOfficalManage() {
   toast('暂未开放,敬请期待');
 }
 
+const { currentNoticeContent, noticeListLoader } = useGetNotice(() => villageStore.currentVillage?.id || 0);
+
 const upgradeRef = ref<InstanceType<typeof UpgradeDialog>>();
 const villageGalleryRef = ref<InstanceType<typeof VillageGallery>>();
 
 watch(() => villageStore.currentVillage, () => {
   villageInfoLoader.reload();
   villageUserRankListLoader.reload();
+  noticeListLoader.reload();
 }, { immediate: true });
 
 defineExpose({