details.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <template>
  2. <SimplePageContentLoader :loader="contentLoader">
  3. <FlexCol v-if="contentLoader.loadStatus.value == 'finished'">
  4. <swiper
  5. circular
  6. :indicator-dots="false"
  7. :autoplay="true"
  8. :interval="2000"
  9. :duration="1000"
  10. :style="{
  11. width: '100%',
  12. height: '500rpx',
  13. }"
  14. >
  15. <swiper-item v-for="(item, k) in data.images" :key="k">
  16. <Image
  17. :src="item"
  18. :radius="20"
  19. :height="500"
  20. :width="750"
  21. mode="aspectFill"
  22. touchable
  23. @click="onPreviewImage(k as number)"
  24. />
  25. </swiper-item>
  26. </swiper>
  27. <FlexCol :padding="20" :radius="20" :gap="20">
  28. <Height :height="20" />
  29. <FlexCol>
  30. <SubTitle :title="data.villageName" />
  31. <IntroBlock
  32. small
  33. :descItems="[
  34. {
  35. label: '保护级别',
  36. value: data.historyLevelText ,
  37. },
  38. {
  39. label: '年份时间',
  40. value: data.ageText,
  41. },
  42. {
  43. label: '所属区域',
  44. value: data.regionText ,
  45. },
  46. ]"
  47. />
  48. <FlexCol :margin="[20, 0, 0, 0]">
  49. <Parse :content="data.overview" />
  50. <Text v-if="!data.overview" fontConfig="subText">无内容,请添加内容! </Text>
  51. </FlexCol>
  52. </FlexCol>
  53. <FlexCol :margin="[20, 0, 30, 0]">
  54. <SubTitle title="地理位置" />
  55. <FlexCol :radius="20" backgroundColor="white" :margin="[20, 0, 0, 0]">
  56. <map
  57. id="map"
  58. :latitude="center[1]"
  59. :longitude="center[0]"
  60. :markers="markers"
  61. :scale="15"
  62. :style="{
  63. width: '100%',
  64. height: '350rpx',
  65. }"
  66. />
  67. <Touchable
  68. v-if="data.address"
  69. :title="data.address"
  70. touchable
  71. direction="column"
  72. :padding="20"
  73. @click="goAddress"
  74. >
  75. <IconTextBlock
  76. icon="map-filling"
  77. :iconProps="{ size: 30 }"
  78. :title="data.address"
  79. extra="去这里"
  80. :extraProps="{
  81. color: 'primary',
  82. }"
  83. />
  84. </Touchable>
  85. </FlexCol>
  86. </FlexCol>
  87. </FlexCol>
  88. </FlexCol>
  89. </SimplePageContentLoader>
  90. </template>
  91. <script setup lang="ts">
  92. import { ref, toRefs, type Ref } from 'vue';
  93. import { useLoadQuerys } from '@/common/composeabe/LoadQuerys';
  94. import { useSwiperImagePreview } from '@/common/composeabe/SwiperImagePreview';
  95. import { navTo } from '@/components/utils/PageAction';
  96. import { onShareTimeline, onShareAppMessage } from '@dcloudio/uni-app';
  97. import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
  98. import { useHomePageMiniCommonListGoMoreAndGoDetail, type IHomePageMiniCommonListGoMoreAndGoDetail } from '@/pages/article/common/CommonContent';
  99. import IntroBlock from '@/pages/article/common/IntroBlock.vue';
  100. import Parse from '@/components/display/parse/Parse.vue';
  101. import SimplePageContentLoader from '@/common/components/SimplePageContentLoader.vue';
  102. import Box2LineLargeImageUserShadow from '@/common/components/parts/Box2LineLargeImageUserShadow.vue';
  103. import VillageApi from '@/api/inhert/VillageApi';
  104. import ImagesUrls from '@/common/config/ImagesUrls';
  105. import SubTitle from '@/components/display/title/SubTitle.vue';
  106. import FlexCol from '@/components/layout/FlexCol.vue';
  107. import Image from '@/components/basic/Image.vue';
  108. import Text from '@/components/basic/Text.vue';
  109. import FlexRow from '@/components/layout/FlexRow.vue';
  110. import Touchable from '@/components/feedback/Touchable.vue';
  111. import Height from '@/components/layout/space/Height.vue';
  112. import IconTextBlock from '@/components/display/block/IconTextBlock.vue';
  113. const EmptyImage = 'https://mncdn.wenlvti.net/app_static/minnan/EmptyImage.png';
  114. const center = ref([118.15723, 24.48147]);
  115. const markers = ref<any>([]);
  116. const { querys } = useLoadQuerys({
  117. id: 0,
  118. }, () => contentLoader.loadData());
  119. const data = ref<Record<string, any>>({
  120. images: [],
  121. overview: '',
  122. longitude: 0,
  123. latitude: 0,
  124. region: 0,
  125. address: '',
  126. villageName: '',
  127. })
  128. function goAddress() {
  129. uni.openLocation({
  130. latitude: Number(data.value.latitude),
  131. longitude: Number(data.value.longitude),
  132. })
  133. }
  134. const { onPreviewImage } = useSwiperImagePreview(() => data.value.images || [])
  135. const contentLoader = useSimpleDataLoader(async () => {
  136. data.value = {
  137. ...data.value,
  138. ...JSON.parse(uni.getStorageSync('VillageTemp') || '{}'),
  139. };
  140. console.log(data.value);
  141. if (data.value.longitude && data.value.latitude) {
  142. center.value = [Number(data.value.longitude), Number(data.value.latitude)];
  143. } else {
  144. center.value = [118.11593, 24.467580];
  145. }
  146. markers.value = [
  147. {
  148. id: 1,
  149. latitude: center.value[1],
  150. longitude: center.value[0],
  151. iconPath: ImagesUrls.IconMarker,
  152. width: 40,
  153. height: 40,
  154. }
  155. ];
  156. }, false);
  157. function getPageShareData() {
  158. return {
  159. title: data.value.villageName,
  160. imageUrl: data.value.images[0],
  161. }
  162. }
  163. onShareTimeline(() => {
  164. return getPageShareData();
  165. })
  166. onShareAppMessage(() => {
  167. return getPageShareData();
  168. })
  169. </script>