news.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <template>
  2. <CommonRoot>
  3. <FlexCol :padding="30" innerClass="bg-base">
  4. <FlexRow>
  5. <Touchable
  6. direction="row"
  7. width="450"
  8. align="center"
  9. :activeOpacity="1"
  10. @click="($refs.pickerField as any).show()"
  11. >
  12. <Text>筛选日期:</Text>
  13. <PickerField
  14. ref="pickerField"
  15. v-model="filterDate"
  16. placeholder="选择日期"
  17. title="筛选日期"
  18. :columns="[filterDates]"
  19. />
  20. <Icon name="arrow-down" />
  21. </Touchable>
  22. <SearchBar
  23. v-model="searchText"
  24. inputBackgroundColor="transparent"
  25. leftIcon=""
  26. placeholder="搜索新闻"
  27. cancelState="hidden"
  28. searchState="show"
  29. @search="loadNews"
  30. />
  31. </FlexRow>
  32. <Box2LineImageRightShadow
  33. v-for="(item, i) in newsLoader.list.value"
  34. :key="item.id"
  35. :class="[
  36. 'position-relative d-flex flex-grow-1',
  37. ]"
  38. class="w-100"
  39. titleColor="title-text"
  40. :image="item.thumbnail || item.image"
  41. :title="item.title"
  42. :desc="item.from ? `来源:${item.from}` : ''"
  43. :badge="item.badge"
  44. :wideImage="true"
  45. @click="goDetails(item, item.id)"
  46. />
  47. <SimplePageListLoader :loader="newsLoader" />
  48. </FlexCol>
  49. </CommonRoot>
  50. </template>
  51. <script setup lang="ts">
  52. import { onMounted, ref, watch } from 'vue';
  53. import { type GetContentListItem, GetContentListParams } from '@/api/CommonContent';
  54. import { useSimplePageListLoader } from '@/common/composeabe/SimplePageListLoader';
  55. import { navCommonDetail } from '../article/common/CommonContent';
  56. import NewsIndexContent from '@/api/news/NewsIndexContent';
  57. import SimplePageListLoader from '@/common/components/SimplePageListLoader.vue';
  58. import CommonRoot from '@/components/dialog/CommonRoot';
  59. import FlexCol from '@/components/layout/FlexCol.vue';
  60. import SearchBar from '@/components/form/SearchBar.vue';
  61. import Box2LineImageRightShadow from '../parts/Box2LineImageRightShadow.vue';
  62. import ApiCofig from '@/common/config/ApiCofig';
  63. import FlexRow from '@/components/layout/FlexRow.vue';
  64. import Touchable from '@/components/feedback/Touchable.vue';
  65. import PickerField from '@/components/form/PickerField.vue';
  66. import Text from '@/components/basic/Text.vue';
  67. import Icon from '@/components/basic/Icon.vue';
  68. import type { PickerItem } from '@/components/form/Picker';
  69. const searchText = ref('');
  70. const filterDate = ref(['']);
  71. const newsLoader = useSimplePageListLoader(10, async (page, pageSize) => {
  72. return await NewsIndexContent.getContentList(new GetContentListParams()
  73. .setMainBodyColumnId([ 228,298,299 ])
  74. .setKeywords(searchText.value)
  75. .setSelfValues({
  76. publishAt: filterDate.value[0],
  77. })
  78. , page, pageSize);
  79. });
  80. const nowYear = new Date().getFullYear();
  81. const filterDates : PickerItem[] = [
  82. { text: '全部', value: 0 },
  83. ...(new Array(21).fill(0).map((_, index) => {
  84. return {
  85. text: `${nowYear - index}`,
  86. value: nowYear - index
  87. }
  88. }))
  89. ];
  90. function loadNews() {
  91. newsLoader.loadData(undefined, true);
  92. }
  93. function goDetails(item: GetContentListItem, id: number) {
  94. navCommonDetail({
  95. id,
  96. mainBodyColumnId: item.mainBodyColumnId,
  97. modelId: item.modelId,
  98. });
  99. }
  100. watch(filterDate, () => {
  101. loadNews();
  102. });
  103. onMounted(() => {
  104. loadNews();
  105. });
  106. </script>