版本 v2.0(在 v1.0 基础上纳入账号安全处置、分级权限管控、异常提醒三项新增需求)
日期 2026-08-14
面向 内部业务决策
调研范围 doctor-ai-brain(核心系统) + settlement(渠道结算系统)
本报告所有技术判断均来自对现有代码的逐项检索,每条结论在附录 A 给出 文件:行号 出处,可逐条复核。
必须先讲清楚哪些能信、哪些不能信:
| 类别 | 状态 |
|---|---|
| 代码层结论(有没有这张表、有没有这个字段、这个功能现在是怎么实现的) | ✅ 已物理验证 |
| IP 归属地解析能力(精度、速度、可获取性) | ✅ 已在本机真实跑通,结果见 §4.2 |
| 数据层结论(多少机构填了地址、日均登录多少次、IP 数据质量) | ❌ 未实测。开发机按规矩不连生产库,需业务侧执行摸底 SQL 后回填 |
| 性能结论(大屏并发、查询耗时) | ❌ 未实测,缺生产同栈环境 |
凡涉及数量、比例、耗时的地方,本报告一律不给编造的数字。需要实测的部分已整理成独立的《数据摸底 SQL》交付件。
公司目前采用"渠道创建 → 机构入驻 → 机构账号独立登录"的三级管理模式:
这套模式在业务扩张期运转正常,但管理侧的观测手段没有跟上,主要体现在三点:
第一,看不到"在哪里"。 系统从建立至今没有采集过机构的地域信息,管理人员无法回答"我们在哪些省有机构""哪个省覆盖薄弱""某个渠道的机构集中在哪些区域"这类基本问题。
第二,看不到"谁在用"。 登录记录虽然完整落库,但只能通过后台表格逐条翻查。管理人员无法一眼判断当前系统的活跃程度,也无法察觉某个区域的机构集体沉默。
第三,发现问题到处置问题之间是断的。 即便通过审计日志发现某个账号异常,处置动作要切换到另外的管理页面去做,中间隔着若干次跳转和查找,异常响应效率低。
调研中确认了四项事实,两好两坏:
有利事实一:登录行为已经完整落库,且记录的是用户真实公网 IP。
系统的认证审计表记录了每一次登录成功/失败的账号、IP、终端信息和精确时间,且 Nginx 与应用容器的代理配置是配套的,记录的是用户真实公网地址而非机房内部地址。这意味着"登录实时上屏"的数据源已经存在,不需要新增任何埋点。
有利事实二:渠道、机构、签约、登录四类数据在同一个物理数据库中。
结算系统虽然在架构上已拆分为独立服务,但生产部署是与核心系统同库共存(通过独立数据库账号做权限隔离)。这意味着"机构归属哪个渠道"可以用一条 SQL 直接关联出来,不需要跨服务调用接口拼装数据,方案复杂度降低一个量级。
不利事实一:系统没有任何地理维度数据。
全库没有省、市字段,没有行政区划字典。机构地址有两个来源,但一个是门店分享名片时自己在手机上选的位置(业务上从不强制),另一个是入驻资料里的签约地址(表单校验的是营业执照、门头照、视光师资质、设备照四类文件,地址字段允许为空)。
不利事实二:系统没有"在线状态"这个概念。
登录采用无状态令牌机制,登录后不打卡、不心跳、退出也不落库。系统目前能回答"这个账号今天上午十点登录过",回答不了"这个账号此刻是否在线"。
本项目要达成的目标,按业务价值排序:
必须纠正一个常见预期:这不是一个"前端画张地图"的项目。
地图渲染、点位闪烁、统计卡片这些工作,占总工作量不到三分之一。真正的工程量集中在四处,且都在业务与数据层,不在展示层:
| 难点 | 本质问题 |
|---|---|
| 地图上的点从哪来 | 机构没有地理坐标,需要建数据、补数据、做地址解析 |
| 在线状态怎么算 | 系统没有在线概念,需要先定义业务口径 |
| 强制下线怎么做 | 无状态令牌天然不支持"踢人",需要改造失效机制 |
| 分级权限怎么控 | 现有权限只管"能不能看见这个菜单",管不了"能看见哪些机构" |
后文对每一项都给出了具体方案和工作量判断。
以中国电子地图为核心载体,机构账号登录后,地图上对应地理位置的机构点位自动点亮。
| 编号 | 子需求 | 现状 | 判定 |
|---|---|---|---|
| M1 | 中国地图底图,支持省级着色 | 前端无任何地图库 | 🆕 新建 |
| M2 | 机构点位按地理坐标落图 | 无坐标数据 | 🔴 卡点,见 §2.1.1 |
| M3 | 登录后对应点位点亮(含动效) | 登录数据现成,缺推送与地区判定 | 🟡 部分 |
| M4 | 省级热力着色(按活跃度) | 依赖 M2 | 🔴 卡点 |
| M5 | 点位聚合(同城多机构不重叠) | — | 🆕 新建 |
| M6 | 省份下钻(点省看该省机构列表) | — | 🆕 新建 |
这是全项目的第一优先级问题。现有两个数据来源都不可靠:
| 来源 | 性质 | 问题 |
|---|---|---|
| 门店名片位置(含经纬度) | 席位在手机端手动选点 | 为分享名片功能设计,业务从不强制,覆盖率大概率很低 |
| 入驻签约地址(文字地址) | 入驻资料的一部分 | 表单层面允许为空,审核不校验,覆盖率待实测 |
建议的解决路径(三层兜底,按优先级取值):
关键原则:绝不允许把未定位的机构静默丢弃。 大屏必须显示"全国 X 家机构,其中 Y 家未定位",否则会造成"我们只有这么多机构"的误判——这比没有大屏更危险。
"地图上那个点代表什么"这件事,业务上有两种理解,实现方式完全不同:
| 理解 | 含义 | 优点 | 缺点 |
|---|---|---|---|
| A. 机构注册地 | 这家机构签约时登记在哪 | 稳定、权威、可核对 | 不反映实际使用地 |
| B. 本次登录地 | 这个人这次从哪登的 | 天然实时,覆盖率高 | 城市级精度,移动网络会漂移 |
| C. 双轨(建议) | 底图点位用注册地,点亮用登录地 | 两个问题各自用最合适的数据源 | 实现成本略高 |
建议选 C。理由是"地域分布"和"登录点亮"本来就是两个不同的业务问题,用一个数据源硬扛必然有一边失真。而且两者不一致时(注册在成都、天天从广州登录)本身就是有价值的风控信号,可直接服务于 §2.6 的异常提醒。
点击地图点位,下钻查看该机构的详细信息。
| 字段 | 数据来源 | 现状 |
|---|---|---|
| 机构名称 | 机构表 | ✅ 现成 |
| 归属渠道 | 签约档案 → 渠道表(同库外键关联) | ✅ 现成 |
| 登录 IP | 认证审计表(真实公网 IP) | ✅ 现成 |
| 登录时段 | 认证审计表(带索引,查询高效) | ✅ 现成 |
| 登录终端 | 认证审计表的 user_agent 与 detail | ✅ 现成 |
| 在线状态 | — | 🔴 需先定义口径,见 §2.2.1 |
| 机构基础信息(联系人、电话、启用状态、入驻时间) | 机构表 | ✅ 现成 |
| 签约状态、席位数、有效期 | 签约档案、用户表 | ✅ 现成 |
| 近期活跃行为 | 行为流水表(已有复合索引) | ✅ 现成 |
判定:详情弹窗要展示的信息,九成以上是现成数据,只需查询组装,无需新建采集链路。
再次强调技术事实:系统采用无状态令牌,服务端不维护会话,没有心跳,退出不落库。因此"此刻是否在线"在当前架构下无法精确回答。
有两条路:
路线一(建议):用活跃度分级替代二元在线状态。
| 状态 | 判定口径(建议值,需业务确认) | 大屏表现 |
|---|---|---|
| 在线 | 最近 15 分钟内有登录或业务操作 | 点位常亮 + 呼吸动效 |
| 今日活跃 | 今日有登录或业务操作 | 点位亮色 |
| 近期活跃 | 7 日内有活动 | 点位淡色 |
| 沉默 | 超过 7 日无活动 | 点位灰色 |
优点是零新增埋点,纯查询实现,口径可解释可审计,且能直接支撑"各省份活跃度"的着色。
路线二:新增前端心跳上报。
每隔一段时间由前端上报一次在线信号。精度更高,但需要新建接口、新建表、处理心跳风暴,且对现有的所有客户端(H5、平板、小程序)都要改造。投入产出比不划算,不建议为大屏单独做。
在大屏上可对机构账号执行强制下线、启用/禁用、重置密码等操作,并记录操作日志。
| 操作 | 现状 | 说明 |
|---|---|---|
| 启用 / 禁用账号 | ✅ 已有接口 | 用户管理与席位管理均已实现 |
| 重置密码 | ✅ 已有接口 | 用户侧与席位侧各有实现 |
| 解锁被锁定账号 | ✅ 已有接口 | 现有安全策略配套 |
| 操作日志记录 | ✅ 可复用现有表 | 见 §2.3.2 |
| 强制下线 | 🔴 需改造 | 见 §2.3.1,这是本节唯一的真工程量 |
系统当前的"下线"机制有两套,都不能直接满足需求:
机制一:令牌黑名单。 用户主动退出时,把他那一串具体的令牌加入 Redis 黑名单。
局限:管理员要踢某个账号时,服务端手里根本没有那个账号的令牌字符串(无状态令牌不落库)。所以这套机制只能用于"用户自己退出",无法用于"管理员踢人"。
机制二:席位设备绑定。 席位账号的令牌里带设备标识,每次请求都会与数据库里记录的当前设备做比对,不一致直接拒绝。
这是一个意外的好消息:对机构席位账号而言,只要把数据库里的当前设备标识改掉,该账号的所有请求会立即失效——等于现成的、即时生效的强制下线能力,几乎零成本。
但对管理员账号、机构管理员账号、渠道账号,没有这层校验,强制下线需要新建机制。
建议方案(工程量不大,但必须一次做对):
结算系统已有一张通用操作审计表,字段结构与本需求完全对口:
操作人、操作人角色、动作类型、操作对象类型、操作对象 ID、操作前快照、操作后快照、操作理由、请求 ID、操作时间。
建议直接复用,不新建表。 其中"操作前后快照"对安全处置场景尤其重要(谁在什么时候把哪个账号从启用改成了禁用,一目了然),"请求 ID"字段还能直接用于 §7.5 的多人操作冲突防护。
大屏是给人看的,通常常驻显示、甚至可能投屏在办公区;而账号处置是高危操作。把两者放在同一个界面,本身是一个需要谨慎对待的设计。
具体风险:大屏常驻意味着登录态长期挂着,若屏幕无人值守,任何路过的人都可以点击禁用某个客户的账号。
建议的防护设计(供业务决策):
全国活跃机构数量、各省份机构活跃度、各渠道机构分布统计卡片。
| 卡片 | 数据来源 | 现状 |
|---|---|---|
| 全国活跃机构数 | 登录审计 + 行为流水 | ✅ 现有机构洞察功能已有活跃口径,建议复用不重造 |
| 今日登录次数 / 环比 | 登录审计 | ✅ 现有看板已有同类实现 |
| 覆盖省份数 | 依赖地理数据 | 🔴 依赖 §2.1.1 |
| 各省份活跃度排行 | 依赖地理数据 | 🔴 依赖 §2.1.1 |
| 各渠道机构分布 | 渠道 + 签约档案(同库关联) | ✅ 数据现成 |
| 未定位机构数 | 地理数据 | 🆕 新建(诚实性要求,见 §2.1.1) |
重要提示:口径必须与现有报表统一。 系统现有的"机构洞察"页面已经有一套活跃度口径。如果大屏另立一套口径,会出现"同一天两个页面两个数字"的情况,管理层会立刻质疑数据可信度。建议大屏的活跃口径直接复用现有实现,而不是重新写一遍聚合逻辑。
总管理员、渠道管理员、区域管理员按权限查看不同范围数据。
现有权限体系是"角色 → 菜单开关"的二元结构:一张表记录"某个角色能不能看见某个菜单"。
这套机制只能控制"能不能进这个页面",完全无法控制"进来后能看到哪些机构的数据"。
本需求要的恰恰是后者——渠道管理员进大屏,只能看到自己名下的机构;区域管理员只能看到自己辖区的机构。这在技术上叫数据行级权限,现有系统一点基础都没有。
| 角色 | 现状 | 缺口 |
|---|---|---|
| 总管理员 | ✅ 已有超管角色,全量可见 | 无缺口 |
| 渠道管理员 | 🟡 渠道账号已存在(有独立登录、绑定渠道) | ⚠️ 但目前进不了管理后台 —— 后台准入角色白名单里没有渠道角色,渠道账号只能进渠道自己的 H5 页面。要让渠道管理员看大屏,需要开放后台准入,或为渠道做独立的大屏入口 |
| 区域管理员 | 🔴 全库无此概念 | 检索确认:系统中不存在区域/大区的任何定义、区域与省份的映射关系、以及区域管理员角色。需从零建设 |
数据范围过滤必须在后端接口层强制执行,绝不能靠前端隐藏。
前端隐藏只是"看不见",接口照样能返回全量数据,任何人打开浏览器开发者工具就能看到本不该看的客户信息。渠道之间存在竞争关系,渠道 A 看到渠道 B 的机构名单属于严重的商业信息泄露。这一条在验收时必须专门测试:用渠道管理员的账号直接调用接口,验证返回的数据确实被过滤。
多地登录、频繁掉线、非工作时间登录等异常情况提醒。
| 异常类型 | 可行性 | 说明 |
|---|---|---|
| 多地登录 | ✅ 可实现 | 数据基础完备:登录审计有全量 IP 与时间,IP 归属地能力已验证可用。判定逻辑:同一账号在设定时间窗内出现在两个不同城市 → 告警。可进一步做"物理不可达"判定(如 1 小时内北京、广州各登录一次) |
| 非工作时间登录 | ✅ 可实现 | 登录时间现成。注意时区:数据库存的是标准时间,判定必须转成北京时间,系统内已有同类处理先例可参照 |
| 频繁掉线 | 🔴 当前无法实现 | 见下方说明 |
| 异地登录(登录地 ≠ 注册地) | ✅ 可实现 | §2.1.2 选双轨方案后自然获得 |
| 暴力破解 / 撞库 | ✅ 已有防护 | 系统已有失败次数限制与 IP 维度的横向扫描防护,大屏只需把已有信号展示出来 |
系统目前物理上无法统计掉线。 原因是没有心跳机制,也不记录会话终止——系统只知道"什么时候登录的",不知道"什么时候断的",因此"掉线"这个事件在数据层根本不存在。
三个选择,请业务方定夺:
| 方案 | 说明 | 成本 |
|---|---|---|
| A. 用代理指标替代(建议) | 用"短时间内重复登录次数异常"近似表征掉线(频繁掉线通常伴随频繁重连)。口径不精确但零改造 | 低 |
| B. 新增心跳上报 | 精确统计在线时长与掉线,但需改造全部客户端 | 高 |
| C. 本期不做 | 明确剔除,留待后续 | 零 |
建议选 A,并在大屏上把指标名称如实标注为"频繁重连"而非"掉线"——指标名称与实际口径必须一致,这是数据可信度的底线。
现状:系统有一个统一错误上报接口,但目前是占位实现,只写日志,既不落表也不推送(代码注释明确写着留待后续升级为"事件表 + 告警规则 + 企业微信机器人")。
已具备的推送通道:阿里云短信、微信订阅消息。
建议:本期告警先做到"大屏内提醒 + 落库可查"(右侧异常提醒栏 + 异常记录列表),不做外部推送。理由是外部推送涉及告警规则配置、免打扰策略、误报处理,是一个独立的运营监控课题,混进本项目会显著拉长工期。
┌──────────────────────────────────────────────────────────────┐
│ 数据驾驶舱大屏(全屏页面) │
│ ┌────────────┬──────────────────────────┬────────────────┐ │
│ │ 统计卡片区 │ 中国地图主区域 │ 实时动态区 │ │
│ │ ① 统计模块 │ ② 地图模块 │ 登录流水 │ │
│ │ │ │ ⑥ 异常提醒 │ │
│ └────────────┴──────────────────────────┴────────────────┘ │
│ ↓ 点击点位 │
│ ┌──────────────────────────┐ │
│ │ ③ 详情弹窗模块 │ │
│ │ 机构信息 / 渠道 / 登录记录 │ │
│ │ ┌────────────────────┐ │ │
│ │ │ ④ 账号处置模块(受控) │ │ │
│ │ └────────────────────┘ │ │
│ └──────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
↕
┌──────────────────────────────────────────────────────────────┐
│ ⑤ 权限模块(贯穿全部请求) │
│ 菜单准入(已有) + 数据范围过滤(新建 · 后端强制) │
└──────────────────────────────────────────────────────────────┘
↕
┌──────────────────────────────────────────────────────────────┐
│ 后端服务层 │
│ 大屏查询服务 │ 处置服务 │ IP归属地服务 │ 异常检测 │ ⑦ 日志审计 │
└──────────────────────────────────────────────────────────────┘
↕
┌──────────────────────────────────────────────────────────────┐
│ 数据层(同一数据库 · 现有表为主 · 新增两张小表) │
│ 机构 │ 渠道 │ 签约档案 │ 登录审计 │ 行为流水 │ 操作审计 │
│ + 机构地理表(新) + 区域体系表(新) │
└──────────────────────────────────────────────────────────────┘
分区展示:机构基础信息 / 归属渠道 / 登录记录(IP + 归属地 + 时间 + 终端)/ 活跃状态 / 席位概况。
登录 IP 按查看者角色脱敏(见 §7.6)。
两层结构:
| 角色 | 可见范围 |
|---|---|
| 总管理员 | 全部机构 |
| 渠道管理员 | 本渠道名下机构 |
| 区域管理员 | 本辖区省份内机构 |
实现红线:过滤在后端完成,前端不做任何数据裁剪。
| 方案 | 评价 |
|---|---|
| ECharts + 自托管中国地图数据(建议) | 无需申请密钥、无外网依赖、机构位置数据不出网、省市下钻成熟、离线可用 |
| 高德 / 百度地图 JS API | 底图精美、自带地址解析,但需申请密钥并计费,机构坐标与登录位置要发送给第三方,且页面依赖外网 |
建议 ECharts 方案。 合规性与可控性优先,内部驾驶舱不需要卫星底图。
需注意:现有前端技术栈的图表库不支持地理投影,必须新增地图库依赖,这是本项目唯一需要新增的前端依赖,需按技术栈管理规则走审批。
选用离线 IP 归属地库,本机实测结果:
| 输入 IP | 解析结果 |
|---|---|
| 220.181.38.148 | 中国 · 北京 · 北京市 · 电信 |
| 61.139.2.69 | 中国 · 四川省 · 成都市 · 电信 |
| 58.216.0.1 | 中国 · 江苏省 · 常州市 · 电信 |
| 223.5.5.5 | 中国 · 浙江省 · 杭州市 · 阿里云 |
| 8.8.8.8 | 美国(境外可识别) |
| 172.18.0.1 | 内网IP(可识别机房内部地址) |
附带价值:该库能识别内网地址,可用作部署健康探针——一旦大批登录被解析为内网 IP,说明代理配置被改坏,可第一时间发现。
系统内已有两种实时技术的先例:WebSocket(实时语音)与 SSE(流式对话)。但本项目建议都不用,采用定时轮询。
| 方案 | 评价 |
|---|---|
| 定时轮询(建议,15 秒) | 实现简单、无连接维护、断网自愈、鉴权沿用现有机制。大屏观众是内部管理人员,并发以个位数计,压力可忽略 |
| SSE | 单向推送,但本项目在 SSE 的连接关闭竞态上有过多次踩坑记录,大屏常驻场景的断连重连、鉴权续期都是额外成本 |
| WebSocket | 双向能力本项目用不上(处置操作走普通接口更合适),维护成本最高 |
业务侧的"实时"是指十几秒内看到,不是毫秒级。 轮询完全满足,且最稳。若后续确有秒级需求,可单独立项升级。
系统目前部署在阿里云服务器上,采用容器化编排,数据库、缓存、后端、前端各自独立容器,通过 Nginx 统一对外提供 HTTPS 服务。已经是云端部署。
需要注意的现实约束:当前服务器资源配置偏紧,各容器均设有内存上限,数据库的缓存参数也调得较小。这一点直接关系到 §7.4 的实时刷新压力评估。
| 模式 | 说明 | 适用性 |
|---|---|---|
| A. 云端部署(强烈建议) | 大屏作为现有管理后台的一个页面,随现有系统一起部署 | ✅ 数据零同步、权限零重建、运维零增量。管理人员浏览器打开即用,会议室投屏也是打开浏览器 |
| B. 本地部署(办公室独立部署一套) | 在公司内网单独部署一套大屏系统 | ❌ 需要把生产数据同步到本地(数据一致性、安全性、同步链路全是新增成本),权限体系要重建一套,且离线场景下"实时上屏"本身就不成立 |
| C. 混合(云端服务 + 本地展示终端) | 服务在云端,办公室配一台专用显示终端 | ✅ 本质上仍是 A,只是多配一台常开的显示设备。若有固定大屏展示需求,建议走这条 |
结论:采用云端部署(方案 A)。 若需要固定的大屏展示位,配一台专用终端常开浏览器即可(方案 C),无需为此改变部署架构。
大屏常驻的一个技术细节必须提前处理:系统的访问令牌 30 分钟过期。大屏挂一晚上,第二天早上会是一片空白或全是错误提示。必须实现静默续期与断线重连提示,这一条容易被漏,须写入实施清单。
以下工作量为经验估算,非实测,按单人投入计算,不含需求评审与验收往返时间。
数据地基必须先行。 先做前端会得到一张漂亮但没有点的空地图,这是本项目最需要避免的返工。
| 阶段 | 内容 | 估算 | 交付标志 |
|---|---|---|---|
| P0 数据地基 | 机构地理表建设、IP 归属地能力接入、存量地址批量解析、未定位清单产出、组合索引优化 | 4~5 人日 | 地理数据填充率达标,未定位清单明确 |
| P1 只读大屏 | 地图模块、统计卡片、详情弹窗、轮询刷新、登录点亮、大屏登录态保活 | 8~10 人日 | 测试环境可投屏演示 |
| P2 账号处置 | 强制下线机制改造(含续期令牌废止)、处置操作接入、操作模式与二次鉴权、操作日志与查询页 | 5~6 人日 | 处置全链路可用且留痕完整 |
| P3 分级权限 | 区域体系建设、数据范围过滤层、渠道后台准入、区域管理员角色、越权测试 | 6~8 人日 | 三种角色各自登录验证范围隔离 |
| P4 异常提醒 | 多地/异地/非工作时间/频繁重连检测、异常记录、提醒栏、一键跳转处置 | 4~5 人日 | 可复现的异常场景全部命中 |
| 合计 | 27~34 人日 | 单人约 6~7 周 |
第 1 周 │ P0 数据地基 ──────────┐
│ (业务侧)地址补录 ─────┼──── 持续进行
第 2-3 周 │ P1 只读大屏 ──────────┘
第 4 周 │ P2 账号处置
第 5-6 周 │ P3 分级权限
第 7 周 │ P4 异常提醒 + 整体验收
| 风险 | 等级 | 应对 |
|---|---|---|
| 机构地址覆盖率过低,地图大面积空白 | 🔴 最高 | 上线前先跑摸底 SQL。可定位率低于 70% 时不应直接进入前端开发,应先补数据。大屏必须显示"未定位机构数",不允许静默丢弃 |
| 地址文字不规范(简写、错字、无省份),解析失败 | 🟡 中 | 解析失败进人工待办清单;提供后台手工指定省市的入口;不追求 100% 自动化 |
| 登录审计中 IP 为空或为内网地址 | 🟡 中 | 摸底 SQL 已包含此项体检。若私网 IP 占比高,说明部署配置有问题,必须先修配置,修复后的新数据才可用 |
| 渠道数据归属缺失(机构无签约档案) | 🟢 低 | 归属关系是外键强关联,缺失即为数据本身的问题,可通过摸底 SQL 一并暴露 |
| 风险 | 等级 | 应对 |
|---|---|---|
| IP 归属地只到城市级,移动网络会跨市漂移 | 🟡 中 | 大屏明确标注"登录位置来自 IP 归属地,仅供参考";机构位置以签约地址为准,两者分开呈现(§2.1.2 双轨方案) |
| IP 库为 2022 年版本,新 IP 段识别不准 | 🟡 中 | 上线前更新库文件;解析不出的显示"未知归属地"而非猜测;建立季度更新机制 |
| VPN / 企业专线导致登录地异常 | 🟢 低 | 这类情况会触发"异地登录"提醒,属于功能而非缺陷,但需在告警说明中注明可能的正常原因,避免误判 |
| 同城多机构点位重叠 | 🟢 低 | 点位聚合 + 展开列表 |
| 风险 | 等级 | 应对 |
|---|---|---|
| 渠道管理员看到其他渠道的机构(商业信息泄露) | 🔴 高 | 数据范围过滤必须在后端强制执行;验收时专项测试:用渠道账号直接调用接口,验证返回数据确实被过滤;前端隐藏不算数 |
| 大屏无人值守被误操作 | 🔴 高 | 投屏模式与操作模式分离、处置二次鉴权、闲置自动退回只读(§2.3.3) |
| 处置权限授予过宽 | 🟡 中 | 查看权限与处置权限分开配置;区域/渠道管理员是否有处置权由业务明确,默认不给 |
| 越权处置(渠道管理员禁用非本渠道账号) | 🔴 高 | 处置接口同样经过数据范围校验,不能只在查询接口做过滤 |
| 风险 | 等级 | 应对 |
|---|---|---|
| 大屏轮询叠加,数据库压力上升 | 🟡 中 | 15 秒轮询 + 服务端结果缓存(约 10 秒);必须补组合索引;实测后再调频率 |
| 服务器资源本身偏紧 | 🟡 中 | 大屏查询全部为只读,可考虑与业务查询错峰;上线前在测试环境压测一轮,不在生产直接试 |
| 大屏常驻导致登录态过期白屏 | 🟡 中 | 静默续期 + 断线重连提示(§5.2) |
| 全量点位数据传输量随机构增长 | 🟢 低 | 点位数据按省聚合传输,下钻时才拉明细 |
| 风险 | 等级 | 应对 |
|---|---|---|
| 两名管理员同时处置同一账号,后者覆盖前者 | 🟡 中 | 处置接口携带请求 ID 做幂等(现有审计表已有该字段,系统内也有幂等实现先例);操作前校验目标账号状态版本,状态已变则提示刷新后重试 |
| A 刚禁用,B 的界面还显示启用,误判 | 🟡 中 | 处置成功后立即刷新该机构状态;轮询周期内的短暂不一致通过操作结果提示消解 |
| 谁改的说不清 | 🟢 低 | 操作日志记录操作前后快照,责任可追溯到人(这正是复用现有审计表的价值) |
这是本项目合规层面最需要正视的一项。 登录 IP 与地理位置,既涉及机构的经营信息,也在特定场景下可能关联到个人。
| 风险 | 等级 | 应对 |
|---|---|---|
| IP 与位置信息展示范围过宽 | 🟡 中 | 按角色分级脱敏:总管理员看完整 IP;其他角色只看归属地或打码 IP(如 220.181.*.*);投屏模式默认打码 |
| 大屏投屏在公共区域,客户信息被无关人员看到 | 🟡 中 | 投屏模式下机构名称可选择部分打码;办公区大屏摆放位置需业务侧确认 |
| 数据外发给第三方 | 🟢 低 | 已通过技术选型规避:IP 解析用本地离线库,地图用自托管数据,登录 IP 与机构位置均不出网(这是选择离线方案的核心理由之一) |
| 地址批量解析时外发机构地址 | 🟡 中 | 若一次性回填需借助在线地址解析服务,需业务确认后再执行,且仅在回填时使用,不做常态调用 |
| 数据留存期限不明确 | 🟢 低 | 现有登录审计的留存策略在代码注释与实际实现之间存在不一致(注释称定期清理,实际未实现清理)。建议本项目一并明确留存期限并落实,避免日后被动 |
| 场景 | 现在 | 建成后 |
|---|---|---|
| 了解全国机构分布 | 导出表格人工统计 | 一屏可见,实时 |
| 判断某区域是否活跃 | 无法直接回答 | 省份着色直接反映 |
| 发现异常账号并处置 | 多页面跳转查找 | 点击点位,就地处置 |
| 核对某渠道的机构规模与分布 | 需人工关联多张表 | 渠道卡片直出 |
本项目最持久的价值可能不是那块大屏,而是它逼着我们把机构的地理数据补齐了。
这份数据一旦建立并纳入常态维护,可以复用于:区域化运营分析、渠道区域保护策略、市场活动的地域投放、客户地域画像。这是一次性投入、长期复用的基础数据资产。
以下三条不满足,上述价值会大打折扣:
| 结论 | 出处 |
|---|---|
| 机构表字段、经纬度用途 | app/models/organization.py:11-58 |
| 统一用户表六角色、渠道绑定 | app/models/user.py:26-70,135-153 |
| 渠道表定义 | app/models/settlement.py:66-105 |
| 签约档案含渠道外键与地址 | app/models/settlement.py:109-145、settlement/backend/app/models/settlement.py:213 |
| 入驻表单地址为选填、审核只校验四类文件 | settlement/backend/app/api/settlement/store_signup.py:98,126-136 |
| 登录审计表字段(IP 为原生 INET 类型) | app/models/audit.py:24-60 |
| 管理端 / 席位登录写审计 | app/services/auth_service.py:249-256、app/api/seat_auth.py:362-369 |
| Nginx 传递真实 IP | deploy/nginx/chat.tongban.love.conf:107-111 |
| 生产容器启用代理头解析 | deploy/Dockerfile.api:67 |
| 结算与核心同库共存、账号隔离 | settlement/deploy/docker-compose.prod.yml:32-34、settlement/db/grants.sql:33-48 |
| 令牌黑名单按令牌串拉黑(无法按账号踢人) | app/services/auth_service.py:357-360、app/auth/middleware.py:64-68 |
| 席位设备绑定每请求校验(现成的踢下线能力) | app/auth/middleware.py:255-257,372-373 |
| 令牌含签发时间与唯一 ID(可支撑按账号失效改造) | app/auth/jwt_local.py:63-64 |
| 访问令牌 30 分钟 / 续期令牌最长一年 | app/auth/jwt_local.py:26-29 |
| 启停、重置密码、解锁接口已存在 | app/api/admin_users.py:163,185,203、app/services/seat_service.py:288,445 |
| 通用操作审计表(含前后快照、请求 ID) | settlement/backend/app/models/settlement.py:615-639 |
| 权限表仅为「角色-菜单」二元组,无数据范围 | app/models/role_menu_permission.py:10-23 |
| 后台准入角色白名单不含渠道角色 | app/core/menu_registry.py:14-15 |
| 全库无区域 / 大区概念 | 检索 region/区域/大区 → 0 业务命中 |
| 错误上报为占位实现(只记日志、无推送) | app/services/incident_logger.py:1-12,44 |
| 已有暴力破解与 IP 横向扫描防护 | app/api/seat_auth.py:141-190 |
| 时区处理先例(北京时间切天) | app/api/admin_activity.py:37,157 |
| 实时通信先例(WebSocket / SSE) | app/api/voice_gateway.py:13、app/api/h5_chat.py:662-664 |
| 现有活跃机构统计口径 | app/api/admin_activity.py:674,827,840 |
| 生产部署资源约束 | deploy/docker-compose.prod.yml(各容器内存上限) |
| 前端无地图库、图表库不支持地理投影 | web/package.json:14-44 |
| 无 IP 归属地能力 | 检索 geoip/ip2region/maxmind → 0 业务命中 |
| IP 归属地实测结果 | 本机真实执行,结果见 §4.2 |
| 编号 | 事项 | 建议方案 | 影响 |
|---|---|---|---|
| D1 | 地图点位代表注册地还是登录地 | 双轨(§2.1.2) | 决定数据模型 |
| D2 | 在线状态的判定口径与时间窗 | 活跃度四级 + 15 分钟(§2.2.1) | 决定统计口径 |
| D3 | 频繁掉线如何处理 | 用"频繁重连"代理指标(§2.6) | 决定是否需改造客户端 |
| D4 | 区域如何划分(几个大区、含哪些省) | 待业务定义 | P3 阶段前置输入,缺失则无法开工 |
| D5 | 渠道管理员是否有处置权限 | 建议默认无 | 决定权限模型复杂度 |
| D6 | 大屏是否需要投屏到公共区域 | — | 决定脱敏策略强度 |
| D7 | IP 展示的脱敏级别 | 按角色分级(§7.6) | 合规相关 |
| D8 | P3 分级权限是否可后置 | 若可后置,整体提前约 1.5 周 | 决定上线节奏 |
| D9 | 一次性地址回填是否可借助在线解析服务 | 需业务确认 | 合规相关 |
建议在正式立项评审前完成一件事:跑摸底 SQL。
四条只读查询,约 1 分钟执行完,直接决定本项目排期是 6 周还是 10 周。查询脚本与结果解读说明见配套交付件《驾驶舱大屏 · 数据摸底 SQL》。
核心是两个数字:
本报告为调研结论,不含任何已实施的代码改动。数据层结论待摸底 SQL 执行后回填。本机为隔离开发环境,未连接生产数据库,报告中不提供任何未经实测的数据指标。