details.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  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)"
  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. <FlexRow :margin="[40, 0, 40, 0]" :gap="[20, 0]" wrap>
  54. <Touchable
  55. v-for="(tag, key) in tagsData"
  56. :key="key"
  57. width="20%"
  58. align="center"
  59. justify="center"
  60. direction="column"
  61. @click="goList(tag)"
  62. >
  63. <Image :src="tag.image" width="65%" mode="widthFix"></Image>
  64. <Text fontConfig="subText" textAlign="center">{{ tag.title }}</Text>
  65. </Touchable>
  66. </FlexRow>
  67. <FlexCol :margin="[20, 0, 30, 0]">
  68. <SubTitle title="地理位置" />
  69. <FlexCol :radius="20" backgroundColor="white" :margin="[20, 0, 0, 0]">
  70. <map
  71. id="map"
  72. :latitude="center[1]"
  73. :longitude="center[0]"
  74. :markers="markers"
  75. :scale="15"
  76. :style="{
  77. width: '100%',
  78. height: '350rpx',
  79. }"
  80. />
  81. <Touchable
  82. v-if="data.address"
  83. :title="data.address"
  84. touchable
  85. direction="column"
  86. :padding="20"
  87. @click="goAddress"
  88. >
  89. <IconTextBlock
  90. icon="map-filling"
  91. :iconProps="{ size: 30 }"
  92. :title="data.address"
  93. extra="去这里"
  94. :extraProps="{
  95. color: 'primary',
  96. }"
  97. />
  98. </Touchable>
  99. </FlexCol>
  100. </FlexCol>
  101. <template
  102. v-for="(tag, index) in tagsDataRecommend"
  103. :key="index"
  104. >
  105. <Height :height="20" />
  106. <SubTitle :title="tag.title" showMore @moreClicked="tag.goList()" />
  107. <SimplePageContentLoader :loader="tag.loader" >
  108. <FlexCol :gap="20">
  109. <Box2LineLargeImageUserShadow
  110. v-for="(item, i) in tag.loader.content.value"
  111. :key="i"
  112. :title="item.title"
  113. :desc="item.desc"
  114. :image="item.image"
  115. :likes="item.likes"
  116. :comment="item.comments"
  117. @click="tag.goDetail(item.id)"
  118. />
  119. </FlexCol>
  120. </SimplePageContentLoader>
  121. </template>
  122. </FlexCol>
  123. </FlexCol>
  124. </SimplePageContentLoader>
  125. </template>
  126. <script setup lang="ts">
  127. import { ref, toRefs, type Ref } from 'vue';
  128. import { useLoadQuerys } from '@/common/composeabe/LoadQuerys';
  129. import { useSwiperImagePreview } from '@/common/composeabe/SwiperImagePreview';
  130. import { navTo } from '@/components/utils/PageAction';
  131. import { onShareTimeline, onShareAppMessage } from '@dcloudio/uni-app';
  132. import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
  133. import { useHomePageMiniCommonListGoMoreAndGoDetail, type IHomePageMiniCommonListGoMoreAndGoDetail } from '@/pages/article/common/CommonContent';
  134. import IntroBlock from '@/pages/article/common/IntroBlock.vue';
  135. import Parse from '@/components/display/parse/Parse.vue';
  136. import SimplePageContentLoader from '@/common/components/SimplePageContentLoader.vue';
  137. import Box2LineLargeImageUserShadow from '@/common/components/parts/Box2LineLargeImageUserShadow.vue';
  138. import VillageApi from '@/api/inhert/VillageApi';
  139. import ImagesUrls from '@/common/config/ImagesUrls';
  140. import SubTitle from '@/components/display/title/SubTitle.vue';
  141. import FlexCol from '@/components/layout/FlexCol.vue';
  142. import Image from '@/components/basic/Image.vue';
  143. import Text from '@/components/basic/Text.vue';
  144. import FlexRow from '@/components/layout/FlexRow.vue';
  145. import Touchable from '@/components/feedback/Touchable.vue';
  146. import Height from '@/components/layout/space/Height.vue';
  147. import IconTextBlock from '@/components/display/block/IconTextBlock.vue';
  148. const EmptyImage = 'https://mncdn.wenlvti.net/app_static/minnan/EmptyImage.png';
  149. interface TagDataItem {
  150. image: string,
  151. title: string,
  152. villageId?: number,
  153. modelId?: number,
  154. mainBodyId?: number,
  155. mainBodyColumnId?: number,
  156. }
  157. interface TagDataRecommendItem extends TagDataItem, IHomePageMiniCommonListGoMoreAndGoDetail {
  158. }
  159. const center = ref([118.15723, 24.48147]);
  160. const markers = ref<any>([]);
  161. const tagsData = ref<TagDataItem[]>([]);
  162. const tagsDataRecommend = ref<TagDataRecommendItem[]>([]) as unknown as Ref<TagDataRecommendItem[]>;
  163. const { querys } = useLoadQuerys({
  164. id: 0,
  165. }, () => contentLoader.loadData());
  166. const data = ref<Record<string, any>>({
  167. images: [],
  168. overview: '',
  169. longitude: 0,
  170. latitude: 0,
  171. region: 0,
  172. address: '',
  173. villageName: '',
  174. })
  175. function goAddress() {
  176. uni.openLocation({
  177. latitude: data.value.latitude,
  178. longitude: data.value.longitude,
  179. })
  180. }
  181. const { onPreviewImage } = useSwiperImagePreview(() => data.value.images || [])
  182. function goList(tag: TagDataItem) {
  183. navTo('/pages/article/common/list', {
  184. title: tag.title,
  185. modelId: tag.modelId,
  186. mainBodyColumnId: tag.mainBodyColumnId,
  187. region: data.value.region,
  188. });
  189. }
  190. const contentLoader = useSimpleDataLoader(async () => {
  191. data.value = {
  192. ...data.value,
  193. ...JSON.parse(uni.getStorageSync('VillageTemp') || '{}'),
  194. };
  195. console.log(data.value);
  196. if (data.value.longitude && data.value.latitude) {
  197. center.value = [Number(data.value.longitude), Number(data.value.latitude)];
  198. } else {
  199. center.value = [118.11593, 24.467580];
  200. }
  201. markers.value = [
  202. {
  203. id: 1,
  204. latitude: center.value[1],
  205. longitude: center.value[0],
  206. iconPath: ImagesUrls.IconMarker,
  207. width: 40,
  208. height: 40,
  209. }
  210. ];
  211. const menu = await VillageApi.getVillageMenuList(querys.value.id);
  212. tagsData.value = menu.map((item, index) => {
  213. return {
  214. title: item.name,
  215. image: item.logo || EmptyImage,
  216. modelId: item.modelId as number,
  217. villageId: item.villageId as number,
  218. mainBodyId: item.mainBodyId as number,
  219. mainBodyColumnId: item.mainBodyColumnId as number,
  220. };
  221. });
  222. tagsDataRecommend.value = tagsData.value.slice(0, 2).map((t) => {
  223. return {
  224. ...t,
  225. ...(toRefs(useHomePageMiniCommonListGoMoreAndGoDetail({
  226. title: t.title,
  227. villageId: t.villageId,
  228. mainBodyId: t.mainBodyId,
  229. mainBodyColumnId: t.mainBodyColumnId,
  230. modelId: t.modelId,
  231. itemType: 'article-common',
  232. detailsPage: '/pages/article/details',
  233. })))
  234. }
  235. }) as any;
  236. tagsDataRecommend.value.forEach(e => {
  237. e.loader.loadData();
  238. });
  239. }, false);
  240. function getPageShareData() {
  241. return {
  242. title: data.value.villageName,
  243. imageUrl: data.value.images[0],
  244. }
  245. }
  246. onShareTimeline(() => {
  247. return getPageShareData();
  248. })
  249. onShareAppMessage(() => {
  250. return getPageShareData();
  251. })
  252. </script>