index.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <template>
  2. <view class="balance">
  3. <!-- <view class="date_picker">
  4. <picker mode="date" :value="selectedDate" fields="month" @change="_bindDateChange">
  5. <view>{{ formattedDate }}</view>
  6. </picker>
  7. </view> -->
  8. <view class="balance_list">
  9. <!-- <view class="balance_date">2025年1月</view> -->
  10. <view class="balance_item" @click="_goDetail(item.id)" v-for="(item, index) in balanceList" :key="item.id">
  11. <view class="balance_item_left">
  12. <view style="margin-bottom: 10rpx"
  13. >{{ item.type_state }} <text v-if="item.state" style="font-size: 20rpx">({{ item.state }})</text>
  14. </view>
  15. <view>{{ item.insert_time }}</view>
  16. </view>
  17. <view class="balance_item_right">
  18. <view class="price">{{ item.prefix == 1 ? "+" : "-" }}{{ item.amount }}</view>
  19. <view>余额:{{ item.balance }}</view>
  20. </view>
  21. </view>
  22. </view>
  23. <Empty v-if="balanceList.length == 0 && !isReqing" text="----- 还没有记录啦 -----" />
  24. <view class="to_bottom" v-if="isLast && balanceList.length"> -----到底啦-----</view>
  25. </view>
  26. </template>
  27. <script setup>
  28. import { ref, computed, onMounted } from "vue";
  29. import { onReachBottom, onPullDownRefresh } from "@dcloudio/uni-app";
  30. import Empty from "@/components/Empty/Empty.vue";
  31. import http from "@/utils/request";
  32. const selectedDate = ref("请选择日期");
  33. const balanceList = ref([]);
  34. const page = ref(1);
  35. const pageSize = ref(15);
  36. const isLast = ref(false);
  37. const isReqing = ref(false);
  38. const _bindDateChange = (e) => {
  39. selectedDate.value = e.detail.value;
  40. };
  41. onMounted(() => {
  42. _getBalacnelist();
  43. });
  44. const _goDetail = (record_id) => {
  45. uni.navigateTo({
  46. url: `/pages/balance/detail?record_id=${record_id}`,
  47. });
  48. };
  49. const _getBalacnelist = async () => {
  50. if (isReqing.value) return;
  51. isReqing.value = true;
  52. try {
  53. const callback = await http.request("api/custom_amount/get_record_list", { page: page.value, limit: pageSize.value });
  54. if (callback.code == "success") {
  55. if (callback.data.last_page <= page.value) isLast.value = true;
  56. const balanceListData = callback.data.data || [];
  57. balanceList.value = [...balanceList.value, ...balanceListData];
  58. }
  59. } finally {
  60. isReqing.value = false;
  61. }
  62. };
  63. onReachBottom(async () => {
  64. console.log("上拉加载");
  65. if (isLast.value || isReqing.value) return;
  66. page.value += 1;
  67. await _getBalacnelist();
  68. });
  69. onPullDownRefresh(async () => {
  70. page.value = 1;
  71. balanceList.value = [];
  72. isLast.value = false;
  73. await _getBalacnelist();
  74. uni.stopPullDownRefresh();
  75. });
  76. const formattedDate = computed(() => {
  77. if (selectedDate.value === "请选择日期") {
  78. return selectedDate.value;
  79. }
  80. const [year, month] = selectedDate.value.split("-");
  81. return `${year}年${parseInt(month)}月`;
  82. });
  83. </script>
  84. <style scoped lang="less">
  85. .balance {
  86. padding: 36rpx;
  87. box-sizing: border-box;
  88. width: 100vw;
  89. .date_picker {
  90. padding: 0 16rpx;
  91. border: 1px solid #e5e5e5;
  92. width: 250rpx;
  93. height: 60rpx;
  94. line-height: 60rpx;
  95. margin-bottom: 40rpx;
  96. }
  97. .balance_list {
  98. .balance_date {
  99. font-weight: bold;
  100. padding-bottom: 20rpx;
  101. border-bottom: 2rpx solid #ddd;
  102. }
  103. .balance_item {
  104. padding-bottom: 20rpx;
  105. display: flex;
  106. justify-content: space-between;
  107. align-items: center;
  108. border-bottom: 1px solid #ddd;
  109. .balance_item_left,
  110. .balance_item_right {
  111. display: flex;
  112. flex-direction: column;
  113. font-size: 26rpx;
  114. padding-top: 20rpx;
  115. }
  116. .balance_item_right {
  117. align-items: flex-end;
  118. > .price {
  119. font-weight: bold;
  120. margin-bottom: 10rpx;
  121. &.red {
  122. color: #ff0000;
  123. }
  124. &.green {
  125. color: #00ff00;
  126. }
  127. }
  128. }
  129. }
  130. }
  131. }
  132. </style>