11 KiB
ReinLoop ControlPanel 功能总览
1. 产品定位
ControlPanel 是 ReinLoop 的 B 端管理工作台,用于管理公司与产线、签发许可证、管理模型、发布参数配置,并接收和审核 ReinLoop 上传的辨识数据。
桌面端基于 Electron,业务请求统一发送到 ReinLoop Server。渲染页面不直接访问文件系统、私钥或管理凭据,敏感操作通过 Electron 主进程完成。
2. 连接与鉴权
应用启动后首先显示连接页面,只包含:
- Server API URL
- Admin Token
- “连接并校验”按钮
点击连接后,主进程调用需要管理权限的 listOrganizations 接口,同时验证:
- Server 地址是否可访问
- API 路径是否正确
- Admin Token 是否有效
只有校验成功才显示后续业务工作台。连接失败时业务区域保持隐藏,并显示 Server 返回的错误信息。
连接信息仅保存在当前应用进程中:
- Token 不写入浏览器存储。
- Token 不写入本地配置文件。
- Token 只由 Electron 主进程附加到 Server 请求。
- 本次应用会话不提供更改连接入口;需要切换 Server 或 Token 时重新启动应用。
支持通过环境变量提供默认值:
REINLOOP_API_URL
B_ADMIN_TOKEN
REINLOOP_DEVICE_ID
POLL_INTERVAL_MS
DOWNLOAD_DIR
3. 公司与产线选择
连接成功后,工作台顶部显示公司和产线两个选择菜单。
设备业务标识由 Server 生成,格式固定为:
<company_code>/<production_line_code>
例如:
sample-co/line-1
配置、模型、辨识数据、审核反馈和容积请求都使用同一个 deviceId,避免不同公司或产线的数据混用。
在线状态
公司菜单显示在线产线汇总,例如:
示例公司 (sample-co) · 在线 2/3
产线菜单显示具体状态:
● 在线 · 一号产线 (line-1)
○ 离线 · 二号产线 (line-2)
◇ 状态未知 · 三号产线 (line-3)
Panel 每 10 秒调用一次 listOrganizations 静默刷新状态。
Server 已实现设备心跳:
- ReinLoop 调用
deviceHeartbeat更新产线的lastSeenAt。 - Server 以最近 30 秒是否收到心跳计算
online。 listOrganizations返回每条产线的online和lastSeenAt。- 旧数据缺少状态字段时,Panel 显示“状态未知”,不会误报在线或离线。
4. 组织管理
“组织管理”页面支持:
- 添加公司
- 为指定公司添加产线
- 刷新公司与产线列表
公司编码和产线编码只允许:
- 小写英文字母
- 数字
- 下划线
- 连字符
编码长度为 2 到 64 位,并且必须以字母或数字开头。
公司编码由 Server 保证全局唯一;产线编码在同一公司内唯一。
相关 Server 接口:
listOrganizations
createCompany
createProductionLine
5. 许可证签发与管理
“许可证”页面根据当前选择的公司和产线签发许可证。
签发字段包括:
- 公司
- 产线
- 组合设备 ID
- 签发时间
- 到期时间
- 功能范围
- 唯一许可证 ID
许可证载荷示例:
{
"license_id": "UUID",
"customer": "示例公司",
"company_id": "company_UUID",
"production_line_id": "line_UUID",
"device_id": "sample-co/line-1",
"issued": "2026-07-25 12:00",
"expiry": "2027-07-25 12:00",
"features": "*"
}
签名格式
Panel 使用 RSA-PSS SHA-256 签名,与 ReinLoop 的 Python 验签逻辑兼容。
许可证文件格式:
base64(JSON)|base64(signature)
签发核心会拒绝:
- 空公司或产线标识
- 非法组合设备 ID
- 无效日期格式
- 到期时间不晚于签发时间
- 空功能字段
私钥安全
- 每次签发由操作者选择外部 PEM 私钥。
- 私钥只在 Electron 主进程内读取。
- 私钥不会进入渲染页面。
- 私钥不会上传 Server。
- 私钥路径和内容不会由 Panel 持久化。
- 私钥不会打进安装包。
本地与 Server 一致性
签发流程为:
- 选择私钥。
- 选择本地许可证保存位置。
- 生成并写入本地许可证。
- 将签发结果登记到 Server。
- Server 登记失败时删除本次本地文件,避免出现半完成状态。
许可证管理支持:
- 刷新许可证列表
- 查看许可证详情
- 撤销有效许可证
- 填写撤销原因
- 区分有效和已撤销状态
相关 Server 接口:
createLicense
listLicenses
getLicense
revokeLicense
6. 模型管理
“模型管理”页面按当前产线操作:
<deviceId>/model_config
支持:
- 刷新模型列表
- 查看文件名、上传时间和大小
- 从本地选择并上传模型
- 同名模型覆盖前要求确认并输入完整文件名
- 下载模型到本地
downloads目录 - 按
fileID精确删除模型;删除前要求两次确认并输入完整文件名
上传使用 Server 的两步协议:
- 调用
uploadDataFile获取上传地址与凭证。 - 使用 multipart 表单上传文件内容。
相关 Server 接口:
listModels
uploadDataFile
downloadModel
deleteFile
7. 参数配置发布
“配置发布”页面支持两类参数:
- 容积测量配置
- 系统辨识配置
用户可以:
- 直接编辑 JSON
- 从本地导入 JSON
- 从 Server 读取当前配置
- 发布新配置
容积测量参数
严格包含 8 个字段:
{
"q_in_val": 91,
"dt": 0.1,
"p_max": 200,
"fit_low": 50,
"fit_high": 200,
"T_delta": 30,
"xa_full": 1000,
"num_runs": 6
}
Panel 在发布前检查:
- 配置必须是 JSON 对象
- 字段不能缺失
- 不能包含多余字段
- 数值必须有限
num_runs必须是整数
容积配置只会响应 ReinLoop 当前有效的一次性请求;没有待处理请求时 Server 拒绝提交。
系统辨识参数
严格包含 9 个字段:
{
"q_in_val": 91,
"dt": 0.1,
"n_order": 8,
"t_c": 2.5,
"levels": [10, 20, 30, 40, 50, 60, 70, 80],
"dead_area": 0,
"xa_full": 1000,
"V_val": 1,
"repeat": 2
}
Panel 将其序列化为 parameter,value 两列 CSV,并发布到当前产线:
<deviceId>/identification_config/identification_config.csv
8. 辨识数据接收与绘图
Panel 按当前产线轮询 Server 收件箱,不扫描 Server 文件目录。
默认轮询间隔为 1 秒,可通过 POLL_INTERVAL_MS 修改,最小允许值为 500 毫秒。
支持两类数据:
辨识 CSV
收到 CSV 后:
- 下载到本地。
- 生成阀门开度与压力组合时序图。
- 在工作台中显示图片。
- 等待人工提交“通过”或“未通过”。
行程稳定压力 JSON
收到 JSON 后:
- 下载到本地。
- 将行程与稳定压力绘制为固定 0-1000 行程范围的数值折线图,并显示各点坐标。
- 在工作台中显示图片。
- 绘图成功后确认已处理;文件保留在 Server 暂存区,可继续查看和下载。
绘图结果支持在系统文件管理器中定位,也支持在应用内放大、缩小、适应窗口和原始比例查看。
9. 辨识数据暂存
“辨识数据”页面按当前产线列出 Server 暂存的 CSV 和行程 JSON,支持:
- 查看并生成对应图像预览
- 将原始 CSV 或 JSON 保存到用户选择的位置
- 管理员二次确认后删除暂存数据
- 查看待处理和已处理状态
文件下载请求携带 Admin Token;Server 可使用该令牌校验下载访问,或返回短期授权下载 URL。
10. 辨识人工审核
绘图页面提供:
- “通过”按钮
- “未通过”按钮
通过
提交数字 1:
{
"type": "setIdentificationFeedback",
"deviceId": "sample-co/line-1",
"runId": "辨识 CSV 文件名",
"result": 1
}
ReinLoop 获取结果后结束当前辨识流程。
未通过
提交数字 0 前,Panel 强制要求:
- 选择一份新的系统辨识参数 JSON。
- 成功发布新的辨识 CSV 配置。
- 再提交未通过结果。
ReinLoop 获取数字 0 后重新下载配置并执行下一轮辨识。
消息可靠性
CSV 不会在绘图后立即从 Server 删除。
只有以下操作都成功后才确认消息:
- 人工审核结论提交成功。
- Server 接受
0/1反馈。 - Panel 调用
ackPanelFile成功。
如果应用在审核前退出,CSV 仍保留在 Server,重新启动并选择同一产线后可以再次获取。
Panel 同一时间只处理一个待审核 CSV,避免多个审核结果串线。
10. Electron 安全边界
BrowserWindow 使用:
contextIsolation: true
nodeIntegration: false
sandbox: true
渲染页面只能通过 preload 暴露的有限 IPC 调用主进程。
以下能力仅存在于主进程:
- Server Token 请求
- 私钥读取和许可证签名
- 本地文件选择与保存
- 模型上传与下载
- 绘图文件读取
- 在文件管理器中定位文件
页面配置了 Content Security Policy,只允许加载应用自身脚本、样式和 data URL 图片。
11. 命令行兼容工具
除 Electron GUI 外,仍保留原有命令行能力:
b-admin.js
poll-panel-inbox.js
支持:
- 发布容积配置
- 发布系统辨识配置
- 读取配置
- 轮询待处理数据
- 命令行人工审核
Electron GUI 是主要管理入口,命令行工具用于调试和兼容既有流程。
12. 运行与打包
安装依赖:
cd ControlPanel
npm install
启动 Electron:
npm run gui
运行语法检查:
npm run check
运行测试:
npm test
构建 Windows 安装版和便携版:
npm run pack:win
输出目录:
Build/
构建内容包含:
- Electron 主进程和 preload
- 页面文件
- Server 客户端
- 配置管理模块
- 许可证签发模块
- CSV/JSON 绘图模块
canvas原生依赖
canvas 会从 ASAR 中解包,以便 Windows 原生模块正常加载。
13. 当前验证状态
已验证:
- 所有 Panel JavaScript 文件通过
node --check。 - 许可证 RSA-PSS 签名可由对应公钥验证。
- 非法身份、设备 ID 和时间范围会被拒绝。
- 许可证签发单元测试通过。
- 连接门禁首屏只显示 Server URL、Token 和校验按钮。
- 未通过连接校验时业务区域保持隐藏。
- 页面文件没有编辑器诊断错误。
当前 Linux 工作区中的完整绘图测试受原生 canvas 环境限制:已有 canvas.node 不是当前 Linux 可加载格式,源码重建又缺少系统 pangocairo 开发库。该限制不影响 JavaScript 语法和许可证测试,但 Windows 发布前仍需在目标构建环境执行完整绘图和打包验证。
14. 主要 Server 接口依赖
连接与组织:
listOrganizations
createCompany
createProductionLine
许可证:
createLicense
listLicenses
getLicense
revokeLicense
模型与文件:
uploadDataFile
listModels
downloadModel
deleteFile
配置:
getPendingVolumeConfigRequest
submitVolumeConfigFile
publishIdentificationConfig
getIdentificationConfig
getFunctionConfig
辨识与收件箱:
getPendingPanelFile
ackPanelFile
setIdentificationFeedback
设备在线状态由 ReinLoop 调用:
deviceHeartbeat