Explorar o código

📦 其他页面与细节修改

imengyu hai 1 mes
pai
achega
ea8e022bd6

+ 10 - 5
src/api/CommonContent.ts

@@ -56,7 +56,7 @@ export class GetContentListParams extends DataModel<GetContentListParams> {
   }
 
 
-  setMainBodyColumnId(val: number) {
+  setMainBodyColumnId(val: number|number[]) {
     this.mainBodyColumnId = val;
     return this;
   }
@@ -86,15 +86,15 @@ export class GetContentListParams extends DataModel<GetContentListParams> {
   }
 
   static TYPE_ARTICLE = 1;
-  static TYPE_IMAGE = 4;
   static TYPE_AUDIO = 2;
   static TYPE_VIDEO = 3;
+  static TYPE_IMAGE = 4;
 
   modelId ?: number;
   /**
    * 主体栏目id
    */
-  mainBodyColumnId: number = 0;
+  mainBodyColumnId: number|number[] = 0;
   /**
    * 标志:hot=热门,recommend=推荐,top=置顶
    */
@@ -199,7 +199,6 @@ export class GetContentDetailItem extends DataModel<GetContentDetailItem> {
     this._convertTable = {
       id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
       title: { clientSide: 'string', serverSide: 'string', clientSideRequired: true },
-      content: { clientSide: 'string', serverSide: 'string' },
       isGuest: { clientSide: 'boolean', serverSide: 'number' },
       isLogin: { clientSide: 'boolean', serverSide: 'number' },
       isComment: { clientSide: 'boolean', serverSide: 'number' },
@@ -301,6 +300,12 @@ export class CommonContentApi extends AppServerRequestModule<DataModel> {
   protected modelId: number;
   protected debugName: string;
 
+  private toStringArray(arr: number|number[]|undefined) {
+    if (typeof arr === 'undefined') 
+      return '';
+    return typeof arr === 'object' ? arr.join(',') : arr.toString();
+  }
+
   /**
    * 获取分类列表
    * @param type 根级类型:1=区域、2=级别、3=文物类型、4=非遗类型、42=事件类型
@@ -368,7 +373,7 @@ export class CommonContentApi extends AppServerRequestModule<DataModel> {
       ...params.toServerSide(),
       model_id: params.modelId || this.modelId,
       main_body_id: params.mainBodyId || this.mainBodyId,
-      main_body_column_id: params.mainBodyColumnId || this.mainBodyColumnId,
+      main_body_column_id: this.toStringArray(params.mainBodyColumnId || this.mainBodyColumnId),
       page,
       pageSize,
       ...querys,

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

@@ -155,7 +155,6 @@ export class VillageApi extends AppServerRequestModule<DataModel> {
   }
   async getVallageList() {
     return (this.get('/village/village/getList', '村落列表', {
-      main_body_id: 2,
     })) 
       .then(res => transformArrayDataModel<VillageListItem>(VillageListItem, transformSomeToArray(res.data2), `村落`, true))
       .catch(e => { throw e });

+ 2 - 2
src/common/components/tabs/tabbar.vue

@@ -92,8 +92,8 @@ export default {
       }
     }
     image {
-      width: 50rpx;
-      height: 50rpx;
+      width: 65rpx;
+      height: 65rpx;
     }
 
     text {

+ 10 - 0
src/common/composeabe/LoadQuerys.ts

@@ -29,4 +29,14 @@ export function useLoadQuerys<T extends Record<string, any>>(
   return {
     querys,
   }
+}
+
+export function stringDotNumbersToNumbers(a: number|number[]|string|undefined): number|number[]|undefined {
+  if (typeof a === 'string') {
+    if (a.includes(','))
+      return a.split(',').map(stringDotNumbersToNumbers) as number[]; 
+    else
+      return Number(a.replace(/\./g, '')); 
+  }
+  return a;
 }

+ 1 - 1
src/common/scss/common.scss

@@ -29,7 +29,7 @@
     top: calc(var(--status-bar-height) + 50rpx);
   }
   > .content {
-    margin-top: 30vh;
+    margin-top: 20vh;
     z-index: 1;
   }
 }

+ 2 - 1
src/manifest.json

@@ -60,10 +60,11 @@
 		},
 		"permission": {
 			"scope.userLocation": {
-				"desc": "你的位置信息将用于小程序位置接口的效果展示"
+				"desc": "用于标识志愿者的位置信息"
 			}
 		},
 		"requiredPrivateInfos": [
+      "getLocation", 
       "chooseAddress",
       "chooseLocation",
       "choosePoi"

+ 14 - 0
src/pages.json

@@ -39,6 +39,12 @@
       }
     },
     {
+      "path": "pages/travel/nav/navto",
+      "style": {
+        "navigationBarTitleText": "导航"
+      }
+    },
+    {
       "path": "pages/discover",
       "style": {
         "navigationBarTitleText": "闽南文化生态保护-发现",
@@ -120,6 +126,14 @@
       }
     },
     {
+      "path": "pages/article/web/ewebview",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
       "path": "pages/article/editor/editor",
       "style": {
         "navigationBarTitleText": "编辑文章",

+ 10 - 4
src/pages/article/common/CommonContent.ts

@@ -1,7 +1,13 @@
-import CommonContent, { GetContentListParams } from "@/api/CommonContent";
-import { useSimpleDataLoader } from "@/common/composeabe/SimpleDataLoader";
+import CommonContent, { GetContentListItem, GetContentListParams } from "@/api/CommonContent";
+import { useSimpleDataLoader, type ISimpleDataLoader } from "@/common/composeabe/SimpleDataLoader";
 import { navTo } from "@/common/utils/PageAction"
 
+export interface IHomePageMiniCommonListGoMoreAndGoDetail {
+  loader: ISimpleDataLoader<GetContentListItem[], any>;
+  goDetail: (id: number) => void;
+  goList: () => void; 
+}
+
 /**
  * 专用于通用内容的首页小列表控制代码组合
  * @param p 
@@ -9,12 +15,12 @@ import { navTo } from "@/common/utils/PageAction"
  */
 export function useHomePageMiniCommonListGoMoreAndGoDetail(p: {
   title?: string,
-  mainBodyColumnId?: number,
+  mainBodyColumnId?: number|number[],
   modelId?: number,
   itemType?: string,
   detailsPage: string,
   count?: number,
-}) {
+}) : IHomePageMiniCommonListGoMoreAndGoDetail {
   function goDetail(id: number) {
     navTo(p.detailsPage, {
       mainBodyColumnId: p.mainBodyColumnId,

+ 4 - 3
src/pages/article/common/list.vue

@@ -12,12 +12,12 @@
 </template>
 
 <script setup lang="ts">
-import { useLoadQuerys } from '@/common/composeabe/LoadQuerys';
+import { useLoadQuerys, stringDotNumbersToNumbers } from '@/common/composeabe/LoadQuerys';
 import CommonListPage from './CommonListPage.vue';
 import CommonContent, { GetContentListParams } from '@/api/CommonContent';
 
 const { querys } = useLoadQuerys({
-  mainBodyColumnId: 0,
+  mainBodyColumnId: '',
   modelId: 0,
   itemType: '',
   detailsPage: '',
@@ -30,9 +30,10 @@ async function loadData(
   searchText: string,
   dropDownValues: number[]
 ) {
+  const mainBodyColumnId = stringDotNumbersToNumbers(querys.value.mainBodyColumnId);
 
   const res = await CommonContent.getContentList(new GetContentListParams().setSelfValues({
-    mainBodyColumnId: querys.value.mainBodyColumnId || undefined,
+    mainBodyColumnId: mainBodyColumnId || undefined,
     modelId: querys.value.modelId || undefined,
     keywords: searchText,
   }), page, pageSize);

+ 29 - 2
src/pages/article/details.vue

@@ -3,8 +3,28 @@
     <SimplePageContentLoader :loader="loader">
       <template v-if="loader.content.value">
         <view class="d-flex flex-col">
+          <swiper 
+            v-if="loader.content.value.images.length > 0"
+            circular 
+            :indicator-dots="true"
+            :autoplay="true"
+            :interval="3000"
+            :duration="1000"
+            class="height-500"
+          >
+            <swiper-item v-for="(item, key) in loader.content.value.images" :key="key">
+              <view class="item">
+                <image 
+                  :src="item" 
+                  class="w-100 height-500 radius-base"
+                  mode="aspectFill" 
+                  @click="onPreviewImage(key)"
+                />
+              </view>
+            </swiper-item>
+          </swiper>
           <image 
-            v-if="loader.content.value.image"
+            v-else-if="loader.content.value.image"
             class="w-100 radius-base"
             :src="loader.content.value.image"
             mode="widthFix"
@@ -17,7 +37,11 @@
             </view>
           </view>
           <view class="p-3 radius-ll bg-light mt-3">
-            <u-parse :content="loader.content.value.content" :tagStyle="commonParserStyle"></u-parse>
+            <u-parse 
+              v-if="loader.content.value.content"
+              :content="loader.content.value.content"
+              :tagStyle="commonParserStyle"
+            ></u-parse>
           </view>
         </view>
         <view class="bottom-actions">
@@ -44,6 +68,7 @@ import { useLoadQuerys } from "@/common/composeabe/LoadQuerys";
 import NewsIndexContent from "@/api/news/NewsIndexContent";
 import commonParserStyle from "@/common/style/commonParserStyle";
 import SimplePageContentLoader from "@/common/components/SimplePageContentLoader.vue";
+import { useSwiperImagePreview } from "@/common/composeabe/SwiperImagePreview";
 
 const loader = useSimplePageContentLoader<
   GetContentDetailItem, 
@@ -56,6 +81,8 @@ const loader = useSimplePageContentLoader<
   return res;
 });
 
+const { onPreviewImage } = useSwiperImagePreview(() => loader.content.value?.images || [])
+
 useLoadQuerys({ id : 0, }, (p) => loader.loadData(p));
 </script>
 

+ 14 - 0
src/pages/article/web/ewebview.vue

@@ -0,0 +1,14 @@
+<template>
+  <web-view 
+    class="w-100 h-100vh"
+    :src="querys.url"
+  />
+</template>
+
+<script setup lang="ts">
+import { useLoadQuerys } from '@/common/composeabe/LoadQuerys';
+
+const { querys } = useLoadQuerys({
+  url: '',
+});
+</script>

+ 109 - 33
src/pages/discover.vue

@@ -9,17 +9,19 @@
       
       <!-- 文化百科 -->
       <HomeTitle title="文化百科" />
-      <view class="d-flex flex-row justify-between">
-        <view 
-          v-for="(item, i) in categories" 
-          :key="i"
-          class="d-flex flex-col align-center"
-          @click="item.onClick"
-        >
-          <image :src="item.icon" class="width-100 height-100" />
-          <text class="width-130 text-align-center mt-2 color-primary size-s">{{ item.name }}</text>
+      <scroll-view scroll-x>
+        <view class="d-flex flex-row">
+          <view 
+            v-for="(item, i) in categories" 
+            :key="i"
+            class="width-150 d-flex flex-col align-center flex-shrink-0"
+            @click="item.onClick"
+          >
+            <image :src="item.icon" class="width-100 height-100" />
+            <text class="width-130 text-align-center mt-2 color-primary size-s">{{ item.name }}</text>
+          </view>
         </view>
-      </view>
+      </scroll-view>
 
       <!-- 闽南语猜猜猜 -->
       <view class="home-title">
@@ -28,7 +30,9 @@
       <Box2LinePlayRightArrow 
         title="听语音猜词语"
         desc="每日更新,赢取积分"
-        @click="navTo('/pages/answer/words/index')"
+        @click="navTo('/pages/article/web/ewebview', {
+          url: 'https://mn.wenlvti.net/assets/addons/yunexamine/h5/#/pages/home/dashboard'
+        })"
       />
 
       <!-- 文化挑战 -->
@@ -47,14 +51,16 @@
         desc="可获积分:500"
       >
         <view class="width-1-5">
-          <u-button shape="circle" type="primary" @click="navTo('/pages/answer/index')">立即报名</u-button>
+          <u-button shape="circle" type="primary" @click="navTo('/pages/article/web/ewebview', {
+            url: 'https://mn.wenlvti.net/assets/addons/yunexamine/h5/#/pages/home/dashboard'
+          })">立即报名</u-button>
         </view>
       </Box2LineRightSlot>
 
       <!-- 文化社区 -->
       <!-- <HomeTitle title="文化社区" />
       <SimplePageContentLoader :loader="communityData">
-        <view class="d-flex w-100 flex-row flex-wrap align-center justify-between">
+        <view class="d-flex w-100 flex-row flex-wrap align-stretch justify-between">
           <Box2LineLargeImageUserShadow 
             v-for="(item, i) in communityData.content.value"
             :key="i"
@@ -70,17 +76,44 @@
       </SimplePageContentLoader> -->
 
       <!-- 老照片 -->
-      <HomeTitle title="老照片" showMore />
+      <HomeTitle title="老照片" showMore @clickMore="goImagesList" />
       <SimplePageContentLoader :loader="imagesData">
         <scroll-view scroll-x>
           <view class="d-flex flex-row">
-            <view v-for="(item, i) in imagesData.content.value" :key="i" class="mr-2">
-              <image class="width-300 radius-base" :src="item.image" mode="widthFix" />
+            <view 
+              v-for="(item, i) in imagesData.content.value"
+              :key="i"
+              class="mr-2"
+              @click="goImagesDetail(item.id)"
+            >
+              <image 
+                class="width-300 height-200 radius-base"
+                :src="item.image"
+                mode="aspectFill"
+              />
             </view>
           </view>
         </scroll-view>
       </SimplePageContentLoader>
 
+      
+      <!-- 文化社区 -->
+      <HomeTitle title="闽南文化" />
+      <SimplePageContentLoader :loader="cultureData">
+        <view class="d-flex w-100 flex-row flex-wrap align-stretch justify-between">
+          <Box2LineLargeImageUserShadow 
+            v-for="(item, i) in cultureData.content.value"
+            :key="i"
+            :title="item.title"
+            :desc="item.desc"
+            :image="item.image"
+            :likes="item.likes"
+            :comment="item.comments"
+            @click="goCultureDetail(item.id)"
+          />
+        </view>
+      </SimplePageContentLoader> 
+
       <!-- 热门话题 -->
       <!-- <HomeTitle title="热门话题" />
       <SimplePageContentLoader :loader="topicsData">
@@ -120,6 +153,7 @@ import HomeTitle from './parts/HomeTitle.vue';
 import { navTo } from '@/common/utils/PageAction';
 import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
 import SimplePageContentLoader from '@/common/components/SimplePageContentLoader.vue';
+import { useHomePageMiniCommonListGoMoreAndGoDetail } from './article/common/CommonContent';
 
 const categories = [
   { 
@@ -167,10 +201,43 @@ const categories = [
     })  
   },
   { 
-    name: '民俗信仰', 
+    name: '舞蹈艺术', 
+    icon: CategoryIcon3  , 
+    onClick: () => navTo('/pages/article/common/list', {
+      title: '舞蹈艺术',
+      mainBodyColumnId: 239,
+      modelId: 3,
+      itemType: 'article-common',
+      detailsPage: '/pages/article/details',
+    }) 
+  },
+  { 
+    name: '海洋文化', 
     icon: CategoryIcon5  , 
     onClick: () => navTo('/pages/article/common/list', {
-      title: '民俗信仰',
+      title: '海洋文化',
+      mainBodyColumnId: 254,
+      modelId: 3,
+      itemType: 'article-common',
+      detailsPage: '/pages/article/details',
+    }) 
+  },
+  { 
+    name: '曲艺艺术', 
+    icon: CategoryIcon3  , 
+    onClick: () => navTo('/pages/article/common/list', {
+      title: '曲艺艺术',
+      mainBodyColumnId: 241,
+      modelId: 3,
+      itemType: 'article-common',
+      detailsPage: '/pages/article/details',
+    }) 
+  },
+  { 
+    name: '宗教信俗', 
+    icon: CategoryIcon5  , 
+    onClick: () => navTo('/pages/article/common/list', {
+      title: '宗教信俗',
       mainBodyColumnId: 248,
       modelId: 4,
       itemType: 'article-common',
@@ -218,22 +285,31 @@ const communityData = useSimpleDataLoader(async () => {
     },
   ]
 });
-const imagesData = useSimpleDataLoader(async () => {
-  return [
-    {
-      image: ImageTest2,
-    },
-    {
-      image: ImageTest3, 
-    },
-    {
-      image: ImageTest4,
-    },
-    {
-      image: ImageTest5,  
-    }
-  ]
+
+const {
+  loader: cultureData,
+  goList: goCultureList,
+  goDetail: goCultureDetail,
+} = useHomePageMiniCommonListGoMoreAndGoDetail({
+  title: '闽南文化',
+  mainBodyColumnId: [252,253,254],
+  modelId: 3,
+  itemType: 'article-common',
+  detailsPage: '/pages/article/details',
 });
+
+const {
+  loader: imagesData,
+  goList: goImagesList,
+  goDetail: goImagesDetail,
+} = useHomePageMiniCommonListGoMoreAndGoDetail({
+  title: '老照片',
+  mainBodyColumnId: 102,
+  modelId: 8,
+  itemType: 'image-large-2',
+  detailsPage: '/pages/article/details',
+});
+
 const topicsData = useSimpleDataLoader(async () => {
   return [
     {

+ 16 - 9
src/pages/home.vue

@@ -5,11 +5,6 @@
       src="/static/images/home/BackgroundBanner.jpg"
       mode="widthFix"
     />
-    <image 
-      class="w-60 position-absolute title"
-      src="/static/images/home/Title.png"
-      mode="widthFix"
-    />
     <view class="content d-flex flex-col wing-l">
 
       <!-- 分栏 -->
@@ -40,7 +35,13 @@
             <text class="color-second-text mt-2 size-base text-align-center">{{ tab.name }}</text>
           </view>
 
-          <Box1AudioPlay class="w-100 mt-3 mb-3" title="里厚吖:你好呀" />
+          <Box1AudioPlay
+            v-if="langLoader.content.value?.[0]"
+            class="w-100 mt-3 mb-3" 
+            :title="langLoader.content.value[0].title"
+            :image="langLoader.content.value[0].image"
+            @click="navTo('/pages/video/details', { id: langLoader.content.value[0].id })"
+          />
 
           <view  
             v-for="(tab, k) in subTabs2" 
@@ -122,7 +123,7 @@
             @click="handleGoDetails(tab)"
           >
             <text 
-              class="tag bg-mask-white color-primary radius-l p-2 position-absolute size-s"
+              class="tag bg-mask-white color-primary radius-l p-1 position-absolute size-s text-lines-1"
             >
               {{ tab.title }}
             </text> 
@@ -175,8 +176,8 @@ const subTabs1 = [
     icon: MainBoxIcon2, 
     onClick: () => navTo('/pages/article/common/list', {
       title: '古早味',
-      mainBodyColumnId: 303,
-      modelId: 16,
+      mainBodyColumnId: 43,
+      modelId: 8,
       itemType: 'article-common',
       detailsPage: '/pages/article/details',
     }) 
@@ -243,6 +244,12 @@ const activityLoader = useSimpleDataLoader(async () => {
     }
   ]
 })
+const langLoader = useSimpleDataLoader(async () => {
+  return (await CommonContent.getContentList(new GetContentListParams()
+    .setModelId(16)
+    .setMainBodyColumnId(189)
+  , 1, 1)).list;
+})
 const recommendLoader = useSimpleDataLoader(async () => {
   const list = [];
   list.push(...(await CommonContent.getContentList(new GetContentListParams()

+ 11 - 10
src/pages/inhert.vue

@@ -21,6 +21,7 @@
               :image="item.image"
               :likes="item.likes"
               :comment="item.comment"
+              title1
               @click="navTo('inhert/artifact/details', { id: item.id })"
             />
           </view>
@@ -126,9 +127,9 @@
               :key="i"
               :title="item.title"
               :desc="item.desc"
-              :image="item.image"
-              :bottomLocate="'item.bottomLocate'"
-              :bottomScore="'item.bottomScore'"
+              :image="item.thumbnail"
+              :bottomLocate="(item.regionText as string)"
+              :bottomScore="''"
               @click="goOldDetail(item.id)"
             />
           </view>
@@ -226,7 +227,7 @@ const {
   goDetail: goStoryDetail,
 } = useHomePageMiniCommonListGoMoreAndGoDetail({
   title: '方言故事频率库',
-  mainBodyColumnId: 0,
+  mainBodyColumnId: 235,
   modelId: 5,
   itemType: 'article-common',
   detailsPage: '/pages/video/details',
@@ -238,8 +239,8 @@ const {
   goDetail: goMemoryDetail,
 } = useHomePageMiniCommonListGoMoreAndGoDetail({
   title: '童趣记忆',
-  mainBodyColumnId: 0,
-  modelId: 0,
+  mainBodyColumnId: 96,
+  modelId: 8,
   itemType: 'article-common',
   detailsPage: '/pages/article/details',
 });
@@ -250,8 +251,8 @@ const {
   goDetail: goOldDetail,
 } = useHomePageMiniCommonListGoMoreAndGoDetail({
   title: '老字号',
-  mainBodyColumnId: 0,
-  modelId: 0,
+  mainBodyColumnId: 312,
+  modelId: 17,
   itemType: 'article-common',
   detailsPage: '/pages/article/details',
 });
@@ -262,8 +263,8 @@ const {
   goDetail: goTopicsDetail,
 } = useHomePageMiniCommonListGoMoreAndGoDetail({
   title: '古早味知识百科',
-  mainBodyColumnId: 303,
-  modelId: 16,
+  mainBodyColumnId: 43,
+  modelId: 8,
   itemType: 'article-common',
   detailsPage: '/pages/article/details',
 });

+ 8 - 1
src/pages/inhert/artifact/details.vue

@@ -6,7 +6,12 @@
           <swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="2000" :duration="1000">
             <swiper-item v-for="(item, key) in loader.content.value.images" :key="key">
               <view class="item">
-                <ImageWrapper :src="item" mode="aspectFill" width="750rpx" />
+                <ImageWrapper 
+                  :src="item"
+                  mode="aspectFill"
+                  width="750rpx"
+                  @click="onPreviewImage(key)"
+                />
               </view>
             </swiper-item>
           </swiper>
@@ -94,6 +99,7 @@ import ImageWrapper from "@/common/components/ImageWrapper.vue";
 import HomeTitle from "@/pages/parts/HomeTitle.vue";
 import commonParserStyle from "@/common/style/commonParserStyle";
 import { useLoadQuerys } from "@/common/composeabe/LoadQuerys";
+import { useSwiperImagePreview } from "@/common/composeabe/SwiperImagePreview";
 
 const loader = useSimplePageContentLoader<
   GetContentDetailItem, 
@@ -106,6 +112,7 @@ const loader = useSimplePageContentLoader<
 
 useLoadQuerys({ id : 0, }, (p) => loader.loadData(p));
 
+const { onPreviewImage } = useSwiperImagePreview(() => loader.content.value?.images || [])
 
 function handleNavTo() {
   navTo('../../travel/nav/navto', {

+ 20 - 6
src/pages/inhert/intangible/details.vue

@@ -2,7 +2,7 @@
   <view class="d-flex flex-col bg-base">
     <SimplePageContentLoader :loader="loader">
       <template v-if="loader.content.value">
-        <view class="d-flex flex-col p-3">
+        <view class="d-flex flex-col">
           <video 
             v-if="loader.content.value.audio"
             class="video w-100"
@@ -20,15 +20,27 @@
             controls
           />
           <ImageSwiper v-else :images="loader.content.value.images" />
-          <view class="d-flex flex-col text-align-center mt-3">
+          <view class="d-flex flex-col text-align-center mt-3 p-3">
             <text class="size-lll font-bold color-text-content">{{ loader.content.value.title }}</text>
             <text class="size-base color-text-content-second mt-2">{{ loader.content.value.desc }}</text>
           </view>
 
           <view class="d-flex flex-col radius-l bg-light p-25 mt-3">
-            <u-parse :content="loader.content.value.intro" :tagStyle="commonParserStyle"></u-parse>
-            <u-parse :content="loader.content.value.content" :tagStyle="commonParserStyle"></u-parse>
-            <u-parse :content="loader.content.value.value" :tagStyle="commonParserStyle"></u-parse>
+            <u-parse 
+              v-if="loader.content.value.intro"
+              :content="loader.content.value.intro"
+              :tagStyle="commonParserStyle"
+            ></u-parse>
+            <u-parse 
+              v-if="loader.content.value.content"
+              :content="loader.content.value.content"
+              :tagStyle="commonParserStyle"
+            ></u-parse>
+            <u-parse 
+              v-if="loader.content.value.value"
+              :content="loader.content.value.value"
+              :tagStyle="commonParserStyle"
+            ></u-parse>
           </view>
         </view>
       </template>
@@ -54,7 +66,9 @@ const loader = useSimplePageContentLoader<
 >(async (params) => {
   if (!params)
     throw new Error("!params");
-  return await UnmoveableContent.getContentDetail(params.id);
+  const d = await UnmoveableContent.getContentDetail(params.id);
+  console.log(d)
+  return d;
 });
 
 useLoadQuerys({ id : 0 }, (p) => loader.loadData(p));

+ 10 - 2
src/pages/parts/Box2LineImageRightShadow.vue

@@ -15,8 +15,11 @@
         mode="aspectFill"
       />
       <view class="d-flex flex-col ml-3 flex-one width-500">
-        <text class="color-primary text-lines-1">{{ title }}</text>
-        <text class="color-second text-lines-1 mt-2">{{ desc }}</text>
+        <text :class="[
+          'color-primary',
+          desc || title1 ? 'text-lines-1' : 'text-lines-2',
+        ]">{{ title }}</text>
+        <text class="color-second text-lines-2 mt-2">{{ desc }}</text>
         <RoundTags v-if="tags" :tags="tags" />
       </view>
     </view>
@@ -33,6 +36,7 @@ defineProps({
   desc: String,
   right: String,
   image: String,
+
   tags: {
     type: Array as PropType<string[]>,
     default: null
@@ -40,6 +44,10 @@ defineProps({
   wideImage: {
     type: Boolean,
     default: false,
+  },
+  title1: {
+    type: Boolean,
+    default: false,
   }
 })
 </script>

+ 20 - 3
src/pages/parts/Box2LineLargeImageUserShadow.vue

@@ -3,7 +3,12 @@
     :class="'position-relative grid4-item d-flex flex-col shadow-l radius-l bg-base p-2 mb-2 overflow-hidden ' + classNames"
     @click="$emit('click')"
   >
-    <image class="w-100 height-300 radius-base" :src="image" mode="aspectFill" />
+    <image 
+      v-if="image" 
+      class="w-100 height-300 radius-base" 
+      :src="image" 
+      mode="aspectFill" 
+    />
     <image 
       v-if="videoMark" 
       class="width-60 mr-2 video-mark" 
@@ -13,8 +18,16 @@
       <image class="width-60 mr-2" :src="userHead" mode="widthFix" />
       <text class="size-s">{{ userName }}</text>
     </view>
-    <text :class="`color-${titleColor} text-lines-1 mt-2`">{{ title }}</text>
-    <text v-if="desc" class="color-second text-lines-1 mt-2">{{ desc }}</text>
+    <text 
+      :class="[
+        `color-${titleColor}`,
+        title1 || desc ? 'text-lines-1' : 'text-lines-2',
+        'mt-2',
+      ]"
+    >
+      {{ title }}
+    </text>
+    <text v-if="desc" class="color-second text-lines-2 mt-2">{{ desc }}</text>
     <view v-if="likes !== undefined && comment !== undefined" class="d-flex flex-row mt-2">
       <image class="width-40 mr-2" :src="IconHeart" mode="widthFix" />
       <text class="size-s mr-3">{{ likes }}</text>
@@ -57,6 +70,10 @@ defineProps({
     type: String,
     default: 'primary',
   },
+  title1: {
+    type: Boolean,
+    default: false,
+  },
   videoMark: {
     type: Boolean,
     default: false,

+ 12 - 2
src/pages/parts/ImageSwiper.vue

@@ -9,7 +9,13 @@
   >
     <swiper-item v-for="(item, key) in images" :key="key">
       <view class="item">
-        <ImageWrapper :src="item" mode="aspectFill" width="750rpx" radius="20rpx" />
+        <ImageWrapper
+          :src="item"
+          mode="aspectFill"
+          width="750rpx"
+          radius="20rpx"
+          @click="onPreviewImage(key)"
+        />
       </view>
     </swiper-item>
   </swiper>
@@ -17,14 +23,18 @@
 
 <script setup lang="ts">
 import ImageWrapper from '@/common/components/ImageWrapper.vue';
+import { useSwiperImagePreview } from '@/common/composeabe/SwiperImagePreview';
 import type { PropType } from 'vue';
 
-defineProps({
+const props = defineProps({
   images: {
     type: Array as PropType<string[]>,
     default: () => [],
   },
 })
+
+const { onPreviewImage } = useSwiperImagePreview(() => props.images || [])
+
 </script>
 
 <style lang="scss">

+ 5 - 7
src/pages/travel.vue

@@ -45,7 +45,6 @@
               :title="item.title"
               :desc="item.desc"
               :image="item.image"
-              :bottomTime="'item.bottomTime'"
               @click="goRouteDetail(item.id)"
             />
           </view>
@@ -63,7 +62,7 @@
               titleColor="title-text"
               :key="i"
               :title="item.title"
-              :desc="item.desc || item.title"
+              title1
               :image="item.image"
               :bottomLocate="item.district"
               :bottomScore="'5.0'"
@@ -127,7 +126,6 @@ import CategoryIcon4 from '@/static/images/travel/CategoryIcon4.png';
 import CategoryIcon5 from '@/static/images/travel/CategoryIcon5.png';
 import CategoryIcon6 from '@/static/images/travel/CategoryIcon6.png';
 import Box2LineLargeImageUserShadow from './parts/Box2LineLargeImageUserShadow.vue';
-import Box2LineRightShadow from './parts/Box2LineRightShadow.vue';
 import HomeTitle from './parts/HomeTitle.vue';
 import { useHomePageMiniCommonListGoMoreAndGoDetail } from './article/common/CommonContent';
 import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
@@ -156,7 +154,7 @@ const subTabs = [
     icon: CategoryIcon3 , 
     onClick: () => navTo('/pages/article/common/list', {
       title: '旅游路线',
-      mainBodyColumnId: 274,
+      mainBodyColumnId: '274,275,276,277',
       modelId: 17,
       itemType: 'article-common',
       detailsPage: '/pages/article/details',
@@ -189,8 +187,8 @@ const subTabs = [
     icon: CategoryIcon6 , 
     onClick: () => navTo('/pages/article/common/list', {
       title: '闽南歌曲',
-      mainBodyColumnId: 257,
-      modelId: 5,
+      mainBodyColumnId: '189,190,191',
+      modelId: 16,
       itemType: 'article-common',
       detailsPage: '/pages/video/details',
     }) 
@@ -203,7 +201,7 @@ const {
   goDetail: goRouteDetail,
 } = useHomePageMiniCommonListGoMoreAndGoDetail({
   title: '旅游路线',
-  mainBodyColumnId: 274,
+  mainBodyColumnId: [274,275,276,277],
   modelId: 17,
   itemType: 'article-common',
   detailsPage: '/pages/article/details',

BIN=BIN
src/static/images/tabs/icon_shop_on.png