Become a sponsor

角色管理
角色是 RBAC 权限模型的核心,连接用户和菜单(权限)。通过为角色分配菜单权限,再将角色分配给用户,实现灵活的权限管理。
application/role/
├── models.py # 角色模型
├── forms.py # 表单验证
├── services.py # 业务逻辑层
├── views.py # 视图层
└── urls.py # 路由配置
application/role_menu/
├── models.py # 角色-菜单关联模型
├── services.py # 关联业务逻辑
└── urls.py # 路由配置# application/role/models.py
from application.models import BaseModel
class Role(BaseModel):
"""角色模型类"""
class Meta:
db_table = 'django_role'
name = models.CharField(max_length=150, verbose_name='角色名称')
code = models.CharField(max_length=30, verbose_name='角色编码')
sort = models.IntegerField(default=0, verbose_name='角色排序')
note = models.CharField(max_length=255, null=True, blank=True, verbose_name='角色备注')角色与菜单通过 django_role_menu 关联表实现多对多关系:
# application/role_menu/models.py
class RoleMenu(BaseModel):
"""角色菜单关联模型类"""
class Meta:
db_table = 'django_role_menu'
role_id = models.IntegerField(default=0, verbose_name='角色ID')
menu_id = models.IntegerField(default=0, verbose_name='菜单ID')角色模块使用自定义 service 函数,涉及唯一性校验、内置角色保护、关联数据清理等复杂逻辑:
# application/role/services.py
def add_role(request):
data = parse_request_body(request)
form = RoleForm(data)
if not form.is_valid():
return R.failed(msg=regular.get_err(form))
# 唯一性校验
name = data.get('name')
code = data.get('code')
if Role.objects.filter(name=name, is_delete=False).exists():
return R.failed("角色名称不能重复")
if Role.objects.filter(code=code, is_delete=False).exists():
return R.failed("角色编码不能重复")
Role.objects.create(
name=name,
code=code,
sort=data.get('sort', 0),
note=data.get('note', ''),
create_user=get_realname(request)
)
return R.ok(msg="添加成功")角色删除需清理关联的用户角色和角色菜单数据:
# application/role/services.py
def delete_role(request):
data = parse_request_body(request)
role_id = data.get('id')
role = Role.objects.filter(id=role_id, is_delete=False).first()
if not role:
return R.failed("记录不存在")
# 内置角色禁止删除
if role_id in BUILTIN_ROLE_IDS:
return R.failed("内置角色不允许删除")
# 软删除角色
role.is_delete = True
role.save()
# 清理关联数据
UserRole.objects.filter(role_id=role_id).delete()
RoleMenu.objects.filter(role_id=role_id).delete()
return R.ok(msg="删除成功")| 接口 | 方法 | 权限节点 | 说明 |
|---|---|---|---|
/role/page | GET | sys:role:page | 角色分页列表 |
/role/list | GET | sys:role:list | 角色列表(无分页) |
/role/detail/<int:role_id> | GET | sys:role:detail | 角色详情 |
/role/add | POST | sys:role:add | 新增角色 |
/role/update | POST | sys:role:update | 编辑角色 |
/role/delete/<int:role_id> | POST | sys:role:delete | 删除角色 |
/role/menu | POST | sys:role:auth | 分配菜单权限 |
角色管理模块具备以下特点:
1. RBAC 核心:连接用户和权限的桥梁
2. 双字段唯一性:name + code 均需唯一性校验
3. 内置角色保护:BUILTIN_ROLE_IDS 中的角色禁止删除
4. 级联清理:删除角色时清理 user_role / role_menu 关联
5. 灵活组合:一个角色可分配多个菜单,一个用户可拥有多个角色