Industrial-image-management.../src/views/system/user/components/UserRoleModal.vue

162 lines
3.9 KiB
Vue
Raw Normal View History

2025-06-27 19:54:42 +08:00
<template>
<a-modal
v-model:visible="modalVisible"
title="分配角色"
:width="600"
@ok="handleSubmit"
@cancel="handleCancel"
>
<div v-if="userData" class="user-info">
<a-descriptions :column="2" bordered size="small">
<a-descriptions-item label="用户">{{ userData.name }}{{ userData.account }}</a-descriptions-item>
<a-descriptions-item label="部门">{{ userData.deptName || '-' }}</a-descriptions-item>
</a-descriptions>
</div>
<div class="role-section">
<h4>选择角色</h4>
<a-checkbox-group v-model="selectedRoles" direction="vertical" style="width: 100%">
<a-checkbox
v-for="role in availableRoles"
:key="role.value"
:value="role.value"
style="margin-bottom: 8px; display: block;"
>
<span class="role-item">
<span class="role-name">{{ role.label }}</span>
<span class="role-desc">{{ role.description || '暂无描述' }}</span>
</span>
</a-checkbox>
</a-checkbox-group>
</div>
</a-modal>
</template>
<script setup lang="ts">
import { ref, watch, computed, onMounted } from 'vue'
import { Message } from '@arco-design/web-vue'
import { bindUserRole } from '@/apis/system/user-new'
interface Props {
visible: boolean
userData?: any
}
const props = withDefaults(defineProps<Props>(), {
visible: false,
userData: null
})
const emit = defineEmits<{
'update:visible': [visible: boolean]
success: []
}>()
const modalVisible = computed({
get: () => props.visible,
set: (value) => emit('update:visible', value)
})
const selectedRoles = ref<string[]>([])
// 模拟角色数据实际应该从API获取
const availableRoles = ref([
{ value: 'admin', label: '系统管理员', description: '拥有系统所有权限' },
{ value: 'manager', label: '部门经理', description: '管理本部门相关业务' },
{ value: 'employee', label: '普通员工', description: '基础员工权限' },
{ value: 'hr', label: '人事专员', description: '人力资源相关权限' },
{ value: 'finance', label: '财务专员', description: '财务相关权限' }
])
// 监听用户数据变化,初始化已选角色
watch(() => props.userData, (newData) => {
if (newData && newData.roleIds) {
selectedRoles.value = [...newData.roleIds]
} else {
selectedRoles.value = []
}
}, { immediate: true })
// 监听弹窗显示状态
watch(() => props.visible, (visible) => {
if (visible && props.userData) {
selectedRoles.value = props.userData.roleIds ? [...props.userData.roleIds] : []
}
})
const handleSubmit = async () => {
try {
if (!props.userData) {
Message.error('用户信息不存在')
return false
}
await bindUserRole({
userId: props.userData.userId,
roleIds: selectedRoles.value
})
Message.success('角色分配成功')
emit('success')
modalVisible.value = false
return true
} catch (error) {
console.error('角色分配失败:', error)
Message.error('角色分配失败')
return false
}
}
const handleCancel = () => {
modalVisible.value = false
}
// 这里可以添加获取角色列表的API调用
const loadRoles = async () => {
// 实际项目中应该调用角色列表API
// const response = await getRoleList()
// availableRoles.value = response.data
}
onMounted(() => {
loadRoles()
})
</script>
<style scoped lang="scss">
.user-info {
margin-bottom: 20px;
}
.role-section {
h4 {
margin-bottom: 12px;
color: #1d2129;
font-weight: 500;
}
}
.role-item {
display: flex;
flex-direction: column;
.role-name {
font-weight: 500;
color: #1d2129;
}
.role-desc {
font-size: 12px;
color: #86909c;
margin-top: 2px;
}
}
:deep(.arco-checkbox) {
align-items: flex-start;
.arco-checkbox-icon {
margin-top: 2px;
}
}
</style>