submits.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <template>
  2. <FlexCol :padding="30">
  3. <SearchBar
  4. v-model="searchText"
  5. placeholder="搜一搜"
  6. @confirm="search"
  7. />
  8. <Height :height="20" />
  9. <SimplePageListLoader :loader="listLoader" :noEmpty="true">
  10. <template #empty>
  11. <Empty image="search" description="这里还没提交过投稿,快来去写吧!">
  12. </Empty>
  13. </template>
  14. <FlexCol :gap="20">
  15. <Touchable
  16. v-for="item in listLoader.list.value"
  17. :key="item.id"
  18. :gap="20"
  19. :padding="[15,20]"
  20. :radius="15"
  21. align="center"
  22. backgroundColor="white"
  23. direction="row"
  24. touchable
  25. @click="goDetail(item.id)"
  26. >
  27. <Image
  28. :src="item.image"
  29. :showFailed="false"
  30. :width="100"
  31. :height="100"
  32. :radius="10"
  33. mode="aspectFill"
  34. round
  35. />
  36. <FlexCol>
  37. <H4 :size="36">{{ item.title }}</H4>
  38. <Text :size="23">{{ item.desc }}</Text>
  39. </FlexCol>
  40. </Touchable>
  41. </FlexCol>
  42. </SimplePageListLoader>
  43. <XBarSpace />
  44. </FlexCol>
  45. </template>
  46. <script setup lang="ts">
  47. import { ref } from 'vue';
  48. import { onPullDownRefresh } from '@dcloudio/uni-app';
  49. import { DataDateUtils } from '@imengyu/js-request-transform';
  50. import { useSimplePageListLoader } from '@/common/composeabe/SimplePageListLoader';
  51. import { useLoadQuerys } from '@/common/composeabe/LoadQuerys';
  52. import { useCollectStore } from '@/store/collect';
  53. import { useAuthStore } from '@/store/auth';
  54. import { navTo } from '@/components/utils/PageAction';
  55. import SimplePageListLoader from '@/common/components/SimplePageListLoader.vue';
  56. import VillageInfoApi from '@/api/inhert/VillageInfoApi';
  57. import Image from '@/components/basic/Image.vue';
  58. import Empty from '@/components/feedback/Empty.vue';
  59. import SearchBar from '@/components/form/SearchBar.vue';
  60. import FlexCol from '@/components/layout/FlexCol.vue';
  61. import Text from '@/components/basic/Text.vue';
  62. import Height from '@/components/layout/space/Height.vue';
  63. import H4 from '@/components/typography/H4.vue';
  64. import Touchable from '@/components/feedback/Touchable.vue';
  65. import XBarSpace from '@/components/layout/space/XBarSpace.vue';
  66. const searchText = ref('');
  67. const authStore = useAuthStore();
  68. const listLoader = useSimplePageListLoader<{
  69. id: number,
  70. image: string,
  71. title: string,
  72. desc: string
  73. }, {
  74. villageId: number,
  75. villageVolunteerId: number,
  76. }>(8, async (page, pageSize, params) => {
  77. if (!params )
  78. throw new Error("未传入参数,当前页面需要参数");
  79. let res = await VillageInfoApi.getList(
  80. undefined,
  81. '',
  82. undefined,
  83. undefined,
  84. params.villageId,
  85. params.villageVolunteerId,
  86. undefined,
  87. page,
  88. pageSize,
  89. )
  90. if (searchText.value)
  91. res = res.filter((p) => p.title.includes(searchText.value));
  92. const list = res.map((item) => {
  93. return {
  94. id: item.id,
  95. image: item.image,
  96. title: item.title,
  97. desc: DataDateUtils.formatDate(item.updatedAt, 'YYYY-MM-dd') + (
  98. authStore.isAdmin ? (' 投稿人:' + item.villageVolunteerName) : ''
  99. )
  100. }
  101. })
  102. return {
  103. list: list,
  104. total: list.length,
  105. };
  106. });
  107. function goDetail(id: number) {
  108. navTo('common', {
  109. id,
  110. villageId: querys.value.villageId,
  111. villageVolunteerId: querys.value.villageVolunteerId,
  112. });
  113. }
  114. function search() {
  115. listLoader.loadData(undefined, true);
  116. }
  117. const { querys } = useLoadQuerys({
  118. villageId: 0,
  119. villageVolunteerId: 0,
  120. }, async (querys) => {
  121. listLoader.loadData(querys)
  122. });
  123. onPullDownRefresh(() => {
  124. listLoader.loadData(undefined, true);
  125. });
  126. defineExpose({
  127. onPageBack(name: string, param: any) {
  128. if (param && param.needRefresh)
  129. listLoader.loadData(undefined, true);
  130. }
  131. })
  132. </script>