T Toutadmin文档

两个版本,同一个产品

Toutadmin 有两份实现:一份跑在 Node.js 上,一份跑在 PHP 上。它们不是两个产品,也不是 精简版与完整版之别。它们是同样的 51 个业务空间、同样 142 张表的 数据库结构、同样的 16 种语言、同样的界面。本页说明它们真正的区别——而区别很少。

为什么是两个#

企业产品必须能装在企业已有的环境里。有的公司有服务器、有 systemd、有管理员; 有的公司只有每月四欧元的虚拟主机和一个 FTP 账号。Node 版面向前者,PHP 版面向后者。 把后者拒之门外,等于拒绝了最需要管理工具的那一半公司。

完全一致的部分#

项目NodePHP
业务空间5151
数据库表142142
字段13111311
界面语言1616
翻译键27652792
可选模块77
Webhook 事件88
API 资源99

由于结构相同,一个数据库可以在两个版本之间直接搬运,无需任何转换:停掉一边, 复制 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 也不过是复制文件

一致性是怎么守住的#

它不是一句承诺,而是一项检查。每次改动都要跑四轮比对:

  1. 路由——从两侧提取后比对;任何差异都必须是已记录在案的差别。
  2. 函数——各模块对外暴露的名称,逐模块比对。
  3. 数据库结构——从两个数据库读出表和字段后比对。
  4. 界面——两个版本并排启动,由真实浏览器逐页走查,比对响应码与结构。

这四轮查出过真实缺陷——其中两个两个版本都有。这正是它们的价值所在:不去度量的 一致性,就是在不知不觉中已经失去的一致性。

此外还有测试套件:Node 侧 802 项,PHP 侧 572 项,共 1374 项。

Toutadmin 文档 —— 构建于 2026-09-13。 独立站点,与软件本身分离。