Files
FastapiAdmin/backend/app/api/v1/module_system/menu/model.py
T
zhangtao ba7fddc34a refactor(generator): 优化代码生成模块接口和服务实现
- 修改接口定义,增加路径参数并完善请求描述,增强参数校验和依赖注入
- 优化CRUD层数据库操作,统一异步会话使用,删除多余db参数
- 增加业务表与字段模型关系级联删除配置,优化模型关联关系声明
- 精简pydantic模型,去除冗余校验装饰器,完善字段描述和必填约束
- 服务层增加类型检查和异常抛出,规范业务逻辑流程和错误提示
- 优化代码结构,调整模块导入顺序和注释,提升代码可读性和一致性
2025-10-01 16:58:49 +08:00

53 lines
3.1 KiB
Python

# -*- coding: utf-8 -*-
"""
菜单模型模块
定义系统菜单相关数据模型
"""
from typing import Optional, List
from sqlalchemy import Boolean, String, Integer, JSON, ForeignKey
from sqlalchemy.orm import relationship, Mapped, mapped_column
from app.core.base_model import ModelMixin
class MenuModel(ModelMixin):
"""
菜单表 - 用于存储系统菜单信息 - SQLAlchemy 2.0 语法
菜单类型说明:
1: 目录
2: 菜单
3: 按钮/权限
4: 链接
"""
__tablename__ = "system_menu"
__table_args__ = ({'comment': '菜单表'})
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, comment='主键ID')
name: Mapped[str] = mapped_column(String(50), nullable=False, comment='菜单名称', unique=True)
type: Mapped[int] = mapped_column(Integer, nullable=False, default=2, comment='菜单类型(1:目录 2:菜单 3:按钮/权限 4:链接)')
order: Mapped[int] = mapped_column(Integer, nullable=False, default=999, comment='显示排序')
status: Mapped[bool] = mapped_column(Boolean(), default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
permission: Mapped[Optional[str]] = mapped_column(String(100), comment='权限标识(如:system:user:list)')
icon: Mapped[Optional[str]] = mapped_column(String(50), comment='菜单图标')
route_name: Mapped[Optional[str]] = mapped_column(String(100), comment='路由名称')
route_path: Mapped[Optional[str]] = mapped_column(String(200), comment='路由路径')
component_path: Mapped[Optional[str]] = mapped_column(String(200), comment='组件路径')
redirect: Mapped[Optional[str]] = mapped_column(String(200), comment='重定向地址')
hidden: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False, comment='是否隐藏(True:隐藏 False:显示)')
keep_alive: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False, comment='是否缓存(True:是 False:否)')
always_show: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False, comment='是否始终显示(True:是 False:否)')
title: Mapped[Optional[str]] = mapped_column(String(50), comment='菜单标题')
params: Mapped[Optional[list[dict[str, str]]]] = mapped_column(JSON, comment='路由参数(JSON对象)')
affix: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False, comment='是否固定标签页(True:是 False:否)')
parent_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey('system_menu.id', ondelete='SET NULL'), default=None, index=True, comment='父菜单ID')
parent: Mapped[Optional['MenuModel']] = relationship(back_populates='children', remote_side=[id], uselist=False)
children: Mapped[Optional[List['MenuModel']]] = relationship(back_populates='parent')
# 角色关联关系
roles: Mapped[List["RoleModel"]] = relationship(secondary="system_role_menus", back_populates="menus", lazy="selectin")
# link: Mapped[Optional[str]] = mapped_column(String(255), comment='外链地址')
# iframe: Mapped[Optional[str]] = mapped_column(String(255), comment='内嵌iframe地址')