index.vue
5.38 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
129
130
<script setup lang="ts" name="user-show">
import { computed, onBeforeMount, ref, watch } from 'vue';
import useUserApi from '@/http/user';
import { onBeforeRouteLeave, useRoute } from 'vue-router';
import BasicCard from '@/views/user/info/components/basic-card.vue';
import ListenActivityTable from '@/views/user/info/components/listen-activity-table.vue';
import LikeActivityTable from '@/views/user/info/components/like-activity-table.vue';
import PublishActivityTable from '@/views/user/info/components/publish-activity-table.vue';
import SubmitActivityTable from '@/views/user/info/components/submit-activity-table.vue';
import ManageProjectTable from '@/views/user/info/components/manage-project-table.vue';
import ManageActivityTable from '@/views/user/info/components/manage-activity-table.vue';
import GroupMemberTable from '@/views/user/info/components/group-member-table.vue';
import DemoActivityTable from '@/views/audition/demo/index.vue';
import useLoading from '@/hooks/loading';
import { User } from '@/utils/model';
import { useRouteQuery } from '@vueuse/router';
import usePermission from '@/hooks/permission';
import { isArray } from '@/utils/is';
import useActivityApi from '@/http/activity';
const userId = Number(useRoute().params?.id);
const user = ref({ identity: 0, scope: 0 });
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);
};
const { loading, setLoading } = useLoading(true);
const tabKeys = computed((): string[] => {
const keys = ['listen-activity', 'like-activity', 'submit-activity', 'manage-activity', 'member', 'demo'];
if ([1, 2].includes(user.value.scope)) {
keys.push('publish-activity');
}
if ([2].includes(user.value.scope)) {
keys.push('project');
}
return keys.filter((item) => checkPermission(item));
});
const tabKey = useRouteQuery('tabKey', tabKeys.value[0] || '');
const listenRef = ref();
const likeRef = ref();
const submitRef = ref();
const activityRef = ref();
const groupMemberRef = ref();
const publishRef = ref();
const projectRef = ref();
const count = ref({ demo: 0 });
watch(
() => tabKeys.value,
() => (tabKeys.value.includes(tabKey.value) ? undefined : (tabKey.value = tabKeys.value[0] || ''))
);
onBeforeMount(() => {
useUserApi
.show(userId)
.then((data) => (user.value = data))
.finally(() => setLoading(false));
});
onBeforeRouteLeave((to, from) => {
if (from.meta.from === to.name) {
to.meta.reload = false;
}
});
const syncDemoCount = () =>
useActivityApi.get({ audit_status: 1, song_type: 2, user_id: userId, pageSize: 1 }).then(({ meta }) => {
count.value.demo = meta.total;
});
</script>
<template>
<page-view :loading="loading" has-bread>
<basic-card :user="user as User" />
<a-card v-if="tabKeys.length" :bordered="false" style="margin-top: 16px">
<a-tabs v-model:active-key="tabKey" type="rounded" :animation="true" size="small" :justify="true" :header-padding="false">
<a-tab-pane v-if="checkPermission('listen-activity')" key="listen-activity" :title="`试听歌曲(${listenRef?.total})`">
<listen-activity-table ref="listenRef" :user-key="userId" />
</a-tab-pane>
<a-tab-pane v-if="checkPermission('like-activity')" key="like-activity" :title="`收藏歌曲(${likeRef?.total})`">
<like-activity-table ref="likeRef" :user-key="userId" />
</a-tab-pane>
<a-tab-pane v-if="checkPermission('submit-activity')" key="submit-activity" :title="`试唱歌曲(${submitRef?.total})`">
<submit-activity-table ref="submitRef" :user-key="userId" />
</a-tab-pane>
<a-tab-pane v-if="checkPermission('manage-activity')" key="manage-activity" :title="`管理歌曲(${activityRef?.total})`">
<manage-activity-table ref="activityRef" :user-key="userId" />
</a-tab-pane>
<a-tab-pane v-if="checkPermission('member')" key="member" :title="`Ta的成员(${groupMemberRef?.total})`">
<group-member-table ref="groupMemberRef" :user-key="userId" />
</a-tab-pane>
<a-tab-pane
v-if="checkPermission('publish-activity') && tabKeys.includes('publish-activity')"
key="publish-activity"
:title="`发布歌曲(${publishRef?.total})`"
>
<publish-activity-table ref="publishRef" :user-key="userId" />
</a-tab-pane>
<a-tab-pane
v-if="checkPermission('project') && tabKeys.includes('project')"
key="project"
:title="`Ta的厂牌(${projectRef?.total})`"
>
<manage-project-table ref="projectRef" :user-key="userId" />
</a-tab-pane>
<a-tab-pane v-if="checkPermission('demo') && tabKeys.includes('demo')" key="demo" :title="`Ta的Demo(${count.demo})`">
<demo-activity-table
style="padding: 0"
:has-bread="false"
:init-filter="{ user_id: userId }"
:hide-search-item="['projectName', 'createdForm', 'userName', 'auditBetween']"
:query-hook="() => syncDemoCount()"
/>
</a-tab-pane>
</a-tabs>
</a-card>
</page-view>
</template>
<style scoped lang="less"></style>