index.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <template>
  2. <el-container class="member">
  3. <el-aside>
  4. <el-scrollbar>
  5. <app-view>
  6. <template #header>
  7. <el-input v-model="filterText" placeholder="请输入好友" />
  8. </template>
  9. <el-tree ref="treeRef" :data="treeList" :filter-node-method="filterNode"
  10. :expand-on-click-node="false" highlight-current default-expand-all @node-click="onNodeClick" />
  11. </app-view>
  12. </el-scrollbar>
  13. </el-aside>
  14. <el-main>
  15. <el-scrollbar>
  16. <app-view>
  17. <template #header>
  18. <app-filter :options="filterOptons" :loading="loading" />
  19. </template>
  20. <!-- 表格数据 -->
  21. <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
  22. <!-- 手机号 -->
  23. <template #mobile="{ value }">
  24. {{ getPhoneNumber(value) }}
  25. </template>
  26. <!-- 是否已实名 -->
  27. <template #hasauth="{ value }">
  28. {{ getAuthStatusName(value) }}
  29. </template>
  30. <!-- 开户时间 -->
  31. <template #createtime="{ value }">
  32. {{ formatDate(value) }}
  33. </template>
  34. <template #footer>
  35. <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
  36. @change="onRefresh" />
  37. </template>
  38. </app-table>
  39. </app-view>
  40. </el-scrollbar>
  41. </el-main>
  42. </el-container>
  43. </template>
  44. <script lang="ts" setup>
  45. import { shallowRef, reactive, watch } from 'vue'
  46. import { ElMessage, ElTree } from 'element-plus'
  47. import { formatDate } from '@/filters'
  48. import { useDataTable, useDataFilter } from '@/hooks/datatable'
  49. import { queryTHJFriends, queryInvestorLevelGroup } from '@/services/api/common'
  50. import { useLoginStore, useUserStore } from '@/stores'
  51. import { decryptAES } from '@/utils/websocket/crypto'
  52. import AppTable from '@pc/components/base/table/index.vue'
  53. import AppFilter from '@pc/components/base/table-filter/index.vue'
  54. import AppPagination from '@pc/components/base/pagination/index.vue'
  55. interface TreeData {
  56. label: string;
  57. userid: number;
  58. children?: TreeData[];
  59. }
  60. const { getUserId } = useLoginStore()
  61. const { getAccountName } = useUserStore()
  62. const { dataList, total, pageIndex, pageSize } = useDataTable<Model.THJFriendsRsp>()
  63. const { filterOptons, getQueryParams } = useDataFilter<Model.THJFriendsReq>()
  64. const loading = shallowRef(false)
  65. const treeRef = shallowRef<InstanceType<typeof ElTree>>()
  66. const filterText = shallowRef('')
  67. const userId = shallowRef(getUserId()) // 当前用户ID
  68. const treeList = reactive<TreeData[]>([{
  69. label: getAccountName() ?? '登录用户',
  70. userid: userId.value,
  71. children: []
  72. }])
  73. const tableColumns = shallowRef<Model.TableColumn[]>([
  74. { prop: 'customername', label: '好友名称' },
  75. { prop: 'mobile', label: '手机号' },
  76. { prop: 'groupname', label: '客户等级' },
  77. { prop: 'hasauth', label: '是否已实名' },
  78. { prop: 'accoutstatus', label: '状态' },
  79. { prop: 'createtime', label: '开户时间' },
  80. ])
  81. filterOptons.selectList = [
  82. {
  83. label: '等级',
  84. key: 'levelgroupid',
  85. options: [],
  86. },
  87. ]
  88. filterOptons.inputList = [
  89. { label: '名称', keys: ['customername'] },
  90. ]
  91. filterOptons.buttonList = [
  92. { lable: '重置', onClick: () => onSearch(true) },
  93. { lable: '查询', className: 'el-button--primary', onClick: () => onSearch() }
  94. ]
  95. // 获取实名状态
  96. const getAuthStatusName = (status: number) => {
  97. switch (status) {
  98. case 1: {
  99. return '已认证'
  100. }
  101. case 2: {
  102. return '已提交'
  103. }
  104. case 3: {
  105. return '已拒绝'
  106. }
  107. default: {
  108. return '未认证'
  109. }
  110. }
  111. }
  112. // 获取手机号码
  113. const getPhoneNumber = (value: string) => {
  114. const phoneNumber = decryptAES(value)
  115. if (userId.value == getUserId()) {
  116. return phoneNumber
  117. }
  118. const reg = /^(\d{3})\d{4}(\d{4})$/
  119. return phoneNumber?.replace(reg, '$1****$2')
  120. }
  121. const getTHJFriends = (params: Partial<Model.THJFriendsReq> = {}) => {
  122. loading.value = true
  123. return queryTHJFriends({
  124. data: {
  125. userid: userId.value,
  126. page: pageIndex.value,
  127. pagesize: pageSize.value,
  128. ...params
  129. },
  130. success: (res) => {
  131. total.value = res.total
  132. dataList.value = res.data
  133. if (treeList[0].children?.length === 0) {
  134. treeList[0].children = res.data.map((e) => ({
  135. label: e.customername,
  136. userid: e.frienduserid,
  137. }))
  138. }
  139. },
  140. complete: () => {
  141. loading.value = false
  142. }
  143. })
  144. }
  145. // 当节点被点击的时候触发
  146. const onNodeClick = ({ userid }: TreeData) => {
  147. if (userId.value !== userid) {
  148. userId.value = userid
  149. onSearch()
  150. }
  151. }
  152. // 过滤树节点
  153. const filterNode = (value: string, data: TreeData) => {
  154. if (value) {
  155. return data.label.includes(value)
  156. }
  157. return true
  158. }
  159. const onSearch = (clear = false) => {
  160. getQueryParams((qs) => {
  161. pageIndex.value = 1
  162. getTHJFriends(qs)
  163. }, clear)
  164. }
  165. const onRefresh = () => {
  166. getQueryParams((qs) => {
  167. getTHJFriends(qs).catch((err) => ElMessage.error(err))
  168. })
  169. }
  170. queryInvestorLevelGroup({
  171. success: (res) => {
  172. const [levelGroups] = filterOptons.selectList
  173. levelGroups.options = res.data.map((e) => ({
  174. label: e.groupname,
  175. value: e.levelgroupid
  176. }))
  177. }
  178. })
  179. onRefresh()
  180. watch(filterText, (val) => {
  181. treeRef.value?.filter(val)
  182. })
  183. </script>
  184. <style lang="less">
  185. @import './index.less';
  186. </style>