submits.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <template>
  2. <FlexCol :padding="30">
  3. <SearchBar
  4. v-model="searchText"
  5. placeholder="搜一搜"
  6. @search="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. :padding="[15,20]"
  19. :radius="15"
  20. justify="space-between"
  21. align="center"
  22. backgroundColor="white"
  23. direction="row"
  24. touchable
  25. @click="goDetail(item)"
  26. >
  27. <FlexRow align="center" :gap="20">
  28. <Image
  29. :src="item.image"
  30. :showFailed="false"
  31. :width="150"
  32. :height="150"
  33. :radius="10"
  34. mode="aspectFill"
  35. round
  36. />
  37. <FlexCol>
  38. <H4 :size="36">{{ item.title }}</H4>
  39. <Height :height="10" />
  40. <Text :size="23" :text="`栏目: ${item.catalogName || item.collectModuleName || ''}`" />
  41. <Text :size="23" :text="`时间: ${DataDateUtils.formatDate(item.updatedAt, 'YYYY-MM-dd')}`" />
  42. <FlexRow align="center">
  43. <Text :size="23" :text="`状态:`" />
  44. <Tag
  45. size="small"
  46. :text="(item.statusText as string)"
  47. :type="selectObjectByType(item.status as string, '0', {
  48. '-1': 'danger',
  49. '0': 'default',
  50. '1': 'warning',
  51. '2': 'primary',
  52. '3': 'primary',
  53. '4': 'success',
  54. })"
  55. />
  56. </FlexRow>
  57. </FlexCol>
  58. </FlexRow>
  59. <Icon icon="arrow-right-bold" color="primary" :size="36" />
  60. </Touchable>
  61. </FlexCol>
  62. </SimplePageListLoader>
  63. <XBarSpace />
  64. </FlexCol>
  65. </template>
  66. <script setup lang="ts">
  67. import { ref } from 'vue';
  68. import { onPullDownRefresh } from '@dcloudio/uni-app';
  69. import { DataDateUtils } from '@imengyu/js-request-transform';
  70. import { useSimplePageListLoader } from '@/common/composeabe/SimplePageListLoader';
  71. import { useLoadQuerys } from '@/common/composeabe/LoadQuerys';
  72. import { useCollectStore } from '@/store/collect';
  73. import { useAuthStore } from '@/store/auth';
  74. import { selectObjectByType } from '@/components/theme/ThemeTools';
  75. import { navTo } from '@/components/utils/PageAction';
  76. import SimplePageListLoader from '@/common/components/SimplePageListLoader.vue';
  77. import VillageInfoApi, { CommonInfoModel } from '@/api/inhert/VillageInfoApi';
  78. import Image from '@/components/basic/Image.vue';
  79. import Empty from '@/components/feedback/Empty.vue';
  80. import SearchBar from '@/components/form/SearchBar.vue';
  81. import FlexCol from '@/components/layout/FlexCol.vue';
  82. import Text from '@/components/basic/Text.vue';
  83. import Height from '@/components/layout/space/Height.vue';
  84. import H4 from '@/components/typography/H4.vue';
  85. import Touchable from '@/components/feedback/Touchable.vue';
  86. import XBarSpace from '@/components/layout/space/XBarSpace.vue';
  87. import FlexRow from '@/components/layout/FlexRow.vue';
  88. import Tag from '@/components/display/Tag.vue';
  89. import Icon from '@/components/basic/Icon.vue';
  90. import { waitTimeOut } from '@imengyu/imengyu-utils';
  91. const searchText = ref('');
  92. const authStore = useAuthStore();
  93. const collectStore = useCollectStore();
  94. const listLoader = useSimplePageListLoader<CommonInfoModel>(8, async (page, pageSize) => {
  95. let res = await VillageInfoApi.getList(
  96. undefined,
  97. '',
  98. undefined,
  99. undefined,
  100. querys.value.villageId,
  101. querys.value.villageVolunteerId,
  102. undefined,
  103. page,
  104. pageSize,
  105. )
  106. if (searchText.value)
  107. res = res.filter((p) => p.title.includes(searchText.value));
  108. return {
  109. list: res,
  110. total: res.length,
  111. };
  112. });
  113. function goDetail(item: CommonInfoModel) {
  114. navTo('common', {
  115. id: item.id,
  116. villageId: querys.value.villageId,
  117. villageVolunteerId: querys.value.villageVolunteerId,
  118. catalogId: item.catalogId,
  119. subType: collectStore.getCollectModuleInternalNameById(item.collectModuleId),
  120. subKey: '',
  121. subId: -1,
  122. subTitle: item.catalogName || item.collectModuleName || '',
  123. });
  124. }
  125. function search() {
  126. listLoader.loadData(undefined, true);
  127. }
  128. const { querys } = useLoadQuerys({
  129. villageId: 0,
  130. villageVolunteerId: 0,
  131. }, async (querys) => {
  132. listLoader.loadData(querys)
  133. });
  134. onPullDownRefresh(() => {
  135. listLoader.loadData(undefined, true);
  136. });
  137. defineExpose({
  138. onPageBack(name: string, param: any) {
  139. if (param && param.needRefresh)
  140. listLoader.loadData(undefined, true);
  141. }
  142. })
  143. </script>