在既有「管理员分配 → 客服导入工作台 → 手动选号」之外**新增**一条 「客服选皮肤 + 数量 → 系统分配账号 + 按需补积分 → 用完自动收回」的路径。 旧路径只做并集与可选参数扩展,行为不变(有用例守着)。 - 归属与使用权分离:新增 account_leases(生成列 + 唯一索引,并发抢号由数据库裁决), assigned_to 收窄为管理员/运营的维护责任;客服可见范围扩为「名下 ∪ 租用中」 - account_pool 服务:候选筛选、两梯队排序(先花快过期的 / 先选充值少的)、 供给与成本预估、租约领取/释放/回收 - 补给链:查余额 → 充鱼翅(单次 ≤800 元,超限拆单)→ 赠精英令 → 兑换; 运行期两道闸门:_skip_when(余额已够就别再花钱)、_depends_on(前置未成功就跳过) - 转人工:鱼翅支付等 10 分钟未到账转 manual_required,租约先不还; account_lease_reaper 兜 TTL 到期 / 漏释放 / 孤儿批次 - 运营流水:业务事件补 actor_id = task.created_by;账号详情页展示操作人、渠道 与租赁记录 - 新工作台:/douyu/pool + 菜单「账号分配台」(新建,不改造旧工作台) - 修复 D1:官方补录的兑换事件漏写 subject_key(10,612 条主键为空), 会让 365 天同皮肤规则漏判 87% 的历史;补代码 + 回填脚本 - 迁移 20261007_0052;权限 account:pool_use / account:pool_admin 测试:766 passed, 6 skipped(改动前基线 727);ruff 与 tsc -b 干净。 设计稿与实施记录:docs/设计-账号自动分配与回收.md
158 lines
5.2 KiB
Python
158 lines
5.2 KiB
Python
"""权限点定义与角色默认权限"""
|
|
|
|
# ---- 权限点 ----
|
|
PERMISSIONS = {
|
|
# 用户管理
|
|
"user:view": "查看用户列表",
|
|
"user:create": "创建用户",
|
|
"user:edit": "编辑用户",
|
|
"user:rename": "修改用户名",
|
|
"user:delete": "删除用户",
|
|
"user:assign_permissions": "分配权限",
|
|
# 账号管理
|
|
"account:view_all": "查看所有账号(仅用户名、标签、分配)",
|
|
"account:view_full": "查看账号完整字段(密码/邮箱,仅管理员)",
|
|
"account:view_assigned": "查看分配给自己的账号",
|
|
"account:import": "导入账号",
|
|
"account:tag": "修改账号标签",
|
|
"account:remark": "修改账号备注",
|
|
"account:check": "账号检测",
|
|
"account:assign": "分配账号给客服",
|
|
"account:delete": "删除账号",
|
|
"account:manage": "停用/归档账号、开关自动化",
|
|
# 账号池(自动分配与回收):归属仍是管理员/运营的维护责任,客服按需租用
|
|
"account:pool_use": "使用账号自动分配(领号执行并释放)",
|
|
"account:pool_admin": "查看全局账号池、强制释放他人租约",
|
|
# 登录任务
|
|
"login:batch": "发起批量登录",
|
|
"login:view_all": "查看所有登录任务",
|
|
"login:view_assigned": "查看自己账号的登录任务",
|
|
# Cookie
|
|
"cookie:view": "查看 Cookie",
|
|
"cookie:operate": "检测/重登已分配账号 Cookie(不含查看)",
|
|
"cookie:export": "导出 Cookie",
|
|
# 斗鱼活动
|
|
"douyu:task": "斗鱼任务管理",
|
|
"douyu:config": "斗鱼配置管理",
|
|
"yyb:session": "应用宝扫码登录与角色查询",
|
|
"yyb:recharge": "应用宝充值与付款",
|
|
"yyb:manage": "接管并操作他人的应用宝任务",
|
|
"yyb:history": "查看应用宝充值历史",
|
|
# 虎牙
|
|
"huya:account": "虎牙账号管理(兼容旧权限)",
|
|
"huya:view_all": "查看所有虎牙账号",
|
|
"huya:view_assigned": "查看分配给自己的虎牙账号",
|
|
"huya:import": "导入/登录虎牙账号",
|
|
"huya:tag": "修改虎牙账号标签",
|
|
"huya:assign": "分配虎牙账号",
|
|
"huya:delete": "删除虎牙账号",
|
|
"huya:cookie:view": "查看虎牙 Cookie",
|
|
"huya:cookie:export": "导出/清除虎牙 Cookie",
|
|
"huya:task": "虎牙任务管理",
|
|
"huya:bind": "虎牙绑定操作",
|
|
"huya:recharge": "虎牙充值操作",
|
|
"huya:config": "虎牙配置管理",
|
|
# 代理 & 白名单
|
|
"proxy:manage": "代理配置管理",
|
|
"whitelist:manage": "白名单配置管理",
|
|
"whitelist:test": "测试白名单",
|
|
# 自动化
|
|
"automation:view": "查看自动化作业与运行历史",
|
|
"automation:manage": "修改自动化配置、手动触发作业",
|
|
# 系统
|
|
"system:settings": "系统设置",
|
|
"audit:view": "查看审计日志",
|
|
}
|
|
|
|
# ---- 角色默认权限 ----
|
|
ROLE_PERMISSIONS = {
|
|
"super_admin": list(PERMISSIONS.keys()), # 全部权限
|
|
"operation": [
|
|
"account:view_all",
|
|
"account:import",
|
|
"account:tag",
|
|
"account:remark",
|
|
"account:check",
|
|
"account:assign",
|
|
"account:manage",
|
|
"account:pool_use",
|
|
"account:pool_admin",
|
|
"login:batch",
|
|
"login:view_all",
|
|
"cookie:view",
|
|
"cookie:export",
|
|
"douyu:task",
|
|
"douyu:config",
|
|
"yyb:session",
|
|
"yyb:recharge",
|
|
"yyb:manage",
|
|
"yyb:history",
|
|
"huya:account",
|
|
"huya:view_all",
|
|
"huya:import",
|
|
"huya:tag",
|
|
"huya:assign",
|
|
"huya:delete",
|
|
"huya:cookie:view",
|
|
"huya:cookie:export",
|
|
"huya:task",
|
|
"huya:bind",
|
|
"huya:recharge",
|
|
"huya:config",
|
|
"proxy:manage",
|
|
"whitelist:manage",
|
|
"whitelist:test",
|
|
"automation:view",
|
|
],
|
|
"support": [
|
|
"account:view_assigned",
|
|
"account:tag",
|
|
"account:remark",
|
|
"account:pool_use",
|
|
"douyu:task",
|
|
"yyb:session",
|
|
"yyb:history",
|
|
"huya:view_assigned",
|
|
"huya:tag",
|
|
"huya:task",
|
|
],
|
|
}
|
|
|
|
# 角色中文映射
|
|
ROLE_LABELS = {
|
|
"super_admin": "超级管理员",
|
|
"operation": "运营",
|
|
"support": "客服",
|
|
}
|
|
|
|
|
|
def get_role_permissions(role: str) -> list[str]:
|
|
"""获取角色拥有的权限列表。"""
|
|
return ROLE_PERMISSIONS.get(role, [])
|
|
|
|
|
|
def get_user_permissions(user) -> list[str]:
|
|
"""获取用户的实际权限列表。
|
|
优先使用用户自定义权限(custom_permissions),
|
|
若为 None 则回退到角色默认权限。
|
|
"""
|
|
if user.custom_permissions is not None:
|
|
return user.custom_permissions
|
|
return get_role_permissions(user.role)
|
|
|
|
|
|
def has_permission(role: str, permission: str) -> bool:
|
|
"""检查角色是否拥有某权限(仅检查角色默认权限,不考虑自定义权限)。
|
|
|
|
注意:对于需要考虑用户自定义权限的场景,请使用 user_has_permission()。
|
|
"""
|
|
return permission in get_role_permissions(role)
|
|
|
|
|
|
def user_has_permission(user, permission: str) -> bool:
|
|
"""检查用户是否拥有某权限(考虑自定义权限)。
|
|
|
|
优先使用用户的 custom_permissions,若为 None 则回退到角色默认权限。
|
|
"""
|
|
return permission in get_user_permissions(user)
|