M1 运行时热换皮 · 技术验证 Demo
验证一件事:渠道商在管理台改一下品牌,客户端下次启动就换完 —— 不用重新出安装包、不用重签名、不用排期。
验证路径
- 打开管理台,改产品名 / logo / 图标 / 主色 / 登录页文案 / 客服联系方式
- 点「保存并发布」 —— 服务端写入新版本并用 Ed25519 私钥签名
- 终端客户预览会实时变化(注入层品牌,与客户端内的页面品牌同一套逻辑)
- 启动 Electron 客户端:拉 bootstrap → 验签 → 应用品牌(窗口标题 / 图标 / 托盘 / 菜单 / 页面内品牌)
- 再次改品牌并重启客户端,验证是「热换皮」而非「重打包」
这个 Demo 覆盖了规格里的哪些关键点
- 配置下发
- GET /api/client/bootstrap(启动)+ /api/client/heartbeat(心跳比对版本)
- 防篡改
- Ed25519 签名,服务端自校验,客户端持公钥验签
- 两段式发布
- 草稿 → published,版本号单调递增
- 粘性降级
- 客户端持久化最后一次成功配置;拉取失败用缓存,绝不回落到平台默认品牌
- 审计
- brand_config_fetch 记录每次拉取的客户端、版本、IP、UA
- 热更新
- 心跳发现新版本 → 提示「重启以应用新品牌」
- 白标边界
- 名称、logo、图标、主色、客服联系方式可改;协议主体与合规声明不可改
为什么这件事值得做成技术规格
竞品调研结论:闭源客服 SaaS 一律把白标收进企业合同或书面拒绝;A 层头部指纹浏览器厂商的公开白标能力基本为零;唯一公开可证实「私有化 + 客户端换名换图标」的是 flowglot——而它的品牌名硬编码在安装包文件名与 .app bundle 里,换名需重打包重签名。
也就是说,行业标准是「重打包」,每新增一个渠道商就多一次排期与一次签名交付。
我们要把它变成「配置」:一次性工程投入,之后每个渠道商换牌的边际成本≈0。这是从「卖产品」升级为「卖渠道能力」的技术前提。
完整规格见《05-运行时热换皮技术规格》,本 Demo 只实现最小可验证切片。
目录说明
- server/
- Next.js 管理台 + API + Postgres(brand_config 等 4 张表)
- server-lite/
- 零框架依赖的降级版服务端(Next.js 装不动时用这个)
- client/
- Electron 客户端:启动拉配置 → 验签 → 换皮 → 自截图