user.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from sqlalchemy import create_engine, Column, Integer, String, MetaData,DateTime,Text,ForeignKey, Table
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.orm import sessionmaker, relationship
  4. from agent.db.database import Base
  5. from datetime import datetime
  6. # Many-to-many association table for Users and Roles
  7. user_roles = Table('user_roles',
  8. Base.metadata,
  9. Column('user_id', Integer, ForeignKey('users.id'), primary_key=True),
  10. Column('role_id', Integer, ForeignKey('roles.id'), primary_key=True)
  11. )
  12. class User(Base):
  13. __tablename__ = 'users'
  14. id = Column(Integer, primary_key=True)
  15. username = Column(String(32), nullable=False)
  16. full_name = Column(String(64))
  17. email = Column(String(100), nullable=False)
  18. hashed_password = Column(String(64), nullable=True)
  19. status = Column(Integer, default=0)
  20. roles = relationship("Role", secondary=user_roles, back_populates="users")
  21. class Session(Base):
  22. __tablename__ = 'sessions'
  23. id = Column(Integer, primary_key=True)
  24. user_role_organ_id = Column(Integer, ForeignKey('sys_user_role_organ.id'))
  25. user_id = Column(Integer, ForeignKey('users.id'))
  26. session_id = Column(String(64), nullable=False)
  27. username = Column(String(32), nullable=False)
  28. full_name = Column(String(64))
  29. created = Column(DateTime, default=datetime.now())
  30. updated = Column(DateTime, default=datetime.now())
  31. # Many-to-many association table for Roles and Permissions
  32. role_permissions = Table('role_permissions',
  33. Base.metadata,
  34. Column('role_id', Integer, ForeignKey('roles.id'), primary_key=True),
  35. Column('permission_id', Integer, ForeignKey('permissions.id'), primary_key=True)
  36. )
  37. class Role(Base):
  38. __tablename__ = 'roles'
  39. id = Column(Integer, primary_key=True, index=True)
  40. name = Column(String(50), unique=True, index=True, nullable=False)
  41. description = Column(String(255))
  42. users = relationship("User", secondary=user_roles, back_populates="roles")
  43. permissions = relationship("Permission", secondary=role_permissions, back_populates="roles")
  44. class Permission(Base):
  45. __tablename__ = 'permissions'
  46. id = Column(Integer, primary_key=True, index=True)
  47. name = Column(String(50), unique=True, index=True, nullable=False) # e.g., "view_dashboard", "edit_settings"
  48. description = Column(String(255))
  49. # For menu items
  50. menu_name = Column(String(50)) # Display name for the menu
  51. menu_route = Column(String(100)) # Frontend route
  52. menu_icon = Column(String(50)) # Icon for the menu
  53. parent_id = Column(Integer, ForeignKey('permissions.id'), nullable=True) # For hierarchical menus
  54. roles = relationship("Role", secondary=role_permissions, back_populates="permissions")
  55. parent = relationship("Permission", remote_side=[id]) # Self-referential relationship for parent menu