feat: 俱乐部杂项图片/关注快手;角色客服按club隔离

This commit is contained in:
XingQue
2026-06-25 02:43:40 +08:00
parent 0c4b28ea45
commit 7a2723fef7
9 changed files with 280 additions and 21 deletions

View File

@@ -151,17 +151,15 @@ class GetRolePermissionView(APIView):
all_perms = Permission.objects.filter(PermStatus=1).values('PermCode', 'PermName', 'PermDesc')
permissions_list = [_serialize_permission_row(p) for p in all_perms]
# 4. 获取所有角色,并统计每个角色下的用户数(仅后台客服账号)
from jituan.services.club_rbac import count_role_users_in_scope, filter_roles_for_request
kefu_user_uuids = list(
User.objects.filter(KefuProfile__isnull=False).values_list('UserUUID', flat=True)
)
roles = Role.objects.filter(RoleStatus=1)
roles = filter_roles_for_request(request)
roles_data = []
for role in roles:
user_count = UserRole.objects.filter(
RoleUUID=role.RoleUUID,
UserUUID__in=kefu_user_uuids,
).count()
user_count = count_role_users_in_scope(role, request, kefu_user_uuids)
role_perm_uuids = RolePermission.objects.filter(
RoleUUID=role.RoleUUID
).values_list('PermUUID', flat=True)
@@ -175,6 +173,7 @@ class GetRolePermissionView(APIView):
'role_code': role.RoleName,
'role_name': role.RoleName,
'description': role.RoleDesc or '',
'club_id': getattr(role, 'ClubID', '') or '',
'user_count': user_count,
'permissions': perms_of_role
})
@@ -339,9 +338,13 @@ class AddRoleView(APIView):
if '000001' not in permissions:
return Response({'code': 403, 'msg': '您无权进行此操作'})
# 检查角色名称是否已存在
if Role.objects.filter(RoleName=role_name).exists():
return Response({'code': 400, 'msg': '角色名称已存在'})
# 检查角色名称是否已存在(同俱乐部内唯一)
from jituan.services.club_rbac import resolve_role_club_id, role_name_exists
target_club_id = resolve_role_club_id(
request, (request.data.get('target_club_id') or '').strip() or None,
)
if role_name_exists(role_name, target_club_id):
return Response({'code': 400, 'msg': '该俱乐部下角色名称已存在'})
# 生成唯一角色编码格式ROLE_ + 8位随机字母数字
role_code = f"ROLE_{''.join(random.choices(string.ascii_uppercase + string.digits, k=8))}"
@@ -356,6 +359,7 @@ class AddRoleView(APIView):
RoleStatus=1,
AssignScope=0,
RoleDesc=description,
ClubID=target_club_id,
CreateTime=timezone.now(),
)
# 绑定权限(过滤掉不存在的权限编码)
@@ -405,6 +409,9 @@ class GetAdminUserListView(APIView):
KefuProfile__isnull=False
).select_related('KefuProfile')
from jituan.services.club_rbac import filter_kefu_users_qs
users = filter_kefu_users_qs(users, request)
if phone:
users = users.filter(Phone__icontains=phone)
if nicheng:
@@ -442,6 +449,7 @@ class GetAdminUserListView(APIView):
'phone': user.Phone or '',
'yonghuid': user.UserUID or '',
'nicheng': user.KefuProfile.nicheng,
'club_id': getattr(user, 'ClubID', '') or '',
'roles': roles_data,
'status': user.KefuProfile.zhuangtai,
'create_time': user.UserCreateTime.strftime('%Y-%m-%d %H:%M:%S') if getattr(user, 'UserCreateTime', None) else '',
@@ -481,11 +489,19 @@ class GetAdminRolesView(APIView):
if '000001' not in permissions:
return Response({'code': 403, 'msg': '您无权访问此页面'})
roles = Role.objects.filter(RoleStatus=1).values('RoleName')
from jituan.services.club_rbac import filter_roles_for_request
roles = filter_roles_for_request(request).values('RoleName', 'ClubID')
return Response({
'code': 0,
'data': {
'roles': [{'role_code': r['RoleName'], 'role_name': r['RoleName']} for r in roles]
'roles': [
{
'role_code': r['RoleName'],
'role_name': r['RoleName'],
'club_id': r.get('ClubID') or '',
}
for r in roles
]
}
})