diff --git a/backend/dvadmin/system/views/role_menu.py b/backend/dvadmin/system/views/role_menu.py index 4a3cc95..a74248f 100644 --- a/backend/dvadmin/system/views/role_menu.py +++ b/backend/dvadmin/system/views/role_menu.py @@ -58,8 +58,38 @@ class RoleMenuPermissionViewSet(CustomModelViewSet): update_serializer_class = RoleMenuPermissionCreateUpdateSerializer extra_filter_class = [] + @action(methods=['get'],detail=False) + def menu_permission_tree(self,request): + """ + 获取菜单按钮树 + """ + # params = request.query_params + # role_id = params.get('role',None) + # if role_id is None: + # return ErrorResponse(msg="未获取到角色") + if request.user.is_superuser: + queryset = Menu.objects.filter(status=1).values("id", "name", "parent_id") + else: + role_id = request.user.role.values_list('id', flat=True) + menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('menu_id', flat=True) + queryset = Menu.objects.filter(status=1, id__in=menu_list).values('id','name', "parent_id").all() + return DetailResponse(data=queryset) + + @action(methods=['get'],detail=False) + def get_menu_permission_checked(self,request): + """ + 获取已授权的菜单 + """ + params = request.query_params + role_id = params.get('role',None) + if role_id is None: + return ErrorResponse(msg="未获取到角色") + menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('menu_id', flat=True) + queryset = Menu.objects.filter(status=1, id__in=menu_list).values_list('id',flat=True) + return DetailResponse(data=queryset) + @action(methods=['post'],detail=False) - def save_auth(self,request): + def save_menu_permission(self,request): """ 保存页面菜单授权 :param request: diff --git a/web/src/components/iconSelector/index.vue b/web/src/components/iconSelector/index.vue index 0c44d11..44e488f 100644 --- a/web/src/components/iconSelector/index.vue +++ b/web/src/components/iconSelector/index.vue @@ -159,11 +159,14 @@ const initModeValueEcho = () => { // 处理 icon 类型,用于回显时,tab 高亮与初始化数据 const initFontIconName = () => { let name = 'ali'; - if (props.modelValue!.indexOf('iconfont') > -1) name = 'ali'; - else if (props.modelValue!.indexOf('ele-') > -1) name = 'ele'; - else if (props.modelValue!.indexOf('fa') > -1) name = 'awe'; - // 初始化 tab 高亮回显 - state.fontIconTabActive = name; + if(props.modelValue){ + if (props.modelValue!.indexOf('iconfont') > -1) name = 'ali'; + else if (props.modelValue!.indexOf('ele-') > -1) name = 'ele'; + else if (props.modelValue!.indexOf('fa') > -1) name = 'awe'; + // 初始化 tab 高亮回显 + state.fontIconTabActive = name; + } + return name; }; // 初始化数据 diff --git a/web/src/views/system/menu/crud.ts b/web/src/views/system/menu/crud.ts index 0dc7a78..4f9c446 100644 --- a/web/src/views/system/menu/crud.ts +++ b/web/src/views/system/menu/crud.ts @@ -3,7 +3,7 @@ import { CreateCrudOptionsProps, CreateCrudOptionsRet, dict, useCompute } from ' const { compute } = useCompute(); import { shallowRef } from "vue"; import IconSelector from "/@/components/IconSelector/index.vue" -export default function ({ crudExpose, onAddCatalog, onAddChildren, onAddButton }: CreateCrudOptionsProps): CreateCrudOptionsRet { +export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet { const pageRequest = async (query) => { return await api.GetList(query); }; @@ -24,7 +24,11 @@ export default function ({ crudExpose, onAddCatalog, onAddChildren, onAddButton }; const addRequest = async (context:any) => { - return await api.AddObj(context.form); + const {form} = context; + if(form.web_path===undefined||form.web_path===null){ + form.web_path='/' + } + return await api.AddObj(form); }; //刷新父节点状态 @@ -148,7 +152,7 @@ export default function ({ crudExpose, onAddCatalog, onAddChildren, onAddButton value:0, valueChange({ form, value, getComponentRef }) { if (value) { - getComponentRef("parent").reloadDict(); // 执行city的select组件的reloadDict()方法,触发“city”重新加载字典 + getComponentRef("parent")?.reloadDict(); // 执行city的select组件的reloadDict()方法,触发“city”重新加载字典 } } }, @@ -256,7 +260,9 @@ export default function ({ crudExpose, onAddCatalog, onAddChildren, onAddButton }, }, component: { - title: '组件地址', + title: compute(({ form }) => { + return form.menu_type === 1 ? '组件地址' : '按钮权限值'; + }), form: { show: compute(({ form }) => { return [1,2].includes(form.menu_type) diff --git a/web/src/views/system/menu/index.vue b/web/src/views/system/menu/index.vue index c71d378..1415c02 100644 --- a/web/src/views/system/menu/index.vue +++ b/web/src/views/system/menu/index.vue @@ -25,92 +25,9 @@ const { crudExpose } = useExpose({ crudRef, crudBinding }); -// 添加目录 -const onAddCatalog = (row:any)=>{ - const childrenOptions = ref(); - childrenOptions.value = {...crudBinding.value.addForm}; - childrenOptions.value.columns.parent_name.show = false - childrenOptions.value.columns.icon.show = true - childrenOptions.value.columns.web_path.show = false - childrenOptions.value.columns.is_link.show = false - childrenOptions.value.columns.cache.show = false - childrenOptions.value.columns.web_path.show = false - childrenOptions.value.columns.visible.show = false - childrenOptions.value.columns.frame_out.show = false - childrenOptions.value.columns.sort.show = true - childrenOptions.value.columns.status.show = true - childrenOptions.value.columns.component.show = false - childrenOptions.value.initialForm = { menu_type:0,web_path:'/' }; - //覆盖提交方法 - childrenOptions.value.doSubmit=({ form })=>{ - AddObj(form).then(res=>{ - ElMessage.success('添加成功') - childrenOptions.value.onSuccess() - addChildrenRef.value.close() - }) - } - addChildrenRef.value.open(childrenOptions.value); -} - -// 添加子级 -const addChildrenRef = ref(); -const onAddChildren = (row:any)=>{ - const childrenOptions = ref(); - childrenOptions.value = {...crudBinding.value.addForm}; - childrenOptions.value.columns.parent_name.show = true - childrenOptions.value.columns.is_link.show = true - childrenOptions.value.columns.cache.show = true - childrenOptions.value.columns.web_path.show = true - childrenOptions.value.columns.component.show = true - childrenOptions.value.columns.component.title = "组件地址" - childrenOptions.value.columns.visible.show = true - childrenOptions.value.columns.frame_out.show = true - childrenOptions.value.columns.status.show = true - childrenOptions.value.initialForm = { parent_name: row.name,menu_type:1 }; - //覆盖提交方法 - childrenOptions.value.doSubmit=({ form })=>{ - form.parent = row.id - AddObj(form).then(res=>{ - ElMessage.success('添加成功') - childrenOptions.value.onSuccess() - addChildrenRef.value.close() - }) - } - addChildrenRef.value.open(childrenOptions.value); -} - -// 添加按钮 -const onAddButton = (row:any)=>{ - const childrenOptions = ref(); - childrenOptions.value = {...crudBinding.value.addForm}; - childrenOptions.value.columns.parent_name.show = true - childrenOptions.value.columns.icon.show = false - childrenOptions.value.columns.web_path.show = false - childrenOptions.value.columns.is_link.show = false - childrenOptions.value.columns.cache.show = false - childrenOptions.value.columns.web_path.show = false - childrenOptions.value.columns.visible.show = false - childrenOptions.value.columns.frame_out.show = false - childrenOptions.value.columns.sort.show = false - childrenOptions.value.columns.status.show = false - childrenOptions.value.columns.component.show = true - childrenOptions.value.columns.component.title = "按钮权限值" - childrenOptions.value.initialForm = { parent_name: row.name,menu_type:2 }; - //覆盖提交方法 - childrenOptions.value.doSubmit=({ form })=>{ - form.parent = row.id - AddObj(form).then(res=>{ - ElMessage.success('添加成功') - childrenOptions.value.onSuccess() - addChildrenRef.value.close() - }) - } - addChildrenRef.value.open(childrenOptions.value); -} - // 你的crud配置 -const { crudOptions } = createCrudOptions({ crudExpose,onAddCatalog,onAddChildren,onAddButton }); +const { crudOptions } = createCrudOptions({ crudExpose }); // 初始化crud配置 // eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars const { resetCrudOptions } = useCrud({ crudExpose, crudOptions }); diff --git a/web/src/views/system/role/components/PermissionComNew/api.ts b/web/src/views/system/role/components/MenuPermission/api.ts similarity index 58% rename from web/src/views/system/role/components/PermissionComNew/api.ts rename to web/src/views/system/role/components/MenuPermission/api.ts index be37ef5..f8e22fe 100644 --- a/web/src/views/system/role/components/PermissionComNew/api.ts +++ b/web/src/views/system/role/components/MenuPermission/api.ts @@ -1,18 +1,49 @@ import { request } from "/@/utils/service"; - +import XEUtils from 'xe-utils'; /** - * 获取角色的授权列表 + * 获取菜单树 * @param roleId * @param query */ -export function getRolePremission(query:object) { +export function getMenuPremissionTree(query:object) { return request({ - url: '/api/system/role_menu_button_permission/get_role_premission/', + url: '/api/system/role_menu_permission/menu_permission_tree/', method: 'get', params:query + }).then((res:any)=>{ + return XEUtils.toArrayTree(res.data,{ parentKey: 'parent_id', key: 'id', children: 'children',}) }) } +/** + * 获取已授权的菜单 + * @param query + */ +export function getMenuPremissionChecked(query:object) { + return request({ + url: '/api/system/role_menu_permission/get_menu_permission_checked/', + method: 'get', + params:query + }).then((res:any)=>{ + return res.data + }) +} + + +/** + * 保存菜单权限 + */ +export function saveMenuPremission(data:object) { + return request({ + url:'/api/system/role_menu_permission/save_menu_permission/', + method:'post', + data + }) +} + + + + /*** * 设置角色的权限 * @param roleId diff --git a/web/src/views/system/role/components/MenuPermission/index.vue b/web/src/views/system/role/components/MenuPermission/index.vue new file mode 100644 index 0000000..5372888 --- /dev/null +++ b/web/src/views/system/role/components/MenuPermission/index.vue @@ -0,0 +1,212 @@ + + + + + + + diff --git a/web/src/views/system/role/components/MenuPermission/menuPermissionTree.vue b/web/src/views/system/role/components/MenuPermission/menuPermissionTree.vue new file mode 100644 index 0000000..52a7d6e --- /dev/null +++ b/web/src/views/system/role/components/MenuPermission/menuPermissionTree.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/web/src/views/system/role/components/PermissionComNew/types.ts b/web/src/views/system/role/components/MenuPermission/types.ts similarity index 100% rename from web/src/views/system/role/components/PermissionComNew/types.ts rename to web/src/views/system/role/components/MenuPermission/types.ts diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/index.vue similarity index 57% rename from web/src/views/system/role/components/PermissionComNew/index.vue rename to web/src/views/system/role/components/index.vue index 0e5d159..03fb0b9 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/index.vue @@ -8,110 +8,26 @@ {{ props.roleName }} - -
- 保存菜单授权 - -
-
-
- - - -
-
-

允许对这些数据有以下操作

- -
- {{ btn.data_range!==null ? `${btn.name}(${formatDataRange(btn.data_range)})` : btn.name }} - - - -
-
-
- -
-

对这些数据有以下字段权限

- -
    -
  • -
    - 字段 -
    - -
    - - {{head.label}} - -
    -
  • - -
  • -
    {{ c_item.title }}
    -
    - -
    -
  • -
-
-
-
-
- - -
- - - - -
- -
-
+
+ + + + + + 角色管理 + +