ソースを参照

📦 非遗路线列表

快乐的梦鱼 3 週間 前
コミット
1801fb7347
共有4 個のファイルを変更した60 個の追加19 個の削除を含む
  1. 13 4
      src/api/traval/TravalContent.ts
  2. 30 11
      src/pages/travel/route/list.vue
  3. 16 3
      src/pages/travel/route/travel-route.vue
  4. 1 1
      src/pages/user/debug/DebugButton.vue

+ 13 - 4
src/api/traval/TravalContent.ts

@@ -1,4 +1,4 @@
-import { DataModel, transformDataModel } from '@imengyu/js-request-transform';
+import { DataModel, transformArrayDataModel, transformDataModel } from '@imengyu/js-request-transform';
 import { CommonContentApi, GetContentDetailItem, GetContentListItem, GetContentListParams } from '../CommonContent';
 
 export class TravalListItem extends DataModel<TravalListItem> {
@@ -36,9 +36,18 @@ export class TravalContentApi extends CommonContentApi {
     res.scenicSpotsList = (res.scenicSpotsList as any[]).map(p => transformDataModel<TravalListItem>(TravalListItem, p));
     return res;
   }
-  async getTravalRouteList() {
-    const res = await this.getContentDetail(8768, GetContentDetailItem, 17, { 'scenic_spots': '1' });
-    return res.associationMeList.concat([res as unknown as GetContentListItem]) as GetContentListItem[];
+  async getTravalRouteList(params: GetContentListParams) {
+    params.setSelfValues({
+      pid: 8768,
+      modelId: 17,
+    });
+    const res = await this.getContentList(params, 1, 100, GetContentDetailItem);
+    res.list.forEach((p) => {
+      if (p.scenicSpotsList) {
+        p.scenicSpotsList = transformArrayDataModel<TravalListItem>(TravalListItem, p.scenicSpotsList as any[], '路线景点列表', true);
+      }
+    });
+    return res;
   }
 
 }

+ 30 - 11
src/pages/travel/route/list.vue

@@ -19,7 +19,14 @@
         <FlexRow>
           <SimpleDropDownPicker v-model="selectedRegion" :columns="regionData.content.value" />
           <SimpleDropDownPicker v-model="selectedType" :columns="typeData.content.value" />
-          <SearchBar v-model="searchValue" placeholder="搜索路线" @search="doSearch" @cancel="doSearch" />
+          <SearchBar 
+            v-model="searchValue"
+            placeholder="搜索路线" 
+            leftIcon=""
+            searchState="show"
+            @search="doSearch" 
+            @cancel="doSearch" 
+          />
         </FlexRow>
         <FlexCol 
           v-for="(item,index) in listLoader.content.value"
@@ -56,7 +63,6 @@
             <Button size="small" type="primary" shape="round" :radius="40" text="Let's Go" @click="handleGo(item)" />
           </FlexRow>
         </FlexCol>
-
         <Empty
           v-if="listLoader.content.value?.length == 0"
           :description="listLoader.content.value?.length == 0 ? '暂无数据' : ''"
@@ -85,16 +91,19 @@ import Tag from '@/components/display/Tag.vue';
 import SearchBar from '@/components/form/SearchBar.vue';
 import SimpleDropDownPicker from '@/common/components/SimpleDropDownPicker.vue';
 import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
-import CommonContent from '@/api/CommonContent';
+import CommonContent, { GetContentListParams } from '@/api/CommonContent';
 import Empty from '@/components/feedback/Empty.vue';
 
 const listLoader = useSimplePageContentLoader(async () => {
-  const res = await TravalContent.getTravalRouteList();
-  return res.filter(p => (
-    !selectedRegion.value || p.region == selectedRegion.value) 
-    && (!selectedType.value || p.type == selectedType.value) 
-    && (!searchValue.value || p.title.includes(searchValue.value))
-  );
+  const res = (await TravalContent.getTravalRouteList(
+    new GetContentListParams()
+      .setKeywords(searchValue.value)
+      .setSelfValues({
+        region: selectedRegion.value == 0 ? undefined : selectedRegion.value,
+        type: selectedType.value == 0 ? undefined : selectedType.value,
+      })
+  )).list;
+  return res;
 });
 
 const selectedRegion = ref(0);
@@ -103,17 +112,27 @@ const searchValue = ref('');
 
 const regionData = useSimpleDataLoader(async () => {
   const res = await CommonContent.getCategoryList(1);
-  return res.filter(p => p.pid == 5).map(p => ({
+  const data = res.filter(p => p.pid == 5).map(p => ({
     id: p.id,
     name: p.title,
   }));
+  data.unshift({
+    id: 0,
+    name: '全部地区',
+  });
+  return data;
 });
 const typeData = useSimpleDataLoader(async () => {
   const res = await CommonContent.getCategoryList(1);
-  return res.map(p => ({
+  const data = res.map(p => ({
     id: p.id,
     name: p.title,
   }));
+  data.unshift({
+    id: 0,
+    name: '全部兴趣',
+  });
+  return data;
 });
 
 watch(selectedRegion, () => {

+ 16 - 3
src/pages/travel/route/travel-route.vue

@@ -162,7 +162,7 @@
 
 <script setup lang="ts">
 import type { GetContentDetailItem } from '@/api/CommonContent';
-import { waitTimeOut } from '@imengyu/imengyu-utils';
+import { RequestApiError, waitTimeOut } from '@imengyu/imengyu-utils';
 import { onMounted, ref, watch } from 'vue';
 import { useLoadQuerys } from '@/common/composeabe/LoadQuerys';
 import TravalContent from '@/api/traval/TravalContent';
@@ -182,6 +182,7 @@ import Button from '@/components/basic/Button.vue';
 import Touchable from '@/components/feedback/Touchable.vue';
 import Parse from '@/components/display/parse/Parse.vue';
 import IconButton from '@/components/basic/IconButton.vue';
+import { alert } from '@/components/utils/DialogAction';
 
 const markers = ref<any[]>([]);
 /** 地图折线:每条 toNextRoute 一段,points 来自 toNextRoute.xxx.polyline (number[] 为 经度,纬度 交替) */
@@ -323,8 +324,20 @@ function focusRoute(item: RouteInfo['items'][number]) {
 }
 async function loadRoute() {
   await waitTimeOut(500);
-  travalDetail.value = await TravalContent.getTravalList(querys.value.id);
-  routeInfo.value = await RouteApi.getRouteInfo(querys.value.id);
+  travalDetail.value = await TravalContent.getTravalList(querys.value.id);  
+  try {
+    routeInfo.value = await RouteApi.getRouteInfo(querys.value.id);
+  } catch (error) {
+    if (error instanceof RequestApiError) {
+      if (error.code == 404) {
+        alert({
+          title: '路线不存在',
+          content: '路线未生成,请在服务器端生成路线',
+        });
+        return;
+      }
+    }
+  }
   await loadMap();
 }
 async function loadMap() {

+ 1 - 1
src/pages/user/debug/DebugButton.vue

@@ -46,7 +46,7 @@ function showBuildInfo() {
   }).then((res) => {
     if (res == 'testRoutePage') {
       uni.navigateTo({
-        url: '/pages/travel/route/travel-route?id=8925',
+        url: '/pages/travel/route/list',
       });
     }
     if (res == 'testBug') {