group-member-table.vue
5.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import useLoading from '@/hooks/loading';
import { AnyObject } from '@/types/global';
import UserTableColumn from '@/components/filter/user-table-column.vue';
import EnumTableColumn from '@/components/filter/enum-table-column.vue';
import PhoneTableColumn from '@/components/filter/phone-table-column.vue';
import { TableData } from '@arco-design/web-vue';
import { useRoute, useRouter } from 'vue-router';
import useUserApi, { useMemberApi } from '@/http/user';
import { createModalVNode } from '@/utils/createVNode';
import { isArray } from '@/utils/is';
import usePermission from '@/hooks/permission';
const router = useRouter();
const props = defineProps<{ userKey: number }>();
const tableRef = ref();
const filter = ref<AnyObject>({});
const { loading, setLoading } = useLoading(false);
const total = ref(0);
const { officialStatusOption, statusOption, scopeOption, sexOption } = useUserApi;
const { get, destroy } = useMemberApi;
const onQuery = async (params?: AnyObject) => {
setLoading(true);
get(props.userKey, { pageSize: 1 }).then(({ meta }) => (total.value = meta.total));
return get(props.userKey, { ...filter.value, ...params, sortBy: 'id', sortType: 'desc' }).finally(() => setLoading(false));
};
const onRowClick = (record: TableData) => {
const identity = record.member?.identity || 0;
if (identity) {
router.push({ name: 'user-register-show', params: { id: record.member_id } });
}
if ([2, 3].includes(identity)) {
router.push({ name: 'user-business-show', params: { id: record.member_id } });
}
router.push({ name: 'user-register-show', params: { id: record.member_id } });
};
const onSearch = () => tableRef.value?.onPageChange(1);
const onReset = () => {
filter.value = {
member_nick_name: '',
member_email_like: '',
member_phone_like: '',
member_official_status: '',
member_status: '',
};
onSearch();
};
const onDelete = (record: TableData) =>
createModalVNode(`确认移除此用户?`, {
title: '删除操作',
onBeforeOk: (done: any) =>
destroy(record.member_id)
.then(() => {
tableRef.value?.onFetch();
done(true);
})
.catch(() => done(false)),
});
onMounted(() => onReset());
defineExpose({ total });
const routeName = useRoute().name as string;
const checkPermission = (permission: string | string[]): boolean => {
permission = isArray(permission) ? permission.map((item) => `${routeName}-${item}`) : `${routeName}-${permission}`;
return usePermission().checkPermission(permission);
};
</script>
<template>
<a-card :bordered="false">
<filter-search :model="filter" :loading="loading" @search="onSearch" @reset="onReset">
<filter-search-item field="member_nick_name" label="用户艺名">
<a-input v-model="filter.member_nick_name" allow-clear placeholder="请输入" />
</filter-search-item>
<filter-search-item field="member_email_like" label="用户邮箱">
<a-input v-model="filter.member_email_like" allow-clear placeholder="请输入" />
</filter-search-item>
<filter-search-item field="member_phone_like" label="手机号码">
<a-input v-model="filter.member_phone_like" allow-clear placeholder="请输入" />
</filter-search-item>
<filter-search-item field="member_official_status" label="关注服务号">
<a-select v-model="filter.member_official_status" :options="officialStatusOption" placeholder="请输入" allow-clear />
</filter-search-item>
<filter-search-item field="member_status" label="状态">
<a-select v-model="filter.member_status" :options="statusOption" placeholder="请输入" allow-clear />
</filter-search-item>
</filter-search>
<filter-table ref="tableRef" :loading="loading" :on-query="onQuery" hover-type="pointer" @row-click="onRowClick">
<user-table-column title="用户艺名" data-index="member_id" user="member" :width="260" show-avatar />
<enum-table-column title="性别" data-index="member.sex" :option="sexOption" :dark-value="0" :width="70" />
<filter-table-column title="用户邮箱" data-index="member.email" :width="170" />
<phone-table-column title="手机号码" data-index="member.phone" area-index="member.area_code" :width="160" />
<enum-table-column title="权限" data-index="member.scope" :option="scopeOption" :dark-value="0" :width="120" />
<enum-table-column
title="关注服务号"
data-index="member.official_status"
:option="officialStatusOption"
:dark-value="0"
:width="120"
/>
<enum-table-column title="状态" data-index="member.status" :option="statusOption" :width="80" />
<a-table-column v-if="checkPermission('member-delete')" title="操作" data-index="operation" :width="100">
<template #cell="{ record }">
<a-link v-if="checkPermission('member-delete')" @click.stop="onDelete(record)">删除</a-link>
</template>
</a-table-column>
</filter-table>
</a-card>
</template>
<style scoped lang="less"></style>