战略规划 · V25 · 2026-07-10

Nexora 分层合并
架构

认证与用户收敛到中心库,珠宝与原料两条业务线代码独立部署、只共享认证。所有仓库归入 gitlab.nexora 组,一份手机端代码按 pt_type 分流 xerp/serp。

9租户
珠宝 3 家 · 原料 6 家 · 全绿
7仓库
nexora 组 · 珠宝 3 · 原料 4
193用户
中心库 bcrypt · 平台超管通
36页 · 0 错
手机端 headless 真机
01

分层架构 · 部署图

3 张纯 HTML 卡片:仓库全景 · 认证流 · 域名路由。加起来当开发决策依据。

图 1 · 仓库全景

gitlab.nexora.restry.cn/nexora 组下 7 个仓库 · 三列 = 平台 / 珠宝 / 原料 · 徽章示部署状态。新增代码按此表定位放哪个仓库。
◉ 平台 · 跨线共用
nexora-platform-admin ↗
已部署已接中心库T·3 后端寄生
平台超管前端 · 独立域名 platform.nexora
5 nav · 12 tenant 表 · API 寄生在 nexora-erp:18101 · 应拆独立
nexora_platform (DB) 已在用
中心库 (MySQL · 不是 git repo)
12 tenants · 193 users · bcrypt · user_tenant_map
nexora-app ↗ · 跨珠宝+原料两条线
已部署已接中心库跨线
uniapp H5 · 前端 1 份 · 后端调 2 份 · *.erp→珠宝 :18101 · *.metal→原料 :18091 (子域同源分流)
pt_type=1→xerp UI (珠宝 3 家) · pt_type=2→serp UI (原料 6 家) · 9/9 全绿 · 36 页 0 错
徽章 = 部署 + 中心库接入 绿 = 通 · 已生效 = 半通 · 有前提 灰浅 = 未做 N/A = 不适用 = 有偏差(见 §03) ✦ 加租户→nexora_platform · 加认证→platform-admin · 加手机页→nexora-app

图 2 · 认证流

一次登录的 6 步 · 从浏览器到 token · 走中心库 bcrypt · 两条业务线用同一份 CentralAuth 类。
1
浏览器
POST /api/login
输 admin / 123456
body: {user, pwd}
2
Caddy 分流
按子域分流:
*.erp → 珠宝 :18101
*.metal → 原料 :18091
3
PHP 后端 Api::login
珠宝或原料 PHP
解析 slug + pwd
CentralAuth::authTenantUser(u,p,s)
4
CentralAuth 校验
SELECT users WHERE
username = 'xipu_admin'
password_verify(bcrypt)
5
映射到租户 user
JOIN user_tenant_map
WHERE tenant_slug='xipu'
→ tenant_user_id=1
6
生成 token 返回
token = random 32 字符
cache(token, [user,...])
{state:success, token}
手机端 nexora-app 前端 1 份 · 后端 2 份 (子域名同源分流)
✦ 平台超管入口 (platform.nexora) 走 authPlatformAdmin · 同一 CentralAuth · is_platform=1 标记 · 短路租户解析
✦ 新组件接认证:只要 use CentralAuth · 调 authTenantUser / authPlatformAdmin · 不要自己再实现 bcrypt
✦ 加新用户:走 CentralAuth::syncUser · 同时写中心库 users + 各租户库 erp_user

图 3 · 域名路由

Caddy 反代表 · 左列当前生产 · 右列目标 (P·1 生产切换后)。加新子域按此规则走。
域名 当前生产反代 目标 (P·1 后)
*.erp.nexora.restry.cn 珠宝 3 家nexora-erp-php:18101 ✓不变
*.metal.nexora.restry.cn 原料 6 家nexora-erp-php:18101 (临时共用)→ nexora-metal-erp-php:18091
platform.nexora.restry.cn 平台超管静态 SPA + /api/→18101 ✓不变
admin.erp.nexora.restry.cn 兼容nexora-erp-php:18101 (platform 分支)保留 · 未来废弃
mall.metal.nexora.restry.cn 待定 · Ch·5未起→ nexora-metal-mall 独立容器 :18092
Caddy 配置:/home/claw/lobster-platform/caddy/Caddyfile · FRP 出口:40.162.94.187 · 加新子域三处都改:FRP custom_domains + Caddy block + 容器 listen

