From e40fb13ab9b59ea216fc3bf6fadde70fce161fdc Mon Sep 17 00:00:00 2001 From: xingyuv <xingyu4j@vip.qq.com> Date: Wed, 12 Apr 2023 16:17:27 +0800 Subject: [PATCH] feat: role scope init --- src/views/system/role/RoleMenuModal.vue | 50 +++++++++++++++++++++++++ src/views/system/role/index.vue | 18 ++++++++- src/views/system/role/role.data.ts | 38 ++++++++++++++++++- 3 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 src/views/system/role/RoleMenuModal.vue diff --git a/src/views/system/role/RoleMenuModal.vue b/src/views/system/role/RoleMenuModal.vue new file mode 100644 index 00000000..0cf48f22 --- /dev/null +++ b/src/views/system/role/RoleMenuModal.vue @@ -0,0 +1,50 @@ +<template> + <BasicModal v-bind="$attrs" @register="registerModal" :title="isUpdate ? '编辑' : '新增'" @ok="handleSubmit"> + <BasicForm @register="registerForm" /> + </BasicModal> +</template> +<script lang="ts" setup name="RoleMenuModal"> +import { ref, unref } from 'vue' +import { BasicModal, useModalInner } from '@/components/Modal' +import { BasicForm, useForm } from '@/components/Form' +import { dataScopeFormSchema } from './role.data' +import { createRole, getRole, updateRole } from '@/api/system/role' + +const emit = defineEmits(['success', 'register']) +const isUpdate = ref(true) + +const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({ + labelWidth: 120, + baseColProps: { span: 24 }, + schemas: dataScopeFormSchema, + showActionButtonGroup: false, + actionColOptions: { span: 23 } +}) + +const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { + resetFields() + setModalProps({ confirmLoading: false }) + isUpdate.value = !!data?.isUpdate + + if (unref(isUpdate)) { + const res = await getRole(data.record.id) + setFieldsValue({ ...res }) + } +}) + +async function handleSubmit() { + try { + const values = await validate() + setModalProps({ confirmLoading: true }) + if (unref(isUpdate)) { + await updateRole(values) + } else { + await createRole(values) + } + closeModal() + emit('success') + } finally { + setModalProps({ confirmLoading: false }) + } +} +</script> diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index e033e6be..9fc90b3e 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -20,13 +20,13 @@ icon: IconEnum.EDIT, label: '菜单权限', auth: 'system:permission:assign-role-menu', - onClick: handleEdit.bind(null, record) + onClick: handleMenu.bind(null, record) }, { icon: IconEnum.EDIT, label: '数据权限', auth: 'system:permission:assign-role-data-scope', - onClick: handleEdit.bind(null, record) + onClick: handleDataScope.bind(null, record) }, { icon: IconEnum.DELETE, @@ -45,6 +45,8 @@ </template> </BasicTable> <RoleModal @register="registerModal" @success="reload()" /> + <RoleMenuModal @register="registerMenuModal" @success="reload()" /> + <RoleScopeModal @register="registerScopeModal" @success="reload()" /> </div> </template> <script lang="ts" setup name="Role"> @@ -52,6 +54,8 @@ import { useI18n } from '@/hooks/web/useI18n' import { useMessage } from '@/hooks/web/useMessage' import { useModal } from '@/components/Modal' import RoleModal from './RoleModal.vue' +import RoleMenuModal from './RoleMenuModal.vue' +import RoleScopeModal from './RoleScopeModal.vue' import { IconEnum } from '@/enums/appEnum' import { BasicTable, useTable, TableAction } from '@/components/Table' import { RoleExportReqVO, deleteRole, exportRole, getRolePage } from '@/api/system/role' @@ -60,6 +64,8 @@ import { columns, searchFormSchema } from './role.data' const { t } = useI18n() const { createConfirm, createMessage } = useMessage() const [registerModal, { openModal }] = useModal() +const [registerMenuModal, { openModal: openMenuModal }] = useModal() +const [registerScopeModal, { openModal: openScopeModal }] = useModal() const [registerTable, { getForm, reload }] = useTable({ title: '角色列表', api: getRolePage, @@ -84,6 +90,14 @@ function handleEdit(record: Recordable) { openModal(true, { record, isUpdate: true }) } +function handleMenu(record: Recordable) { + openMenuModal(true, { record, isUpdate: true }) +} + +function handleDataScope(record: Recordable) { + openScopeModal(true, { record, isUpdate: true }) +} + async function handleExport() { createConfirm({ title: t('common.exportTitle'), diff --git a/src/views/system/role/role.data.ts b/src/views/system/role/role.data.ts index ff84a6eb..7c399d49 100644 --- a/src/views/system/role/role.data.ts +++ b/src/views/system/role/role.data.ts @@ -2,6 +2,7 @@ import { BasicColumn, FormSchema, useRender } from '@/components/Table' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { listSimpleDept } from '@/api/system/dept' import { SystemDataScopeEnum } from '@/enums/systemEnum' +import { listSimpleMenus } from '@/api/system/menu' export const columns: BasicColumn[] = [ { @@ -151,7 +152,7 @@ export const dataScopeFormSchema: FormSchema[] = [ }, { label: '数据权限', - field: 'status', + field: 'dataScopeDeptIds', component: 'ApiTreeSelect', ifShow: ({ values }) => values.dataScope === SystemDataScopeEnum.DEPT_CUSTOM, componentProps: { @@ -165,3 +166,38 @@ export const dataScopeFormSchema: FormSchema[] = [ } } ] + +export const menuScopeFormSchema: FormSchema[] = [ + { + label: '编号', + field: 'id', + show: false, + component: 'Input' + }, + { + label: '角色名称', + field: 'name', + dynamicDisabled: true, + component: 'Input' + }, + { + label: '角色标识', + field: 'code', + dynamicDisabled: true, + component: 'Input' + }, + { + label: '菜单权限', + field: 'menuIds', + component: 'ApiTreeSelect', + componentProps: { + api: () => listSimpleMenus(), + fieldNames: { + label: 'name', + key: 'id', + value: 'id' + }, + handleTree: 'id' + } + } +]