| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- <template>
- <el-drawer :title="title" v-model="drawerOpened" @close="reset">
- <el-form
- label-position="left"
- label-width="80px"
- :model="formData"
- :rules="formRules"
- ref="formInstance"
- >
- <el-form-item label="角色名称" prop="roleName">
- <el-input placeholder="角色名称" v-model="formData.roleName" />
- </el-form-item>
- <el-form-item label="角色权限">
- <PermissioTreenCard title="相机权限" :tree-data="cameraPermTreeData" ref="cameraCardInstance" />
- <PermissioTreenCard title="菜单权限" :tree-data="menuPermTreeData" ref="menuCardInstance" />
- <PermissioTreenCard title="功能权限" :tree-data="funcPermTreeData" ref="funcCardInstance" />
- </el-form-item>
- <el-form-item label="备注" prop="remark">
- <el-input type="textarea" placeholder="备注" v-model="formData.remark" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="reset">重置</el-button>
- <el-button type="primary" @click="submit">提交</el-button>
- </template>
- </el-drawer>
- </template>
- <script setup lang="ts">
- import { reactive, ref, computed, toRaw } from 'vue';
- import PermissioTreenCard from './PermissionTreeCard.vue';
- import { RoleForm, Role, AssignedPermissions } from '@/types/role/type';
- import { FormRules, FormInstance, ElMessage } from 'element-plus';
- import useMenuPermTree from '../hooks/useMenuPermissionTree';
- import useFuncPermTree from '../hooks/useFunctionPermissionTree';
- import useCameraPermTree from '../hooks/useCameraPermissionTree';
- import { createRole, editRole, getAssignedPerms } from '@/api/system/role';
- import { PermissionTreeKey } from '@/types/permission/type';
- defineProps<{
- title: string;
- }>();
- const emits = defineEmits<{
- (e: 'submitted'): void; // 提交之后触发的事件
- }>();
- const { cameraPermTreeData } = useCameraPermTree();
- const { menuPermTreeData } = useMenuPermTree();
- const { funcPermTreeData} = useFuncPermTree();
- const drawerOpened = ref(false);
- const cameraCardInstance = ref<InstanceType<typeof PermissioTreenCard>>();
- const menuCardInstance = ref<InstanceType<typeof PermissioTreenCard>>();
- const funcCardInstance = ref<InstanceType<typeof PermissioTreenCard>>();
- // 表单相关
- const defaultFormData = (): RoleForm => ({
- id: null,
- roleName: '',
- remark: '',
- cameraIds: [],
- menuIds: [],
- permIds: [],
- });
- const formData = reactive<RoleForm>(defaultFormData());
- const formRules: FormRules = {
- roleName: { required: true, trigger: 'blur', message: '请填写角色名称' },
- remark: {},
- };
- const formInstance = ref<FormInstance>();
-
- const isEditing = computed(() => formData.id != null);
- /**
- * 打开 drawer。如果未传递 roleId,表示创建角色;反之,表示编辑角色
- * @param roleId 可选
- */
- const open = (role?: Role) => {
- if (role) {
- formData.id = role.id;
- formData.roleName = role.roleName;
- formData.remark = role.remark;
- getAssignedPermissions(role.id);
- // TODO: 获取已拥有的权限
- }
- drawerOpened.value = true;
- };
- /**
- * 获取当前角色已分配的权限数据,并更新相应的权限数
- */
- const getAssignedPermissions = async (roleId: number) => {
- try {
- const result = await getAssignedPerms(roleId);
- displayAssignedPermissions(result);
- } catch (e) {
- console.error(e);
- }
- }
- const displayAssignedPermissions = (result: AssignedPermissions) => {
- // 相机树很有可能会有 id 重复的情况,比如说 一个camera id 和 一个 workspace id 相同,这样会导致 tree 节点 value 不唯一,因此需要给个前缀
- cameraCardInstance.value?.setAssignedPermissions(result.cameraIds ?? [], 'camera');
- menuCardInstance.value?.setAssignedPermissions(result.menuIds ?? []);
- funcCardInstance.value?.setAssignedPermissions(result.permIds ?? []);
- }
- /**
- * 重置表单
- */
- const reset = () => {
- formInstance.value?.resetFields();
- Object.assign(formData, defaultFormData());
- cameraCardInstance.value?.reset();
- menuCardInstance.value?.reset();
- funcCardInstance.value?.reset();
- };
- /**
- * 提交。创建和编辑统一
- */
- const submit = async () => {
- formData.cameraIds = cleanCameraPermissions(cameraCardInstance.value!.getSelectedPermissions());
- formData.menuIds = menuCardInstance.value!.getSelectedPermissions();
- formData.permIds = funcCardInstance.value!.getSelectedPermissions();
- const api = isEditing.value ? editRole : createRole;
- try {
- await api(toRaw(formData));
- drawerOpened.value = false;
- ElMessage.success('提交成功');
- // 让父组件更新列表
- emits('submitted');
- } catch (e) {
- console.error(e);
- }
- }
- /**
- * 获取到的相机的权限码是 camera-xxx, 例如 camera-11, 提交后端转换成数字 11
- */
- const cleanCameraPermissions = (perms: PermissionTreeKey[]) => {
- return perms.map(perm => {
- if (typeof perm === 'string' && perm.includes('-')) {
- const splits = perm.split('-');
- return +splits[1];
- }
- // 否则正常返回
- return perm;
- });
- }
- defineExpose({ open });
- </script>
|