判据:跨线是同一概念(用户/认证)就统一;跨线是不同实现(进销存/贵金属)就分线。

内容载体(仓库)状态
统一层认证 · 用户 · 租户目录 · 平台超管nexora_platform 中心库 · CentralAuth已建 · 已验
珠宝网页PC admin (囍铺/龙凤/摆件)nexora/nexora-erp-web已部署
珠宝后端3 家一租户一库 · 137 手机端接口nexora/nexora-erp :18101已合并 · 已验
原料网页PC admin · eperp/merp/serp 三子项目nexora/nexora-metal-erp-webbuild 通过
原料后端6 家共用 · aid 隔离nexora/nexora-metal-erp :18091已独立 · 已验
手机端uniapp H5 · pt_type=1 xerp · pt_type=2 serpnexora/nexora-app9/9 全绿
妈祖商城H5 商城nexora/nexora-metal-mall入库未起
妈祖小程序微信小程序nexora/nexora-metal-miniprogram入库未起
平台超管前端platform.nexora.restry.cn 独立域名 · 12 租户表 · 5 导航nexora/nexora-platform-admin已部署 · 已验
02

路线图 · 执行时间线

六个阶段。每个阶段展开精确到分钟的执行事件(绿点=已完成 · 灰点=待做)。让后续会话读到当前进度不重复不遗漏。

A统一认证

中心库 bcrypt · 跨线共用

nexora_platform · 193 users · 12 tenants · CentralAuth 类被两条 PHP 后端共用。
已完成
07-11 12:52U·1珠宝 3 家 admin/123456 走中心库 bcrypt 登录 · 全 state:success xipu ✓ · xylferp ✓ · baijian ✓ · CentralAuth::authTenantUser
07-11 12:52U·2原料 3 家(有用户的)走中心库 bcrypt 登录 · state:success · 正确 aid darkgroup/heian aid=19 · pymetal/ss aid=21 · fjfl/gxgjs aid=37
07-11 12:54U·3users vs user_tenant_map 双写核对 · 11/12 家完美对齐 仅 fjfl 缺 1 映射 (9 用户 8 映射)
07-11 12:55U·4平台超管 admin/123456 → is_platform=1 · 平台身份 token 生成 CentralAuth::authPlatformAdmin · user_tenants.role=platform_admin
B珠宝线合并

龙凤 / 摆件 / 囍铺 合入 nexora-erp · 手机后端从 Kotlin/Java 迁到 PHP

一份 PHP 代码 · 一租户一库 · 表前缀 xipunum_ · 囍铺原 Kotlin (sprin-boot-kotlin219) 手机端 137 接口全数复刻到 nexora-erp PHP · 技术栈去掉 Java。
已完成
07-10 22:40M·B1销售链 23 接口 · impl 累计 41
07-11 00:00M·B2库存扫码 32 接口 · impl 累计 73
07-11 00:30M·B3会员财务 10 接口 · impl 累计 83
07-11 01:00M·B4报表明细 44 接口 · impl 累计 127
07-11 01:20M·B5告警辅助 10 接口 · 137/137 全绿 · selftest 243/243 · Kotlin 冻结
07-11 07:56M·fixoutbound 临时表回归 · 6305f40 · 修 500
07-11 08:01M·fix收银汇总 queryUserByStoreList 实现 · 6bccbfb
C手机端统一

nexora-app 单后端 · pt_type 分流

