index.vue 3.7 KB

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