style: Update UserCard.vue to include user subscription counts and user management actions

This commit is contained in:
jxxghp
2024-08-18 11:44:34 +08:00
parent cca3368d8f
commit fc61f3fca1
3 changed files with 94 additions and 28 deletions
+19
View File
@@ -0,0 +1,19 @@
import store from '@/store'
// 检查是否有权限
export function hasPermission(permission: string | null = null) {
if (!permission) return true
// permission是一个以.分隔的字符串,例如:'user.create'
const permissionList = permission.split('.')
let permissions_obj = store.state.auth.permissions
for (const element of permissionList) {
if (!permissions_obj[element]) {
return false
} else if (typeof permissions_obj[element] === 'object') {
permissions_obj = permissions_obj[element]
} else {
return true
}
}
return false
}
+74 -7
View File
@@ -1,19 +1,86 @@
<script setup lang="ts"> <script setup lang="ts">
import { User } from '@/api/types' import api from '@/api'
import { Subscribe, User } from '@/api/types'
import store from '@/store'
import avatar1 from '@images/avatars/avatar-1.png' import avatar1 from '@images/avatars/avatar-1.png'
import { useToast } from 'vue-toast-notification'
import { useConfirm } from 'vuetify-use-dialog'
import { hasPermission } from '@/@core/utils/permission'
// 定义输入变量 // 定义输入变量
defineProps({ const props = defineProps({
user: { user: {
type: Object as PropType<User>, type: Object as PropType<User>,
required: true, required: true,
}, },
}) })
// 当前用户名称
const currentUser = store.state.auth.userName
// 定义触发的自定义事件
const emit = defineEmits(['remove'])
// 确认框
const createConfirm = useConfirm()
// 提示框
const $toast = useToast()
// 用户电影订阅数量 // 用户电影订阅数量
const movieSubscriptions = 0 const movieSubscriptions = ref(0)
// 用户电视剧订阅数量 // 用户电视剧订阅数量
const tvShowSubscriptions = 0 const tvShowSubscriptions = ref(0)
// 按用户查询订阅数量
async function fetchSubscriptions() {
try {
const result: Subscribe[] = await api.get(`subscribe/user/${props.user.name}`)
if (result) {
movieSubscriptions.value = result.filter(item => item.type === '电影').length
tvShowSubscriptions.value = result.filter(item => item.type === '电视剧').length
}
} catch (error) {
console.log(error)
}
}
// 删除用户
async function removeUser() {
try {
const isConfirmed = await createConfirm({
title: '确认',
content: `删除用户 ${props.user?.name} 的所有数据,是否确认?`,
})
if (!isConfirmed) return
const result: { [key: string]: any } = await api.delete(`user/${props.user.id}`)
if (result.success) {
$toast.success('用户删除成功')
emit('remove')
} else {
$toast.error('用户删除失败!')
}
} catch (error) {
console.log(error)
}
}
// 计算是否有用户编辑权限
const canEditUser = computed(() => {
if (props.user.is_superuser) return true
return hasPermission('admin') || hasPermission('usermanage')
})
// 计算是否有用户管理权限
const canManageUser = computed(() => {
if (props.user.name == currentUser) return false
return canEditUser
})
onMounted(() => {
fetchSubscriptions()
})
</script> </script>
<template> <template>
<VCard> <VCard>
@@ -68,9 +135,9 @@ const tvShowSubscriptions = 0
</VList> </VList>
</VCardText> </VCardText>
<VCardText class="flex flex-row justify-center"> <VCardText class="flex flex-row justify-center">
<VBtn color="primary" class="me-4">编辑</VBtn> <VBtn v-if="canEditUser" color="primary" class="me-4">编辑</VBtn>
<VBtn color="info" class="me-4" variant="outlined">权限</VBtn> <VBtn v-if="canEditUser" color="info" class="me-4" variant="outlined"> 权限 </VBtn>
<VBtn color="error" variant="outlined">删除</VBtn> <VBtn v-if="canManageUser" color="error" variant="outlined" @click="removeUser"> 删除 </VBtn>
</VCardText> </VCardText>
</VCard> </VCard>
</template> </template>
+1 -21
View File
@@ -12,6 +12,7 @@ import store from '@/store'
import { SystemNavMenus } from '@/router/menu' import { SystemNavMenus } from '@/router/menu'
import { NavMenu } from '@/@layouts/types' import { NavMenu } from '@/@layouts/types'
import { useDisplay } from 'vuetify' import { useDisplay } from 'vuetify'
import { hasPermission } from '@/@core/utils/permission'
const display = useDisplay() const display = useDisplay()
const appMode = computed(() => { const appMode = computed(() => {
@@ -21,27 +22,6 @@ const appMode = computed(() => {
// 是否超级用户 // 是否超级用户
let superUser = store.state.auth.superUser let superUser = store.state.auth.superUser
// 用户权限
const permissions = store.state.auth.permissions
// 检查是否有权限
function hasPermission(permission: string | null = null) {
if (!permission) return true
// permission是一个以.分隔的字符串,例如:'user.create'
const permissionList = permission.split('.')
let permissions_obj = permissions
for (const element of permissionList) {
if (!permissions_obj[element]) {
return false
} else if (typeof permissions_obj[element] === 'object') {
permissions_obj = permissions_obj[element]
} else {
return true
}
}
return false
}
// 开始菜单项 // 开始菜单项
const startMenus = ref<NavMenu[]>([]) const startMenus = ref<NavMenu[]>([])