珠宝 pt_type=1→xerp · 原料 pt_type=2→serp · 一份 uniapp 代码。详见 nexora-mobile-migration.html
已完成
07-11 13:05M·V·J珠宝 3 家 × 4 页 = 12 页面 headless 真机全绿 · 0 API 500 xipu / xylferp / baijian · xerp 模式 · home + order + report + mine
07-11 13:20M·V·M原料 6 家 × 4 页 = 24 页面 headless 真机全绿 · 0 API 500 darkgroup / pymetal / fjfl / qyxs / ftgf / qywh · serp 模式
D原料线独立化

pyerp_php → nexora/nexora-metal-erp

4 库搬迁 · 珠宝主干剥离 61 文件 · 独立容器 :18091 · Caddy 未切(等 P·1)。
已完成
07-11 10:33D·B仓库搬迁 · xipugold → nexora 组 · 4 库 nexora-metal-erp 37.5MB/123c · -erp-web 2.1MB/165c · -mall 123.6MB/39c · -miniprogram 16.8MB/8c
07-11 12:21D·A代码剥离 · nexora-erp 删原料残留 · selftest 243/243 保持 commit faef50a · 61 files · modules/ymetal · myhw-shop · mall-sync · pos-mall-bridge · sql.gz
07-11 12:24D·C独立部署 · nexora-metal-erp-php :18091 · 登录行为与老 :18080 一致 DB=pyerp_test · 网络=pyerp-dev_default · 老 pyerp-php 完好
07-11 12:35D·C16 家 metal 直连 :18091 · 3/6 login+接口全绿(老库有用户的 3 家) darkgroup heian aid=19 · pymetal ss aid=21 · fjfl gxgjs aid=37
07-11 13:15D·C1+6 家 metal 走生产 Caddy + 中心库 · admin/123456 全绿 6/6 · 中心库 bcrypt · 全部返回"管理员"
07-11 12:45D·C2nexora-metal-erp-web/serp build 通过 · dist 7.4M · publicPath=/serp/ 1348 packages · vue-cli-service build DONE · static server 200
07-11 18:32D·C3nexora-metal-erp 接入 CentralAuth · 独立容器 :18091 走中心库 bcrypt Api.php login 从 nexora-erp 复刻 · config/database platform 段 · commit 421d15a · 6/6 家 admin/123456 直打 :18091 state:success · 平台超管 is_platform:1
07-11 19:05D·C4nexora-metal-erp-web/serp 独立部署 · metal-test.nexora.restry.cn/serp/ baseURL 从 pyerp.test 改成 metal-test.nexora · 重 build · Caddy handle /serp/* 挂到 /srv/portal/nexora-metal-serp/ · 反代 :18091
07-11 20:48D·C5原料 web 生产化 · *.metal.nexora / 切到 nexora-metal-serp · 不再共用珠宝前端 publicPath=/ · baseURL=/ · rebuild · Caddy root 从 /srv/nexora-erp-web 切到 /srv/portal/nexora-metal-serp · 6/6 家真机 #/home 全绿 · title 莆阳ERP
F平台超管前端

platform.nexora 独立站

独立仓库 nexora/nexora-platform-admin · 独立域名 platform.nexora.restry.cn · Caddy 反代 · CentralAuth 复用 nexora-erp:18101 · 5 导航 · 12 租户表 · 分线跳转。
已完成
07-11 15:47F·1独立仓库 + 独立域名 + 独立部署 · platform.nexora.restry.cn 建 nexora/nexora-platform-admin · Caddy /api/*→18101 · FRP + · LE cert · HTTP 200
07-11 16:05F·2/api/platform/tenants 后端 10 路由 · Tenant.php platform-only 分支 PlatformAuth::isCurrent 短路 · Api.php login host 判断 · 12 租户完整数据
07-11 16:20F·3headless E2E · admin/123456 → dashboard → 5 tab 切换 · 12 租户表渲染 · 0 error 总览/租户 tab 有内容 · 用户/审计/设置 tab 显示 placeholder
E商城 · 小程序

妈祖 H5 商城 + 微信小程序

nexora-metal-mall + nexora-metal-miniprogram · 只做妈祖各一份 · 珠宝线不做。判据:本地部署通 · 商城 login/首页/1 个业务页 · 小程序真机预览。
入库未起
待做E·1nexora-metal-mall 部署 · 本地打开首页/登录/1 个商品页
待做E·2nexora-metal-miniprogram 编译 · 微信开发者工具真机预览
待做E·3Mall ↔ ERP 数据流验证 · 下单/库存扣减/回写
P生产切换

Caddy 流量迁移 · 本地测试通过后再动

所有本地验证通过后再动生产流量。当前 *.metal.nexora Caddy 反代仍在珠宝后端 :18101。
等发话
待做P·1Caddy *.metal.nexora → 切到 nexora-metal-erp-php:18091
待做P·2切后 6 家 metal 复测 · 通过则停老 pyerp-php · 归档 pyerp_php 目录
待做P·3Caddy erp-web / mall / miniprogram 域名接入 · 独立实例上线
03

遗留待办

干活过程中发现但先不处理的事 · 攒着后面统一清 · 别让它们悄悄溜走。

T·1

清理 nexora-metal-erp-web 里的 eperp / merp 子项目

这两个子项目 title 都是"囍铺ERP" · 是从 xipugold/pyerp_web mirror 时误搬进来的珠宝残留

珠宝 admin 已在 nexora-erp-web · 这俩在原料 repo 里是纯冗余 · 保留会持续误导后续开发者。删掉 + git commit 说明来龙去脉即可。

代码清理
T·2

确认 nexora-metal-erp 里有没有珠宝残留

metal-erp 从老 pyerp_php mirror 过来后 · 剥离过一次 (commit faef50a · 61 files · modules/ymetal/myhw-shop/mall-sync/pos-mall-bridge 删掉)。

但当时只查了明显的 metal/mall 目录 · 没系统扫过"珠宝专属代码" (xipunum_ 硬编码/囍铺业务模块) 是否还在。审计一遍确保原料 repo 里没混珠宝逻辑。

代码审计
T·3

平台超管后端 · 从 nexora-erp 拆独立

现在平台管理 API(/api/platform/tenants 等)寄生在珠宝 nexora-erp:18101 里。

平台层跟业务线是不同 concern · 应该独立后端 · 或者干脆做在 nexora-platform-admin 前端仓里(Node/Deno serverless) · 不应耦合任何业务 ERP。

架构拆分
T·4 ✓

原料网页 admin · 独立部署 nexora-metal-erp-web/serp

07-11 20:48 完成:publicPath 从 /serp/ 改回 / · baseURL 从 /serp-api/ 改回 / · npm run build · dist 拷到 /srv/portal/nexora-metal-serp · Caddy *.metal.nexora root 从 nexora-erp-web 切到 nexora-metal-serp。

6 家原料 (darkgroup/pymetal/fjfl/qyxs/ftgf/qywh) 真机验证 · 全部登录进 #/home · title 莆阳ERP · 业务看板正常渲染。

已完成
T·5

原料租户库 xipunum_sys 表缺 aid

/api/runDataSQLSTATE[42S22]: Column not found: 1054 Unknown column 'aid' in 'where clause'

metal-erp 后端 getSys() 硬编码 ['aid','=',aid](app/common.php:567) · 但从老 myhw dump 迁的租户库表结构没这个列。修法 3 选一 · 参见 hermes 会话记录。会阻塞 T·4。

数据/代码
T·6

妈祖商城 + 小程序 · 起容器 + 挂域名

nexora-metal-mall(H5 商城 · repo 自带 PHP+DB) + nexora-metal-miniprogram(微信小程序) 都入库未起

商城起 :18092 容器 · Caddy 挂 mall.metal.nexora · 小程序编译走微信开发者工具真机预览。

部署