menu.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from datetime import datetime
  2. from sqlalchemy import BigInteger, DateTime, ForeignKey, Integer, SmallInteger, String, UniqueConstraint, func
  3. from sqlalchemy.orm import Mapped, mapped_column, relationship
  4. from app.database import Base
  5. from app.models.base import BaseModel, SoftDeleteMixin
  6. class MenuRole(Base):
  7. __tablename__ = "bx_menu_role"
  8. __table_args__ = (UniqueConstraint("menu_id", "role_id"),)
  9. id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
  10. menu_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("bx_menu.id"), nullable=False)
  11. role_id: Mapped[int] = mapped_column(BigInteger, ForeignKey("bx_role.id"), nullable=False, index=True)
  12. create_by: Mapped[str | None] = mapped_column(String(64))
  13. create_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
  14. class Menu(BaseModel, SoftDeleteMixin):
  15. __tablename__ = "bx_menu"
  16. id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
  17. parent_id: Mapped[int] = mapped_column(
  18. BigInteger, ForeignKey("bx_menu.id"), nullable=False, default=0, server_default="0"
  19. )
  20. menu_name: Mapped[str] = mapped_column(String(64), nullable=False)
  21. menu_code: Mapped[str | None] = mapped_column(String(64))
  22. menu_type: Mapped[int] = mapped_column(SmallInteger, nullable=False)
  23. path: Mapped[str | None] = mapped_column(String(256))
  24. icon: Mapped[str | None] = mapped_column(String(64))
  25. sort_order: Mapped[int] = mapped_column(Integer, nullable=False, default=0, server_default="0")
  26. visible: Mapped[int] = mapped_column(SmallInteger, nullable=False, default=1, server_default="1")
  27. status: Mapped[int] = mapped_column(SmallInteger, nullable=False, default=1, server_default="1")
  28. remark: Mapped[str | None] = mapped_column(String(512))
  29. parent: Mapped["Menu | None"] = relationship(
  30. "Menu", remote_side=[id], back_populates="children"
  31. )
  32. children: Mapped[list["Menu"]] = relationship("Menu", back_populates="parent")
  33. roles: Mapped[list["Role"]] = relationship(
  34. "Role", secondary="bx_menu_role", back_populates="menus"
  35. )