list.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <template>
  2. <view class="d-flex flex-column bg-base">
  3. <view class="top-tab bg-base">
  4. <u-tabs
  5. :list="tabs"
  6. lineWidth="30"
  7. lineColor="#d9492e"
  8. :activeStyle="{
  9. color: '#000',
  10. fontWeight: 'bold',
  11. transform: 'scale(1.05)'
  12. }"
  13. :inactiveStyle="{
  14. color: '#606266',
  15. transform: 'scale(1)'
  16. }"
  17. :scrollable="false"
  18. class="top-tab"
  19. @click="(e: any) => tab = e.index"
  20. />
  21. </view>
  22. <view class="d-flex flex-col p-2">
  23. <uni-search-bar
  24. v-model="searchValue"
  25. radius="100"
  26. bgColor="#fff"
  27. placeholder="搜索文物"
  28. clearButton="auto"
  29. cancelButton="none"
  30. @confirm="doSearch"
  31. />
  32. </view>
  33. <view class="d-flex flex-row justify-around p-2 pt-0">
  34. <SimpleDropDownPicker v-model="selectedTag" :columns="categoryData.content.value" />
  35. <SimpleDropDownPicker v-model="selectedLevel" :columns="levelData.content.value" />
  36. <SimpleDropDownPicker v-model="selectedRegion" :columns="regionData.content.value" />
  37. </view>
  38. <view class="d-flex flex-row flex-wrap justify-between p-2">
  39. <view
  40. v-for="item in listLoader.list.value"
  41. :key="item.id"
  42. class="width-1-2"
  43. >
  44. <Box2LineLargeImageUserShadow
  45. classNames="ml-2 mb-3"
  46. titleColor="title-text"
  47. :image="item.image"
  48. :title="item.name"
  49. @click="goDetails(item.id)"
  50. />
  51. </view>
  52. </view>
  53. <SimplePageListLoader :loader="listLoader" />
  54. </view>
  55. </template>
  56. <script setup lang="ts">
  57. import { ref, watch } from 'vue';
  58. import CommonContent, { GetContentListParams } from '@/api/CommonContent';
  59. import { useSimplePageListLoader } from '@/common/composeabe/SimplePageListLoader';
  60. import { navTo } from '@/components/utils/PageAction';
  61. import MoveableContent from '@/api/inheritor/MoveableContent';
  62. import UnmoveableContent from '@/api/inheritor/UnmoveableContent';
  63. import SimplePageListLoader from '@/common/components/SimplePageListLoader.vue';
  64. import Box2LineLargeImageUserShadow from '@/pages/parts/Box2LineLargeImageUserShadow.vue';
  65. import SimpleDropDownPicker from '@/common/components/SimpleDropDownPicker.vue';
  66. import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
  67. import AppCofig from '@/common/config/AppCofig';
  68. const categoryData = useSimpleDataLoader(async () =>
  69. [{
  70. id: 0,
  71. name: '全部分类'
  72. }].concat((await CommonContent.getCategoryList(3)).map((item) => ({
  73. id: item.id,
  74. name: item.title,
  75. })))
  76. , true);
  77. const levelData = useSimpleDataLoader(async () =>
  78. [{
  79. id: 0,
  80. name: '全部级别'
  81. }].concat(
  82. (await CommonContent.getCategoryList(2)).map((item) => ({
  83. id: item.id,
  84. name: item.title,
  85. })).filter((item) => !item.name.includes('非'))
  86. )
  87. , true);
  88. const regionData = useSimpleDataLoader(async () =>
  89. [{
  90. id: 0,
  91. name: '全部区域'
  92. }].concat((await CommonContent.getCategoryList(1)).map((item) => ({
  93. id: item.id,
  94. name: item.title,
  95. })))
  96. , true);
  97. const selectedTag = ref(0);
  98. const selectedLevel = ref(0);
  99. const selectedRegion = ref(0);
  100. const searchValue = ref('');
  101. const tab = ref(0)
  102. const tabs = [
  103. {
  104. name: '不可移动文物'
  105. },
  106. {
  107. name: '可移动文物'
  108. },
  109. ];
  110. const listLoader = useSimplePageListLoader<{
  111. id: number,
  112. image: string,
  113. name: string
  114. }>(8, async (page, pageSize) => {
  115. let api;
  116. switch (tab.value) {
  117. default:
  118. case 0: api = UnmoveableContent; break;
  119. case 1: api = MoveableContent; break;
  120. }
  121. const res = await api.getContentList(new GetContentListParams().setSelfValues({
  122. crType: selectedTag.value == 0 ? undefined: selectedTag.value,
  123. level: selectedLevel.value == 0 ? undefined: selectedLevel.value,
  124. region: selectedRegion.value == 0 ? undefined: selectedRegion.value,
  125. keywords: searchValue.value,
  126. }), page, pageSize);
  127. return { list: res.list.map((item) => {
  128. return {
  129. id: item.id,
  130. image: item.thumbnail || item.image || AppCofig.defaultImage,
  131. name: item.title,
  132. }
  133. }), total: res.total }
  134. });
  135. watch(selectedLevel, () => {
  136. listLoader.loadData(undefined, true);
  137. });
  138. watch(selectedRegion, () => {
  139. listLoader.loadData(undefined, true);
  140. });
  141. watch(selectedTag, () => {
  142. listLoader.loadData(undefined, true);
  143. });
  144. watch(tab, () => {
  145. listLoader.loadData(undefined, true);
  146. }, { immediate: true });
  147. function doSearch() {
  148. listLoader.loadData(undefined, true);
  149. }
  150. function goDetails(id: number) {
  151. navTo('details', { id })
  152. }
  153. </script>