balance.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <template>
  2. <div class="w-full min-h-[70vh] bg-page pt-6">
  3. <div class="main-container flex justify-between" >
  4. <sidebar></sidebar>
  5. <div class="ml-[20px] px-[20px] py-[30px] flex-1 bg-[#fff]" v-loading="balanceTableData.loading">
  6. <div class="text-[18px] text-[#333] mb-[30px]">{{t('myBalance')}}</div>
  7. <div class="text-center mb-[40px]">
  8. <div class="text-[32px] text-[#333] font-600 mb-[10px]">{{ memberStore.info ? moneyFormat((parseFloat(memberStore.info.balance) + parseFloat(memberStore.info.money)).toString()) : '0.00' }}</div>
  9. <div class="text-[#999] text-[14px]">账户余额(元)</div>
  10. </div>
  11. <div class="flex flex-wrap">
  12. <div v-for="(item,index) in accountTypeList" :key="index" class="cursor-pointer relative text-[16px] mr-[50px] text-[#666] flex items-center justify-center" :class="{'class-select': item.key == balanceTableData.params.trade_type}" @click="fromTypeFn(item.key)">{{item.name}}</div>
  13. </div>
  14. <div v-if="balanceTableData.data.length && !balanceTableData.loading">
  15. <div class="pt-[20px] px-[20px] rounded-[12px] min-h-[63%] mt-[30px] bg-[#fafafa]" >
  16. <div >
  17. <div class="flex items-center justify-between mb-[20px] border-b-[1px] border-dashed border-[#eee]" v-for="(item,index) in balanceTableData.data" :key="index">
  18. <div>
  19. <div class="font-[16px] mb-[14px] text-[#333]">{{ item.from_type_name }}</div>
  20. <div class="text-[14px] text-[#999] mb-[20px]">{{ item.create_time }}</div>
  21. </div>
  22. <div class="text-right">
  23. <div class="mb-[14px] text-[18px] price-font" :class="{'text-[#EF000C]' :item.account_data > 0, 'text-[#03B521]':item.account_data <= 0}">{{ item.account_data > 0 ? '+' + item.account_data : item.account_data }}</div>
  24. <div class="text-[14px] text-[#999] mb-[20px]">余额 {{item.account_sum}}</div>
  25. </div>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="mt-[30px] flex justify-center">
  30. <el-pagination v-model:current-page="balanceTableData.page" v-model:page-size="balanceTableData.limit" layout="prev, pager, next" background hide-on-single-page :total="balanceTableData.total" @size-change="loadBalanceList()" @current-change="loadBalanceList" />
  31. </div>
  32. </div>
  33. <div v-if="!balanceTableData.data.length && !balanceTableData.loading">
  34. <el-empty description="暂无数据" :image-size="200" :image="img('static/resource/images/system/empty.png')"/>
  35. </div>
  36. </div>
  37. </div>
  38. </div>
  39. </template>
  40. <script lang="ts" setup>
  41. import { reactive, ref } from 'vue'
  42. import useMemberStore from '@/stores/member'
  43. import { moneyFormat } from '@/utils/common'
  44. import { getBalanceListAll } from '@/app/api/member'
  45. const memberStore = useMemberStore()
  46. //获取数据来源类型
  47. const accountTypeList = ref([
  48. {name:'全部',key:''},
  49. {name:'收入',key:'income'},
  50. {name:'支出',key:'disburse'},
  51. {name:'提现',key:'cash_out'},
  52. ])
  53. // 获取会员列表
  54. const balanceTableData = reactive<any>({
  55. page: 1,
  56. limit: 10,
  57. total: 0,
  58. loading: true,
  59. data: [],
  60. params:{
  61. trade_type:''
  62. }
  63. })
  64. const loadBalanceList = (page: number = 1) => {
  65. balanceTableData.loading = true
  66. balanceTableData.page = page
  67. getBalanceListAll({
  68. page: balanceTableData.page,
  69. limit: balanceTableData.limit,
  70. ...balanceTableData.params
  71. }).then(res => {
  72. balanceTableData.loading = false
  73. balanceTableData.data = res.data.data
  74. balanceTableData.total = res.data.total
  75. }).catch(() => {
  76. balanceTableData.loading = false
  77. })
  78. }
  79. loadBalanceList()
  80. // 分类点击
  81. const fromTypeFn = (key: string)=>{
  82. balanceTableData.params.trade_type = key
  83. loadBalanceList()
  84. }
  85. </script>
  86. <style lang="scss" scoped>
  87. .text-color{
  88. color: var(--jjext-color-brand);
  89. }
  90. .class-select{
  91. color: var( --el-color-primary);
  92. &::after{
  93. background: #e93323;
  94. content: "";
  95. height: 2px;
  96. position: absolute;
  97. top: 31px;
  98. width: 22px;
  99. }
  100. }
  101. </style>