162 lines
3.9 KiB
Vue
162 lines
3.9 KiB
Vue
|
<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>
|