外观
菜单管理
使用说明
主界面
刷新菜单缓存:等效于当前用户重新登录。即触发重新获取数据字典和当前用户的权限信息,然后生成当前用户的菜单。
新增目录
目录功能1:用于菜单分类
- 路由地址:以
/
开头
目录功能2:用于外链
- 路由地址:以
http
或https
开头
新增菜单
- 路由地址:直接写英文名称。例如
server
- 组件地址:前端Vue组件相对于
src/views
的地址。例如组件完整地址src/views/system/user/index.vue
,则填写system/user/index
- 组件名称:前端Veu组件中定义的名称。例如
defineOptions({ name: 'SystemUser' })
,则填写SystemUser
- 权限标识:填写权限字符串。例如
system:user:query
新增按钮
不同的按钮,一般对应不同的权限标识。例如
按钮 | 权限标识示例 |
---|---|
查询 | asset:server:query |
新增 | asset:server:create |
修改 | asset:server:update |
删除 | asset:server:delete |
导出 | asset:server:export |
导入 | asset:server:import |
示例
后端实现
目录
代码目录:mysite\myapp_system\menu
模型
菜单模型SystemMenu
parent_id
外键指向了父节点。默认删除策略为models.CASCADE
,即删除当前节点时,会级联删除其子节点。
python
class SystemMenu(BaseModel):
id = models.BigAutoField(primary_key=True, db_comment="菜单ID", help_text="菜单ID")
# ...
parent_id = models.ForeignKey(
"self",
on_delete=models.CASCADE,
null=True,
blank=True,
db_constraint=False,
db_column="parent_id",
db_comment="父菜单ID",
help_text="父菜单ID",
related_name="children",
)
# ...
视图
菜单视图MenuViewSet
继承了CustomModelViewSetNoExport
- 如果要实现不允许级联删除子菜单,可启动下面代码。该代码重写了
destropy
方法,在删除前检查是否有子节点。
python
# @extend_schema(summary="删除")
# def destroy(self, request, *args, **kwargs):
# """删除菜单,存在子菜单,不允许删除"""
# if self.get_object().children.exists():
# return CommonResponse.error(code=111601, msg="存在子菜单,无法删除")
# return super().destroy(request, *args, **kwargs)
前端实现
目录
代码目录:src\views\system\menu
sh
menu/
|-- MenuForm.vue # 新增/编辑界面
`-- index.vue # 主界面