details.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <template>
  2. <view class="d-flex flex-column bg-base pb-45">
  3. <SimplePageContentLoader :loader="loader">
  4. <template v-if="loader.content.value">
  5. <view class="d-flex flex-col">
  6. <swiper
  7. v-if="loader.content.value.images.length > 0"
  8. circular
  9. :indicator-dots="true"
  10. :autoplay="true"
  11. :interval="3000"
  12. :duration="1000"
  13. class="height-500"
  14. >
  15. <swiper-item v-for="(item, key) in loader.content.value.images" :key="key">
  16. <view class="item">
  17. <image
  18. :src="item"
  19. class="w-100 height-500 radius-base"
  20. mode="aspectFill"
  21. @click="onPreviewImage(key)"
  22. />
  23. </view>
  24. </swiper-item>
  25. </swiper>
  26. <image
  27. v-else-if="loader.content.value.image"
  28. class="w-100 radius-base"
  29. :src="loader.content.value.image"
  30. mode="widthFix"
  31. />
  32. <view class="d-flex flex-col p-3">
  33. <view class="size-ll color-title-text">{{ loader.content.value.title }}</view>
  34. <view class="d-flex flex-row mt-2">
  35. <text v-if="loader.content.value.from" class="size-s color-text-content-second mr-2 ">来源:{{ loader.content.value.from }}</text>
  36. <text class="size-s color-text-content-second">{{ DataDateUtils.formatDate(loader.content.value.publishAt, 'YYYY-MM-dd') }}</text>
  37. </view>
  38. </view>
  39. <view class="p-3 radius-ll bg-light mt-3">
  40. <Parse
  41. v-if="loader.content.value.content"
  42. :content="loader.content.value.content"
  43. :tagStyle="commonParserStyle"
  44. />
  45. <text v-if="emptyContent">暂无简介</text>
  46. </view>
  47. <!-- 推荐 -->
  48. <view v-if="recommendListLoader.content.value?.length" class="d-flex flex-col p-3">
  49. <text class="size-base text-bold mb-3">相关推荐</text>
  50. <Box2LineImageRightShadow
  51. class="w-100"
  52. titleColor="title-text"
  53. v-for="item in recommendListLoader.content.value"
  54. :key="item.id"
  55. :image="item.image || AppCofig.defaultImage"
  56. :title="item.title"
  57. :desc="item.desc"
  58. :badge="item.badge"
  59. :wideImage="true"
  60. @click="goDetails(item.id)"
  61. />
  62. </view>
  63. </view>
  64. </template>
  65. </SimplePageContentLoader>
  66. </view>
  67. </template>
  68. <script setup lang="ts">
  69. import { computed } from "vue";
  70. import { useSimpleDataLoader } from "@/common/composeabe/SimpleDataLoader";
  71. import { useSimplePageContentLoader } from "@/common/composeabe/SimplePageContentLoader";
  72. import { useSwiperImagePreview } from "@/common/composeabe/SwiperImagePreview";
  73. import { useLoadQuerys } from "@/common/composeabe/LoadQuerys";
  74. import { navTo } from "@/components/utils/PageAction";
  75. import { onShareTimeline, onShareAppMessage } from "@dcloudio/uni-app";
  76. import { DataDateUtils } from "@imengyu/js-request-transform";
  77. import commonParserStyle from "@/common/style/commonParserStyle";
  78. import SimplePageContentLoader from "@/common/components/SimplePageContentLoader.vue";
  79. import Parse from "@/components/display/parse/Parse.vue";
  80. import Box2LineImageRightShadow from "@/common/components/parts/Box2LineImageRightShadow.vue";
  81. import AppCofig from "@/common/config/AppCofig";
  82. import VillageInfoApi from "@/api/inhert/VillageInfoApi";
  83. const { onPreviewImage } = useSwiperImagePreview(() => loader.content.value?.images || []);
  84. const emptyContent = computed(() => (loader.content.value?.content || '').trim() === '');
  85. const loader = useSimplePageContentLoader(async () => {
  86. const res = await VillageInfoApi.getInfoForDiscover(
  87. querys.value.collectModelId,
  88. querys.value.id,
  89. );
  90. uni.setNavigationBarTitle({ title: res.title });
  91. return res;
  92. });
  93. const recommendListLoader = useSimpleDataLoader(async () => {
  94. if (!querys.value.collectModelId)
  95. return []
  96. return (await VillageInfoApi.getListForDiscover(querys.value.collectModelId, 1, 5))
  97. .list
  98. .filter((p) => p.id !== querys.value.id);
  99. });
  100. const { querys } = useLoadQuerys({
  101. id: 0,
  102. collectModelId: 0,
  103. collectModelInternalName: '',
  104. }, (t) => loader.loadData(t));
  105. function goDetails(id: number) {
  106. navTo('details', {
  107. id,
  108. collectModelId: querys.value.collectModelId,
  109. collectModelInternalName: querys.value.collectModelInternalName
  110. });
  111. }
  112. function getPageShareData() {
  113. if (!loader.content.value)
  114. return { title: '文章详情', imageUrl: '' }
  115. return {
  116. title: loader.content.value.title,
  117. imageUrl: loader.content.value.images[0],
  118. }
  119. }
  120. onShareTimeline(() => {
  121. return getPageShareData();
  122. })
  123. onShareAppMessage(() => {
  124. return getPageShareData();
  125. })
  126. </script>