Преглед изворни кода

📦 按要求修改首页栏目以及地图显示栏目

imengyu пре 1 месец
родитељ
комит
850f70a807

+ 10 - 0
src/api/fusion/ScenicSpotContent.ts

@@ -0,0 +1,10 @@
+import { CommonContentApi } from '../CommonContent';
+
+export class ScenicSpotContentApi extends CommonContentApi {
+
+  constructor() {
+    super(undefined, 17, "闽南文化景区", 273);
+  }
+}
+
+export default new ScenicSpotContentApi();

+ 1 - 1
src/api/inheritor/ProductsContent.ts

@@ -3,7 +3,7 @@ import { CommonContentApi } from '../CommonContent';
 export class ProductsContentApi extends CommonContentApi {
 
   constructor() {
-    super(undefined, 16, "非遗保护名录-非遗产品");
+    super(undefined, 16, "非遗保护名录-非遗产品(作品)");
   }
 }
 

+ 5 - 1
src/api/inhert/VillageApi.ts

@@ -26,9 +26,11 @@ export class VillageListItem extends DataModel<VillageListItem> {
         (this.city || '未知市') + 
         (this.district || '未知区') + 
         (this.township || '未知村');
-      if (this.images && this.images && this.images.length > 0  ) {
+      if (!this.image && this.images && this.images.length > 0  ) {
         this.image = this.images[0]
       }
+      this.thumbnail = this.image;
+      this.title = this.villageName
     }
 
   }
