index.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <template>
  2. <FlexCol :gap="20" :padding="20">
  3. <Box title="导览" icon="/static/images/home/icon-compass.png">
  4. <ProvideVar :vars="{
  5. GridItemIconSize: 90,
  6. GridItemBackgroundColor: 'transparent',
  7. GridItemPaddingHorizontal: 0,
  8. }">
  9. <Grid :borderGrid="false" :mainAxisCount="4">
  10. <GridItem title="全部" icon="/static/images/icons/icon-all.png" touchable @click="goList('')" />
  11. <GridItem title="历史文化" icon="/static/images/icons/icon-history.png" touchable @click="goList('历史文化')" />
  12. <GridItem title="环境格局" icon="/static/images/icons/icon-envirounment.png" touchable @click="goList('环境格局')" />
  13. <GridItem title="传统建筑" icon="/static/images/icons/icon-buliding.png" touchable @click="goList('传统建筑')" />
  14. <GridItem title="民俗文化" icon="/static/images/icons/icon-location.png" touchable @click="goList('民俗文化')" />
  15. <GridItem title="地道美食" icon="/static/images/icons/icon-foods.png" touchable @click="goList('美食物产')" />
  16. <GridItem title="物产资源" icon="/static/images/icons/icon-resource.png" touchable @click="goList('历史人物')" />
  17. <GridItem title="旅游线路" icon="/static/images/icons/icon-route.png" touchable @click="goList('旅游线路')" />
  18. </Grid>
  19. </ProvideVar>
  20. </Box>
  21. <Box title="最新推荐" icon="/static/images/home/icon-article.png">
  22. <SimplePageContentLoader :loader="discoverLoader">
  23. <FlexCol :gap="25">
  24. <ImageBlock2
  25. v-for="(item, i) in discoverLoader.content.value"
  26. :key="i"
  27. :src="item.image"
  28. :title="item.title"
  29. :desc="item.desc"
  30. :imageHeight="400"
  31. :imageRadius="15"
  32. width="100%"
  33. @click="goDetails(item)"
  34. >
  35. <template #extra>
  36. <Tag scheme="light" :text="item.villageName" type="primary" />
  37. </template>
  38. </ImageBlock2>
  39. </FlexCol>
  40. </SimplePageContentLoader>
  41. </Box>
  42. <Loadmore status="nomore" />
  43. <Height :height="150" />
  44. </FlexCol>
  45. </template>
  46. <script setup lang="ts">
  47. import { navTo } from '@/components/utils/PageAction';
  48. import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
  49. import Box from '@/common/components/parts/Box.vue';
  50. import SimplePageContentLoader from '@/common/components/SimplePageContentLoader.vue';
  51. import Image from '@/components/basic/Image.vue';
  52. import Text from '@/components/basic/Text.vue';
  53. import Loadmore from '@/components/display/loading/Loadmore.vue';
  54. import Touchable from '@/components/feedback/Touchable.vue';
  55. import FlexCol from '@/components/layout/FlexCol.vue';
  56. import Height from '@/components/layout/space/Height.vue';
  57. import ProvideVar from '@/components/theme/ProvideVar.vue';
  58. import Grid from '@/components/layout/grid/Grid.vue';
  59. import GridItem from '@/components/layout/grid/GridItem.vue';
  60. import VillageInfoApi from '@/api/inhert/VillageInfoApi';
  61. import AppCofig from '@/common/config/AppCofig';
  62. import Tag from '@/components/display/Tag.vue';
  63. import ImageBlock2 from '@/components/display/block/ImageBlock2.vue';
  64. function goList(keywords: string) {
  65. navTo('/pages/home/discover/list', {
  66. keywords,
  67. title: keywords,
  68. });
  69. }
  70. function goDetails(item: any) {
  71. navTo('/pages/home/discover/details', {
  72. id: item.id,
  73. collectModelId: item.collectModuleId,
  74. collectModelInternalName: item.collectModuleInternalName,
  75. });
  76. }
  77. const discoverLoader = useSimpleDataLoader(async () => {
  78. return (await VillageInfoApi.getListForDiscover(1, 30)).list.map((item) => {
  79. return {
  80. ...item,
  81. image: (item.thumbnail || item.image) as string,
  82. desc: item.desc || '',
  83. title: item.title,
  84. }
  85. })
  86. });
  87. </script>