ArtifactDetailView.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <template>
  2. <!-- 文物详情页 -->
  3. <div class="main-background">
  4. <div class="nav-placeholder"></div>
  5. <!-- 新闻 -->
  6. <section class="main-section main-background main-background-type0 small-h">
  7. <SimplePageContentLoader :loader="loader">
  8. <div v-if="loader.content.value" class="content news-detail">
  9. <h1>{{ loader.content.value.title }}</h1>
  10. <p class="small-info">
  11. {{ loader.content.value.address }}
  12. </p>
  13. <!-- 轮播 -->
  14. <Carousel
  15. :itemsToShow="1"
  16. wrapAround
  17. :autoPlay="5000"
  18. class="carousel"
  19. >
  20. <Slide v-for="(image, key) in loader.content.value.images" :key="key">
  21. <img :src="image" />
  22. </Slide>
  23. <template #addons>
  24. <Navigation />
  25. <Pagination />
  26. </template>
  27. </Carousel>
  28. <div class="info-list mb-2">
  29. <div class="entry">
  30. <div class="label">开放时间:</div>
  31. <div class="value">{{ loader.content.value.openStatusText }}</div>
  32. </div>
  33. <div class="entry">
  34. <div class="label">年代:</div>
  35. <div class="value">{{ loader.content.value.age }}</div>
  36. </div>
  37. <div class="entry">
  38. <div class="label">文物类型:</div>
  39. <div class="value">{{ loader.content.value.crTypeText }}</div>
  40. </div>
  41. <div class="entry">
  42. <div class="label">所属区域:</div>
  43. <div class="value">{{ loader.content.value.regionText }}</div>
  44. </div>
  45. <div class="entry">
  46. <div class="label">级别:</div>
  47. <div class="value">{{ loader.content.value.levelText }}</div>
  48. </div>
  49. <div class="entry">
  50. <div class="label">保护范围:</div>
  51. <div class="value">
  52. <SimpleRichHtml
  53. :contents="[loader.content.value.protectedArea as string]"
  54. />
  55. </div>
  56. </div>
  57. </div>
  58. <SimpleRichHtml
  59. class="news-content"
  60. :contents="[
  61. loader.content.value.intro,
  62. loader.content.value.value,
  63. loader.content.value.content,
  64. ]"
  65. />
  66. <ContentNode />
  67. <div class="row d-flex justify-content-center">
  68. <div class="back-button" @click="back">
  69. <img src="@/assets/images/news/IconBack.png" />
  70. <span>返回列表</span>
  71. </div>
  72. </div>
  73. </div>
  74. </SimplePageContentLoader>
  75. </section>
  76. </div>
  77. </template>
  78. <script setup lang="ts">
  79. import { Carousel, Slide, Pagination, Navigation } from 'vue3-carousel'
  80. import type { GetContentDetailItem } from '@/api/CommonContent';
  81. import UnmoveableContent from '@/api/inheritor/UnmoveableContent';
  82. import SimplePageContentLoader from '@/components/content/SimplePageContentLoader.vue';
  83. import SimpleRichHtml from '@/components/display/SimpleRichHtml.vue';
  84. import { useLoadQuerys } from '@/composeable/PageQuerys';
  85. import { useSimpleDataLoader } from '@/composeable/SimpleDataLoader';
  86. import { useRouter } from 'vue-router';
  87. import ContentNode from '@/components/content/ContentNode.vue';
  88. const router = useRouter();
  89. const loader = useSimpleDataLoader<
  90. GetContentDetailItem,
  91. { id: number }
  92. >(async (params) => {
  93. if (!params)
  94. throw new Error("!params");
  95. return await UnmoveableContent.getContentDetail(params.id);
  96. });
  97. useLoadQuerys({
  98. id: 0
  99. }, async ({ id }) => {
  100. if (id <= 0) {
  101. router.push({ name: 'NotFound' });
  102. return;
  103. }
  104. loader.loadData({ id });
  105. })
  106. function back() {
  107. router.back();
  108. }
  109. </script>
  110. <style lang="scss">
  111. </style>