Bläddra i källkod

📦 概况页和文物页修改

imengyu 2 dagar sedan
förälder
incheckning
a825c4fd34

+ 57 - 0
src/api/CommonContent.ts

@@ -2,6 +2,7 @@ import { DataModel, transformArrayDataModel, type NewDataModel } from '@imengyu/
 import { AppServerRequestModule } from './RequestModules';
 import type { QueryParams } from '../common/request/utils/AllType';
 import ApiCofig from '@/common/config/ApiCofig';
+import { transformSomeToArray } from '@/common/request/utils/Utils';
 
 export class GetColumListParams extends DataModel<GetColumListParams> {
   
@@ -207,6 +208,27 @@ export class GetContentDetailItem extends DataModel<GetContentDetailItem> {
   }[];
 }
 
+export class CategoryListItem extends DataModel<CategoryListItem> {
+  constructor() {
+    super(CategoryListItem, "分类列表");
+    this.setNameMapperCase('Camel', 'Snake');
+    this._convertTable = {
+      id: { clientSide: 'number', serverSide: 'number', clientSideRequired: true },
+      pid: { clientSide: 'number', serverSide: 'number' },
+      haschild: { clientSide: 'boolean', serverSide: 'number' },
+    }
+  }
+
+  id !: number;
+  pid !: number;
+  title = '';
+  status = 'normal';
+  weight = 0;
+  spacer = '';
+  haschild = false;
+  children?: CategoryListItem[];
+}
+
 export class CommonContentApi extends AppServerRequestModule<DataModel> {
 
   constructor(mainBodyId = ApiCofig.mainBodyId, modelId = 0, debugName = 'CommonContent', mainBodyColumnId?: number) {
@@ -223,6 +245,41 @@ export class CommonContentApi extends AppServerRequestModule<DataModel> {
   protected debugName: string;
 
   /**
+   * 获取分类列表
+   * @param type 根级类型:1=区域、2=级别、3=文物类型、4=非遗类型、42=事件类型
+   * @param withself 是否返回包含自己:true=是,false=否 ,默认false
+   * @returns 
+   */
+  async getCategoryList(
+    type?: number,
+    withself?: boolean,
+  ) {
+    return (this.get('/content/category/getCategoryList', '获取分类列表', {
+      type,
+      is_tree: false,
+      withself,
+    }))
+      .then(res => transformArrayDataModel<CategoryListItem>(CategoryListItem, res.data2, `获取分类列表`, true))
+      .catch(e => { throw e });
+  }
+  /**
+   * 用于获取某一个分类需要用的子级
+   * @param pid 父级
+   * @returns 
+   */
+  async getCategoryChildList(pid?: number) {
+    return (this.get('/content/category/getCategoryOnlyChildList', '获取分类子级列表', {
+      pid,
+    }))
+      .then(res => transformArrayDataModel<CategoryListItem>(
+        CategoryListItem, 
+        transformSomeToArray(res.data2), 
+        `获取分类列表`, 
+        true
+      ))
+      .catch(e => { throw e });
+  }
+  /**
    * 主体栏目列表
    * @param params 参数 
    * @param querys 额外参数

+ 3 - 3
src/common/components/SimpleDropDownPicker.vue

@@ -24,7 +24,7 @@ export interface SimpleDropDownPickerItem {
 
 const props = defineProps({	
   columns: {
-    type: Object as PropType<SimpleDropDownPickerItem[]>,
+    type: Object as PropType<SimpleDropDownPickerItem[]|null>,
     default: null,
   },
   modelValue: {
@@ -43,8 +43,8 @@ const emit = defineEmits([
 
 const show = ref(false);
 const dispayText = computed(() => {
-  if (props.modelValue) 
-    return props.columns.find(item => item.id == props.modelValue)?.name;
+  if (props.columns) 
+    return props.columns.find(item => item.id == props.modelValue)?.name || props.defaultText;
   return props.defaultText;
 });
 

+ 4 - 0
src/common/scss/common.scss

@@ -32,4 +32,8 @@
     margin-top: 30vh;
     z-index: 1;
   }
+}
+
+.font-songti {
+  font-family: "SongtiSCBlack";
 }

+ 7 - 0
src/pages.json

@@ -12,6 +12,13 @@
       }
     },
     {
+      "path": "pages/home/introduction",
+      "style": {
+        "navigationBarTitleText": "闽南文化生态保护-介绍",
+        "navigationStyle": "custom"
+      }
+    },
+    {
       "path": "pages/travel",
       "style": {
         "navigationBarTitleText": "闽南文化生态保护-文旅",

+ 0 - 106
src/pages/article/food/index.vue

@@ -1,106 +0,0 @@
-<template>
-  <view class="main">
-    <view class="search">
-      <uni-search-bar 
-        v-model="searchValue"
-        radius="100" 
-        bgColor="#fff" 
-        placeholder="搜一搜" 
-        clearButton="auto" 
-        cancelButton="none"
-        @confirm="search"
-      />
-    </view>
-    <u-tabs 
-      :current="currentCategoryId"
-      :list="categoryList" 
-      lineWidth="30"
-      lineColor="rgb(255, 135, 25)"
-      :activeStyle="{
-        color: '#000',
-        fontWeight: 'bold',
-        transform: 'scale(1.05)'
-      }"
-      :inactiveStyle="{
-        color: '#606266',
-        transform: 'scale(1)'
-      }"
-      :scrollable="false"
-      class="top-tab"
-      @click="tabClick"
-    />
-    <view class="post-list">
-      <view
-        v-for="item in listLoader.list.value" 
-        :key="item.id"
-        class="item" 
-        @click="goDetails(item.id)"
-      >
-        <view class="image-wrap" :style="{backgroundImage:'url('+item.image+')'}">
-          <view class="like" :class="{liked: item.isLike}">
-            <text class="iconfont icon-liked" v-if="item.isLike"></text>
-            <text class="iconfont icon-like" v-else></text>
-            <text>{{ item.likes }}</text>
-          </view>
-        </view>
-        <view class="desc ellipsis-2">{{ item.title }}</view>
-      </view>
-    </view>
-    <SimplePageListLoader :loader="listLoader" />
-  </view>
-</template>
-
-<script setup lang="ts">
-import { ref, watch } from 'vue'
-import { useSimplePageListLoader } from '@/common/composeabe/SimplePageListLoader';
-import { navTo } from '@/common/utils/PageAction';
-import SimplePageListLoader from '@/common/components/SimplePageListLoader.vue';
-import { GetContentListItem, GetContentListParams } from '@/api/CommonContent';
-import NewsIndexContent from '@/api/news/NewsIndexContent';
-
-const searchValue = ref('');
-const currentCategoryId = ref(3);
-const categoryList = [
-  {
-    id: 1,
-    name: '美好时光'
-  },
-  {
-    id: 2,
-    name: '伴手好礼'
-  }, {
-    id: 3,
-    name: '特色佳肴'
-  }, {
-    id: 4,
-    name: '海鲜盛宴'
-  }
-];
-
-const listLoader = useSimplePageListLoader<GetContentListItem>(8, async (page, pageSize) => {
-  const res = await NewsIndexContent.getContentList(new GetContentListParams().setSelfValues({
-    keywords: searchValue.value,
-    mainBodyColumnId: 303
-  }), page, pageSize);
-  return res.list;
-});
-
-watch(currentCategoryId, () => {
-  listLoader.loadData(undefined, true);
-}, { immediate: true });
-
-function goDetails(id: number) {
-  navTo('../details', { id })
-}
-function search() {
-  listLoader.loadData(undefined, true);
-}
-function tabClick(e: { index: number }) {
-  currentCategoryId.value = e.index;
-}
-
-</script>
-
-<style lang="scss" scoped>
-
-</style>

+ 4 - 2
src/pages/home.vue

@@ -18,6 +18,7 @@
           class="w-100"
           src="/static/images/home/MainBanner.jpg"
           mode="widthFix"
+          @click="navTo('home/introduction')"
         />
         <view class="position-relative d-flex flex-row flex-wrap justify-between mt-3">
           <view  
@@ -133,9 +134,10 @@ import ImageTest2 from '/static/images/home/ImageTest2.jpg';
 import ImageTest3 from '/static/images/home/ImageTest3.jpg';
 import ImageTest4 from '/static/images/home/ImageTest4.jpg';
 import ImageTest5 from '/static/images/home/ImageTest5.jpg';
-import HomeTitle from './parts/HomeTitle.vue';
+import HomeTitle from '@/pages/parts/HomeTitle.vue'; 
 import IconLocation from '/static/images/inhert/IconLocation.png';
-import Box1AudioPlay from './parts/Box1AudioPlay.vue';
+import Box1AudioPlay from '@/pages/parts/Box1AudioPlay.vue';
+import { navTo } from '@/common/utils/PageAction';
 
 const subTabs1 = [
   { name: '闽南语', icon: MainBoxIcon1 },

+ 55 - 0
src/pages/home/introduction.vue

@@ -0,0 +1,55 @@
+<template>
+  <view class="home-container page-home-introduction d-flex flex-col bg-base">
+    <u-navbar :autoBack="true" bgColor="transparent" />
+    <image 
+      class="w-100 position-absolute"
+      src="/static/images/home/BackgroundBanner2.jpg"
+      mode="widthFix"
+    />
+    <view class="content d-flex flex-col wing-l">
+
+      <!-- 标题 -->
+      <view class="font-songti color-title-text d-flex flex-col align-center justify-center p-3">
+        <text class="size-lll">闽南文化(厦门)生态保护区</text>
+        <text class="size-base mt-2">世界闽南文化交流中心</text>
+      </view>
+
+      <!-- 分栏 -->
+      <view class="shadow-l radius-l bg-base p-3">
+        <SimplePageContentLoader :loader="introdData">
+          <u-parse :content="introdData.content.value?.content" :tag-style="commonParserStyle"></u-parse>
+        </SimplePageContentLoader>
+      </view>
+    </view>
+  </view>
+  <tabbar :current="0"></tabbar>
+</template>
+
+<script setup lang="ts">
+import { GetContentListParams } from '@/api/CommonContent';
+import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
+import NewsIndexContent from '@/api/news/NewsIndexContent';
+import Tabbar from '@/common/components/tabs/tabbar.vue';
+import commonParserStyle from '@/common/style/commonParserStyle';
+import SimplePageContentLoader from '@/common/components/SimplePageContentLoader.vue';
+
+const introdData = useSimpleDataLoader(async () => {
+  const data = (await NewsIndexContent.getColumList(new GetContentListParams().setSelfValues({
+    modelId: 3,
+    mainBodyColumnId: 234,
+  }))).list[0]
+
+  return {
+    content: data.overview, 
+  }
+}, true);
+
+</script>
+
+<style lang="scss">
+.page-home-introduction {
+  .content {
+    margin-top: 15vh;
+  }
+}
+</style>

+ 50 - 13
src/pages/inhert/artifact/list.vue

@@ -20,6 +20,7 @@
 
     <view class="d-flex flex-col p-2">
       <uni-search-bar 
+        v-model="searchValue"
         radius="100" 
         bgColor="#fff" 
         placeholder="搜索文物" 
@@ -29,9 +30,9 @@
       />
     </view>
     <view class="d-flex flex-row justify-around p-2 pt-0">
-      <SimpleDropDownPicker class="width-1-4" :columns="categoryData" />
-      <SimpleDropDownPicker class="width-1-4" :columns="categoryData" />
-      <SimpleDropDownPicker class="width-1-4" :columns="categoryData" />
+      <SimpleDropDownPicker v-model="selectedTag" :columns="categoryData.content.value" />
+      <SimpleDropDownPicker v-model="selectedLevel" :columns="levelData.content.value" />
+      <SimpleDropDownPicker v-model="selectedRegion" :columns="regionData.content.value" />
     </view>
     <view class="d-flex flex-row flex-wrap justify-between p-2">
       <view
@@ -54,7 +55,7 @@
 
 <script setup lang="ts">
 import { ref, watch } from 'vue';
-import { GetContentListParams } from '@/api/CommonContent';
+import CommonContent, { GetContentListParams } from '@/api/CommonContent';
 import { useSimplePageListLoader } from '@/common/composeabe/SimplePageListLoader';
 import { navTo } from '@/common/utils/PageAction';
 import MoveableContent from '@/api/inheritor/MoveableContent';
@@ -62,14 +63,38 @@ import UnmoveableContent from '@/api/inheritor/UnmoveableContent';
 import SimplePageListLoader from '@/common/components/SimplePageListLoader.vue';
 import Box2LineLargeImageUserShadow from '@/pages/parts/Box2LineLargeImageUserShadow.vue';
 import SimpleDropDownPicker from '@/common/components/SimpleDropDownPicker.vue';
+import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
 
-const categoryData =  [
-    { id: 290, name: '全部' },
-    { id: 291, name: '闽南音乐' },
-    { id: 187, name: '讲古' },
-    { id: 292, name: '方言' },
-    { id: 293, name: '民俗习俗' },
-  ]
+const categoryData = useSimpleDataLoader(async () => 
+  [{
+    id: 0, 
+    name: '全部分类'
+  }].concat((await CommonContent.getCategoryList(3)).map((item) => ({
+    id: item.id,
+    name: item.title,
+  })))
+, true);
+const levelData = useSimpleDataLoader(async () => 
+  [{
+    id: 0, 
+    name: '全部级别'
+  }].concat((await CommonContent.getCategoryList(2)).map((item) => ({
+    id: item.id,
+    name: item.title,
+  })))
+, true);
+const regionData = useSimpleDataLoader(async () => 
+  [{
+    id: 0, 
+    name: '全部区域'
+  }].concat((await CommonContent.getCategoryList(1)).map((item) => ({
+    id: item.id,
+    name: item.title,
+  })))
+, true);
+const selectedTag = ref(0);
+const selectedLevel = ref(0);
+const selectedRegion = ref(0);
 const searchValue = ref('');
 const tab = ref(0)
 const tabs = [
@@ -92,7 +117,10 @@ const listLoader = useSimplePageListLoader<{
     case 1: api = MoveableContent; break; 
   }
   const res = await api.getContentList(new GetContentListParams().setSelfValues({
-    //keywords: searchValue.value,
+    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);
   return res.list.map((item) => {
     return {
@@ -103,12 +131,21 @@ const listLoader = useSimplePageListLoader<{
   })
 });
 
+watch(selectedLevel, () => {
+  listLoader.loadData(undefined, true);
+});
+watch(selectedRegion, () => {
+  listLoader.loadData(undefined, true);
+});
+watch(selectedTag, () => {
+  listLoader.loadData(undefined, true);
+});
 watch(tab, () => {
   listLoader.loadData(undefined, true);
 }, { immediate: true });
 
 function doSearch() {
-  
+  listLoader.loadData(undefined, true);
 }
 function goDetails(id: number) {
   navTo('details', { id })

+ 33 - 10
src/pages/user/index.vue

@@ -29,32 +29,55 @@
       </view>
       <view class="d-flex bg-base flex-col shadow-l radius-l">
         <view class="list">
-          <view class="entry">
-            <image src="https://mn.wenlvti.net/uploads/20250313/042236758da5aaed21c1010e5b9440ce.png" mode="aspectFill"></image><text class="label">我的好友</text><text class="iconfont icon-arrow-right"></text>
+          <!-- <view class="entry">
+            <image src="https://mn.wenlvti.net/uploads/20250313/042236758da5aaed21c1010e5b9440ce.png" mode="aspectFill"></image>
+            <text class="label">我的好友</text>
+            <text class="iconfont icon-arrow-right"></text>
           </view>
           <view class="entry">
-            <image src="https://mn.wenlvti.net/uploads/20250313/9fb29e8bdb66490034145c90f892773a.png" mode="aspectFill"></image><text class="label">邀请好友</text><text class="iconfont icon-arrow-right"></text>
+            <image src="https://mn.wenlvti.net/uploads/20250313/9fb29e8bdb66490034145c90f892773a.png" mode="aspectFill"></image>
+            <text class="label">邀请好友</text>
+            <text class="iconfont icon-arrow-right"></text>
           </view>
           <view class="entry">
-            <image src="https://mn.wenlvti.net/uploads/20250313/1366973c061bf98594036e42c0344593.png" mode="aspectFill"></image><text class="label">积分日志</text><text class="iconfont icon-arrow-right"></text>
+            <image src="https://mn.wenlvti.net/uploads/20250313/1366973c061bf98594036e42c0344593.png" mode="aspectFill"></image>
+            <text class="label">积分日志</text>
+            <text class="iconfont icon-arrow-right"></text>
           </view>
           <view class="entry">
-            <image src="https://mn.wenlvti.net/uploads/20250313/042236758da5aaed21c1010e5b9440ce.png" mode="aspectFill"></image><text class="label">我的收藏</text><text class="iconfont icon-arrow-right"></text>
+            <image src="https://mn.wenlvti.net/uploads/20250313/042236758da5aaed21c1010e5b9440ce.png" mode="aspectFill"></image>
+            <text class="label">我的收藏</text>
+            <text class="iconfont icon-arrow-right"></text>
           </view>
           <view class="entry">
-            <image src="https://mn.wenlvti.net/uploads/20250313/07f750b4cf4959654c40171fdae91c3a.png" mode="aspectFill"></image><text class="label">投稿</text><view class="btn">去投稿</view><text class="iconfont icon-arrow-right"></text>
+            <image src="https://mn.wenlvti.net/uploads/20250313/07f750b4cf4959654c40171fdae91c3a.png" mode="aspectFill"></image>
+            <text class="label">投稿</text>
+            <view class="btn">去投稿</view><text class="iconfont icon-arrow-right"></text>
           </view>
           <view class="entry">
-            <image src="https://mn.wenlvti.net/uploads/20250313/66d4665b1da5075e60148312469b2630.png" mode="aspectFill"></image><text class="label">我的投稿</text><text class="iconfont icon-arrow-right"></text>
+            <image src="https://mn.wenlvti.net/uploads/20250313/66d4665b1da5075e60148312469b2630.png" mode="aspectFill"></image>
+            <text class="label">我的投稿</text>
+            <text class="iconfont icon-arrow-right"></text>
           </view>
           <view class="entry">
-            <image src="https://mn.wenlvti.net/uploads/20250313/acd97ca7b3f7736942495c7aec1dd65b.png" mode="aspectFill"></image><text class="label">加入我们</text><text class="iconfont icon-arrow-right"></text>
+            <image src="https://mn.wenlvti.net/uploads/20250313/acd97ca7b3f7736942495c7aec1dd65b.png" mode="aspectFill"></image>
+            <text class="label">加入我们</text>
+            <text class="iconfont icon-arrow-right"></text>
           </view>
           <view class="entry">
-            <image src="https://mn.wenlvti.net/uploads/20250313/d2e9010323d098aa51e268fc32f14d3d.png" mode="aspectFill"></image><text class="label">我的预约</text><text class="iconfont icon-arrow-right"></text>
+            <image src="https://mn.wenlvti.net/uploads/20250313/d2e9010323d098aa51e268fc32f14d3d.png" mode="aspectFill"></image>
+            <text class="label">我的预约</text>
+            <text class="iconfont icon-arrow-right"></text>
+          </view> -->
+          <view class="entry">
+            <image src="https://mn.wenlvti.net/uploads/20250313/d2e9010323d098aa51e268fc32f14d3d.png" mode="aspectFill"></image>
+            <text class="label">在线客服</text>
+            <text class="iconfont icon-arrow-right"></text>
           </view>
           <view v-if="userInfo" class="entry" @click="doLogout">
-            <image src="https://mn.wenlvti.net/uploads/20250313/cbc47d0b9cad7891e6154359952858c6.png" mode="aspectFill"></image><text class="label">退出登录</text><text class="iconfont icon-arrow-right"></text>
+            <image src="https://mn.wenlvti.net/uploads/20250313/cbc47d0b9cad7891e6154359952858c6.png" mode="aspectFill"></image>
+            <text class="label">退出登录</text>
+            <text class="iconfont icon-arrow-right"></text>
           </view>
         </view>
       </view>

BIN
src/static/images/home/BackgroundBanner2.jpg