list.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <template>
  2. <FlexCol :padding="30">
  3. <FlexRow justify="space-between">
  4. <SearchBar
  5. v-model="searchText"
  6. placeholder="搜一搜"
  7. :innerStyle="{ width: '460rpx' }"
  8. @confirm="search"
  9. />
  10. <Button type="primary" @click="newData">+ 新增</Button>
  11. </FlexRow>
  12. <Height :height="20" />
  13. <FlexCol :gap="20">
  14. <Touchable
  15. v-for="item in listLoader.list.value"
  16. :key="item.id"
  17. :gap="20"
  18. :padding="[15,20]"
  19. :radius="15"
  20. align="center"
  21. backgroundColor="white"
  22. direction="row"
  23. touchable
  24. @click="goDetail(item.id)"
  25. >
  26. <Image
  27. :src="item.image"
  28. defaultImage="https://mn.wenlvti.net/app_static/minnan/EmptyImage.png"
  29. failedImage="https://mn.wenlvti.net/app_static/minnan/EmptyImage.png"
  30. :showFailed="false"
  31. :width="100"
  32. :height="100"
  33. :radius="10"
  34. mode="aspectFill"
  35. round
  36. />
  37. <FlexCol>
  38. <H4 :size="36">{{ item.title }}</H4>
  39. <Text :size="23">{{ item.date }}</Text>
  40. </FlexCol>
  41. </Touchable>
  42. </FlexCol>
  43. <SimplePageListLoader :loader="listLoader" :noEmpty="true">
  44. <template #empty>
  45. <Empty image="search" text="这里还没有数据,快来编写完善吧!">
  46. <Button type="primary" :text="`+ 新增${subTitle}数据`" @click="newData" />
  47. </Empty>
  48. </template>
  49. </SimplePageListLoader>
  50. <XBarSpace />
  51. </FlexCol>
  52. </template>
  53. <script setup lang="ts">
  54. import { useSimplePageListLoader } from '@/common/composeabe/SimplePageListLoader';
  55. import { ref } from 'vue';
  56. import { DataDateUtils } from '@imengyu/js-request-transform';
  57. import { useLoadQuerys } from '@/common/composeabe/LoadQuerys';
  58. import SimplePageListLoader from '@/common/components/SimplePageListLoader.vue';
  59. import VillageInfoApi from '@/api/inhert/VillageInfoApi';
  60. import Image from '@/components/basic/Image.vue';
  61. import Empty from '@/components/feedback/Empty.vue';
  62. import Button from '@/components/basic/Button.vue';
  63. import SearchBar from '@/components/form/SearchBar.vue';
  64. import FlexCol from '@/components/layout/FlexCol.vue';
  65. import FlexRow from '@/components/layout/FlexRow.vue';
  66. import Text from '@/components/basic/Text.vue';
  67. import { navTo } from '@/components/utils/PageAction';
  68. import Height from '@/components/layout/space/Height.vue';
  69. import H4 from '@/components/typography/H4.vue';
  70. import Touchable from '@/components/feedback/Touchable.vue';
  71. import XBarSpace from '@/components/layout/space/XBarSpace.vue';
  72. import { useCollectStore } from '@/store/collect';
  73. import { onPullDownRefresh } from '@dcloudio/uni-app';
  74. const subTitle = ref('');
  75. const searchText = ref('');
  76. const collectStore = useCollectStore();
  77. const listLoader = useSimplePageListLoader<{
  78. id: number,
  79. image: string,
  80. title: string,
  81. date: string
  82. }, {
  83. villageId: number,
  84. villageVolunteerId: number,
  85. subType: string,
  86. subId: number,
  87. subKey: string,
  88. }>(8, async (page, pageSize, params) => {
  89. if (!params )
  90. throw new Error("未传入参数,当前页面需要参数");
  91. if (!params.subType)
  92. throw new Error("params.subType");
  93. if (!params.villageId)
  94. throw new Error("params.villageId");
  95. if (!params.villageVolunteerId)
  96. throw new Error("params.villageId");
  97. let res = (page == 1 ? await VillageInfoApi.getList(
  98. collectStore.getCollectModuleId(params.subType),
  99. params.subType,
  100. params.subKey ? params.subId : undefined,
  101. params.subKey,
  102. params.villageId,
  103. params.villageVolunteerId,
  104. ) : [])
  105. if (searchText.value)
  106. res = res.filter((p) => p.title.includes(searchText.value));
  107. const list = res.map((item) => {
  108. return {
  109. id: item.id,
  110. image: item.image,
  111. title: item.title,
  112. date: DataDateUtils.formatDate(item.updatedAt, 'YYYY-MM-dd'),
  113. }
  114. })
  115. return {
  116. list: list,
  117. total: list.length,
  118. };
  119. });
  120. function newData() {
  121. navTo('common', {
  122. id: -1,
  123. villageId: querys.value.villageId,
  124. villageVolunteerId: querys.value.villageVolunteerId,
  125. subType: querys.value.subType,
  126. subId: querys.value.subId,
  127. });
  128. }
  129. function goDetail(id: number) {
  130. navTo('common', {
  131. id,
  132. villageId: querys.value.villageId,
  133. villageVolunteerId: querys.value.villageVolunteerId,
  134. catalogId: querys.value.catalogId,
  135. subType: querys.value.subType,
  136. subKey: querys.value.subKey,
  137. subId: querys.value.subId,
  138. subTitle: querys.value.subTitle,
  139. });
  140. }
  141. function search() {
  142. listLoader.loadData(undefined, true);
  143. }
  144. const { querys } = useLoadQuerys({
  145. villageId: 0,
  146. villageVolunteerId: 0,
  147. catalogId: 0,
  148. subType: '',
  149. subKey: '',
  150. subId: 0,
  151. subTitle: '',
  152. }, async (querys) => {
  153. if (querys.subTitle) {
  154. subTitle.value = querys.subTitle;
  155. uni.setNavigationBarTitle({ title: subTitle.value + '列表', })
  156. }
  157. listLoader.loadData(querys)
  158. });
  159. onPullDownRefresh(() => {
  160. listLoader.loadData(undefined, true);
  161. });
  162. defineExpose({
  163. onPageBack(name: string, param: any) {
  164. if (param && param.needRefresh)
  165. listLoader.loadData(undefined, true);
  166. }
  167. })
  168. </script>