Appearance
第十二章 权限控制
本章定义操盘系统的角色划分、功能权限矩阵、数据可见范围及权限相关的交互规则。
12.1 角色定义
系统定义三种用户角色,每种角色拥有不同的操作权限和数据可见范围。
| 角色 | 角色代码 | 说明 |
|---|---|---|
| 普通操盘手 | TRADER | 负责具体赛事操盘 |
| 主管 | SUPERVISOR | 团队管理,高权限 |
| 风控 | RISK_CONTROL | 风险控制,最高权限 |
12.1.1 角色职责详述
普通操盘手:负责日常操盘工作,包括审核上架、盘口调整、风险监控、异常响应等。可操作分配给自己的赛事,也可主动上架未分配赛事(上架时分配给自己)。
| 职责范围 | 说明 |
|---|---|
| 赛事上架 | 审核待上架赛事,执行上架操作 |
| 盘口调整 | 在详情页隐藏/取消隐藏自己负责赛事的盘口 |
| 风险监控 | 监控自己负责赛事的投注分布和风险指标 |
| 异常响应 | 处理自己负责赛事的告警和异常情况 |
主管:负责操盘团队的管理工作,包括赛事分配、人员调度、异常审批等。可以操作所有赛事,并拥有分配操盘手、锁盘等高级权限。
| 职责范围 | 说明 |
|---|---|
| 赛事分配 | 将赛事分配给操盘手,调整分配 |
| 团队管理 | 协调团队工作,处理人员调度 |
| 高级操作 | 在详情页执行锁盘、解锁等高权限功能 |
| 异常审批 | 审批需要确认的异常处理 |
风控人员:负责风险监控和紧急干预,拥有最高操作权限。可以执行一键锁盘、处理高风险赛事等敏感操作。
| 职责范围 | 说明 |
|---|---|
| 风险监控 | 全局监控所有赛事的风险指标 |
| 紧急干预 | 执行一键锁盘等紧急操作 |
| 风控策略 | 配置和调整风控规则(在联赛管理页面) |
| 异常处理 | 处理高风险赛事和异常投注 |
12.2 功能权限矩阵
12.2.1 基础功能权限
| 功能 | 普通操盘手 | 主管 | 风控 | 说明 |
|---|---|---|---|---|
| 查看操盘列表 | ✅ | ✅ | ✅ | 全部角色可查看 |
| 筛选搜索 | ✅ | ✅ | ✅ | 全部角色可使用 |
| 数据导出 | ✅ | ✅ | ✅ | 导出当前筛选结果 |
12.2.2 上架与下架权限(列表页操作)
与7.4.1/11保持一致:操盘列表仅提供上架/下架操作,盘口操作统一在详情页进行。
"自己负责"定义:指当前用户被分配为该玩法的操盘手时。未分配的赛事不属于任何人"自己负责",普通操盘手对未分配和未上架的赛事只有查看权限。
| 功能 | 普通操盘手 | 主管 | 风控 | 说明 |
|---|---|---|---|---|
| 上架赛事 | ✅ | ✅ | ✅ | 全部角色可上架 |
| 隐藏待上架赛事 | ✅ | ✅ | ✅ | 全部角色可隐藏 |
| 下架赛事(自己的) | ✅ | ✅ | ✅ | 操盘手可下架自己负责的赛事 |
| 下架赛事(他人的) | ❌ | ✅ | ✅ | 仅主管和风控可下架他人赛事 |
| 批量上架 | ✅ | ✅ | ✅ | 全部角色可批量上架 |
| 批量下架(自己的) | ✅ | ✅ | ✅ | 操盘手可批量下架自己负责的赛事 |
| 批量下架(他人的) | ❌ | ✅ | ✅ | 仅主管和风控可批量下架他人赛事 |
12.2.3 盘口操作权限(详情页操作)
重要说明:根据D1设计决策,盘口操作(隐藏/取消隐藏/锁定/解锁)统一在「赛事操盘详情页」进行,列表页不提供这些操作按钮。
| 功能 | 普通操盘手 | 主管 | 风控 | 操作位置 | 说明 |
|---|---|---|---|---|---|
| 隐藏盘口(自己的) | ✅ | ✅ | ✅ | 详情页 | 操盘手可隐藏自己负责的赛事 |
| 隐藏盘口(他人的) | ❌ | ✅ | ✅ | 详情页 | 仅主管和风控可隐藏他人赛事 |
| 取消隐藏盘口(自己的) | ✅ | ✅ | ✅ | 详情页 | 操盘手可取消隐藏自己负责的赛事 |
| 取消隐藏盘口(他人的) | ❌ | ✅ | ✅ | 详情页 | 仅主管和风控可取消隐藏他人赛事 |
| 锁定盘口 | ❌ | ✅ | ✅ | 详情页 | 仅主管和风控可锁定 |
| 解锁盘口 | ❌ | ✅ | ✅ | 详情页 | 仅主管和风控可解锁 |
| 一键锁盘 | ❌ | ✅ | ✅ | 详情页 、列表页 | 仅主管和风控可执行 |
12.2.4 操盘手管理权限
| 功能 | 普通操盘手 | 主管 | 风控 | 说明 |
|---|---|---|---|---|
| 上架时选择操盘手 | ✅(仅选自己) | ✅ | ✅ | 普通操盘手上架时只能选择自己 |
| 分配/变更操盘手 | ❌ | ✅ | ✅ | 更换赛事负责人 |
| 批量分配 | ❌ | ✅ | ✅ | 批量上架时统一分配 |
12.2.5 详情页访问权限
| 功能 | 普通操盘手 | 主管 | 风控 | 说明 |
|---|---|---|---|---|
| 进入操盘详情(自己的) | ✅ | ✅ | ✅ | 操盘手可进入自己负责的赛事详情 |
| 进入操盘详情(未分配) | ✅ | ✅ | ✅ | 操盘手可查看未分配赛事详情(只读) |
| 进入操盘详情(他人的) | ❌ | ✅ | ✅ | 仅主管和风控可进入他人赛事详情 |
12.2.6 结算相关权限
| 功能 | 普通操盘手 | 主管 | 风控 | 说明 |
|---|---|---|---|---|
| 确认取消赛事退款 | ✅ | ✅ | ✅ | 全部角色可确认 |
| 处理腰斩赛事结算 | ✅ | ✅ | ✅ | 全部角色可处理 |
12.3 数据可见范围
| 角色 | 列表可见范围 | 详情页访问范围 | 说明 |
|---|---|---|---|
| 普通操盘手 | 已分配给自己 + 未分配 | 自己的可操作,未分配的只读 | 可看到自己负责的和待认领的赛事 |
| 主管 | 全部赛事 | 全部赛事 | 无限制,可查看和操作全部赛事 |
| 风控 | 全部赛事 | 全部赛事 | 无限制,可查看和操作全部赛事 |
权限设计说明
普通操盘手可见范围 = 「已分配给自己的赛事」+「未分配的赛事」,设计原因:
- 主动承接:操盘手可以主动上架未分配赛事并承接(上架时分配给自己)
- 工作协同:了解待处理赛事情况,便于团队协作
- 责任明确:已分配给他人的赛事不可见,避免越界操作
普通操盘手看不到已分配给其他操盘手的赛事,这部分仅主管和风控可见。
12.3.1 普通操盘手的赛事可见规则
普通操盘手可见以下两类赛事:
| 可见类型 | 匹配条件 | 可执行操作 |
|---|---|---|
| 已分配给自己 | 操盘手编号 = 当前用户编号 | 上架、下架、详情页操作 |
| 未分配赛事 | 操盘手字段为空 | 上架(上架时分配给自己) |
不可见的赛事:已分配给其他操盘手的赛事,普通操盘手不可见。
12.3.2 主管的赛事管理职责
主管可以看到全部赛事,负责:
| 职责 | 说明 |
|---|---|
| 赛事分配 | 将待上架赛事分配给操盘手 |
| 分配调整 | 在操盘手之间转移赛事 |
| 兜底操作 | 对紧急赛事进行操作 |
| 全局监控 | 查看所有操盘手的工作状态 |
12.4 权限不足处理
12.4.1 前端处理
| 场景 | 处理方式 | 说明 |
|---|---|---|
| 无权限的按钮 | 显示为禁用状态(灰色 50% 透明度) | 视觉上明确不可操作 |
| 鼠标悬停无权限按钮 | 显示 Tooltip 提示具体原因 | 帮助用户理解原因 |
| 通过 URL 直接访问无权限页面 | 跳转到无权限提示页面 | 防止越权访问 |
| 通过快捷键触发无权限操作 | 弹出提示对话框 | 阻止操作并提示 |
12.4.2 后端处理
| 场景 | 处理方式 | HTTP 状态码 |
|---|---|---|
| 接口权限校验失败 | 返回错误信息 | 403 Forbidden |
| 越权操作尝试 | 记录越权操作日志 | 403 Forbidden |
| 角色不存在 | 返回错误信息 | 401 Unauthorized |
12.4.3 权限提示文案
| 场景 | 提示文案 |
|---|---|
| 下架他人赛事 | 「该赛事由 {操盘手姓名} 负责,您无权操作」 |
| 执行锁盘/解锁(详情页) | 「锁盘/解锁操作仅限主管和风控执行」 |
| 分配/变更操盘手 | 「分配操盘手仅限主管执行」 |
| 进入他人赛事详情 | 「该赛事由 {操盘手姓名} 负责,您无权查看详情」 |
| 批量操作包含他人赛事 | 「选中的赛事中包含非您负责的赛事,这些赛事将被跳过」 |
| 对未分配赛事执行非上架操作 | 「该赛事尚未分配操盘手,请先上架」 |
12.5 角色切换与多角色
12.5.1 单用户单角色
系统采用单用户单角色设计,每个用户只能拥有一种角色。角色由管理员在后台配置,用户无法自行切换。
| 设计原则 | 说明 |
|---|---|
| 职责清晰 | 每个用户只承担一种角色的职责 |
| 权限明确 | 避免多角色带来的权限混淆 |
| 审计简单 | 操作日志可明确追溯到具体角色 |
12.5.2 角色变更
当用户角色发生变更时:
| 变更类型 | 处理方式 | 生效时机 |
|---|---|---|
| 角色升级(操盘手 → 主管) | 获得新权限 | 下次刷新页面后生效 |
| 角色降级(主管 → 操盘手) | 失去原权限 | 下次刷新页面后生效 |
| 角色平移(主管 → 风控) | 权限变更 | 下次刷新页面后生效 |
12.5.3 角色变更时的数据处理
| 场景 | 处理方式 |
|---|---|
| 操盘手升级为主管 | 原负责的赛事保持分配关系 |
| 主管降级为操盘手 | 需重新分配其原负责的赛事 |
| 操盘手账号停用 | 主管重新分配其负责的赛事 |
12.6 敏感操作审计
日志详情:审计日志是操盘日志的子集,完整的日志格式、字段定义和查询方式详见第18章「操盘日志页面规范」。
以下敏感操作会记录详细审计日志:
| 操作类型 | 记录内容 | 风险等级 |
|---|---|---|
| 锁盘 | 操作人、操作时间、赛事信息 | 高 |
| 解锁 | 操作人、操作时间、赛事信息 | 高 |
| 一键锁盘 | 操作人、操作时间、影响赛事数量 | 高 |
| 分配操盘手 | 操作人、操作时间、赛事信息、分配给谁 | 中 |
| 变更操盘手 | 操作人、操作时间、赛事信息、原操盘手、新操盘手 | 中 |
| 取消赛事确认 | 操作人、操作时间、赛事信息、选择的结算方式 | 高 |
| 腰斩赛事确认 | 操作人、操作时间、赛事信息、选择的结算方式 | 高 |
| 越权操作尝试 | 操作人、操作时间、尝试的操作、失败原因 | 高 |
12.6.1 审计日志保留与查询
| 配置项 | 值 | 说明 |
|---|---|---|
| 保留时间 | 180 天 | 超过 180 天自动归档 |
| 查询权限 | 主管、风控 | 普通操盘手无法查询审计日志 |
| 导出权限 | 风控 | 仅风控可导出审计日志 |
12.6.2 审计日志字段
| 字段 | 数据类型 | 说明 |
|---|---|---|
| 日志编号 | 字符串 | 唯一标识 |
| 操作时间 | 时间戳 | 精确到毫秒 |
| 操作人编号 | 字符串 | 操作人用户编号 |
| 操作人姓名 | 字符串 | 操作人姓名 |
| 操作人角色 | 枚举 | TRADER / SUPERVISOR / RISK_CONTROL |
| 操作类型 | 枚举 | 见上表 |
| 操作对象 | 字符串 | 赛事编号或批量操作标识 |
| 操作详情 | JSON | 操作的具体参数和结果 |
| 操作结果 | 枚举 | SUCCESS / FAILED / REJECTED |
| 操作原因 | 字符串 | 操作人填写的原因(如有) |
| IP 地址 | 字符串 | 操作人 IP |
12.7 权限与操作按钮的联动
操盘列表中的操作按钮显示规则需要同时满足「状态条件」(详见第7章7.4节)和「权限条件」。
12.7.1 列表页按钮显示与权限叠加规则
与7.4.1/D1决策保持一致:操盘列表仅提供上架/下架/详情三个操作按钮。
| 按钮 | 状态条件(第七章) | 权限条件 | 最终显示 |
|---|---|---|---|
| 上架 | 待上架/已下架 + 正常 | 全部角色 | 满足状态条件即显示 |
| 下架 | 已上架 | 自己的赛事或主管/风控 | 状态满足 + 权限满足才可点击 |
| 详情 | 任意 | 自己的/未分配的赛事或主管/风控 | 状态满足 + 权限满足才可点击 |
12.7.2 详情页按钮权限规则
盘口操作按钮在详情页显示,权限规则如下:
| 按钮 | 状态条件 | 权限条件 | 说明 |
|---|---|---|---|
| 隐藏 | 盘口状态=开盘 | 自己的赛事或主管/风控 | 普通操盘手仅限自己的赛事 |
| 取消隐藏 | 盘口状态=隐藏 | 自己的赛事或主管/风控 | 普通操盘手仅限自己的赛事 |
| 锁盘 | 盘口状态=开盘/隐藏 | 仅主管/风控 | 普通操盘手无此权限 |
| 解锁 | 盘口状态=锁定 | 仅主管/风控 | 普通操盘手无此权限 |
修订记录
| 版本 | 日期 | 修订内容 |
|---|---|---|
| v1.0 | 2026-01-15 | 初稿 |
| v1.1 | 2026-01-21 | 【D1/D3决策对齐】1) 12.3节普通操盘手可见范围改为「已分配+未分配」;2) 12.2.3节盘口操作增加「操作位置=详情页」;3) 12.7节移除列表页不存在的按钮,拆分为列表页/详情页权限;4) VitePress语法转换 |
| v1.2 | 2026-01-28 | 【审计修正】12.2.2节补充「自己负责」定义:指当前用户被分配为该玩法的操盘手时 |