index.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <template>
  2. <CommonTopBanner title="乡源好物">
  3. <FlexCol gap="gap.md" padding="padding.md">
  4. <FlexRow justify="space-between" align="center" gap="gap.sm">
  5. <SearchBar v-model:value="searchValue" placeholder="搜索乡源好物" :innerStyle="{ width: '270rpx' }" />
  6. <FrameButton text="我要发布" @click="handlePublish" size="small" />
  7. <FrameButton text="开通微信小店" size="small" />
  8. </FlexRow>
  9. <SimplePageListLoader :loader="goodsLoader">
  10. <FlexRow wrap justify="space-around" gap="gap.sm">
  11. <BoxMid
  12. v-for="good in goodsLoader.list.value" :key="good.id"
  13. :innerStyle="{
  14. width: 'calc(50% - 80rpx)',
  15. }"
  16. >
  17. <Touchable direction="column" gap="gap.lg" @click="handleGoodDetail(good)">
  18. <Image
  19. :src="good.image"
  20. :radius="20"
  21. width="100%"
  22. height="300rpx"
  23. mode="aspectFill"
  24. />
  25. <Text :text="good.title" fontConfig="titleText" />
  26. <FlexRow align="center" gap="gap.md">
  27. <Avatar
  28. :src="good.villageVolunteerAvatar"
  29. :size="40"
  30. />
  31. <Text :text="`发布人: ${good.villageVolunteerName}`" fontConfig="contentText" />
  32. </FlexRow>
  33. </Touchable>
  34. </BoxMid>
  35. <FlexCol v-if="goodsLoader.list.value.length % 2 !== 0" width="calc(50% - 40rpx)" />
  36. </FlexRow>
  37. </SimplePageListLoader>
  38. </FlexCol>
  39. </CommonTopBanner>
  40. </template>
  41. <script setup lang="ts">
  42. import { navTo } from '@/components/utils/PageAction';
  43. import { onMounted, ref } from 'vue';
  44. import { useSimplePageListLoader } from '@/components/composeabe/loader/SimplePageListLoader';
  45. import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
  46. import { useUserTools } from '@/common/composeabe/UserTools';
  47. import BoxMid from '@/common/components/box/BoxMid.vue';
  48. import FrameButton from '@/common/components/FrameButton.vue';
  49. import Image from '@/components/basic/Image.vue';
  50. import Text from '@/components/basic/Text.vue';
  51. import Avatar from '@/components/display/Avatar.vue';
  52. import Touchable from '@/components/feedback/Touchable.vue';
  53. import SearchBar from '@/components/form/SearchBar.vue';
  54. import FlexCol from '@/components/layout/FlexCol.vue';
  55. import FlexRow from '@/components/layout/FlexRow.vue';
  56. import SimplePageListLoader from '@/components/loader/SimplePageListLoader.vue';
  57. import VillageInfoApi from '@/api/inhert/VillageInfoApi';
  58. import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
  59. import { confirm } from '@/components/utils/DialogAction';
  60. const { querys } = useLoadQuerys({
  61. villageId: 0,
  62. });
  63. const { getIsVolunteer, getIsJoinedVillage, volunteerInfo } = useUserTools();
  64. const isJoined = ref(false);
  65. const CollectModuleId = 24; // 乡源好物模块id
  66. const goodsLoader = useSimplePageListLoader(20, async (page, pageSize, params) => {
  67. return await VillageInfoApi.getList({
  68. collectModuleId: CollectModuleId,
  69. villageId: querys.value.villageId,
  70. page, pageSize,
  71. keywords: searchValue.value,
  72. });
  73. });
  74. const searchValue = ref('');
  75. function handleJoin() {
  76. navTo('/pages/home/light/submit', {
  77. villageId: querys.value.villageId,
  78. });
  79. }
  80. const handleGoodDetail = (good: { id: number }) => {
  81. navTo('./detail', {
  82. id: good.id,
  83. });
  84. };
  85. const handlePublish = () => {
  86. if (!isJoined.value) {
  87. confirm({
  88. title: '提示',
  89. content: "您还不是当前村社的志愿者,请先加入志愿者队伍才能采编信息哦",
  90. confirmText: '去加入',
  91. }).then((res) => {
  92. if (res) {
  93. handleJoin();
  94. }
  95. });
  96. return;
  97. }
  98. navTo('/pages/dig/forms/common', {
  99. id: -1,
  100. villageId: querys.value.villageId,
  101. villageVolunteerId: volunteerInfo.value?.id || 0,
  102. collectModuleId: CollectModuleId,
  103. subTitle: '乡源好物',
  104. });
  105. }
  106. onMounted(async () => {
  107. await getIsVolunteer();
  108. isJoined.value = await getIsJoinedVillage(querys.value.villageId);
  109. await goodsLoader.load();
  110. });
  111. defineExpose({
  112. onPageBack(name: string, param: any) {
  113. if (param && param.needRefresh)
  114. goodsLoader.reload();
  115. },
  116. });
  117. </script>