mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-21 12:52:26 +00:00
本次提交包含多项优化和修复: 1. 修复CRUD初始化参数传递、搜索参数处理逻辑 2. 更新环境配置中的大模型相关参数 3. 重构部分服务方法命名,统一代码风格 4. 新增多个枚举类型,补充模型关联关系和加载选项 5. 优化查询参数类实现,完善字段校验逻辑 6. 调整Pydantic模型字段注释和类型定义 7. 简化并移除冗余的CRUD方法实现 8. 新增超级管理员权限装饰器 9. 修复邮件日志模型的租户关联和字段定义
101 lines
4.7 KiB
Python
101 lines
4.7 KiB
Python
from datetime import datetime
|
|
from typing import TYPE_CHECKING
|
|
|
|
from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
|
|
from app.core.base_model import MappedBase, ModelMixin, TenantMixin, UserMixin
|
|
|
|
if TYPE_CHECKING:
|
|
from app.api.v1.module_platform.tenant.model import TenantModel
|
|
from app.api.v1.module_system.dept.model import DeptModel
|
|
from app.api.v1.module_system.position.model import PositionModel
|
|
from app.api.v1.module_system.role.model import RoleModel
|
|
|
|
|
|
class UserRolesModel(MappedBase):
|
|
"""
|
|
用户角色关联表
|
|
|
|
定义用户与角色的多对多关系
|
|
"""
|
|
|
|
__tablename__: str = "sys_user_roles"
|
|
__table_args__: dict[str, str] = {"comment": "用户角色关联表"}
|
|
|
|
user_id: Mapped[int] = mapped_column(
|
|
Integer,
|
|
ForeignKey("sys_user.id", ondelete="CASCADE", onupdate="CASCADE"),
|
|
primary_key=True,
|
|
comment="用户ID",
|
|
)
|
|
role_id: Mapped[int] = mapped_column(
|
|
Integer,
|
|
ForeignKey("sys_role.id", ondelete="CASCADE", onupdate="CASCADE"),
|
|
primary_key=True,
|
|
comment="角色ID",
|
|
)
|
|
|
|
|
|
class UserPositionsModel(MappedBase):
|
|
"""
|
|
用户岗位关联表
|
|
|
|
定义用户与岗位的多对多关系
|
|
"""
|
|
|
|
__tablename__: str = "sys_user_positions"
|
|
__table_args__: dict[str, str] = {"comment": "用户岗位关联表"}
|
|
|
|
user_id: Mapped[int] = mapped_column(
|
|
Integer,
|
|
ForeignKey("sys_user.id", ondelete="CASCADE", onupdate="CASCADE"),
|
|
primary_key=True,
|
|
comment="用户ID",
|
|
)
|
|
position_id: Mapped[int] = mapped_column(
|
|
Integer,
|
|
ForeignKey("sys_position.id", ondelete="CASCADE", onupdate="CASCADE"),
|
|
primary_key=True,
|
|
comment="岗位ID",
|
|
)
|
|
|
|
|
|
class UserModel(ModelMixin, TenantMixin, UserMixin):
|
|
"""
|
|
用户模型
|
|
"""
|
|
|
|
__tablename__: str = "sys_user"
|
|
__table_args__ = (UniqueConstraint("tenant_id", "username"), {"comment": "用户表"})
|
|
__loader_options__: list[str] = ["dept", "roles", "positions", "created_by", "updated_by", "deleted_by", "tenant_by"]
|
|
|
|
username: Mapped[str] = mapped_column(String(64), nullable=False, comment="用户名/登录账号")
|
|
password: Mapped[str] = mapped_column(String(255), nullable=False, comment="密码哈希")
|
|
name: Mapped[str] = mapped_column(String(32), nullable=False, comment="昵称")
|
|
mobile: Mapped[str | None] = mapped_column(String(11), nullable=True, comment="手机号")
|
|
email: Mapped[str | None] = mapped_column(String(64), nullable=True, comment="邮箱")
|
|
gender: Mapped[str | None] = mapped_column(String(1), default="2", nullable=True, comment="性别(0:男 1:女 2:未知)")
|
|
avatar: Mapped[str | None] = mapped_column(String(255), nullable=True, comment="头像URL地址")
|
|
is_superuser: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False, comment="是否超管")
|
|
last_login: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True, comment="最后登录时间")
|
|
gitee_login: Mapped[str | None] = mapped_column(String(32), nullable=True, comment="Gitee登录")
|
|
github_login: Mapped[str | None] = mapped_column(String(32), nullable=True, comment="Github登录")
|
|
wx_login: Mapped[str | None] = mapped_column(String(32), nullable=True, comment="微信登录")
|
|
qq_login: Mapped[str | None] = mapped_column(String(32), nullable=True, comment="QQ登录")
|
|
status: Mapped[int] = mapped_column(Integer, default=0, nullable=False, comment="状态(0:启动 1:停用)", index=True)
|
|
description: Mapped[str | None] = mapped_column(Text, default=None, nullable=True, comment="备注")
|
|
|
|
dept_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("sys_dept.id", ondelete="SET NULL", onupdate="CASCADE"), nullable=True, index=True, comment="部门ID")
|
|
tenant: Mapped["TenantModel | None"] = relationship(
|
|
"TenantModel",
|
|
foreign_keys="UserModel.tenant_id",
|
|
lazy="selectin",
|
|
viewonly=True,
|
|
)
|
|
dept: Mapped["DeptModel | None"] = relationship(back_populates="users", foreign_keys=[dept_id], lazy="selectin")
|
|
roles: Mapped[list["RoleModel"]] = relationship(secondary="sys_user_roles", back_populates="users", lazy="selectin")
|
|
positions: Mapped[list["PositionModel"]] = relationship(secondary="sys_user_positions", back_populates="users", lazy="selectin")
|
|
created_by: Mapped["UserModel | None"] = relationship("UserModel", foreign_keys="UserModel.created_id", remote_side="UserModel.id", lazy="selectin", uselist=False, viewonly=True)
|
|
updated_by: Mapped["UserModel | None"] = relationship("UserModel", foreign_keys="UserModel.updated_id", remote_side="UserModel.id", lazy="selectin", uselist=False, viewonly=True)
|