docs: 更新鑫潼架构文档,补充运营管理APP相关内容

1. 新增青色色系变量与对应的样式类
2. 调整图例顺序与文案,拆分运营相关端
3. 重构客户端层描述,从四端改为五端入口
4. 更新API路由分组,新增/ops路由
5. 补充对象存储为RustFS并更新说明
6. 新增运营管理APP模块与权限说明
7. 更新权限设计、权限流转与角色矩阵内容
8. 修正多处文案描述与功能细节
This commit is contained in:
andyesfly committed 2026-08-26 10:55:17 +08:00
1 parent dc86bf1040
commit f61ade107b
1 file changed
+61 -36
+61 -36
View File
@@ -19,6 +19,7 @@
--c-blue:#1d6fff; --c-blue-bg:#e8f1ff; --c-blue-d:#0c4dd1; --c-blue:#1d6fff; --c-blue-bg:#e8f1ff; --c-blue-d:#0c4dd1;
--c-green:#0d9488; --c-green-bg:#e6f7f5; --c-green-d:#0a7068; --c-green:#0d9488; --c-green-bg:#e6f7f5; --c-green-d:#0a7068;
--c-purple:#7c3aed; --c-purple-bg:#f0eaff; --c-purple-d:#5b21b6; --c-purple:#7c3aed; --c-purple-bg:#f0eaff; --c-purple-d:#5b21b6;
--c-teal:#0f766e; --c-teal-bg:#ccfbf1; --c-teal-d:#0d9488;
--c-amber:#e0852b; --c-amber-bg:#fef3e2; --c-amber-d:#b5681a; --c-amber:#e0852b; --c-amber-bg:#fef3e2; --c-amber-d:#b5681a;
--c-slate:#475569; --c-slate-bg:#f1f5f9; --c-slate-d:#334155; --c-slate:#475569; --c-slate-bg:#f1f5f9; --c-slate-d:#334155;
--c-red:#dc2626; --c-red-bg:#fee2e2; --c-red:#dc2626; --c-red-bg:#fee2e2;
@@ -78,8 +79,9 @@ section{padding:40px 0}
.dg-block ul li::before{content:"·";font-weight:700;margin-right:4px} .dg-block ul li::before{content:"·";font-weight:700;margin-right:4px}
.dg-blue{border-color:var(--c-blue);background:var(--c-blue-bg)} .dg-blue .di{background:var(--c-blue)} .dg-blue .dx{color:var(--c-blue-d)} .dg-blue .dt{color:var(--c-blue-d)} .dg-blue{border-color:var(--c-blue);background:var(--c-blue-bg)} .dg-blue .di{background:var(--c-blue)} .dg-blue .dx{color:var(--c-blue-d)} .dg-blue .dt{color:var(--c-blue-d)}
.dg-green{border-color:var(--c-green);background:var(--c-green-bg)} .dg-green .di{background:var(--c-green)} .dg-green .dx{color:var(--c-green-d)} .dg-green .dt{color:var(--c-green-d)}
.dg-purple{border-color:var(--c-purple);background:var(--c-purple-bg)} .dg-purple .di{background:var(--c-purple)} .dg-purple .dx{color:var(--c-purple-d)} .dg-purple .dt{color:var(--c-purple-d)} .dg-purple{border-color:var(--c-purple);background:var(--c-purple-bg)} .dg-purple .di{background:var(--c-purple)} .dg-purple .dx{color:var(--c-purple-d)} .dg-purple .dt{color:var(--c-purple-d)}
.dg-teal{border-color:var(--c-teal);background:var(--c-teal-bg)} .dg-teal .di{background:var(--c-teal)} .dg-teal .dx{color:var(--c-teal-d)} .dg-teal .dt{color:var(--c-teal-d)}
.dg-green{border-color:var(--c-green);background:var(--c-green-bg)} .dg-green .di{background:var(--c-green)} .dg-green .dx{color:var(--c-green-d)} .dg-green .dt{color:var(--c-green-d)}
.dg-amber{border-color:var(--c-amber);background:var(--c-amber-bg)} .dg-amber .di{background:var(--c-amber)} .dg-amber .dx{color:var(--c-amber-d)} .dg-amber .dt{color:var(--c-amber-d)} .dg-amber{border-color:var(--c-amber);background:var(--c-amber-bg)} .dg-amber .di{background:var(--c-amber)} .dg-amber .dx{color:var(--c-amber-d)} .dg-amber .dt{color:var(--c-amber-d)}
.dg-slate{border-color:var(--c-slate);background:var(--c-slate-bg)} .dg-slate .di{background:var(--c-slate)} .dg-slate .dx{color:var(--c-slate-d)} .dg-slate .dt{color:var(--c-slate-d)} .dg-slate{border-color:var(--c-slate);background:var(--c-slate-bg)} .dg-slate .di{background:var(--c-slate)} .dg-slate .dx{color:var(--c-slate-d)} .dg-slate .dt{color:var(--c-slate-d)}
.dg-ext{border-style:dashed;border-width:2px} .dg-ext{border-style:dashed;border-width:2px}
@@ -254,10 +256,11 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<div class="dg-legend"> <div class="dg-legend">
<div class="li"><span class="lc" style="background:var(--c-blue)"></span>运营管理平台 Web</div> <div class="li"><span class="lc" style="background:var(--c-blue)"></span>运营管理平台 Web</div>
<div class="li"><span class="lc" style="background:var(--c-purple)"></span>共享电工 APP</div> <div class="li"><span class="lc" style="background:var(--c-purple)"></span>运营管理 APP(业务员)</div>
<div class="li"><span class="lc" style="background:var(--c-green)"></span>共享电工 APP</div>
<div class="li"><span class="lc" style="background:var(--c-amber)"></span>客户微信小程序</div> <div class="li"><span class="lc" style="background:var(--c-amber)"></span>客户微信小程序</div>
<div class="li"><span class="lc" style="background:var(--c-slate)"></span>大华 ICC 外部</div> <div class="li"><span class="lc" style="background:var(--c-slate)"></span>大华 ICC 外部</div>
<div class="li"><span class="lc" style="background:var(--c-green)"></span>后端服务 Midway</div> <div class="li"><span class="lc" style="background:var(--c-teal, #0f766e)"></span>后端服务 Midway</div>
<div class="li"><span class="lc" style="background:var(--c-red)"></span>权限控制</div> <div class="li"><span class="lc" style="background:var(--c-red)"></span>权限控制</div>
</div> </div>
@@ -267,15 +270,19 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<div class="dg-layer"> <div class="dg-layer">
<div class="dg-layer-label"> <div class="dg-layer-label">
<span class="dg-ll-tag" style="background:var(--c-blue)">L1</span> <span class="dg-ll-tag" style="background:var(--c-blue)">L1</span>
<span class="dg-ll-name">客户端层 — 四端入口</span> <span class="dg-ll-name">客户端层 — 五端入口</span>
<span class="dg-ll-desc">不同角色访问不同端</span> <span class="dg-ll-desc">不同角色访问不同端,运营方双端(Web + APP)</span>
</div> </div>
<div class="dg-blocks"> <div class="dg-blocks">
<div class="dg-block dg-blue"> <div class="dg-block dg-blue">
<div class="dh"><div class="di">PC</div><div><div class="dt">运营管理平台</div><div class="dx">Vue3 + Ant Design Vue</div></div></div> <div class="dh"><div class="di">PC</div><div><div class="dt">运营管理平台</div><div class="dx">Vue3 + Ant Design Vue</div></div></div>
<ul><li>用户:业务员 / 运营管理员</li><li>客户/项目/派单/设备管理</li><li>统计报表 / 月度报告</li><li>系统管理(RBAC 菜单权限)</li></ul> <ul><li>用户:运营管理员</li><li>审批/配置/报表/系统设置</li><li>全量数据查看与管理</li><li>RBAC 菜单级权限</li></ul>
</div> </div>
<div class="dg-block dg-purple"> <div class="dg-block dg-purple">
<div class="dh"><div class="di">APP</div><div><div class="dt">运营管理 APP</div><div class="dx">uni-app → iOS / Android</div></div></div>
<ul><li>用户:业务员(运营方)</li><li>客户管理 / 项目跟进</li><li>勘察/回访/现场巡查</li><li>共享 sys_user 表 + 角色区分</li></ul>
</div>
<div class="dg-block dg-teal">
<div class="dh"><div class="di">APP</div><div><div class="dt">共享电工 APP</div><div class="dx">uni-app → iOS / Android</div></div></div> <div class="dh"><div class="di">APP</div><div><div class="dt">共享电工 APP</div><div class="dx">uni-app → iOS / Android</div></div></div>
<ul><li>用户:共享电工</li><li>五类派单接单处理</li><li>现场水印拍照取证上传</li><li>领料管理 / 报酬查询</li></ul> <ul><li>用户:共享电工</li><li>五类派单接单处理</li><li>现场水印拍照取证上传</li><li>领料管理 / 报酬查询</li></ul>
</div> </div>
@@ -301,7 +308,7 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
</div> </div>
<div class="dg-gateway"> <div class="dg-gateway">
<div class="gi"><h4>统一鉴权</h4><p>JWT 双 Token<br/>多端统一登录态</p></div> <div class="gi"><h4>统一鉴权</h4><p>JWT 双 Token<br/>多端统一登录态</p></div>
<div class="gi"><h4>API 路由分发</h4><p>/admin · /worker<br/>/customer 分组路由</p></div> <div class="gi"><h4>API 路由分发</h4><p>/admin · /ops · /worker<br/>/customer 分组路由</p></div>
<div class="gi"><h4>接口数据权限</h4><p>Interceptor 注入过滤<br/>给什么数据看什么</p></div> <div class="gi"><h4>接口数据权限</h4><p>Interceptor 注入过滤<br/>给什么数据看什么</p></div>
<div class="gi"><h4>限流与日志</h4><p>rate-limiter<br/>操作审计 winston</p></div> <div class="gi"><h4>限流与日志</h4><p>rate-limiter<br/>操作审计 winston</p></div>
</div> </div>
@@ -342,7 +349,7 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<div class="dg-data"> <div class="dg-data">
<div class="dg-db d-amber"><div class="dmi">🐘</div><h4>PostgreSQL 主库</h4><p>业务数据(customer_id 逻辑隔离)<br/>用电采集数据(按月分区)<br/>TypeORM + 声明式分区</p></div> <div class="dg-db d-amber"><div class="dmi">🐘</div><h4>PostgreSQL 主库</h4><p>业务数据(customer_id 逻辑隔离)<br/>用电采集数据(按月分区)<br/>TypeORM + 声明式分区</p></div>
<div class="dg-db d-red"><div class="dmi">⚡</div><h4>Redis 缓存</h4><p>JWT 会话 Token<br/>数据字典/热点配置<br/>BullMQ 队列底层</p></div> <div class="dg-db d-red"><div class="dmi">⚡</div><h4>Redis 缓存</h4><p>JWT 会话 Token<br/>数据字典/热点配置<br/>BullMQ 队列底层</p></div>
<div class="dg-db d-blue"><div class="dmi">📁</div><h4>对象存储</h4><p>取证照片(水印)<br/>合同/验收/方案文件<br/>月度报告文档</p></div> <div class="dg-db d-blue"><div class="dmi">📁</div><h4>对象存储 RustFS</h4><p>取证照片(水印)<br/>合同/验收/方案文件<br/>月度报告文档<br/>国产 · S3 兼容 · Apache 2.0</p></div>
<div class="dg-db d-green"><div class="dmi">📬</div><h4>BullMQ 消息队列</h4><p>ICC 拉取数据缓冲<br/>报警事件异步处理<br/>基于 Redis 轻量级</p></div> <div class="dg-db d-green"><div class="dmi">📬</div><h4>BullMQ 消息队列</h4><p>ICC 拉取数据缓冲<br/>报警事件异步处理<br/>基于 Redis 轻量级</p></div>
</div> </div>
</div> </div>
@@ -378,7 +385,8 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<div class="dg-perm"> <div class="dg-perm">
<h4>🔒 权限控制方案(贯穿 L1 → L3)</h4> <h4>🔒 权限控制方案(贯穿 L1 → L3)</h4>
<div class="pr"> <div class="pr">
<div class="pi"><div class="pt">运营后台(Web)— RBAC 菜单级</div><div class="pd">角色绑定菜单/按钮:运营管理员(全菜单)、业务员(客户/项目/方案/合同/回访)</div></div> <div class="pi"><div class="pt">运营管理平台(Web)— RBAC 菜单级</div><div class="pd">运营管理员:审批/配置/报表/系统设置,全量数据,全部菜单</div></div>
<div class="pi"><div class="pt">运营管理 APP — 角色 + 数据权限</div><div class="pd">业务员:客户管理/项目跟进/勘察回访,按 salesman_id 过滤自己负责的数据</div></div>
<div class="pi"><div class="pt">共享电工 APP — 接口级数据权限</div><div class="pd">接口按 worker_id 过滤:仅自己接的派单、个人报酬明细,给什么看什么</div></div> <div class="pi"><div class="pt">共享电工 APP — 接口级数据权限</div><div class="pd">接口按 worker_id 过滤:仅自己接的派单、个人报酬明细,给什么看什么</div></div>
<div class="pi"><div class="pt">客户小程序 — 接口级数据权限</div><div class="pd">接口按 customer_id 过滤:仅本客户设备/用电/报警/月报/报修记录</div></div> <div class="pi"><div class="pt">客户小程序 — 接口级数据权限</div><div class="pd">接口按 customer_id 过滤:仅本客户设备/用电/报警/月报/报修记录</div></div>
</div> </div>
@@ -396,12 +404,15 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<div class="arch-stack"> <div class="arch-stack">
<div class="alayer client"> <div class="alayer client">
<div class="alayer-head"><span class="alayer-tag">CLIENT</span><span class="alayer-name">客户端层 · 四端入口</span><span class="alayer-note">不同角色访问不同端,统一鉴权</span></div> <div class="alayer-head"><span class="alayer-tag">CLIENT</span><span class="alayer-name">客户端层 · 五端入口</span><span class="alayer-note">运营方双端(Web+APP),统一鉴权</span></div>
<div class="alayer-body"> <div class="alayer-body">
<div class="anode"><h4><span class="dot"></span>运营管理平台(Web)</h4><p>鑫潼内部人员使用:业务员、运营管理员</p><span class="tech">Vue3 + Ant Design Vue</span></div> <div class="anode"><h4><span class="dot"></span>运营管理平台(Web)</h4><p>运营管理员使用:审批、配置、报表、系统设置</p><span class="tech">Vue3 + Ant Design Vue</span></div>
<div class="anode"><h4><span class="dot"></span>运营管理 APP</h4><p>业务员移动办公:客户管理、项目跟进、现场勘察回访</p><span class="tech">uni-app (iOS / Android)</span></div>
<div class="anode"><h4><span class="dot"></span>共享电工 APP</h4><p>共享电工接单、现场拍照取证、报酬查询</p><span class="tech">uni-app (iOS / Android)</span></div> <div class="anode"><h4><span class="dot"></span>共享电工 APP</h4><p>共享电工接单、现场拍照取证、报酬查询</p><span class="tech">uni-app (iOS / Android)</span></div>
<div class="anode"><h4><span class="dot"></span>客户微信小程序</h4><p>客户查看用电/报警/月报、报修申请、评分</p><span class="tech">uni-app → 微信小程序</span></div> <div class="anode"><h4><span class="dot"></span>客户微信小程序</h4><p>客户查看用电/报警/月报、报修申请、评分</p><span class="tech">uni-app → 微信小程序</span></div>
<div class="anode"><h4><span class="dot"></span>大华 ICC 管理平台</h4><p>设备数据采集平台(厂家后台,非自研)</p><span class="tech">外部系统 · API 对接</span></div> </div>
<div class="alayer-body" style="margin-top:10px;grid-template-columns:1fr">
<div class="anode" style="border-style:dashed"><h4><span class="dot" style="background:#64748b"></span>大华 ICC 管理平台</h4><p>设备数据采集平台(厂家后台,非自研)· API 对接</p><span class="tech">外部系统 · HTTP REST</span></div>
</div> </div>
</div> </div>
<div class="flow-arrow">▼</div> <div class="flow-arrow">▼</div>
@@ -410,7 +421,7 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<div class="alayer-head"><span class="alayer-tag">GATEWAY</span><span class="alayer-name">接入网关层 · 统一入口</span><span class="alayer-note">认证、路由、限流、日志</span></div> <div class="alayer-head"><span class="alayer-tag">GATEWAY</span><span class="alayer-name">接入网关层 · 统一入口</span><span class="alayer-note">认证、路由、限流、日志</span></div>
<div class="alayer-body"> <div class="alayer-body">
<div class="anode"><h4><span class="dot"></span>统一鉴权服务</h4><p>JWT Token 签发与校验,多端统一登录态</p><span class="tech">Midway Guard + JWT</span></div> <div class="anode"><h4><span class="dot"></span>统一鉴权服务</h4><p>JWT Token 签发与校验,多端统一登录态</p><span class="tech">Midway Guard + JWT</span></div>
<div class="anode"><h4><span class="dot"></span>API 路由分发</h4><p>按端区分路由前缀:/admin · /worker · /customer</p><span class="tech">Midway Controller 分组</span></div> <div class="anode"><h4><span class="dot"></span>API 路由分发</h4><p>按端区分路由前缀:/admin · /ops · /worker · /customer</p><span class="tech">Midway Controller 分组</span></div>
<div class="anode"><h4><span class="dot"></span>接口级数据权限</h4><p>接口决定可见数据范围,APP/小程序给什么看什么</p><span class="tech">Guard + Interceptor</span></div> <div class="anode"><h4><span class="dot"></span>接口级数据权限</h4><p>接口决定可见数据范围,APP/小程序给什么看什么</p><span class="tech">Guard + Interceptor</span></div>
<div class="anode"><h4><span class="dot"></span>限流与日志</h4><p>常规 ERP 并发量,请求日志与操作审计</p><span class="tech">rate-limiter + winston</span></div> <div class="anode"><h4><span class="dot"></span>限流与日志</h4><p>常规 ERP 并发量,请求日志与操作审计</p><span class="tech">rate-limiter + winston</span></div>
</div> </div>
@@ -439,7 +450,7 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<div class="alayer-body"> <div class="alayer-body">
<div class="anode"><h4><span class="dot"></span>PostgreSQL 主库</h4><p>业务数据(逻辑隔离)+ 用电采集数据(按月分区)</p><span class="tech">TypeORM + 声明式分区</span></div> <div class="anode"><h4><span class="dot"></span>PostgreSQL 主库</h4><p>业务数据(逻辑隔离)+ 用电采集数据(按月分区)</p><span class="tech">TypeORM + 声明式分区</span></div>
<div class="anode"><h4><span class="dot"></span>Redis 缓存</h4><p>会话 Token、数据字典、热点配置、限流计数</p><span class="tech">ioredis</span></div> <div class="anode"><h4><span class="dot"></span>Redis 缓存</h4><p>会话 Token、数据字典、热点配置、限流计数</p><span class="tech">ioredis</span></div>
<div class="anode"><h4><span class="dot"></span>对象存储</h4><p>取证照片、合同/验收/方案电子文件、月度报告</p><span class="tech">MinIO / 阿里云 OSS</span></div> <div class="anode"><h4><span class="dot"></span>对象存储</h4><p>取证照片、合同/验收/方案电子文件、月度报告</p><span class="tech">RustFS(国产 · S3 兼容)</span></div>
<div class="anode"><h4><span class="dot"></span>消息队列</h4><p>ICC 拉取数据缓冲、报警事件异步处理</p><span class="tech">BullMQ (Redis 队列)</span></div> <div class="anode"><h4><span class="dot"></span>消息队列</h4><p>ICC 拉取数据缓冲、报警事件异步处理</p><span class="tech">BullMQ (Redis 队列)</span></div>
</div> </div>
</div> </div>
@@ -458,7 +469,7 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<div class="callout"> <div class="callout">
<h4>架构设计要点</h4> <h4>架构设计要点</h4>
<p>① <strong>不直接对接硬件</strong>:所有设备数据通过大华 ICC 平台 API 拉取,鑫潼系统只做数据消费方。② <strong>四端共享一套后端</strong>:Midway.js 统一提供 /admin、/worker、/customer 三组路由,避免重复开发。③ <strong>ICC 内部虽实时推送,但鑫潼侧采用主动拉取</strong>,通过定时任务按采集频次拉取,进入 BullMQ 队列缓冲后写入分区表。</p> <p>① <strong>不直接对接硬件</strong>:所有设备数据通过大华 ICC 平台 API 拉取,鑫潼系统只做数据消费方。② <strong>五端共享一套后端</strong>:Midway.js 统一提供 /admin(Web管理台)、/ops(运营APP)、/worker(电工APP)、/customer(小程序)四组路由,避免重复开发。③ <strong>运营方双端同一套账号</strong>:运营管理平台(Web)和运营管理 APP(业务员)共用 sys_user 表,通过角色区分权限,共用 RBAC 体系。④ <strong>ICC 内部虽实时推送,但鑫潼侧采用主动拉取</strong>,通过定时任务按采集频次拉取,进入 BullMQ 队列缓冲后写入分区表。</p>
</div> </div>
</section> </section>
@@ -476,13 +487,14 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<tbody> <tbody>
<tr><td>后端框架</td><td><code>Midway.js</code></td><td>Node.js · IoC + TypeORM</td><td>阿里出品,TypeScript 原生支持,装饰器风格,模块化清晰</td></tr> <tr><td>后端框架</td><td><code>Midway.js</code></td><td>Node.js · IoC + TypeORM</td><td>阿里出品,TypeScript 原生支持,装饰器风格,模块化清晰</td></tr>
<tr><td>前端框架</td><td><code>Vue 3 + Ant Design Vue</code></td><td>Composition API</td><td>AntDV 组件丰富,适合中后台 ERP 型管理系统</td></tr> <tr><td>前端框架</td><td><code>Vue 3 + Ant Design Vue</code></td><td>Composition API</td><td>AntDV 组件丰富,适合中后台 ERP 型管理系统</td></tr>
<tr><td>APP 框架</td><td><code>uni-app</code></td><td>跨 iOS / Android</td><td>一套代码多端发布,共享电工端仅需移动 App</td></tr> <tr><td>共享电工 APP</td><td><code>uni-app</code></td><td>跨 iOS / Android</td><td>一套代码多端发布,共享电工端仅需移动 App</td></tr>
<tr><td>运营管理 APP</td><td><code>uni-app</code></td><td>跨 iOS / Android</td><td>业务员移动办公,共用 sys_user 表,复用 uni-app 技术栈</td></tr>
<tr><td>小程序</td><td><code>uni-app → 微信小程序</code></td><td>客户端使用</td><td>复用 uni-app 技术栈,降低学习成本</td></tr> <tr><td>小程序</td><td><code>uni-app → 微信小程序</code></td><td>客户端使用</td><td>复用 uni-app 技术栈,降低学习成本</td></tr>
<tr><td>数据库</td><td><code>PostgreSQL</code></td><td>15+</td><td>时序数据分区成熟、多维聚合分析强、JSONB 灵活(详见下方对比)</td></tr> <tr><td>数据库</td><td><code>PostgreSQL</code></td><td>15+</td><td>时序数据分区成熟、多维聚合分析强、JSONB 灵活(详见下方对比)</td></tr>
<tr><td>ORM</td><td><code>TypeORM</code></td><td>Midway 内置集成</td><td>与 Midway 深度集成,支持 PostgreSQL 分区表</td></tr> <tr><td>ORM</td><td><code>TypeORM</code></td><td>Midway 内置集成</td><td>与 Midway 深度集成,支持 PostgreSQL 分区表</td></tr>
<tr><td>缓存</td><td><code>Redis</code></td><td>7.x</td><td>会话、字典缓存、限流、BullMQ 队列底层</td></tr> <tr><td>缓存</td><td><code>Redis</code></td><td>7.x</td><td>会话、字典缓存、限流、BullMQ 队列底层</td></tr>
<tr><td>消息队列</td><td><code>BullMQ</code></td><td>基于 Redis</td><td>轻量级,无需额外引入 Kafka,满足常规 ERP 并发</td></tr> <tr><td>消息队列</td><td><code>BullMQ</code></td><td>基于 Redis</td><td>轻量级,无需额外引入 Kafka,满足常规 ERP 并发</td></tr>
<tr><td>对象存储</td><td><code>MinIO / 阿里云 OSS</code></td><td>—</td><td>取证照片、合同/验收文件、月度报告存档</td></tr> <tr><td>对象存储</td><td><code>RustFS(国产)</code></td><td>S3 兼容 · Apache 2.0</td><td>取证照片、合同/验收文件、月度报告存档,替代 MinIO</td></tr>
<tr><td>鉴权</td><td><code>JWT</code></td><td>双 Token 刷新</td><td>多端统一,无状态易扩展</td></tr> <tr><td>鉴权</td><td><code>JWT</code></td><td>双 Token 刷新</td><td>多端统一,无状态易扩展</td></tr>
</tbody> </tbody>
</table> </table>
@@ -527,13 +539,13 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<section id="modules"> <section id="modules">
<div class="section-head"> <div class="section-head">
<span class="section-num">04</span> <span class="section-num">04</span>
<h2>四端功能模块拆解</h2> <h2>五端功能模块拆解</h2>
<span class="desc">后端 · 前端 · APP · 小程序</span> <span class="desc">后端 · Web前端 · 运营APP · 电工APP · 小程序</span>
</div> </div>
<div class="client-grid" style="margin-bottom:16px"> <div class="client-grid" style="margin-bottom:16px">
<div class="client-card full cc-green"> <div class="client-card full cc-green">
<div class="cc-head"><div class="icon">BE</div><h3>后端服务(Midway.js)</h3><span class="role">四端共享 · 统一 API</span></div> <div class="cc-head"><div class="icon">BE</div><h3>后端服务(Midway.js)</h3><span class="role">五端共享 · 统一 API</span></div>
<div class="cc-body"><div class="mod-list"> <div class="cc-body"><div class="mod-list">
<div class="mod"><h4>客户管理服务</h4><p>客户信息(省市县分类)、客户部门、客户访问账号分配</p></div> <div class="mod"><h4>客户管理服务</h4><p>客户信息(省市县分类)、客户部门、客户访问账号分配</p></div>
<div class="mod"><h4>项目管理服务</h4><p>建筑/房间、勘察派单、智电方案、合同、安装、验收、回访</p></div> <div class="mod"><h4>项目管理服务</h4><p>建筑/房间、勘察派单、智电方案、合同、安装、验收、回访</p></div>
@@ -551,14 +563,26 @@ footer .ft{font-size:13px;color:var(--muted);text-align:center}
<div class="client-grid"> <div class="client-grid">
<div class="client-card cc-blue"> <div class="client-card cc-blue">
<div class="cc-head"><div class="icon">PC</div><h3>运营管理平台(Web 前端)</h3><span class="role">业务员 / 运营管理员</span></div> <div class="cc-head"><div class="icon">PC</div><h3>运营管理平台(Web 前端)</h3><span class="role">运营管理员</span></div>
<div class="cc-body"><div class="mod-list"> <div class="cc-body"><div class="mod-list">
<div class="mod"><h4>客户管理</h4><p>客户录入(省市县)、部门、建筑/房间配置、访问账号分配</p></div> <div class="mod"><h4>运营工作台</h4><p>全局数据概览、报警总览、派单总览、待办事项</p></div>
<div class="mod"><h4>项目管理</h4><p>勘察派单、方案制定上传、合同登记、安装派单、验收管理、回访</p></div> <div class="mod"><h4>审批与配置</h4><p>方案审批、合同审批、派单规则配置、数据字典</p></div>
<div class="mod"><h4>运营派单</h4><p>报警派单(从 ICC 拉取报警)、报修派单、维保派单、评分管理</p></div> <div class="mod"><h4>运营派单</h4><p>报警派单(从 ICC 拉取报警)、报修派单、维保派单、评分管理</p></div>
<div class="mod"><h4>设备监控</h4><p>设备列表、线路分配(部门/房间)、设备状态、报警查询</p></div> <div class="mod"><h4>设备监控</h4><p>设备列表、线路分配(部门/房间)、设备状态、报警查询</p></div>
<div class="mod"><h4>统计报表</h4><p>多维度用电统计、月度报告生成下载、共享电工报酬统计</p></div> <div class="mod"><h4>统计报表</h4><p>多维度用电统计、月度报告生成下载、共享电工报酬统计</p></div>
<div class="mod"><h4>系统管理</h4><p>用户/角色/菜单权限配置、数据字典、日志审计</p></div> <div class="mod"><h4>系统管理</h4><p>用户/角色/菜单权限配置、员工管理、日志审计</p></div>
</div></div>
</div>
<div class="client-card cc-purple">
<div class="cc-head"><div class="icon">APP</div><h3>运营管理 APP(uni-app)</h3><span class="role">业务员(运营方)</span></div>
<div class="cc-body"><div class="mod-list">
<div class="mod"><h4>客户管理</h4><p>客户档案查看、联系人管理、客户项目列表(和后台功能一致,移动端适配)</p></div>
<div class="mod"><h4>项目管理</h4><p>项目跟进、勘察任务、方案查看、合同查看、验收与回访</p></div>
<div class="mod"><h4>派单查看</h4><p>负责客户的派单进度跟踪、报警处理进度、报修处理进度</p></div>
<div class="mod"><h4>现场巡查</h4><p>现场拍照记录、巡查日志提交、问题上报</p></div>
<div class="mod"><h4>消息通知</h4><p>派单提醒、报警推送、客户消息、系统通知</p></div>
<div class="mod"><h4>我的</h4><p>个人信息、修改密码、负责客户统计、业绩查看</p></div>
</div></div> </div></div>
</div> </div>
@@ -731,36 +755,36 @@ flowchart LR
<div class="callout"> <div class="callout">
<h4>权限设计原则</h4> <h4>权限设计原则</h4>
<p>现阶段权限粗放管理:<strong>运营后台采用 RBAC 菜单级权限</strong>(角色绑定菜单/按钮);<strong>APP 和小程序的数据权限由接口定义</strong>——接口返回什么数据,端上就只能看到什么数据,不在端上做复杂权限判断。</p> <p>现阶段权限粗放管理:<strong>运营方双端(Web + APP)共用 sys_user 表</strong>,采用 RBAC 菜单级权限(角色绑定菜单/按钮);<strong>共享电工 APP 和客户小程序的数据权限由接口定义</strong>——接口返回什么数据,端上就只能看到什么数据,不在端上做复杂权限判断。</p>
</div> </div>
<h3 style="margin:18px 0 10px;font-size:16px">权限流转链路</h3> <h3 style="margin:18px 0 10px;font-size:16px">权限流转链路</h3>
<div class="perm-flow"> <div class="perm-flow">
<div class="perm-step"><span class="num">STEP 1</span><h4>用户登录</h4><p>运营后台:账号密码<br/>APP:账号密码<br/>小程序:微信 openid</p></div> <div class="perm-step"><span class="num">STEP 1</span><h4>用户登录</h4><p>运营方双端:账号密码(sys_user)<br/>电工APP:账号密码(worker)<br/>小程序:微信 openid</p></div>
<div class="perm-arrow">→</div> <div class="perm-arrow">→</div>
<div class="perm-step"><span class="num">STEP 2</span><h4>JWT 签发</h4><p>Token 携带:userId、role、customerId<br/>双 Token 刷新</p></div> <div class="perm-step"><span class="num">STEP 2</span><h4>JWT 签发</h4><p>Token 携带:userId、user_type、role、customerId<br/>双 Token 刷新</p></div>
<div class="perm-arrow">→</div> <div class="perm-arrow">→</div>
<div class="perm-step"><span class="num">STEP 3</span><h4>菜单权限(后台)</h4><p>RBAC:角色 → 菜单/按钮<br/>后台根据角色渲染菜单</p></div> <div class="perm-step"><span class="num">STEP 3</span><h4>菜单/路由权限</h4><p>运营方双端:RBAC 角色 → 菜单<br/>电工APP/小程序:固定功能页</p></div>
<div class="perm-arrow">→</div> <div class="perm-arrow">→</div>
<div class="perm-step"><span class="num">STEP 4</span><h4>接口数据权限</h4><p>接口根据 Token 身份过滤数据<br/>APP/小程序给什么看什么</p></div> <div class="perm-step"><span class="num">STEP 4</span><h4>接口数据权限</h4><p>接口根据 user_type + role 过滤数据<br/>给什么看什么</p></div>
</div> </div>
<h3 style="margin:24px 0 10px;font-size:16px">角色与权限矩阵</h3> <h3 style="margin:24px 0 10px;font-size:16px">角色与权限矩阵</h3>
<div class="table-wrap"> <div class="table-wrap">
<table> <table>
<thead><tr><th>角色</th><th>使用端</th><th>菜单权限(RBAC)</th><th>接口数据权限</th></tr></thead> <thead><tr><th>角色</th><th>使用端</th><th>账号表</th><th>菜单权限(RBAC)</th><th>接口数据权限</th></tr></thead>
<tbody> <tbody>
<tr><td>运营管理员</td><td>运营管理平台</td><td>全部菜单:客户/项目/派单/设备/报表/系统管理</td><td>可查看所有客户数据,全量派单管理</td></tr> <tr><td>运营管理员</td><td>运营管理平台(Web)</td><td>sys_user</td><td>全部菜单:工作台/审批/派单/设备/报表/系统管理</td><td>全量数据,所有客户和派单</td></tr>
<tr><td>业务员</td><td>运营管理平台</td><td>客户/项目/方案/合同/回访(按需配置)</td><td>仅自己负责的客户(user_id 过滤)</td></tr> <tr><td>业务员</td><td>运营管理平台(Web)+ 运营管理 APP</td><td>sys_user</td><td>客户/项目/派单查看/报表查看(按需配置)</td><td>仅自己负责的客户(salesman_id 过滤)</td></tr>
<tr><td>共享电工</td><td>共享电工 APP</td><td>—(APP 无菜单权限,固定功能)</td><td>仅分配给自己的派单、个人报酬明细</td></tr> <tr><td>共享电工</td><td>共享电工 APP</td><td>worker</td><td>—(APP 固定功能页)</td><td>仅分配给自己的派单、个人报酬明细</td></tr>
<tr><td>客户</td><td>微信小程序</td><td>—(小程序固定功能页)</td><td>仅本客户设备/用电/报警/月报/报修记录</td></tr> <tr><td>客户</td><td>微信小程序</td><td>customer_account</td><td>—(小程序固定功能页)</td><td>仅本客户设备/用电/报警/月报/报修记录</td></tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="callout"> <div class="callout">
<h4>接口级数据权限实现要点</h4> <h4>接口级数据权限实现要点</h4>
<p>① <strong>共享电工</strong>:查询派单接口自动按 <code>worker_id = 当前用户</code> 过滤;报酬接口只返回本人数据。② <strong>客户</strong>:查询设备/用电/报警接口自动按 <code>customer_id = 当前客户</code> 过滤;报修只能提交本客户的。③ <strong>业务员</strong>:查询客户/项目接口按 <code>salesman_id = 当前用户</code> 过滤(运营管理员不受限)。通过 Midway Interceptor 统一注入过滤条件,避免每个接口手动处理。</p> <p>① <strong>共享电工</strong>:查询派单接口自动按 <code>worker_id = 当前用户</code> 过滤;报酬接口只返回本人数据。② <strong>客户</strong>:查询设备/用电/报警接口自动按 <code>customer_id = 当前客户</code> 过滤;报修只能提交本客户的。③ <strong>业务员(运营管理 APP + Web)</strong>:查询客户/项目/派单接口按 <code>salesman_id = 当前用户</code> 过滤,只能看自己负责的客户数据(运营管理员不受限)。④ <strong>运营方双端共用一套 RBAC</strong>:Web 管理台和运营管理 APP 共用 sys_user 表 + 角色体系,菜单权限由后端统一返回,前端/APP 根据返回动态渲染。通过 Midway Interceptor 统一注入过滤条件,避免每个接口手动处理。</p>
</div> </div>
</section> </section>
@@ -825,7 +849,8 @@ flowchart TB
<tr><td>ICC 接口文档</td><td>待研究,按通用 REST API 模式预留</td><td>用户确认</td></tr> <tr><td>ICC 接口文档</td><td>待研究,按通用 REST API 模式预留</td><td>用户确认</td></tr>
<tr><td>后台权限</td><td>RBAC 菜单级,现阶段粗放管理</td><td>用户确认</td></tr> <tr><td>后台权限</td><td>RBAC 菜单级,现阶段粗放管理</td><td>用户确认</td></tr>
<tr><td>APP/小程序数据权限</td><td>接口定义数据范围,给什么看什么</td><td>用户确认</td></tr> <tr><td>APP/小程序数据权限</td><td>接口定义数据范围,给什么看什么</td><td>用户确认</td></tr>
<tr><td>APP 技术栈</td><td>uni-app 跨 iOS/Android</td><td>用户确认</td></tr> <tr><td>共享电工 APP 技术栈</td><td>uni-app 跨 iOS/Android</td><td>用户确认</td></tr>
<tr><td>运营管理 APP</td><td>uni-app,业务员使用,功能与后台一致,共用 sys_user 表</td><td>用户确认</td></tr>
<tr><td>客户小程序</td><td>微信小程序,运营后台分配账号</td><td>用户确认</td></tr> <tr><td>客户小程序</td><td>微信小程序,运营后台分配账号</td><td>用户确认</td></tr>
<tr><td>子账号</td><td>待定,当前按单账号预留扩展</td><td>用户确认(待定)</td></tr> <tr><td>子账号</td><td>待定,当前按单账号预留扩展</td><td>用户确认(待定)</td></tr>
<tr><td>电子签章</td><td>不需要,但需取证拍照(水印)</td><td>用户确认</td></tr> <tr><td>电子签章</td><td>不需要,但需取证拍照(水印)</td><td>用户确认</td></tr>