ソースを参照

📦 SSR修改测试完成

imengyu 1 ヶ月 前
コミット
43fb285414
共有57 個のファイルを変更した115 個の追加193 個の削除を含む
  1. 1 0
      .gitignore
  2. 27 8
      nuxt.config.ts
  3. 1 0
      src/App.vue
  4. 6 0
      src/assets/scss/components.scss
  5. 0 57
      src/components/container/SimpleScrollView.vue
  6. 18 14
      src/components/content/CommonListBlock.vue
  7. 1 1
      src/components/controls/Dropdown.vue
  8. 11 24
      src/components/display/SimpleRemoveRichHtml.vue
  9. 0 0
      src/pages/about/company.vue
  10. 0 0
      src/pages/about/index.vue
  11. 0 1
      src/pages/communicate/activity.vue
  12. 0 1
      src/pages/communicate/fujian-and-taiwan.vue
  13. 0 1
      src/pages/communicate/hk-macao-and-taiwan.vue
  14. 0 0
      src/pages/communicate/index.vue
  15. 0 1
      src/pages/communicate/outside.vue
  16. 13 19
      src/pages/details/TabDetailView.vue
  17. 4 4
      src/pages/details/intangible.vue
  18. 0 1
      src/pages/fusion/demo-site.vue
  19. 0 1
      src/pages/fusion/fashion.vue
  20. 3 1
      src/pages/fusion.vue
  21. 0 1
      src/pages/fusion/point.vue
  22. 0 1
      src/pages/fusion/products.vue
  23. 0 1
      src/pages/fusion/route.vue
  24. 0 1
      src/pages/fusion/scenic-spot.vue
  25. 13 3
      src/pages/index.vue
  26. 0 1
      src/pages/inheritor/activity.vue
  27. 0 1
      src/pages/inheritor/area.vue
  28. 0 1
      src/pages/inheritor/block.vue
  29. 0 1
      src/pages/inheritor/heritage.vue
  30. 1 1
      src/pages/inheritor.vue
  31. 1 2
      src/pages/inheritor/inheritor.vue
  32. 0 1
      src/pages/inheritor/language.vue
  33. 0 1
      src/pages/inheritor/moveable.vue
  34. 1 2
      src/pages/inheritor/products.vue
  35. 1 2
      src/pages/inheritor/projects.vue
  36. 0 1
      src/pages/inheritor/seminar.vue
  37. 0 1
      src/pages/inheritor/unmoveable.vue
  38. 0 1
      src/pages/introduction/about.vue
  39. 0 1
      src/pages/introduction/book.vue
  40. 0 1
      src/pages/introduction/building.vue
  41. 0 1
      src/pages/introduction/character.vue
  42. 0 1
      src/pages/introduction/custom.vue
  43. 0 1
      src/pages/introduction/feature.vue
  44. 0 1
      src/pages/introduction/history.vue
  45. 0 0
      src/pages/introduction/index.vue
  46. 0 1
      src/pages/introduction/language.vue
  47. 0 1
      src/pages/introduction/policy.vue
  48. 0 1
      src/pages/introduction/sea.vue
  49. 0 1
      src/pages/introduction/victuals.vue
  50. 13 21
      src/pages/news/detail.vue
  51. 0 0
      src/pages/news/index.vue
  52. 0 1
      src/pages/research/discuss.vue
  53. 0 1
      src/pages/research/expert.vue
  54. 0 0
      src/pages/research/index.vue
  55. 0 1
      src/pages/research/projects.vue
  56. 0 1
      src/pages/research/result.vue
  57. 0 1
      src/pages/research/teams.vue

+ 1 - 0
.gitignore

@@ -14,6 +14,7 @@ dist-ssr
 coverage
 *.local
 
+.output
 .nuxt
 
 /cypress/videos/

+ 27 - 8
nuxt.config.ts

