news.vue 2.8 KB

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