message.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <template>
  2. <div class="message-page">
  3. <custom-header name="我的消息" bgColor="#f7f7f7"></custom-header>
  4. <List
  5. v-model:loading="loading"
  6. :finished="finished"
  7. finished-text="没有更多了"
  8. @load="onLoad"
  9. :immediate-check="false"
  10. >
  11. <div class="message-list">
  12. <div class="message-item" v-for="(item, index) in messageList" :key="index" @click="handleItem(item)">
  13. <div class="message-content">
  14. <div class="title">{{ item.title }}</div>
  15. <div class="desc">{{ item.desc }}</div>
  16. <div class="footer">
  17. <div class="footer-left">
  18. <span class="view-detail">查看详情</span>
  19. <span class="date">{{ formatDate(item.createDate) }}</span>
  20. </div>
  21. <el-icon class="arrow-icon"><ArrowRight /></el-icon>
  22. </div>
  23. </div>
  24. </div>
  25. </div>
  26. </List>
  27. </div>
  28. </template>
  29. <script setup>
  30. import { ref, onMounted } from "vue";
  31. import { useRouter } from "vue-router";
  32. import { ArrowRight } from "@element-plus/icons-vue";
  33. import { List } from "vant";
  34. import customHeader from "@/components/customHeader.vue";
  35. const router = useRouter();
  36. const handleItem = (item) => {
  37. router.push("/completed_work?miniJson=" + JSON.stringify({ id: item.farmData.farmWorkRecordId }));
  38. };
  39. // 分页相关状态
  40. const messageList = ref([]);
  41. const loading = ref(false);
  42. const finished = ref(false);
  43. const currentPage = ref(1);
  44. const pageSize = ref(10);
  45. // 加载数据
  46. const getNoticeList = async () => {
  47. try {
  48. loading.value = true;
  49. const params = {
  50. page: currentPage.value,
  51. limit: pageSize.value,
  52. popType: 0,
  53. };
  54. const res = await VE_API.mine.listNotice(params);
  55. if (res.data && res.data.length > 0) {
  56. const newData = res.data.map((item) => {
  57. return {
  58. ...item,
  59. farmData: JSON.parse(item.data),
  60. };
  61. });
  62. if (currentPage.value === 1) {
  63. messageList.value = newData;
  64. } else {
  65. messageList.value = [...messageList.value, ...newData];
  66. }
  67. // 如果返回的数据少于每页数量,说明没有更多数据了
  68. if (res.data.length < pageSize.value) {
  69. finished.value = true;
  70. }
  71. } else {
  72. // 没有数据时,如果是第一页,显示空列表;否则标记为完成
  73. if (currentPage.value === 1) {
  74. messageList.value = [];
  75. }
  76. finished.value = true;
  77. }
  78. } catch (error) {
  79. console.error("获取消息列表失败:", error);
  80. finished.value = true;
  81. } finally {
  82. loading.value = false;
  83. }
  84. };
  85. // 滚动加载更多
  86. const onLoad = () => {
  87. if (finished.value) {
  88. return;
  89. }
  90. currentPage.value += 1;
  91. getNoticeList();
  92. };
  93. // 初始化加载
  94. onMounted(() => {
  95. currentPage.value = 1;
  96. finished.value = false;
  97. getNoticeList();
  98. });
  99. // 格式化日期为 MM-DD 格式
  100. const formatDate = (dateStr) => {
  101. if (!dateStr) return "--";
  102. const date = new Date(dateStr);
  103. if (Number.isNaN(date.getTime())) return dateStr;
  104. const m = `${date.getMonth() + 1}`.padStart(2, "0");
  105. const d = `${date.getDate()}`.padStart(2, "0");
  106. return `${m}-${d}`;
  107. };
  108. </script>
  109. <style lang="scss" scoped>
  110. .message-page {
  111. position: relative;
  112. width: 100%;
  113. height: 100vh;
  114. box-sizing: border-box;
  115. background-color: #f7f7f7;
  116. display: flex;
  117. flex-direction: column;
  118. ::v-deep .van-list {
  119. flex: 1;
  120. height: calc(100vh - 40px);
  121. overflow-y: auto;
  122. padding: 12px;
  123. box-sizing: border-box;
  124. }
  125. .message-list {
  126. width: 100%;
  127. .message-item {
  128. background-color: #fff;
  129. border-radius: 14px;
  130. padding: 16px;
  131. .message-content {
  132. .title {
  133. font-size: 16px;
  134. font-weight: 500;
  135. margin-bottom: 8px;
  136. }
  137. .desc {
  138. color: #bbbbbb;
  139. margin-bottom: 10px;
  140. }
  141. .footer {
  142. display: flex;
  143. align-items: center;
  144. justify-content: space-between;
  145. border-top: 1px solid #f5f5f5;
  146. padding-top: 10px;
  147. .footer-left {
  148. display: flex;
  149. align-items: center;
  150. }
  151. .view-detail {
  152. color: #333333;
  153. font-size: 14px;
  154. margin-right: 8px;
  155. }
  156. .date {
  157. color: #b6b6b6;
  158. font-size: 14px;
  159. }
  160. }
  161. }
  162. .arrow-icon {
  163. color: #999999;
  164. font-size: 16px;
  165. margin-left: 12px;
  166. }
  167. }
  168. .message-item + .message-item {
  169. margin-top: 12px;
  170. }
  171. }
  172. }
  173. </style>