92 lines
2.5 KiB
Python
92 lines
2.5 KiB
Python
# =============================================================================
|
||
# 角色模型 — roles 表
|
||
# =============================================================================
|
||
# 说明:定义系统角色(user/agent/admin),支持 RBAC 权限控制
|
||
# =============================================================================
|
||
|
||
import uuid
|
||
from datetime import datetime
|
||
from typing import Optional
|
||
|
||
from sqlalchemy import String, Boolean, DateTime, Text, JSON
|
||
from sqlalchemy.orm import Mapped, mapped_column
|
||
|
||
from app.database import Base
|
||
|
||
|
||
class Role(Base):
|
||
"""角色模型 — 对应 roles 表。
|
||
|
||
预置三个角色:
|
||
- user: 所有在职员工默认角色(is_default=True)
|
||
- agent: IT坐席,通过企微标签或eHR字段映射
|
||
- admin: 管理员,通过管理后台手动绑定
|
||
"""
|
||
|
||
__tablename__ = "roles"
|
||
|
||
# 主键:UUID
|
||
id: Mapped[str] = mapped_column(
|
||
String(36),
|
||
primary_key=True,
|
||
default=lambda: str(uuid.uuid4()),
|
||
)
|
||
|
||
# 角色标识:user/agent/admin(唯一)
|
||
name: Mapped[str] = mapped_column(
|
||
String(50),
|
||
unique=True,
|
||
nullable=False,
|
||
comment="角色标识:user/agent/admin",
|
||
)
|
||
|
||
# 显示名称:用户/坐席/管理员
|
||
display_name: Mapped[str] = mapped_column(
|
||
String(100),
|
||
nullable=False,
|
||
comment="显示名称:用户/坐席/管理员",
|
||
)
|
||
|
||
# 角色描述
|
||
description: Mapped[Optional[str]] = mapped_column(
|
||
Text,
|
||
nullable=True,
|
||
comment="角色描述",
|
||
)
|
||
|
||
# 权限列表(JSON数组)
|
||
permissions: Mapped[list] = mapped_column(
|
||
JSON,
|
||
nullable=False,
|
||
default=list,
|
||
comment="权限列表(JSON数组)",
|
||
)
|
||
|
||
# 是否默认角色(user=True)
|
||
is_default: Mapped[bool] = mapped_column(
|
||
Boolean,
|
||
nullable=False,
|
||
default=False,
|
||
comment="是否默认角色(所有员工自动获得)",
|
||
)
|
||
|
||
# 创建时间
|
||
created_at: Mapped[datetime] = mapped_column(
|
||
DateTime(timezone=True),
|
||
nullable=False,
|
||
default=datetime.now,
|
||
comment="创建时间",
|
||
)
|
||
|
||
# 更新时间(自动刷新)
|
||
updated_at: Mapped[datetime] = mapped_column(
|
||
DateTime(timezone=True),
|
||
nullable=False,
|
||
default=datetime.now,
|
||
onupdate=datetime.now,
|
||
comment="更新时间",
|
||
)
|
||
|
||
def __repr__(self) -> str:
|
||
return f"<Role(id={self.id}, name={self.name}, display_name={self.display_name})>"
|