You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-System/iti_system/models/sys/sys_menu.py

140 lines
6.1 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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):
"""
菜单表响应结构
"""
class Meta:
name = "SysMenu"
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"])