UserDetail.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <template>
  2. <el-drawer v-model="drawer" :title="dialogTitle" size="50%">
  3. <div>
  4. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
  5. <el-tab-pane :label="t('mall.userInfo')" name="first">
  6. <el-descriptions :title="t('mall.basicInfo')" :column="2">
  7. <el-descriptions-item :label="t('mall.userAvatar')"><el-image style="width: 50px; height: 50px" :src="DetailData.avatar" /></el-descriptions-item>
  8. <el-descriptions-item :label="t('mall.userNickname')">{{ DetailData.nickname }}</el-descriptions-item>
  9. <el-descriptions-item :label="t('mall.balance')">{{ DetailData.nowMoney }}</el-descriptions-item>
  10. <el-descriptions-item :label="t('mall.birthday')">{{ DetailData.birthday }}</el-descriptions-item>
  11. <el-descriptions-item :label="t('mall.phoneNumber')">{{ DetailData.mobile }}</el-descriptions-item>
  12. <el-descriptions-item :label="t('mall.idCardNumber')">{{ DetailData.cardId }}</el-descriptions-item>
  13. </el-descriptions>
  14. <el-descriptions :title="t('mall.userOverview')" :column="2">
  15. <el-descriptions-item :label="t('mall.boundMembershipCard')">{{ DetailData.cardName ? DetailData.cardName : t('public.none') }}</el-descriptions-item>
  16. <el-descriptions-item :label="t('mall.points')">{{ DetailData.integral }}</el-descriptions-item>
  17. <el-descriptions-item :label="t('mall.commissionAmount')">{{ DetailData.brokeragePrice }}</el-descriptions-item>
  18. <el-descriptions-item :label="t('mall.consecutiveSignInDays')">{{ DetailData.signNum }}</el-descriptions-item>
  19. <el-descriptions-item :label="t('mall.loginIp')">{{ DetailData.loginIp }}</el-descriptions-item>
  20. <el-descriptions-item :label="t('mall.userLevel')">{{ DetailData.level }}</el-descriptions-item>
  21. <el-descriptions-item :label="t('mall.promotionId')">{{ DetailData.spreadUid }}</el-descriptions-item>
  22. <el-descriptions-item :label="t('mall.purchaseCount')">{{ DetailData.payCount }}</el-descriptions-item>
  23. <el-descriptions-item :label="t('mall.subordinateCount')">{{ DetailData.spreadCount }}</el-descriptions-item>
  24. <el-descriptions-item :label="t('mall.loginType')">{{ DetailData.loginType }}</el-descriptions-item>
  25. <el-descriptions-item :label="t('mall.registrationTime')">{{ formatDate(DetailData.createTime) }}</el-descriptions-item>
  26. </el-descriptions>
  27. </el-tab-pane>
  28. <el-tab-pane :label="t('mall.consumptionRecord')" name="second">
  29. <el-table :data="list">
  30. <el-table-column :label="t('mall.expenseOrGain')" align="center" prop="pm">
  31. <template #default="scope">
  32. <span v-if="scope.row.pm == 0">{{t('mall.expense')}}</span>
  33. <span v-else-if="scope.row.category == 1">{{t('mall.gain')}}</span>
  34. <span v-else>{{t('mall.unknown')}}</span>
  35. </template>
  36. </el-table-column>
  37. <el-table-column :label="t('mall.billTitle')" align="center" prop="title" />
  38. <el-table-column :label="t('mall.detailCategory')" align="center" prop="category">
  39. <template #default="scope">
  40. <span v-if="scope.row.category == 'now_money'">{{t('mall.balance')}}</span>
  41. <span v-else-if="scope.row.category == 'integral'">{{t('mall.points')}}</span>
  42. <span v-else>{{t('mall.unknown')}}</span>
  43. </template>
  44. </el-table-column>
  45. <el-table-column :label="t('mall.detailType')" align="center" prop="type">
  46. <template #default="scope">
  47. <span v-if="scope.row.type == 'recharge'">{{t('mall.recharge')}}</span>
  48. <span v-else-if="scope.row.type == 'brokerage'">{{t('mall.rebate')}}</span>
  49. <span v-else-if="scope.row.type == 'pay_product'">{{t('mall.consumption')}}</span>
  50. <span v-else-if="scope.row.type == 'extract'">{{t('mall.withdrawal')}}</span>
  51. <span v-else-if="scope.row.type == 'pay_product_refund'">{{t('mall.refund')}}</span>
  52. <span v-else-if="scope.row.type == 'system_add'">{{t('mall.systemAdd')}}</span>
  53. <span v-else-if="scope.row.type == 'system_sub'">{{t('mall.systemReduce')}}</span>
  54. <span v-else-if="scope.row.type == 'deduction'">{{t('mall.subtract')}}</span>
  55. <span v-else-if="scope.row.type == 'gain'">{{t('mall.reward')}}</span>
  56. <span v-else-if="scope.row.type == 'sign'">{{t('mall.signIn')}}</span>
  57. <span v-else-if="scope.row.type == 'vip_card'">{{t('mall.membershipCard')}}</span>
  58. <span v-else>未知</span>
  59. </template>
  60. </el-table-column>
  61. <el-table-column :label="t('mall.detailAmountYuan')" align="center" prop="number">
  62. <template #default="scope">
  63. <span v-if="scope.row.pm == 1">+</span>
  64. <span v-else>-</span>
  65. <span>{{ scope.row.number }}</span>
  66. </template>
  67. </el-table-column>
  68. <el-table-column :label="t('mall.remainingYuan')" align="center" prop="balance" />
  69. <el-table-column :label="t('public.remark')" align="center" prop="mark" width="200" />
  70. <el-table-column
  71. :label="t('public.addTime')"
  72. align="center"
  73. prop="createTime"
  74. :formatter="dateFormatter"
  75. width="100"
  76. />
  77. </el-table>
  78. <!-- 分页 -->
  79. <Pagination
  80. :total="total"
  81. v-model:page="queryParams.pageNo"
  82. v-model:limit="queryParams.pageSize"
  83. @pagination="getList"
  84. />
  85. </el-tab-pane>
  86. </el-tabs>
  87. </div>
  88. </el-drawer>
  89. </template>
  90. <script setup lang="ts">
  91. import * as UserApi from '@/api/member/user'
  92. import { formatDate } from '@/utils/formatTime'
  93. import type { TabsPaneContext } from 'element-plus'
  94. import * as UserBillApi from '@/api/member/userBill'
  95. import { dateFormatter } from '@/utils/formatTime'
  96. const { t } = useI18n() // 国际化
  97. // const message = useMessage() // 消息弹窗
  98. const dialogTitle = ref('') // 弹窗的标题
  99. const drawer = ref(false)
  100. const DetailData = ref({})
  101. const activeName = ref('first')
  102. const total = ref(0) // 列表的总页数
  103. const list = ref([]) // 列表的数据
  104. const queryParams = reactive({
  105. pageNo: 1,
  106. pageSize: 10,
  107. uid: null,
  108. linkId: null,
  109. pm: null,
  110. title: null,
  111. category: null,
  112. type: null,
  113. number: null,
  114. balance: null,
  115. mark: null,
  116. createTime: [],
  117. status: null
  118. })
  119. /** 打开弹窗 */
  120. const open = async (type: string, id?: number) => {
  121. drawer.value = true
  122. dialogTitle.value = t('action.' + type)
  123. DetailData.value = await UserApi.getUser(id)
  124. queryParams.uid = id
  125. getList()
  126. }
  127. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  128. const handleClick = (tab: TabsPaneContext, event: Event) => {
  129. console.log(tab.paneName, event)
  130. // queryParams.pageNo = 1
  131. // queryParams.type = tab.paneName
  132. //getList()
  133. }
  134. /** 查询列表 */
  135. const getList = async () => {
  136. try {
  137. const data = await UserBillApi.getUserBillPage(queryParams)
  138. list.value = data.list
  139. total.value = data.total
  140. } finally {
  141. loading.value = false
  142. }
  143. }
  144. </script>
  145. <style scoped>
  146. </style>