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 @@
+
+