两个版本,同一个产品
Toutadmin 有两份实现:一份跑在 Node.js 上,一份跑在 PHP 上。它们不是两个产品,也不是 精简版与完整版之别。它们是同样的 51 个业务空间、同样 142 张表的 数据库结构、同样的 16 种语言、同样的界面。本页说明它们真正的区别——而区别很少。
为什么是两个#
企业产品必须能装在企业已有的环境里。有的公司有服务器、有 systemd、有管理员;
有的公司只有每月四欧元的虚拟主机和一个 FTP 账号。Node 版面向前者,PHP 版面向后者。
把后者拒之门外,等于拒绝了最需要管理工具的那一半公司。
完全一致的部分#
| 项目 | Node | PHP |
|---|---|---|
| 业务空间 | 51 | 51 |
| 数据库表 | 142 | 142 |
| 字段 | 1311 | 1311 |
| 界面语言 | 16 | 16 |
| 翻译键 | 2765 | 2792 |
| 可选模块 | 7 | 7 |
| Webhook 事件 | 8 | 8 |
| API 资源 | 9 | 9 |
由于结构相同,一个数据库可以在两个版本之间直接搬运,无需任何转换:停掉一边,
复制 app.sqlite 和文件目录,启动另一边。密码照常可用——两个版本读的是同一种
散列格式。这是检验一致性最诚实的办法,而它通过了。
有差别的部分#
少数地址的写法#
Node 侧 531 条路由,PHP 侧 513 条。这个差额并不是功能缺失: 同样的功能,只是写得更紧凑。
-
API。Node 把九个资源逐一声明(
/api/v1/collaborateurs、/api/v1/services……);PHP 用一条带参数的路由统一提供。九个全都能响应, 根地址也如数列出,并有测试逐个调用来加以证明。 - 安装。Node 分五步引导,PHP 则一页一次提交即可。所需的五项信息相同: 语言、前置条件、公司、年假天数、管理员账户。
-
横向权限。Node 每项权限一条路由,PHP 只用一条带参数的
/admin/droits/{flag}。
这二十八处形式差异并非凭记忆断言:tests/test_parity.php 会逐一实际验证。
定期巡检#
Node 自带调度器:服务常驻运行,自己会醒。PHP 只在请求期间存活:同样的八项操作通过
tools/cron.php 完成,由主机的定时任务调用。业务代码相同,效果相同,触发方式不同。
日期#
Node 使用 V8 内置的 Intl 输出日期。装有 intl 扩展时,PHP 做法相同
——同一套 ICU 引擎,结果逐字一致。缺少该扩展时,星期与月份名称改由翻译词典提供:日期依然
正确且已翻译,但在少数语言中各部分的顺序可能不同。
本以为会不同、实际却相同的部分#
| 主题 | 两个版本中 |
|---|---|
| 二维码(双重验证) | PHP 侧手写的编码器,在十六种文本长度上与 Node 侧所用的库做过逐字节比对。 |
| 备份归档 | 两侧都不依赖任何库自行生成 tar.gz,内容相同,SHA-256 校验值相同。 |
| IMAP 财务邮箱 | 两侧都在产品内部实现 IMAP 客户端。 |
| PDF、CSV、导入 | 均在产品内部实现,输出文件相同。 |
| 审计日志 | 同样的散列链式校验:改动任意一行都会打断链条,两侧皆然。 |
| HTTP 安全策略 | 相同的响应头、相同的带 nonce 的 CSP,同样不依赖任何必需的 JavaScript。 |
该选哪个#
| 您的情况 | 版本 |
|---|---|
| 虚拟主机、FTP 访问、没有命令行 | PHP——正是为此而做 |
自有服务器、systemd、有管理员 | Node |
| 您本来就会维护其中一个 | 就选它。一致性让这个选择可以反悔。 |
| 同时使用的人很多 | Node——常驻进程,数据库已处于打开状态 |
| 拿不定主意 | PHP——要照管的部件更少,日后转到 Node 也不过是复制文件 |
一致性是怎么守住的#
它不是一句承诺,而是一项检查。每次改动都要跑四轮比对:
- 路由——从两侧提取后比对;任何差异都必须是已记录在案的差别。
- 函数——各模块对外暴露的名称,逐模块比对。
- 数据库结构——从两个数据库读出表和字段后比对。
- 界面——两个版本并排启动,由真实浏览器逐页走查,比对响应码与结构。
这四轮查出过真实缺陷——其中两个两个版本都有。这正是它们的价值所在:不去度量的 一致性,就是在不知不觉中已经失去的一致性。
此外还有测试套件:Node 侧 802 项,PHP 侧 572 项,共 1374 项。
Toutadmin 文档 —— 构建于 2026-09-13。 独立站点,与软件本身分离。