本域总览见《账号计费中心 · 结构大纲》。本文为该域完整设计:定位与边界 / 角色与依赖 / 数据模型 / 核心流程 / 接口契约 / 关键约束与验收标准。
本域是运营与管理后台的功能域,覆盖全部功能域的管理面能力:谁可以进运营面、能做哪一类事、每次变更如何留痕。全文按「数据模型 → 核心流程 → 接口契约」排布(先事实结构,再运行路径,最后对外投影)。
定位:运营侧的身份与权限唯一判定者、运营端点统一门禁、运营动作留痕方。回答三问:平台员工是谁、权限范围是什么;某条运营端点在当前请求下是否放行;这次动作留下什么可复核的证据。业务能力本身(钱怎么扣、票怎么开、风险怎么判)不属本域。
核心概念
| 概念 | 承载 | 语义 |
|---|---|---|
| 平台员工 | platform_staff 一行 |
员工不是独立账号:既有账号加绑定行即员工;无绑定行访问运营端点一律拒绝 |
| 权限范围 | platform_staff 的 scopes |
授权唯一真相;每请求查库、不缓存进令牌,停用与改范围即时生效 |
| 权限簿 | 值域常量目录 | 范围全集(10 值),接口与提权工具双端引用;目录外取值一律拒绝 |
| 粗粒度权限 | saas:ops |
运营全集,隐含全部子域权限;反向不成立 |
| 运营面令牌 | 门户令牌(门户类型) | 只证明会话身份、不承载权限——权限每请求另查 |
| 内部运营令牌 | 内部令牌的运营 scope | 服务级凭据,供运营代理与部署侧任务调用内部写面 |
| 权限载体留痕 | 应用层审计行加库层审计行 | 同一事件两行:应用行带操作人,库层行带库执行角色 |
| 平台设置与客户端 | platform_settings 键值行、oauth_clients 登记行 |
平台级配置落点(无记录按默认语义)与单点登录客户端登记(可注册、改配、启停,不删除) |
关键口径
边界
能力矩阵
| 能力 | 本域 | 运营面调用方 | 统一登录服务 | 门户用户 |
|---|---|---|---|---|
| 维护员工绑定与权限范围 | ✓(唯一写入口) | 仅经本域端点 | ✗ | ✗ |
| 判定运营请求是否放行 | ✓(唯一实现) | 依赖本域 | ✗ | ✗ |
| 读员工绑定事实 | ✓ | 依赖本域 | ✓(内部点查) | 仅本人绑定 |
| 平台设置读写与客户端登记 | ✓ | 依赖本域 | ✗ | ✗ |
| 单点登录客户端登记 | ✓(运营面唯一写入口) | 依赖本域 | ✓(消费登记行) | ✗ |
| 运营动作留痕 | ✓ | ✗ | ✗ | ✗ |
上游依赖
| 上游 | 依赖内容 | 语义 |
|---|---|---|
| 账号与身份域 | 账号行与已验证联系方式 | 绑定按账号定位;授权入口按已验证邮箱唯一定位;令牌只证明会话身份 |
| 通知与触达域 | 可用短信通道清单 | 开关开启前置;通道停用触发反向联动 |
| 关系库 | 触发器与守卫函数 | 库层留痕与清空守卫的执行前提 |
下游被引用
| 引用方 | 引用内容 | 语义 |
|---|---|---|
| 统一登录服务 | 内部员工绑定点查端点 | 登录后判定操作者与调用者角色,只回绑定事实 |
| 全部运营面端点 | 门禁依赖(绑定加权限范围) | 每端点执行前统一校验,权限不足即拒绝 |
| 各能力域 | 运营入口与审计行 | 业务语义由各域实现,留痕口径由本域统一;审计行回答「谁在何时对哪个对象做了什么」 |
| 运营门户前端 | 本人绑定与权限范围 | 菜单与无权限页渲染依据;运营门户地址随绑定下发 |
operation_logs 为平台审计共用表,本域是其两个写入方(应用层写入点与库层触发器);客户端登记行归属统一登录侧,本域是其运营面唯一写入口。| 表 | 职责 | 关键字段 |
|---|---|---|
platform_staff |
权限载体:员工绑定行,一人至多一条 | user_id / status / scopes / granted_by / created_at |
platform_settings |
平台设置:键值行,运营门户自助开关的唯一事实源 | key / value / updated_by / created_at / updated_at |
operation_logs(引用) |
运营操作审计:应用层审计行与库层留痕行的共同去向 | actor_id / action / target_type / target_id / detail / created_at |
oauth_clients(引用) |
单点登录客户端登记:回调白名单与申请范围 | client_id / client_name / redirect_uris / scope / is_active |
users(引用) |
绑定主体的账号行,员工身份来源 | id / display_name / is_active |
staff:manage、saas:ops 及其 6 个子域、router:operator),目录外取值拒绝(状态码 422、明细 unknown_scope),值域单处定义、双端引用。user_id 上有唯一索引 uk_staff_user,账号行不做员工标记;status 仅 active / inactive,停用保留行与范围。empty_scopes)。staff:manage 即拒(明细 cannot_remove_own_staff_manage);不得停用本人绑定(明细 cannot_modify_self)。key 无记录即假且不预置初始行;时长类无记录或取值非法回落业务原值(验证码 10 分钟、邀请 7 天),取 0 属危险值。AFTER 行级触发器把插入 / 更新 / 删除的前后整行值写入 operation_logs,动作名前缀区分三动作,操作人置空(库层无人员身份)、数据库执行角色入明细。BEFORE 语句级守卫直接拒绝清空(状态码类 23000);业务回滚则留痕回滚、不留孤儿;旁路须「事务级开关为开」且「当前角色为维护角色成员」(append_only_bypass_authorized 兼查角色存在性)。client_id 为小写字母数字与连字符、首尾为字母数字;redirect_uris 须绝对地址且不带片段;scope 限 openid、portal 且不重复;只提供启停(软开关、不删行)。platform_staff.db_insert、platform_staff.db_update、platform_staff.db_delete 对应插入 / 更新 / 删除,对象类别固定 platform_staff、对象标识取绑定行标识。source 固定 db_trigger、db_user 记执行角色、user_id 记被绑账号、old 与 new 为整行快照(插入行旧值为空、删除行新值为空、更新行两侧齐全)。actor_id 一律为空,人员线索落在并存的应用层审计行上。platform_setting.phone_auth_auto_disabled、明细含原因的审计行。ttl_out_of_range);只影响新签发。| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /api/account/ops/staff |
员工列表:状态筛选、关键词检索、分页 |
| POST | /api/account/ops/staff |
授权:按已验证邮箱定位账号建绑定,范围先经目录校验 |
| PATCH | /api/account/ops/staff/{user_id}/scopes |
调整权限范围(替换语义、前后留痕;本人不得移除自身管理权限) |
| PATCH | /api/account/ops/staff/{user_id}/status |
停用或恢复(不可作用于本人;停用保留行与范围) |
| GET | /api/account/ops/staff/me |
本人绑定:仅要求有效绑定、不校验范围;回传范围与门户地址 |
| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /api/account/ops/settings |
设置总览:开关值、可用通道数、两个时长生效值 |
| PUT | /api/account/ops/settings/phone-auth |
手机认证开关:开启前置为存在可用通道,关闭无前置 |
| PUT | /api/account/ops/settings/ttl |
验证码与邀请有效期:区间校验,与现值相同则跳过不记审计 |
| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /api/account/ops/clients |
客户端列表:创建时间倒序,不含机密字段 |
| POST | /api/account/ops/clients |
新建登记:标识唯一,白名单与范围逐项校验 |
| PATCH | /api/account/ops/clients/{client_id} |
改配:全量替换语义,停用态可编辑 |
| PATCH | /api/account/ops/clients/{client_id}/status |
启用或停用:软开关不删行;值未变则不改不记 |
| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /internal/platform-staff/{user_id} |
员工绑定点查:有绑定回状态与范围,无绑定回未绑定;只回事实不下结论;消费方对非成功响应按未绑定降级 |
按能力所属域分组登记,语义细节写在各域;同一端点不在两篇重复展开。本域自有端点(§5.1~§5.4 共 13 条)不在此重复登记。
客户账务(门禁:客户运营权限)
| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /api/account/ops/customers |
台账(D04) |
| GET | /api/account/ops/customers/{customer_id} |
客户详情(D04) |
| PATCH | /api/account/ops/customers/{customer_id}/status |
经营状态(D04) |
| PATCH | /api/account/ops/customers/{customer_id}/credit-limit |
信用额度(D04) |
| PUT | /api/account/ops/customers/{customer_id}/grace |
宽限设置(D04) |
| POST | /api/account/ops/customers/{customer_id}/adjustment |
运营调整与坏账核销(门禁:额度权限;D04) |
| GET | /api/account/ops/real-name/verifications |
核验台账(D09) |
| POST | /api/account/ops/real-name/verifications/{verification_id}/review |
人工复核(D09) |
订单与支付(门禁:额度运营权限)
| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /api/account/ops/orders |
台账(D03) |
| GET | /api/account/ops/orders/{order_no} |
订单详情(D03) |
| POST | /api/account/ops/orders/{order_no}/confirm |
手工确认(D03) |
| POST | /api/account/ops/orders/{order_no}/query |
通道主动查单(D03) |
| POST | /api/account/ops/orders/poll |
在途订单轮询(D03) |
退款与对账(门禁:额度运营权限)
| 方法 | 路径 | 语义 |
|---|---|---|
| POST | /api/account/ops/orders/{order_no}/refund-request |
退款申请(D07) |
| POST | /api/account/ops/orders/{order_no}/refund-approve |
退款通过(D07) |
| POST | /api/account/ops/orders/{order_no}/refund-reject |
退款驳回(D07) |
| POST | /api/account/ops/orders/{order_no}/refund-retry |
通道重试(D07) |
| POST | /api/account/ops/orders/{order_no}/refund-manual-settle |
线下核销(D07) |
| POST | /api/account/ops/orders/{order_no}/refund-abandon |
放弃结案(D07) |
| GET | /api/account/ops/orders/refunds/offline-pending |
待确认清单(D07) |
| POST | /api/account/ops/orders/{order_no}/refund-offline-confirm |
线下确认(D07) |
| GET | /api/account/ops/orders/{order_no}/refund-risk |
退款风险台账(D07) |
对账台账(门禁:额度运营权限)
| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /api/account/ops/reconcile/check |
对账校验(D05) |
| POST | /api/account/ops/reconcile/scan |
对账扫描(D05) |
发票(门禁:发票运营权限)
| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /api/account/ops/invoices/applications |
申请台账(D08) |
| POST | /api/account/ops/invoices/applications |
代提申请(D08) |
| POST | /api/account/ops/invoices/applications/{application_id}/issue |
开票(D08) |
| POST | /api/account/ops/invoices/applications/{application_id}/reject |
驳回(D08) |
| POST | /api/account/ops/invoices/applications/{application_id}/void |
作废(D08) |
风控(门禁:风控运营权限)
| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /api/account/ops/risk/rules |
规则列表(D09) |
| POST | /api/account/ops/risk/rules |
新建规则(D09) |
| PATCH | /api/account/ops/risk/rules/{rule_id} |
更新规则(D09) |
| GET | /api/account/ops/risk/events |
事件台账(D09) |
| POST | /api/account/ops/risk/events/{event_id}/resolve |
处置事件(D09) |
| POST | /api/account/ops/risk/scan |
触发扫描(D09) |
| GET | /api/account/ops/risk/keys |
密钥视图(D03) |
| POST | /api/account/ops/risk/keys/{key_id}/kill |
封停(D03) |
| POST | /api/account/ops/risk/keys/{key_id}/unblock |
解封(D03) |
通道配置与支付通道(仅登记入口):通知与触达域运营面端点 32 条(前缀 /api/account/ops/channels,覆盖短信与邮件通道登记、改配、启停、优先级、探测、测试发送、模板绑定与发送事件查询,语义见 D10);订购与支付域 9 条(前缀 /api/account/ops/payments,覆盖状态、通道列表、新建、改配、启用、灰度、停用、探测与删除,语义见 D03)。
| # | 验收口径 |
|---|---|
| 1 | 无绑定行的账号访问任一运营端点返回同一拒绝结果,不泄露绑定状态 |
| 2 | 权限范围含权限簿外取值被拒且不产生绑定行;仅空格与空串视为空 |
| 3 | 授予运营全集即可调用全部子域端点;仅授一个子域时调用其它子域端点被拒 |
| 4 | 员工被停用后下一请求即失去运营端点访问权,无需等令牌过期 |
| 5 | 操作人把自身范围改为不含员工管理权限被拒;停用本人绑定被拒 |
| 6 | 范围或状态与现值相同时返回未变更且审计表不新增行 |
| 7 | 同一账号第二次授权被拒,且在册与停用两种状态给出不同明细 |
| 8 | 已停用账号被提权被拒;不存在邮箱与未验证邮箱返回同一结果 |
| 9 | 应用层与直连改权限范围都留库层留痕行,明细旧值与新值齐全 |
| 10 | 留痕行操作人为空、执行角色为当前库角色、来源标记固定;删除行可从旧值还原整行 |
| 11 | 一条语句改两行绑定落两行留痕;事务回滚后无新增留痕行 |
| 12 | 留痕行事后被同一连接改写或删除被拒 |
| 13 | 清空语句被拒(状态码类 23000)且行数不变;非维护角色开旁路仍被拒 |
| 14 | 无可用通道开启手机认证被拒;通道停用后开关同事务自动置关并留带原因的审计行 |
| 15 | 时长参数越界被拒、库内脏值回落原值而非 0;改小后既有凭证到期时刻不变 |
| 16 | 回调地址或申请范围非法被拒;停用后授权码兑换被拒且行仍在;响应不含机密字段 |