index.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <!--
  2. * @Author: PoJun
  3. * @Date: 2023-09-28 10:38:11
  4. * @LastEditors: XuanJi
  5. * @LastEditTime: 2024-05-20 23:20:49
  6. * @Message: 消息, 认证、系统消息
  7. -->
  8. <template>
  9. <view class="message">
  10. <uv-empty v-if="dataList.length == 0 || !vuex_userInfo" mode="message" marginTop="200"></uv-empty>
  11. <view v-else>
  12. <view
  13. class="message-item"
  14. v-for="(item, index) in dataList"
  15. :key="index"
  16. @tap="itemClick(item)"
  17. hover-class="uv-hover-class"
  18. >
  19. <view class="uv-flex uv-row-between">
  20. <view class="uv-font-30 uv-flex">
  21. <view v-if="item.read == 0" class="uv-m-r-10">
  22. <uv-badge :isDot="true" type="error"></uv-badge>
  23. </view>
  24. <view>{{ item.type }}</view>
  25. </view>
  26. <view class="uv-font-24 uv-info">{{ item.gmtCreate }}</view>
  27. </view>
  28. <view class="uv-font-32 uv-weight-700 uv-m-t-20">{{ item.title }}</view>
  29. <view class="uv-font-28 uv-info uv-m-t-20">{{ item.content }}</view>
  30. </view>
  31. </view>
  32. <!-- 加载更多 -->
  33. <uv-load-more v-if="dataList.length > 10" :status="status" marginTop="20" line />
  34. <!-- 返回顶部 -->
  35. <uv-back-top :scroll-top="scrollTop" :iconStyle="iconStyle" :customStyle="customStyle"></uv-back-top>
  36. </view>
  37. </template>
  38. <script>
  39. import { getMessages, postReadAll, postReadMessage } from "@/config/http.js";
  40. export default {
  41. data() {
  42. return {
  43. dataList: [],
  44. status: "loadmore",
  45. page: {
  46. pageSize: 10,
  47. pageNum: 1,
  48. },
  49. scrollTop: 0,
  50. iconStyle: { color: "#fff" },
  51. customStyle: { background: "#4076F4" },
  52. };
  53. },
  54. onLoad() {
  55. this.getDataList();
  56. },
  57. methods: {
  58. refreshList() {
  59. this.page.pageNum = 1;
  60. this.getDataList();
  61. },
  62. itemClick(item) {
  63. if (item.read == 0) {
  64. this.setReadState(item.id);
  65. }
  66. // uni.navigateTo("/subpkg/home/message-detail" + item.id);
  67. uni.navigateTo({
  68. url: `/subpkg/home/message-detail?id=${item.id}`,
  69. });
  70. },
  71. async getDataList() {
  72. if (!this.vuex_userInfo) {
  73. return;
  74. }
  75. if (this.page.pageNum == 1) {
  76. this.dataList = [];
  77. }
  78. this.status = "loading";
  79. const data = {
  80. params: {
  81. pageSize: this.page.pageSize,
  82. pageNum: this.page.pageNum,
  83. query: { search: this.searchKey },
  84. },
  85. };
  86. try {
  87. const res = await getMessages(data);
  88. if (this.dataList.length == res.total) {
  89. this.status = "nomore";
  90. }
  91. this.dataList = this.dataList.concat(res.list);
  92. } finally {
  93. uni.stopPullDownRefresh();
  94. }
  95. },
  96. setReadState(id) {
  97. if (id) {
  98. const item = this.dataList.find(v => v.id == id);
  99. this.$set(item, "read", 1);
  100. postReadMessage([id]);
  101. } else {
  102. this.dataList.forEach(v => {
  103. this.$set(v, "read", 1);
  104. });
  105. postReadAll();
  106. }
  107. },
  108. },
  109. async onNavigationBarButtonTap() {
  110. uni.showLoading({ mask: true });
  111. this.setReadState();
  112. uni.hideLoading();
  113. },
  114. onPullDownRefresh() {
  115. if (!this.vuex_userInfo) {
  116. uni.stopPullDownRefresh();
  117. return;
  118. }
  119. this.refreshList();
  120. },
  121. onReachBottom() {
  122. if (this.status == "nomore") {
  123. return;
  124. }
  125. this.status = "loading";
  126. this.page.pageNum = ++this.page.pageNum;
  127. this.getDataList();
  128. },
  129. onPageScroll(e) {
  130. this.scrollTop = e.scrollTop;
  131. },
  132. watch: {
  133. vuex_userInfo: {
  134. deep: true,
  135. handler: function () {
  136. this.getDataList();
  137. },
  138. },
  139. },
  140. };
  141. </script>
  142. <style lang="scss">
  143. page {
  144. background-color: $uni-bg-color-grey;
  145. }
  146. .message {
  147. padding: 0 25rpx 25rpx;
  148. &-item {
  149. padding: 28rpx 20rpx;
  150. background-color: #fff;
  151. border-radius: 8px;
  152. margin-top: 12px;
  153. }
  154. }
  155. </style>