Skip to content

菜单管理

使用说明

主界面

刷新菜单缓存:等效于当前用户重新登录。即触发重新获取数据字典和当前用户的权限信息,然后生成当前用户的菜单。

image-20250618094534813

新增目录

目录功能1:用于菜单分类

  • 路由地址:以/开头

image-20250618100019813

目录功能2:用于外链

  • 路由地址:以httphttps开头

image-20250618100446807

新增菜单

  • 路由地址:直接写英文名称。例如server
  • 组件地址:前端Vue组件相对于src/views的地址。例如组件完整地址src/views/system/user/index.vue,则填写system/user/index
  • 组件名称:前端Veu组件中定义的名称。例如defineOptions({ name: 'SystemUser' }),则填写SystemUser
  • 权限标识:填写权限字符串。例如system:user:query

image-20250618153146620

新增按钮

不同的按钮,一般对应不同的权限标识。例如

按钮权限标识示例
查询asset:server:query
新增asset:server:create
修改asset:server:update
删除asset:server:delete
导出asset:server:export
导入asset:server:import

image-20250618161924502

示例

image-20250618162407309

后端实现

目录

代码目录: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 # 主界面

原理