@@ -1,18 +1,37 @@
 // https://nuxt.com/docs/api/configuration/nuxt-config
 export default defineNuxtConfig({
   compatibilityDate: '2025-05-15',
+  app: {
+    head: {
+      title: '闽南文化生态保护区(厦门市)',
+      viewport: 'width=device-width, initial-scale=1, maximum-scale=1',
+      htmlAttrs: {
+        lang: 'zh',
+      },
+      link: [
+        { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' },
+      ]
+    }
+  },
   devtools: { enabled: true },
   srcDir: 'src/',
   modules: ['@pinia/nuxt', '@ant-design-vue/nuxt'],
+  components: [
+    {
+      path: '~/components',
+      pathPrefix: false,
+      extensions: ['.vue'],
+    }
+  ],
   routeRules: {
-    '/': { swr: 1800 },
-    '/about': { swr: 86400 },
-    '/communicate': { swr: 86400 },
-    '/fusion': { swr: 86400 },
-    '/inheritor': { swr: 3600 },
-    '/introduction': { swr: 3600 },
-    '/news': { swr: 3600 },
-    '/research': { swr: 86400 },
+    '/': { swr: 1/* 1800 */ },
+    '/about/': { swr: 86400 },
+    '/communicate/': { swr: 86400 },
+    '/fusion/': { swr: 86400 },
+    '/inheritor/': { swr: 3600 },
+    '/introduction/': { swr: 3600 },
+    '/news/': { swr: 3600 },
+    '/research/': { swr: 86400 },
 
     '/introduction/**': { swr: true },
     '/communicate/**': { swr: true },

+ 1 - 0
src/App.vue

@@ -7,6 +7,7 @@
       },
     }"
   >
+    <NuxtLoadingIndicator />
     <NavBar />
     <main>
       <NuxtPage />

+ 6 - 0
src/assets/scss/components.scss

@@ -1,5 +1,11 @@
 @use "./colors.scss" as *;
 
+.simple-link {
+  font-size: 20px;
+  line-height: 30px;
+  color: $primary-color;
+  text-decoration: none;
+}
 .simple-carousel2-left-right {
   display: flex;
   flex-direction: row;

+ 0 - 57
src/components/container/SimpleScrollView.vue

@@ -1,57 +0,0 @@
-<template>
-  <div 
-    :class="[
-      'nana-scroll-view',
-      scrollX ? 'x' : '',
-      scrollY ? 'y' : ''
-    ]"
-  >
-    <slot />
-  </div>
-</template>
-
-<script lang="ts" setup>
-/**
- * 组件说明:可滚动的容器。
- */
-const props = defineProps({	
-  scrollX: {
-    type: Boolean,
-    default: false
-  },
-  scrollY: {
-    type: Boolean,
-    default: false 
-  }
-})
-</script>
-
-<style lang="scss" scoped>
-.nana-scroll-view {
-  overflow: hidden;
-  
-  &::-webkit-scrollbar {
-    width: 5px;
-    height: 5px;
-  }
-  &::-webkit-scrollbar-thumb {
-    background: #d6d6d6;
-    opacity: .7;
-    border-radius: 3px;
-
-    &:hover {
-      background: #707070;
-    }
-  }
-  &::-webkit-scrollbar-track {
-    background: transparent;
-  }
-
-  &.x {
-    overflow-x: scroll; 
-  }
-  &.y {
-    overflow-y: scroll; 
-  }
-}
-</style>

+ 18 - 14
src/components/content/CommonListBlock.vue

@@ -13,7 +13,7 @@
         />
         <!-- 标题 -->
         <div v-if="showNav" class="nav-back-title">
-          <img src="@/assets/images/BackArrow.png" alt="返回" @click="back" />
+          <img src="@/assets/images/BackArrow.png" alt="返回" @click="router.back()" />
           <h2>{{ title }}</h2>
         </div>
         <!-- 标题 -->
@@ -83,6 +83,7 @@
           :style="{ width: rowWidth }"
           @click="handleShowDetail(item)"
         >
+          <a class="d-none" :href="router.resolve({ path: props.detailsPage, query: { id: item.id }}).href" />
           <img
             :src="item.image || defaultImage" alt="新闻图片" 
           />
@@ -132,8 +133,7 @@
 
 <script setup lang="ts">
 import { computed, onMounted, ref, watch, type PropType } from 'vue';
-import { useSimplePagerDataLoader } from '@/composeable/SimplePagerDataLoader';
-import { usePageAction } from '@/composeable/PageAction';
+import { useSSrSimplePagerDataLoader } from '@/composeable/SimplePagerDataLoader';
 import DateUtils from '@/common/utils/DateUtils';
 import TagBar from '../content/TagBar.vue';
 import Dropdown from '../controls/Dropdown.vue';
@@ -143,8 +143,6 @@ import Pagination from '../controls/Pagination.vue';
 import TitleDescBlock from '../parts/TitleDescBlock.vue';
 import IconSearch from '../icons/IconSearch.vue';
 
-const { navTo, back } = usePageAction();
-
 export interface DropdownCommonItem {
   id: number; 
   name: string;
@@ -254,9 +252,12 @@ const props = defineProps({
   },
 })
 
+const router = useRouter();
+
 const realRowCount = computed(() => {
-  if (window.innerWidth < 768) 
-    return 1;
+  if (import.meta.client)
+    if (window.innerWidth < 768) 
+      return 1;
   return props.rowCount;
 });
 const rowWidth = computed(() => {
@@ -291,24 +292,27 @@ function handleChangeDropDownValue(index: number, value: number) {
 function handleShowDetail(item: any) {
   if (props.showDetail)
     return props.showDetail(item);
-  navTo(props.detailsPage, { 
-    id: item.id,
-    ...props.detailsParams,
+  router.push({ 
+    path: props.detailsPage,
+    query: {
+      id: item.id,
+    }
   });
 }
 
+
+//子分类
+const selectedTag = ref(props.defaultSelectTag);
 const pageSize = ref(props.pageSize);
+const route = useRoute();
 
-const newsLoader = useSimplePagerDataLoader(pageSize, (page, size) => props.load(
+const newsLoader = await useSSrSimplePagerDataLoader(route.fullPath + '/list', Number(route.query.page || 1), pageSize, (page, size) => props.load(
   page, size, 
   selectedTag.value, 
   searchText.value,
   dropDownValues.value,
 ));
 
-//子分类
-const selectedTag = ref(props.defaultSelectTag);
-
 watch(() => props.defaultSelectTag, (v) => {
   selectedTag.value = v;
 })

+ 1 - 1
src/components/controls/Dropdown.vue

@@ -27,7 +27,7 @@
 <script setup lang="ts">
 import { computed, ref, type PropType } from 'vue';
 import DropDownIcon from './DropdownIcon.vue';
-import SimpleScrollView from '../container/SimpleScrollView.vue';
+import SimpleScrollView from '../display/SimpleScrollView.vue';
 
 const props = defineProps({
   options: {

+ 11 - 24
src/components/display/SimpleRemoveRichHtml.vue

@@ -1,11 +1,8 @@
 <template>
-  <div ref="solveHtmlDiv" class="nana-no-rich-html" v-html="content" />
-  {{ pureContent }}
+  <span>{{ removeHtmlTags(content) }}</span>
 </template>
 
 <script setup lang="ts">
-import { ref, watch } from 'vue';
-
 const props = defineProps({	
   content: {
     type: String,
@@ -13,25 +10,15 @@ const props = defineProps({
   },
 })
 
-const solveHtmlDiv = ref<HTMLElement|null>(null);
-const pureContent = ref('');
-
-watch(() => props.content, () => {
-  setTimeout(() => {
-    if (solveHtmlDiv.value) {
-      pureContent.value = solveHtmlDiv.value.textContent || '';
-    }
-  }, 200);
-}, { immediate: true })
-
-</script>
-
-<style lang="scss">
-.nana-no-rich-html {
-  position: absolute;
-  opacity: 0;
-  left: -1000px;
-  pointer-events: none;
+function removeHtmlTags(str: string) {
+  str = str.replace(/<[^>]*>/g, '');
+  str = str.replace(/&nbsp;/gi, ' '); // 替换为普通空格
+  str = str.replace(/&amp;/gi, '&');  // 替换为 &
+  str = str.replace(/&lt;/gi, '<');  // 替换为 <
+  str = str.replace(/&gt;/gi, '>');  // 替换为 >
+  str = str.replace(/&quot;/gi, '"'); // 替换为 "
+  str = str.replace(/&#39;/gi, "'");  // 替换为 '
+  return str;
 }
 
-</style>
+</script>

src/pages/about-company.vue → src/pages/about/company.vue


src/pages/about.vue → src/pages/about/index.vue


+ 0 - 1
src/pages/communicate/activity.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 传播交流 - 品牌活动 -->
    <CommonListPage
     :title="'品牌活动'"
     :dropDownNames="[]"

+ 0 - 1
src/pages/communicate/fujian-and-taiwan.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 传播交流 - 闽台文化交流 -->
    <CommonListPage
     :title="'闽台文化交流'"
     :prevPage="{ title: '传播交流' }"

+ 0 - 1
src/pages/communicate/hk-macao-and-taiwan.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 传播交流 - 台港澳地区文化交流 -->
    <CommonListPage
     :title="'台港澳地区文化交流'"
     :prevPage="{ title: '传播交流' }"

src/pages/communicate.vue → src/pages/communicate/index.vue


+ 0 - 1
src/pages/communicate/outside.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 传播交流 - 对外文化交流 -->
    <CommonListPage
     :title="'对外文化交流'"
     :prevPage="{ title: '传播交流' }"

+ 13 - 19
src/pages/details/TabDetailView.vue

@@ -2,6 +2,11 @@
   <!-- 文物详情页 -->
   <div class="main-background">
     <div class="nav-placeholder"></div>
+    <!-- SEO -->
+    <Head>
+      <Title>{{ loader.content.value?.title }}</Title>
+      <Meta name="description" :content="loader.content.value?.desc" />
+    </Head>
     <!-- 新闻 -->
     <section class="main-section main-background main-background-type0 small-h">
       <SimplePageContentLoader :loader="loader">
@@ -134,8 +139,7 @@ import { Carousel, Slide, Pagination, Navigation } from 'vue3-carousel'
 import type { GetContentDetailItem } from '@/api/CommonContent';
 import SimplePageContentLoader from '@/components/content/SimplePageContentLoader.vue';
 import SimpleRichHtml from '@/components/display/SimpleRichHtml.vue';
-import { useLoadQuerys } from '@/composeable/PageQuerys';
-import { useSimpleDataLoader } from '@/composeable/SimpleDataLoader';
+import { useSSrSimpleDataLoader } from '@/composeable/SimpleDataLoader';
 import { useRoute, useRouter } from 'vue-router';
 import ContentNode from '@/components/content/ContentNode.vue';
 import { computed, ref, watch, type PropType } from 'vue';
@@ -149,6 +153,10 @@ const props = defineProps({
   }
 })
 
+
+const route = useRoute();
+const router = useRouter();
+
 const imagePreviewVisible = ref(false);
 const imagePreviewSrc = ref('');
 
@@ -157,17 +165,10 @@ function handleShowImage(url: string) {
   imagePreviewSrc.value = url;
 }
 
-const route = useRoute();
-const router = useRouter();
-const loader = useSimpleDataLoader<
-  GetContentDetailItem, 
-  { id: number }
->(async (params) => {
-  if (!params)
-    throw new Error("!params");
+const loader = await useSSrSimpleDataLoader('details', async () => {
   if (!props.load)
     throw new Error("!props.load");
-  return props.load(params.id);
+  return (await props.load(Number(route.query.id))).toJSON();
 }, false);
 
 
@@ -185,15 +186,8 @@ const contentProps = computed(() => {
   };
 })
 
-useLoadQuerys({
-  id: 0
-}, async ({ id }) => {
-  if (id <= 0) {
-    router.push({ path: '/404' });
-    return;
-  }
+onMounted(() => {
   currentTabIndex.value = 0;
-  loader.loadData({ id });
 })
 
 function back() {

+ 4 - 4
src/pages/details/intangible.vue

@@ -40,7 +40,7 @@
           :showTotal="true"
           :showSearch="false"
           :load="(page: number, pageSize: number) => loadSubList(page, pageSize, content, 'worksMeList')"
-          detailsPage="/inheritor/intangible-detail"
+          detailsPage="/details/intangible"
           :detailsParams="{
             mainBodyColumnId: ProjectsContent.mainBodyColumnId,
             modelId: ProjectsContent.modelId,
@@ -53,7 +53,7 @@
           :showTotal="true"
           :showSearch="false"
           :load="(page: number, pageSize: number) => loadSubList(page, pageSize, content, 'ichSitesList')"
-          detailsPage="/inheritor/intangible-detail"
+          detailsPage="/details/intangible"
           :detailsParams="{
             mainBodyColumnId: ProjectsContent.mainBodyColumnId,
             modelId: ProjectsContent.modelId,
@@ -66,7 +66,7 @@
           :showTotal="true"
           :showSearch="false"
           :load="(page: number, pageSize: number) => loadSubList(page, pageSize, content, 'inheritorsList')"
-          detailsPage="/inheritor/intangible-detail"
+          detailsPage="/details/intangible"
           :detailsParams="{
             mainBodyColumnId: ProjectsContent.mainBodyColumnId,
             modelId: ProjectsContent.modelId,
@@ -79,7 +79,7 @@
           :showTotal="true"
           :showSearch="false"
           :load="(page: number, pageSize: number) => loadSubList(page, pageSize, content, 'associationMeList')"
-          detailsPage="/inheritor/intangible-detail"
+          detailsPage="/details/intangible"
           :detailsParams="{
             mainBodyColumnId: ProjectsContent.mainBodyColumnId,
             modelId: ProjectsContent.modelId,

+ 0 - 1
src/pages/fusion/demo-site.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文旅融合 - 非遗与旅游融合发展推荐目录 -->
    <CommonListPage
     :title="'非遗与旅游融合发展推荐目录'"
     :prevPage="{ title: '文旅融合' }"

+ 0 - 1
src/pages/fusion/fashion.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 闽南时尚 -->
    <CommonListPage
     :title="'闽南时尚'"
     :dropDownNames="[]"

+ 3 - 1
src/pages/fusion.vue

@@ -84,7 +84,9 @@ import ImageTitleDescBlock from '@/components/parts/ImageTitleDescBlock.vue';
 import ThreeImageList from '@/components/parts/ThreeImageList.vue';
 import CalendarContent from '@/api/fusion/CalendarContent';
 import { GetContentListItem, GetContentListParams } from '@/api/CommonContent';
-import { ScrollRect } from '@imengyu/vue-scroll-rect';
+import VueScrollRect from '@imengyu/vue-scroll-rect';
+
+const { ScrollRect } = VueScrollRect
 
 const router = useRouter();
 const carouselConfig = {

+ 0 - 1
src/pages/fusion/point.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文旅融合 - 非遗研学点 -->
    <CommonListPage
     :title="'非遗研学点'"
     :prevPage="{ title: '文旅融合' }"

+ 0 - 1
src/pages/fusion/products.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文旅融合 - 文创产品 -->
    <CommonListPage
     :title="'文创产品'"
     :prevPage="{ title: '文旅融合' }"

+ 0 - 1
src/pages/fusion/route.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文旅融合 - 文化旅游路线 -->
    <CommonListPage
     :title="'文化旅游路线'"
     :prevPage="{ title: '文旅融合' }"

+ 0 - 1
src/pages/fusion/scenic-spot.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 文化景区 -->
    <CommonListPage
     :title="'文化文化景区'"
     :prevPage="{ title: '文旅融合' }"

+ 13 - 3
src/pages/index.vue

@@ -1,6 +1,12 @@
 <template>
   <!-- 首页 -->
   <div class="main-background">
+    <!-- SEO -->
+    <Head>
+      <Title>闽南文化生态保护区(厦门市)</Title>
+      <Meta name="description" content="闽南文化生态保护区(厦门市)是福建省厦门市的一个生态保护区,保护范围为厦门市内的闽南文化地区,包括福建、台湾、客家语等地区的历史文化遗产。" />
+      <Meta name="keywords" content="厦门市, 闽南文化生态保护区, 福建闽南文化, 闽南文化, 闽南历史文化, 闽南历史文化, 闽南历史文化, 闽南历史文化" />
+    </Head>
     <!-- 轮播 -->
     <Carousel v-bind="carouselConfig" class="main-header-box small carousel-light">
       <Slide 
@@ -215,6 +221,9 @@
           <p class="mt-4">
             <SimpleRemoveRichHtml :content="overviewData.content.value || ''" />
           </p>
+          <div class="d-flex flex-row justify-content-end p-4">
+            <NuxtLink class="simple-link" style="z-index:100" :to="{ path: '/about/' }">详情 →</NuxtLink>
+          </div>
         </div>
       </div>
     </section>
@@ -229,9 +238,8 @@ import { useRouter } from 'vue-router';
 import { useSSrSimpleDataLoader } from '@/composeable/SimpleDataLoader';
 import { NO_CONTENT_STRING } from '@/common/ConstStrings';
 import { DataDateUtils } from '@imengyu/js-request-transform';
-import { ScrollRect } from '@imengyu/vue-scroll-rect';
+import VueScrollRect from '@imengyu/vue-scroll-rect';
 import ImageTitleBlock from '@/components/parts/ImageTitleBlock.vue';
-import SimpleRemoveRichHtml from '@/components/display/SimpleRemoveRichHtml.vue';
 import SimplePageContentLoader from '@/components/content/SimplePageContentLoader.vue';
 import IndexContent from '@/api/introduction/IndexContent';
 import NewsIndexContent from '@/api/news/NewsIndexContent';
@@ -244,6 +252,8 @@ import ProjectsContent from '@/api/inheritor/ProjectsContent';
 import SeminarContent from '@/api/inheritor/SeminarContent';
 import CommonContent, { GetColumListParams, GetContentListParams, type GetContentListItem } from '@/api/CommonContent';
 
+const { ScrollRect } = VueScrollRect
+
 const router = useRouter();
 
 const carouselConfig = {
@@ -324,7 +334,7 @@ const statsData = await useSSrSimpleDataLoader('stats', async () => {
         {
           title: '传统村落',
           value: data.villageData[0]?.total ?? 0,
-          link: router.resolve({ path: '/village/index' }).href,
+          link: router.resolve({ path: '/village/' }).href,
         },
         {
           title: '文物古迹',

+ 0 - 1
src/pages/inheritor/activity.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 非遗活动 -->
    <CommonListPage
     :title="'非遗活动'"
     :dropDownNames="[]"

+ 0 - 1
src/pages/inheritor/area.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 重要相关文物古迹 -->
   <CommonListPage
     :title="'重要相关文物古迹'"
     :prevPage="{ title: '文化传承' }"

+ 0 - 1
src/pages/inheritor/block.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 历史文化街区 -->
   <CommonListPage
     :title="'历史文化街区'"
     :prevPage="{ title: '文化传承' }"

+ 0 - 1
src/pages/inheritor/heritage.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 自然遗产 -->
   <CommonListPage
     :title="'自然遗产'"
     :prevPage="{ title: '文化传承' }"

+ 1 - 1
src/pages/inheritor.vue

@@ -295,7 +295,7 @@ const statsData = await useSSrSimpleDataLoader('stats', async () => {
         {
           title: '传统村落',
           value: data.villageData[0]?.total ?? 0,
-          link: router.resolve({ path: '/village/index' }).href,
+          link: router.resolve({ path: '/village/' }).href,
         },
         {
           title: '文物古迹',

+ 1 - 2
src/pages/inheritor/inheritor.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 -  -->
    <CommonListPage
     :title="'非遗传承人'"
     :prevPage="{ title: '保护传承' }"
@@ -13,7 +12,7 @@
       title: '传承人姓名',
     }"
     :defaultSelectTag="tagsData[0].id"
-    detailsPage="/inheritor/intangible-detail"
+    detailsPage="/details/intangible"
   />
 </template>
 

+ 0 - 1
src/pages/inheritor/language.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 重要闽南记忆遗产 -->
   <CommonListPage
     :title="'重要闽南记忆遗产'"
     :prevPage="{ title: '文化传承' }"

+ 0 - 1
src/pages/inheritor/moveable.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 可移动文物 -->
   <CommonListPage
     :title="'可移动文物'"
     :dropDownNames="dropdownNames"

+ 1 - 2
src/pages/inheritor/products.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 非遗作品 -->
   <CommonListPage
     :title="'非遗作品'"
     :prevPage="{ title: '保护传承' }"
@@ -9,7 +8,7 @@
     :loadDetail="loadDetail"
     :tagsData="tagsData"
     :defaultSelectTag="tagsData[0].id"
-    detailsPage="/inheritor/intangible-detail"
+    detailsPage="/details/intangible"
   />
 </template>
 

+ 1 - 2
src/pages/inheritor/projects.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 非遗项目 -->
   <CommonListPage
     :title="'非遗项目'"
     :prevPage="{ title: '保护传承' }"
@@ -13,7 +12,7 @@
       title: '项目名称',
     }"
     :defaultSelectTag="tagsData[0].id"
-    detailsPage="/inheritor/intangible-detail"
+    detailsPage="/details/intangible"
   />
 </template>
 

+ 0 - 1
src/pages/inheritor/seminar.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 非遗传习所 -->
   <CommonListPage
     :title="'非遗传习所'"
     :prevPage="{ title: '保护传承' }"

+ 0 - 1
src/pages/inheritor/unmoveable.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化传承 - 不可移动文物 -->
   <CommonListPage
     :title="'不可移动文物'"
     :prevPage="{ title: '保护传承' }"

+ 0 - 1
src/pages/introduction/about.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 闽南文化生态保护区(厦门市)基本情况 -->
    <CommonListPage
     :title="'闽南文化生态保护区(厦门市)基本情况'"
     :prevPage="{ title: '保护区概况' }"

+ 0 - 1
src/pages/introduction/book.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化常识 - 闽南文化百科 -->
    <CommonListPage
     :title="'闽南文化百科'"
     :prevPage="{ title: '文化常识' }"

+ 0 - 1
src/pages/introduction/building.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化常识 - 建筑文化 -->
    <CommonListPage
     :title="'建筑文化'"
     :prevPage="{ title: '文化常识' }"

+ 0 - 1
src/pages/introduction/character.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化常识 - 历史人物 -->
    <CommonListPage
     :title="'历史人物'"
     :prevPage="{ title: '文化常识' }"

+ 0 - 1
src/pages/introduction/custom.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化常识 - 民间习俗 -->
    <CommonListPage
     :title="'民间习俗'"
     :prevPage="{ title: '文化常识' }"

+ 0 - 1
src/pages/introduction/feature.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化常识 - 艺术特色 -->
    <CommonListPage
     :title="'艺术特色'"
     :prevPage="{ title: '文化常识' }"

+ 0 - 1
src/pages/introduction/history.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化常识 - 历史和地理背景 -->
    <CommonListPage
     :title="'历史和地理背景'"
     :prevPage="{ title: '文化常识' }"

src/pages/introduction.vue → src/pages/introduction/index.vue


+ 0 - 1
src/pages/introduction/language.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化常识 - 语言文化 -->
   <CommonListPage
     :title="'语言文化'"
     :prevPage="{ title: '文化常识' }"

+ 0 - 1
src/pages/introduction/policy.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化常识 - 相关政策 -->
    <CommonListPage
     :title="'相关政策'"
     :prevPage="{ title: '文化常识' }"

+ 0 - 1
src/pages/introduction/sea.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化常识 - 海洋文化 -->
    <CommonListPage
     :title="'海洋文化'"
     :prevPage="{ title: '文化常识' }"

+ 0 - 1
src/pages/introduction/victuals.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 文化常识 - 饮食文化 -->
    <CommonListPage
     :title="'饮食文化'"
     :prevPage="{ title: '文化常识' }"

+ 13 - 21
src/pages/news/detail.vue

@@ -2,6 +2,11 @@
   <!-- 资讯详情页 -->
   <div class="main-background">
     <div class="nav-placeholder"></div>
+    <!-- SEO -->
+    <Head>
+      <Title>{{ newsLoader.content.value?.title }}</Title>
+      <Meta name="description" :content="newsLoader.content.value?.desc" />
+    </Head>
     <!-- 新闻 -->
     <section class="main-section main-background main-background-type0 small-h">
       <SimplePageContentLoader :loader="newsLoader">
@@ -104,35 +109,22 @@ import NewsIndexContent from '@/api/news/NewsIndexContent';
 import DateUtils from '@/common/utils/DateUtils';
 import SimplePageContentLoader from '@/components/content/SimplePageContentLoader.vue';
 import SimpleRichHtml from '@/components/display/SimpleRichHtml.vue';
-import { useLoadQuerys } from '@/composeable/PageQuerys';
-import { useSimpleDataLoader } from '@/composeable/SimpleDataLoader';
+import { useSSrSimpleDataLoader } from '@/composeable/SimpleDataLoader';
 import { useRouter } from 'vue-router';
 import ContentNode from '@/components/content/ContentNode.vue';
 
+const route = useRoute();
 const router = useRouter();
-const newsLoader = useSimpleDataLoader<GetContentDetailItem, { 
-  id: number,
-  modelId: number,
-}>(async (p) => {
-  if (!p)
+const newsLoader = await useSSrSimpleDataLoader('detail', async () => {
+  const id = Number(route.query.id);
+  const modelId = route.query.modelId ? Number(route.query.modelId) : undefined;
+  if (!id)
     throw new Error('参数错误');
-  const z = (await NewsIndexContent.getContentDetail<GetContentDetailItem>(p.id, p.modelId ? p.modelId : undefined));
-  console.log(z);
+  const z = (await NewsIndexContent.getContentDetail<GetContentDetailItem>(id, modelId)).toJSON();
+  //console.log(z);
   return z;
-  
 }, false)
 
-useLoadQuerys({
-  id: 0,
-  modelId: 0,
-}, async (p) => {
-  if (p.id <= 0) {
-    router.push({ name: 'NotFound' });
-    return;
-  }
-  newsLoader.loadData(p);
-})
-
 function back() {
   router.back();
 }

src/pages/news.vue → src/pages/news/index.vue


+ 0 - 1
src/pages/research/discuss.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 理论研究 - 理论研讨 -->
    <CommonListPage
     :title="'理论研讨'"
     :prevPage="{ title: '理论研究' }"

+ 0 - 1
src/pages/research/expert.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 传播交流 - 专家学者 -->
    <CommonListPage
     :title="'专家学者'"
     :prevPage="{ title: '理论研究' }"

src/pages/research.vue → src/pages/research/index.vue


+ 0 - 1
src/pages/research/projects.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 传播交流 - 研究项目 -->
    <CommonListPage
     :title="'研究项目'"
     :prevPage="{ title: '理论研究' }"

+ 0 - 1
src/pages/research/result.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 传播交流 - 研究成果 -->
    <CommonListPage
     :title="'研究成果'"
     :prevPage="{ title: '理论研究' }"

+ 0 - 1
src/pages/research/teams.vue

@@ -1,5 +1,4 @@
 <template>
-  <!-- 传播交流 - 研究团队 -->
    <CommonListPage
     :title="'研究团队'"
     :prevPage="{ title: '理论研究' }"