Files
ai-agent-admin/backend-fastapi/core/role/model.py
T
2026-06-08 18:14:59 +08:00

100 lines
3.3 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Role Model - 角色模型
用于管理系统角色和权限分配
"""
from sqlalchemy import Column, String, Integer, Boolean, Text, Table, ForeignKey
from sqlalchemy.orm import relationship
from app.base_model import BaseModel
from app.database import Base
# 角色-菜单关联表
role_menu = Table(
'core_role_menu',
Base.metadata,
Column('role_id', String(21), ForeignKey('core_role.id', ondelete='CASCADE'), primary_key=True),
Column('menu_id', String(21), ForeignKey('core_menu.id', ondelete='CASCADE'), primary_key=True),
)
# 角色-权限关联表
role_permission = Table(
'core_role_permission',
Base.metadata,
Column('role_id', String(21), ForeignKey('core_role.id', ondelete='CASCADE'), primary_key=True),
Column('permission_id', String(21), ForeignKey('core_permission.id', ondelete='CASCADE'), primary_key=True),
)
# 角色-部门关联表
role_dept = Table(
'core_role_dept',
Base.metadata,
Column('role_id', String(21), ForeignKey('core_role.id', ondelete='CASCADE'), primary_key=True),
Column('dept_id', String(21), ForeignKey('core_dept.id', ondelete='CASCADE'), primary_key=True),
)
class Role(BaseModel):
"""
角色模型 - 用于用户角色管理和权限分配
字段说明:
- name: 角色名称
- code: 角色编码(唯一)
- role_type: 角色类型(0-系统角色, 1-自定义角色)
- status: 角色状态
- priority: 角色优先级
- description: 角色描述
- remark: 备注
"""
__tablename__ = "core_role"
# 角色类型选择
ROLE_TYPE_CHOICES = {
0: '系统角色',
1: '自定义角色',
}
# 角色名称
name = Column(String(64), nullable=False, index=True, comment="角色名称")
# 角色编码
code = Column(String(64), unique=True, nullable=False, index=True, comment="角色编码")
# 角色类型
role_type = Column(Integer, default=1, index=True, comment="角色类型(0-系统角色, 1-自定义角色)")
# 角色状态
status = Column(Boolean, default=True, index=True, comment="角色状态(启用/禁用)")
# 角色优先级
priority = Column(Integer, default=0, index=True, comment="角色优先级(数字越大优先级越高)")
# 角色描述
description = Column(Text, nullable=True, comment="角色描述")
# 备注
remark = Column(Text, nullable=True, comment="备注信息")
# 多对多关系
menus = relationship("Menu", secondary=role_menu, backref="roles", lazy="selectin")
permissions = relationship("Permission", secondary=role_permission, backref="roles", lazy="selectin")
depts = relationship("Dept", secondary=role_dept, backref="roles", lazy="selectin")
def __str__(self):
return f"{self.name} ({self.code})"
def is_system_role(self) -> bool:
"""判断是否为系统角色"""
return self.role_type == 0
def can_delete(self) -> bool:
"""判断是否可以删除(系统角色不可删除)"""
return self.role_type != 0
def get_role_type_display(self) -> str:
"""获取角色类型的显示名称"""
return self.ROLE_TYPE_CHOICES.get(self.role_type, '未知')