|
|
from iti.applications.extensions import db
|
|
|
from iti.applications.common.crud import BaseWithoutIdModelMixin
|
|
|
from iti.applications.common.enums import StatusEnum, MenuTypeEnum
|
|
|
from iti.applications.common.utils import BaseSchema
|
|
|
from apiflask.fields import String, Integer, Enum, Nested, DateTime, Boolean, List
|
|
|
import uuid
|
|
|
|
|
|
|
|
|
class SysMenu(BaseWithoutIdModelMixin):
|
|
|
"""
|
|
|
菜单表
|
|
|
"""
|
|
|
|
|
|
__tablename__ = "sys_menu"
|
|
|
id = db.Column(
|
|
|
db.String(36),
|
|
|
primary_key=True,
|
|
|
default=lambda: str(uuid.uuid4().hex),
|
|
|
comment="标识",
|
|
|
)
|
|
|
name = db.Column(db.String(255), nullable=False, unique=True, comment="菜单名称")
|
|
|
type = db.Column(
|
|
|
db.Enum(MenuTypeEnum, values_callable=lambda x: [e.value for e in x]),
|
|
|
nullable=False,
|
|
|
default=MenuTypeEnum.MENU.value,
|
|
|
comment="菜单类型",
|
|
|
)
|
|
|
path = db.Column(db.String(255), nullable=True, comment="菜单路径")
|
|
|
component = db.Column(db.String(255), nullable=True, comment="菜单组件")
|
|
|
redirect = db.Column(db.String(255), nullable=True, comment="菜单重定向")
|
|
|
sort = db.Column(db.Integer, nullable=False, default=0, comment="排序")
|
|
|
auth_code = db.Column(db.String(128), nullable=True, comment="权限编码")
|
|
|
meta = db.Column(db.JSON, nullable=True, comment="菜单元数据")
|
|
|
status = db.Column(
|
|
|
db.Enum(StatusEnum, values_callable=lambda x: [e.value for e in x]),
|
|
|
nullable=False,
|
|
|
default=StatusEnum.ENABLED.value,
|
|
|
comment="状态",
|
|
|
)
|
|
|
parent_id = db.Column(db.String(36), nullable=True, comment="父菜单ID")
|
|
|
|
|
|
# 关系
|
|
|
parent = db.relationship(
|
|
|
"SysMenu",
|
|
|
primaryjoin="SysMenu.parent_id == SysMenu.id",
|
|
|
foreign_keys="SysMenu.parent_id",
|
|
|
uselist=False,
|
|
|
remote_side=[id],
|
|
|
viewonly=True,
|
|
|
)
|
|
|
children = db.relationship(
|
|
|
"SysMenu",
|
|
|
primaryjoin="SysMenu.id == SysMenu.parent_id",
|
|
|
foreign_keys="SysMenu.parent_id",
|
|
|
uselist=True,
|
|
|
lazy="noload",
|
|
|
viewonly=True,
|
|
|
)
|
|
|
|
|
|
|
|
|
class SysMenuMetaSchema(BaseSchema):
|
|
|
"""
|
|
|
菜单元数据结构
|
|
|
"""
|
|
|
|
|
|
# 用于配置页面的标题,会在菜单和标签页中显示。一般会配合国际化使用。
|
|
|
title = String()
|
|
|
# 用于配置页面的图标,会在菜单和标签页中显示。一般会配合图标库使用,如果是http链接,会自动加载图片。
|
|
|
icon = String()
|
|
|
# 用于配置页面的激活图标,会在菜单和标签页中显示。一般会配合图标库使用,如果是http链接,会自动加载图片。
|
|
|
activeIcon = String()
|
|
|
# 用于配置页面是否开启缓存,开启后页面会缓存,不会重新加载,仅在标签页启用时有效。
|
|
|
keepAlive = Boolean()
|
|
|
# 用于配置页面是否在菜单中隐藏,隐藏后页面不会在菜单中显示。
|
|
|
hideInMenu = Boolean()
|
|
|
# 用于配置页面是否在标签页中隐藏,隐藏后页面不会在标签页中显示。
|
|
|
hideInTab = Boolean()
|
|
|
# 用于配置页面是否在面包屑中隐藏,隐藏后页面不会在面包屑中显示。
|
|
|
hideInBreadcrumb = Boolean()
|
|
|
# 用于配置页面的子页面是否在菜单中隐藏,隐藏后子页面不会在菜单中显示。
|
|
|
hideChildrenInMenu = Boolean()
|
|
|
# 用于配置页面的权限,只有拥有对应权限的用户才能访问页面,不配置则不需要权限。
|
|
|
authority = List(String())
|
|
|
# 用于配置页面的徽标,会在菜单显示。
|
|
|
badge = String()
|
|
|
# 用于配置页面的徽标类型,dot 为小红点,normal 为文本。
|
|
|
badgeType = String()
|
|
|
# 用于配置页面的徽标颜色。
|
|
|
badgeVariants = String()
|
|
|
# 用于配置页面是否将路由的完整路径作为tab key(默认true)
|
|
|
fullPathKey = Boolean()
|
|
|
# 用于配置当前激活的菜单,有时候页面没有显示在菜单内,需要激活父级菜单时使用。
|
|
|
activePath = String()
|
|
|
# 用于配置页面是否固定标签页,固定后页面不可关闭。
|
|
|
affixTab = Boolean()
|
|
|
# 用于配置页面固定标签页的排序, 采用升序排序。
|
|
|
affixTabOrder = Integer()
|
|
|
# 用于配置内嵌页面的 iframe 地址,设置后会在当前页面内嵌对应的页面。
|
|
|
iframeSrc = String()
|
|
|
# 用于配置页面是否忽略权限,直接可以访问。
|
|
|
ignoreAccess = Boolean()
|
|
|
# 用于配置外链跳转路径,会在新窗口打开。
|
|
|
link = String()
|
|
|
# 用于配置标签页最大打开数量,设置后会在打开新标签页时自动关闭最早打开的标签页(仅在打开同名标签页时生效)。
|
|
|
maxNumOfOpenTabs = Integer()
|
|
|
# 用于配置页面在菜单可以看到,但是访问会被重定向到403。
|
|
|
menuVisibleWithForbidden = Boolean()
|
|
|
# 用于配置页面是否在新窗口打开。
|
|
|
openInNewWindow = Boolean()
|
|
|
# 用于配置页面的排序,用于路由到菜单排序。注意: 排序仅针对一级菜单有效,二级菜单的排序需要在对应的一级菜单中按代码顺序设置。
|
|
|
order = Integer()
|
|
|
# 用于配置页面的菜单参数,会在菜单中传递给页面。
|
|
|
query = String()
|
|
|
# 用于配置当前路由不使用基础布局,仅在顶级时生效。默认情况下,所有的路由都会被包裹在基础布局中(包含顶部以及侧边等导航部件),如果你的页面不需要这些部件,可以设置 noBasicLayout 为 true。
|
|
|
noBasicLayout = Boolean()
|
|
|
|
|
|
|
|
|
class SysMenuSchema(BaseSchema):
|
|
|
"""
|
|
|
菜单表响应结构
|
|
|
"""
|
|
|
|
|
|
id = String()
|
|
|
name = String()
|
|
|
type = Enum(MenuTypeEnum, by_value=True)
|
|
|
path = String()
|
|
|
component = String()
|
|
|
redirect = String()
|
|
|
sort = Integer()
|
|
|
auth_code = String()
|
|
|
meta = Nested(SysMenuMetaSchema)
|
|
|
status = Enum(StatusEnum, by_value=True)
|
|
|
parent_id = String()
|
|
|
created_at = DateTime(format="%Y-%m-%d %H:%M:%S")
|
|
|
updated_at = DateTime(format="%Y-%m-%d %H:%M:%S")
|
|
|
parent = Nested("SysMenuSchema", dump_only=True, exclude=["children"])
|
|
|
children = Nested("SysMenuSchema", many=True, dump_only=True, exclude=["parent"])
|