@@ -42,11 +44,13 @@ export class VillageListItem extends DataModel<VillageListItem> {
   villageVolunteerId = null as number|null;
   villageId = null as number|null;
   claimReason = '';
+  title = '';
   status = '';
   statusText = '';
   createdAt = null as Date|null;
   updatedAt = null as Date|null;
   deleteAt = null as Date|null;
+  thumbnail = '';
   image = '';
   images = [] as string[];
   villageName = '';

+ 2 - 0
src/common/config/AppCofig.ts

@@ -6,6 +6,8 @@ export default {
   version: '0.0.1',
   appId: 'wx1845c7dab9e8b236',
   amapKey: '34eb1d57f93720a871bd11a90af0c91c',
+  defaultLonLat: [ 118.161270, 24.529196 ],
+  defaultImage: 'https://mn.wenlvti.net/app_static/minnan/EmptyImage.png',
 }
 
 /**

+ 2 - 2
src/pages/discover.vue

@@ -97,8 +97,8 @@
       </SimplePageContentLoader>
 
       
-      <!-- 文化社区 -->
-      <HomeTitle title="闽南文化" />
+      <!-- 闽南文化资讯 -->
+      <HomeTitle title="闽南文化资讯" />
       <SimplePageContentLoader :loader="cultureData">
         <view class="d-flex w-100 flex-row flex-wrap align-stretch justify-between">
           <Box2LineLargeImageUserShadow 

+ 99 - 52
src/pages/home.vue

@@ -44,7 +44,7 @@
             @playPauseClick="indexAudioPlayer.playpause"
             @nextClick="indexAudioPlayer.next"
             @prevClick="indexAudioPlayer.prev"
-            @arrowClick="subTabs1[0].onClick"
+            @arrowClick="handleGoAudioList"
           />
 
           <view  
@@ -69,22 +69,32 @@
           :enable-zoom="false"
           :enable-scroll="false"
           :scale="15"
-          @click="navTo('inhert/map/index')"
+          @click="navTo('inhert/map/index', { tab: mapTab })"
         />
-        <view class="position-absolute map-tags d-flex flex-row">
-          <view :class="mapTab == 1 ? 'active' : ''" @click="mapTab=1">
-            <text class="iconfont icon-read" />
-            文物
-          </view>
-          <view :class="mapTab == 2 ? 'active' : ''" @click="mapTab=2">
-            <text class="iconfont icon-task-trip" />
-            非遗
-          </view>
-          <view :class="mapTab == 3 ? 'active' : ''" @click="mapTab=3">
-            <text class="iconfont icon-task-trip" />
-            非遗传习所
+        <scroll-view class="map-tags position-absolute" :scroll-x="true">
+          <view class="tag-bar d-flex flex-row flex-nowrap">
+            <view :class="mapTab == 1 ? 'active' : ''" @click="mapTab=1">
+              <text class="iconfont icon-read" />
+              非遗项目
+            </view>
+            <view :class="mapTab == 2 ? 'active' : ''" @click="mapTab=2">
+              <text class="iconfont icon-task-trip" />
+              非遗传习所
+            </view>
+            <view :class="mapTab == 3 ? 'active' : ''" @click="mapTab=3">
+              <text class="iconfont icon-task-buliding" />
+              文物古迹
+            </view>
+            <view :class="mapTab == 4 ? 'active' : ''" @click="mapTab=4">
+              <text class="iconfont icon-place" />
+              传统村落
+            </view>
+            <view :class="mapTab == 5 ? 'active' : ''" @click="mapTab=5">
+              <text class="iconfont icon-task-environment-3" />
+              闽南文化景区
+            </view>
           </view>
-        </view>
+        </scroll-view>
       </view>
 
       <!-- 近期活动 -->
@@ -172,6 +182,10 @@ import UnmoveableContent from '@/api/inheritor/UnmoveableContent';
 import SeminarContent from '@/api/inheritor/SeminarContent';
 import ProjectsContent from '@/api/inheritor/ProjectsContent';
 import { useSimpleListAudioPlayer } from '@/common/composeabe/SimpleAudioPlayer';
+import ProductsContent from '@/api/inheritor/ProductsContent';
+import AppCofig from '@/common/config/AppCofig';
+import VillageApi from '@/api/inhert/VillageApi';
+import ScenicSpotContent from '@/api/fusion/ScenicSpotContent';
 
 const subTabs1 = [
   { 
@@ -186,22 +200,22 @@ const subTabs1 = [
     }) 
   },
   { 
-    name: '古早味', 
+    name: '闽南美食', 
     icon: MainBoxIcon2, 
     onClick: () => navTo('/pages/article/common/list', {
-      title: '古早味',
+      title: '闽南美食',
       mainBodyColumnId: 103,
       modelId: 8,
       itemType: 'article-common',
       detailsPage: '/pages/article/details',
     }) 
   },
-  { name: '先贤列传', icon: MainBoxIcon3, onClick: () => navTo('/pages/introduction/character') },
+  { name: '历史人物', icon: MainBoxIcon3, onClick: () => navTo('/pages/introduction/character') },
   { 
-    name: '民俗活动', 
+    name: '民俗信俗', 
     icon: MainBoxIcon4, 
     onClick: () => navTo('/pages/article/common/list', {
-      title: '民俗活动', 
+      title: '民俗信俗', 
       mainBodyColumnId: 299,
       modelId: 18,
       itemType: 'article-common',
@@ -211,10 +225,10 @@ const subTabs1 = [
 ]
 const subTabs2 = [
   { 
-    name: '红砖厝韵', 
+    name: '文物古迹', 
     icon: MainBoxIcon5 , 
     onClick: () => navTo('/pages/article/common/list', {
-      title: '红砖厝韵',
+      title: '文物古迹',
       mainBodyColumnId: 252,
       modelId: 3,
       itemType: 'article-common',
@@ -222,23 +236,23 @@ const subTabs2 = [
     }) 
   },
   { 
-    name: '薪传匠艺', 
+    name: '非遗项目', 
     icon: MainBoxIcon6 , 
     onClick: () => navTo('/pages/inhert/intangible/list')
   },
   { 
-    name: '工夫茶道', 
+    name: '老字号', 
     icon: MainBoxIcon7 , 
     onClick: () => navTo('/pages/article/common/list', {
-      title: '工夫茶道',
-      mainBodyColumnId: 311,
-      modelId: 3,
+      title: '老字号',
+      mainBodyColumnId: 312,
+      modelId: 17,
       itemType: 'article-common',
       detailsPage: '/pages/article/details',
     }) 
   },
   { 
-    name: '特色村社', 
+    name: '传统村落', 
     icon: MainBoxIcon8 , 
     onClick: () => navTo('/pages/inhert/village/list')
   },
@@ -251,13 +265,19 @@ const mapLoader = useSimpleDataLoader(async () => {
   switch (mapTab.value) {
     default:
     case 1:
-      list = (await UnmoveableContent.getContentList(new GetContentListParams(), 1, 6)).list
+      list = (await ProjectsContent.getContentList(new GetContentListParams(), 1, 6)).list
       break;
     case 2:
-      list = (await ProjectsContent.getContentList(new GetContentListParams(), 1, 6)).list
+      list = (await SeminarContent.getContentList(new GetContentListParams(), 1, 6)).list
       break;
     case 3:
-      list = (await SeminarContent.getContentList(new GetContentListParams(), 1, 6)).list
+      list = (await UnmoveableContent.getContentList(new GetContentListParams(), 1, 6)).list
+      break;
+    case 4:
+      list = (await VillageApi.getVallageList()).slice(1, 10)
+      break;
+    case 5:
+      list = (await ScenicSpotContent.getContentList(new GetContentListParams(), 1, 6)).list
       break;
   }  
   const res = list.map((p) => {
@@ -272,10 +292,16 @@ const mapLoader = useSimpleDataLoader(async () => {
     };
   });
   mapCtx.includePoints({
-    points: res.map(p => ({
-      latitude: p.latitude,
-      longitude: p.longitude,
-    })),
+    points: res.map(p => {
+      if (!p.longitude || !p.latitude) {
+        p.longitude = AppCofig.defaultLonLat[0];
+        p.latitude = AppCofig.defaultLonLat[1];
+      }
+      return {
+        latitude: p.latitude,
+        longitude: p.longitude,
+      }
+    }),
     padding: [20, 20, 20, 20],
   });
   return res;
@@ -296,6 +322,15 @@ const indexAudioPlayer = useSimpleListAudioPlayer(async () => {
     }
   });
 })
+function handleGoAudioList() {
+  navTo('/pages/article/common/list', {
+    title: '闽南原创歌曲',
+    mainBodyColumnId: 313,
+    modelId: 5,
+    itemType: 'article-common',
+    detailsPage: '/pages/video/details',
+  }) 
+}
 
 const activityLoader = useSimpleDataLoader(async () => {
   //TODO: 活动接口
@@ -313,20 +348,20 @@ const activityLoader = useSimpleDataLoader(async () => {
 })
 const recommendLoader = useSimpleDataLoader(async () => {
   const list = [];
+  list.push(...(await ProjectsContent.getContentList(new GetContentListParams(), 1, 6)).list.map((p) => {
+    p.itemType = 'intangible';
+    return p;
+  }));
   list.push(...(await CommonContent.getContentList(new GetContentListParams()
     .setModelId(1)
   , 1, 6)).list.map((p) => {
     p.itemType = 'artifact';
     return p;
-  }))
-  list.push(...(await CommonContent.getContentList(new GetContentListParams()
-    .setModelId(16)
-  , 1, 6)).list.map((p) => {
+  }));
+  list.push(...(await ProductsContent.getContentList(new GetContentListParams(), 1, 6)).list.map((p) => {
     p.itemType = 'intangible';
     return p;
-  }))
-
-
+  }));
   return list;
 });
 
@@ -351,18 +386,30 @@ function handleGoDetails(item: any) {
   .map-tags {
     left: 0;
     top: 0;
-    padding: 20rpx;
+    padding: 15rpx 0;
+    font-size: 25rpx;
 
-    view {
-      border-radius: 40rpx;
-      padding: 10rpx 20rpx;
-      background-color: #f7f3e8;
-      color: #d9492e;
-      margin-right: 10rpx;
+    .tag-bar {
+      padding: 0 20rpx;
+
+      view {
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        flex-shrink: 0;
+        border-radius: 40rpx;
+        padding: 10rpx 15rpx;
+        background-color: #f7f3e8;
+        color: #d9492e;
+        margin-right: 10rpx;
 
-      &.active {
-        background-color: #d9492e;
-        color: #f7f3e8;
+        .iconfont {
+          margin-right: 8rpx;
+        }
+        &.active {
+          background-color: #d9492e;
+          color: #f7f3e8;
+        }
       }
     }
   }

+ 69 - 42
src/pages/inhert.vue

@@ -6,9 +6,30 @@
       mode="widthFix"
     />
     <view class="content d-flex flex-col ">
+
+      <!-- 非遗项目 -->
+      <HomeTitle title="非遗项目" showMore inWing @clickMore="navTo('inhert/intangible/list')" />
+      <SimplePageContentLoader :loader="intangibleData" >
+        <scroll-view scroll-x>
+          <view class="padding-wing-l pb-3 pt-3 d-flex flex-row overflow-visible align-stretch">
+            <Box2LineLargeImageUserShadow
+              v-for="(item, i) in intangibleData.content.value"
+              classNames="width-2-3 mr-2"
+              titleColor="title-text"
+              :key="i"
+              :title="item.title"
+              :desc="item.desc"
+              :image="item.image"
+              :bottomLocate="item.bottomLocate"
+              :bottomScore="item.bottomScore"
+              @click="navTo('inhert/intangible/details', { id: item.id })"
+            />
+          </view>
+        </scroll-view>
+      </SimplePageContentLoader>
       
       <!-- 文物 -->
-      <HomeTitle title="文物" showMore inWing @clickMore="navTo('inhert/artifact/list')" />
+      <HomeTitle title="文物古迹" showMore inWing @clickMore="navTo('inhert/artifact/list')" />
       <SimplePageContentLoader :loader="artifactData">
         <scroll-view scroll-x>
           <view class="padding-wing-l pb-3 pt-3 d-flex flex-row overflow-visible align-stretch">
@@ -28,13 +49,13 @@
         </scroll-view>
       </SimplePageContentLoader>
 
-      <!-- 非遗 -->
-      <HomeTitle title="非遗" showMore inWing @clickMore="navTo('inhert/intangible/list')" />
-      <SimplePageContentLoader :loader="intangibleData" >
+      <!-- 非遗作品 -->
+      <HomeTitle title="非遗产品(作品)" showMore inWing @clickMore="navTo('inhert/intangible/list')" />
+      <SimplePageContentLoader :loader="productsData" >
         <scroll-view scroll-x>
           <view class="padding-wing-l pb-3 pt-3 d-flex flex-row overflow-visible align-stretch">
             <Box2LineLargeImageUserShadow
-              v-for="(item, i) in intangibleData.content.value"
+              v-for="(item, i) in productsData.content.value"
               classNames="width-2-3 mr-2"
               titleColor="title-text"
               :key="i"
@@ -71,66 +92,66 @@
 
       <view class="d-flex flex-col wing-l">
         <!-- 闽南语原创歌曲 -->
-        <HomeTitle title="闽南语原创歌曲" showMore @clickMore="goSongsList" />
+        <HomeTitle title="闽南语原创歌曲" showMore @clickMore="goMingnanSongsList" />
 
-        <SimplePageContentLoader :loader="songsData" >
+        <SimplePageContentLoader :loader="mingnanSongsData" >
           <Box1AudioPlay 
-            v-for="s in songsData.content.value" 
+            v-for="s in mingnanSongsData.content.value" 
             :key="s.id"
             :title="s.title" 
             class="w-100 mt-3" 
-            @click="goSongsDetail(s.id)"
+            @click="goMingnanSongsDetail(s.id)"
           />
         </SimplePageContentLoader>
 
-        <!-- 方言故事音频库 -->
-        <HomeTitle title="方言故事音频库" showMore @clickMore="goStoryList" />
-        <SimplePageContentLoader :loader="storyData" >
+        <!-- 闽南语作品库 -->
+        <HomeTitle title="闽南语作品库" showMore @clickMore="goSongsList" />
+        <SimplePageContentLoader :loader="songsData" >
           <Box2LinePlayRightArrow 
             v-for="s in songsData.content.value" 
             :key="s.id"
             :title="s.title" 
             :desc="s.desc"
-            @click="goStoryDetail(s.id)"
+            @click="goSongsDetail(s.id)"
           />
         </SimplePageContentLoader>
       </view>
 
-      <!-- 童趣记忆 -->
-      <HomeTitle title="童趣记忆" showMore inWing @clickMore="goMemoryList" />
-      <SimplePageContentLoader :loader="memoryData" >
+      <!-- 老字号 -->
+      <HomeTitle title="老字号" showMore inWing @clickMore="goOldList" />
+      <SimplePageContentLoader :loader="oldData">
         <scroll-view scroll-x>
           <view class="padding-wing-l pb-3 pt-3 d-flex flex-row overflow-visible align-stretch">
             <Box2LineLargeImageUserShadow
-              v-for="(item, i) in memoryData.content.value"
+              v-for="(item, i) in oldData.content.value"
               classNames="width-2-3 mr-2"
               titleColor="title-text"
               :key="i"
               :title="item.title"
               :desc="item.desc"
-              :image="item.thumbnail || item.image"
-              @click="goMemoryDetail(item.id)"
+              :image="item.thumbnail"
+              :bottomLocate="(item.regionText as string)"
+              :bottomScore="''"
+              @click="goOldDetail(item.id)"
             />
           </view>
         </scroll-view>
       </SimplePageContentLoader>
 
-      <!-- 老字号 -->
-      <HomeTitle title="老字号" showMore inWing @clickMore="goOldList" />
-      <SimplePageContentLoader :loader="oldData">
+      <!-- 童趣记忆 -->
+      <HomeTitle title="童趣记忆" showMore inWing @clickMore="goMemoryList" />
+      <SimplePageContentLoader :loader="memoryData" >
         <scroll-view scroll-x>
           <view class="padding-wing-l pb-3 pt-3 d-flex flex-row overflow-visible align-stretch">
             <Box2LineLargeImageUserShadow
-              v-for="(item, i) in oldData.content.value"
+              v-for="(item, i) in memoryData.content.value"
               classNames="width-2-3 mr-2"
               titleColor="title-text"
               :key="i"
               :title="item.title"
               :desc="item.desc"
-              :image="item.thumbnail"
-              :bottomLocate="(item.regionText as string)"
-              :bottomScore="''"
-              @click="goOldDetail(item.id)"
+              :image="item.thumbnail || item.image"
+              @click="goMemoryDetail(item.id)"
             />
           </view>
         </scroll-view>
@@ -169,12 +190,10 @@ import SimplePageContentLoader from '@/common/components/SimplePageContentLoader
 import ProjectsContent from '@/api/inheritor/ProjectsContent';
 import UnmoveableContent from '@/api/inheritor/UnmoveableContent';
 import { useHomePageMiniCommonListGoMoreAndGoDetail } from './article/common/CommonContent';
+import ProductsContent from '@/api/inheritor/ProductsContent';
 
 const artifactData = useSimpleDataLoader(async () => 
-  (await UnmoveableContent.getContentList(new GetContentListParams().setSelfValues({
-    type: GetContentListParams.TYPE_ARTICLE,
-    flag: 'recommend',
-  }), 1, 4)).list.map(p => ({
+  (await UnmoveableContent.getContentList(new GetContentListParams(), 1, 4)).list.map(p => ({
     id: p.id,
     title: p.title, 
     desc: '', 
@@ -184,10 +203,18 @@ const artifactData = useSimpleDataLoader(async () =>
   }))
 );
 const intangibleData = useSimpleDataLoader(async () => 
-  (await ProjectsContent.getContentList(new GetContentListParams().setSelfValues({
-    type: GetContentListParams.TYPE_ARTICLE,
-    flag: 'recommend',
-  }), 1, 4)).list.map(p => ({
+  (await ProjectsContent.getContentList(new GetContentListParams(), 1, 4)).list.map(p => ({
+    id: p.id,
+    title: p.title, 
+    desc: p.desc, 
+    image: p.thumbnail || p.image,
+    bottomLocate: p.area as string,
+    bottomScore: '5.0',
+  }))
+);
+
+const productsData = useSimpleDataLoader(async () => 
+  (await ProductsContent.getContentList(new GetContentListParams(), 1, 4)).list.map(p => ({
     id: p.id,
     title: p.title, 
     desc: p.desc, 
@@ -214,7 +241,7 @@ const {
   goList: goSongsList,
   goDetail: goSongsDetail,
 } = useHomePageMiniCommonListGoMoreAndGoDetail({
-  title: '闽南语原创歌曲',
+  title: '闽南语作品库',
   mainBodyColumnId: 189,
   modelId: 16,
   itemType: 'article-common',
@@ -222,13 +249,13 @@ const {
 });
 
 const {
-  loader: storyData,
-  goList: goStoryList,
-  goDetail: goStoryDetail,
+  loader: mingnanSongsData,
+  goList: goMingnanSongsList,
+  goDetail: goMingnanSongsDetail,
 } = useHomePageMiniCommonListGoMoreAndGoDetail({
-  title: '方言故事频率库',
-  mainBodyColumnId: 235,
-  modelId: 5,
+  title: '闽南语原创歌曲',
+  mainBodyColumnId: 315,
+  modelId: 16,
   itemType: 'article-common',
   detailsPage: '/pages/video/details',
 });

+ 43 - 18
src/pages/inhert/map/index.vue

@@ -3,6 +3,7 @@
     
     <u-tabs 
       :list="tabs" 
+      :current="tab"
       lineWidth="30"
       lineColor="#d9492e"
       :activeStyle="{
@@ -14,7 +15,7 @@
         color: '#606266',
         transform: 'scale(1)'
       }"
-      :scrollable="false"
+      :scrollable="true"
       class="top-tab"
       @click="(e: any) => tab = e.index"
     />
@@ -23,16 +24,16 @@
         v-model="searchValue"
         radius="100" 
         bgColor="#fff" 
-        placeholder="搜索文物" 
+        placeholder="搜索地图数据库" 
         clearButton="auto" 
         cancelButton="none"
         @confirm="doSearch"
       />
     </view>
     <view class="d-flex flex-row justify-around p-2 pt-0">
-      <SimpleDropDownPicker v-if="tab == 0" v-model="selectedTag" :columns="categoryData.content.value" />
-      <SimpleDropDownPicker v-model="selectedLevel" :columns="levelData.content.value" />
-      <SimpleDropDownPicker v-model="selectedRegion" :columns="regionData.content.value" />
+      <SimpleDropDownPicker v-if="tab == 2" v-model="selectedTag" :columns="categoryData.content.value" />
+      <SimpleDropDownPicker v-if="tab <= 2" v-model="selectedLevel" :columns="levelData.content.value" />
+      <SimpleDropDownPicker v-if="tab <= 2" v-model="selectedRegion" :columns="regionData.content.value" />
     </view>
     <view class="d-flex flex-row flex-wrap justify-between">
       <map 
@@ -58,17 +59,26 @@ import CommonContent, { GetContentListParams } from '@/api/CommonContent';
 import UnmoveableContent from '@/api/inheritor/UnmoveableContent';
 import ProjectsContent from '@/api/inheritor/ProjectsContent';
 import { onLoad } from '@dcloudio/uni-app';
+import AppCofig from '@/common/config/AppCofig';
+import VillageApi from '@/api/inhert/VillageApi';
+import ScenicSpotContent from '@/api/fusion/ScenicSpotContent';
 
 const tab = ref(0)
 const tabs = [
   {
-    name: '文物'
+    name: '非遗项目'
   },
   {
-    name: '非遗'
+    name: '非遗传习所'
   },
   {
-    name: '非遗传习所'
+    name: '文物古迹'
+  },
+  {
+    name: '传统村落'
+  },
+  {
+    name: '闽南文化景区'
   },
 ];
 const mapCtx = uni.createMapContext('map');
@@ -108,36 +118,50 @@ const listLoader = useSimplePageListLoader(50, async (page, pageSize) => {
   switch (tab.value) {
     default:
     case 0:
-      list = (await UnmoveableContent.getContentList(new GetContentListParams().setSelfValues({
-        crType: selectedTag.value == 0 ? undefined: selectedTag.value,
+      list = (await ProjectsContent.getContentList(new GetContentListParams().setSelfValues({
         level: selectedLevel.value == 0 ? undefined: selectedLevel.value,
         region: selectedRegion.value == 0 ? undefined: selectedRegion.value,
         keywords: searchValue.value,
       }), page, pageSize)).list;
       break;
     case 1:
-      list = (await ProjectsContent.getContentList(new GetContentListParams().setSelfValues({
+      list = (await SeminarContent.getContentList(new GetContentListParams().setSelfValues({
         level: selectedLevel.value == 0 ? undefined: selectedLevel.value,
         region: selectedRegion.value == 0 ? undefined: selectedRegion.value,
         keywords: searchValue.value,
       }), page, pageSize)).list;
       break;
     case 2:
-      list = (await SeminarContent.getContentList(new GetContentListParams().setSelfValues({
+      list = (await UnmoveableContent.getContentList(new GetContentListParams().setSelfValues({
+        crType: selectedTag.value == 0 ? undefined: selectedTag.value,
         level: selectedLevel.value == 0 ? undefined: selectedLevel.value,
         region: selectedRegion.value == 0 ? undefined: selectedRegion.value,
         keywords: searchValue.value,
       }), page, pageSize)).list;
       break;
+    case 3:
+      list = (await VillageApi.getVallageList()).filter(p => 
+        (!searchValue.value || p.villageName.indexOf(searchValue.value) > -1)
+      );
+      break;
+    case 4:
+      list = (await ScenicSpotContent.getContentList(new GetContentListParams().setSelfValues({
+        keywords: searchValue.value,
+      }), page, pageSize)).list
+      break;
   }
   
   const res = list.map((p) => {
+    if (!p.longitude || !p.latitude) {
+      p.longitude = AppCofig.defaultLonLat[0] + Math.random() * 0.1 - 0.05;
+      p.latitude = AppCofig.defaultLonLat[1] + Math.random() * 0.1 - 0.05;
+    }
     return {
       //...p,
       id: p.id,
       longitude: Number(p.longitude),
       latitude: Number(p.latitude),
-      iconPath: p.thumbnail,
+      iconPath: p.thumbnail || p.image || AppCofig.defaultImage,
       width: 40,
       height: 40,
       joinCluster: true,
@@ -163,7 +187,6 @@ const listLoader = useSimplePageListLoader(50, async (page, pageSize) => {
     clear: true,
     markers: res, 
   })
-
   return res;
 }, true);
 
@@ -188,14 +211,15 @@ function onMarkerTap(e: { markerId: number }) {
 }
 function goDetails(id: number) {
   switch (tab.value) {
-    case 0: navTo('/pages/inhert/artifact/details', { id }); break;
-    case 1: navTo('/pages/inhert/intangible/details', { id }); break;
     default:
-    case 2: navTo('/pages/article/details', { id }); break;
+    case 0: navTo('/pages/article/details', { id }); break;
+    case 1: navTo('/pages/inhert/intangible/details', { id }); break;
+    case 2: navTo('/pages/inhert/artifact/details', { id }); break;
+    case 3: navTo('/pages/inhert/village/details', { id }); break;
   }
 }
 
-onLoad(() => {
+onLoad((query) => {
   mapCtx.initMarkerCluster({
     enableDefaultStyle: false,
     zoomOnClick: true,
@@ -228,6 +252,7 @@ onLoad(() => {
       clear: false,
     });
   })
+  tab.value = Number(query?.tab || 0) - 1;
   listLoader.loadData(undefined, true);
 })
 </script>

+ 2 - 2
src/pages/introduction/character.vue

@@ -1,7 +1,7 @@
 <template>
-  <!-- 文化概况 - 先贤列传 -->
+  <!-- 文化概况 - 历史人物 -->
    <CommonListPage
-    :title="'先贤列传'"
+    :title="'历史人物'"
     :dropDownNames="[]"
     itemType="article-character"
     detailsPage="/pages/inhert/inheritor/details"