From e54c7728687c535ff8ceb86e34ffb11c6a9ce084 Mon Sep 17 00:00:00 2001 From: augushong Date: Wed, 9 Sep 2026 14:37:56 +0000 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E8=8F=9C=E5=8D=95=E5=BF=AB?= =?UTF-8?q?=E7=85=A7=E5=AF=B9=E9=BD=90=E8=BF=81=E7=A7=BB=EF=BC=8C=E5=AD=98?= =?UTF-8?q?=E9=87=8F=E5=BA=93=E8=87=AA=E5=8A=A8=E8=A1=A5=E9=BD=90=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E7=AE=A1=E7=90=86=E4=B8=8EXHProf=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对齐迁移是菜单快照进入数据库的唯一途径(新装与存量库同路径);缺失行按显式 id 补插,框架结构行仅对齐 pid+sort,软删/用户分组跳过;新增规则文件与索引;清理 status 模块孤儿占位文件。 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- .agents/rules/ulthon-init-data-migration.md | 70 ++++++++++ AGENTS.md | 8 ++ app/admin/service/MenuAlignService.php | 16 +++ app/admin/view/status/_common.js | 0 .../20260909120000_system_menu_align.php | 37 +++++ .../admin/service/MenuAlignServiceBase.php | 131 ++++++++++++++++++ .../service/adminInitData/SystemMenu.php | 12 ++ 7 files changed, 274 insertions(+) create mode 100644 .agents/rules/ulthon-init-data-migration.md create mode 100644 app/admin/service/MenuAlignService.php delete mode 100644 app/admin/view/status/_common.js create mode 100644 database/migrations/20260909120000_system_menu_align.php create mode 100644 extend/base/admin/service/MenuAlignServiceBase.php diff --git a/.agents/rules/ulthon-init-data-migration.md b/.agents/rules/ulthon-init-data-migration.md new file mode 100644 index 0000000..7432c43 --- /dev/null +++ b/.agents/rules/ulthon-init-data-migration.md @@ -0,0 +1,70 @@ +# 初始化数据变更与迁移铁律 + +> 来源:框架内置(ulthon-) +> 作用域:`extend/base/admin/service/adminInitData/` 下全部初始化快照(SystemMenu、SystemConfig、SystemAdmin 等)及其配套数据迁移 +> 触发条件:新增/修改/重组任何初始化数据、快照或相关迁移时加载 + +## 背景:迁移是唯一安装命令 + +`php think migrate:run` 是唯一的安装命令,一条命令完成建表 + 全部初始数据(超管、角色、权限节点、配置、快捷入口、商城演示、菜单)。种子机制已退役:框架自身零种子,`seed:run` 成为空操作,仅保留给下游业务项目放自己的种子。 + +| 路径 | 机制 | +|------|------| +| 全新安装 | `migrate:run` 建表并写入全部初始数据(phinxlog 记账,幂等) | +| 存量库 | 数据型 migration 经 `migrate:run` 对齐(admin:update 检测到 migrations 变更会提示) | + +历史教训:定时器/主机菜单(2026-05 c169646)、XHProf 菜单与运行管理重组(2026-08 8cbe62a)都曾只改快照不带 migration,导致存量库永久缺菜单。这就是「快照变更必须配套迁移」铁律的由来。 + +## 铁律 + +1. **已发布迁移永不编辑**:`database/migrations/` 下已发布(进过提交/已在库中执行)的迁移文件永不编辑,任何变更只能新增迁移。 +2. **数据迁移必须幂等**:不得依赖「恰好执行一次」。存在性检查 + 原生查询兜底:auth/quick/admin 等含 `delete_time` 的表,判存必须用 `Db::name` 原生查询(或 `withTrashed`)绕过软删除作用域——否则软删行被误判「缺失」导致重放时主键冲突或数据复活。参照 `MenuAlignServiceBase` 已验证模式。 +3. **对齐只增不删**:快照行删除或 id 复用属破坏性变更,必须显式编写删除迁移 + 人工确认。既定语义:快照文案/icon 变更与 config value 修改**不自动传播**到已装库,不视为缺陷。 + +## 快照数据源 + +`extend/base/admin/service/adminInitData/*.php` 是唯一初始数据源(9 个文件:SystemAdmin、SystemAuth、SystemAuthNode、SystemConfig、SystemQuick、SystemMenu、MallCate、MallGoods、MallTag)。 + +新增初始数据 = 新增快照 + 新增迁移(或纳入对齐服务),migration 不得硬编码快照数据副本,必须复用快照文件或调用对齐服务(如 `MenuAlignServiceBase`、`InitDataAlignServiceBase`),避免两份数据漂移。 + +## migration 模板 + +```php + + */ +class SystemMenuAlign extends Migrator +{ + public function up() + { + (new MenuAlignService(new Output()))->align('SystemMenu'); + } + + public function down() + { + // 数据对齐迁移不提供对称回滚,见规则 ulthon-init-data-migration.md + } +} +``` + +新增菜单时同步操作:`adminInitData/SystemMenu.php` 追加条目(显式 id 接续现有序列)+ 按模板新增迁移(时间戳接续)。其他类型快照需要类似对齐能力时,参照 `MenuAlignServiceBase` 扩展对应服务,不硬编码数据。 + +## 相关文件 + +- `extend/base/admin/service/adminInitData/` - 初始化数据快照目录(唯一数据源) +- `extend/base/admin/service/InitDataAlignServiceBase.php` - 六域初始数据对齐编排(超管/角色/配置/快捷入口/商城演示/菜单) +- `app/admin/service/InitDataAlignService.php` - app 层入口(可覆盖) +- `extend/base/admin/service/MenuAlignServiceBase.php` - 菜单对齐服务 +- `app/admin/service/MenuAlignService.php` - app 层入口(可覆盖) +- `database/migrations/20260909120000_system_menu_align.php` - 菜单对齐迁移(范本) +- `database/migrations/20260909130000_system_init_data.php` - 全量初始数据迁移 + +## 相关规则 + +- [ulthon-file-override-mechanism.md](./ulthon-file-override-mechanism.md) - app 层覆盖 extend/base 的三类文件 diff --git a/AGENTS.md b/AGENTS.md index ae9dd81..a52e5a0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,6 +4,13 @@ ## 项目信息 +- 项目概述:ulthon_admin 框架本身(框架作者开发模式,非下游业务项目) +- 运行方式:使用框架内置 docker-dev 栈(`source/stack/docker-dev/`)。启动:`cd source/stack/docker-dev && docker compose up -d` +- 命令执行方式:`php think` 一律在容器内执行,不在宿主机直接执行。模式目录内:`docker compose exec ulthon_admin php think ...`;仓库根目录:`docker compose -f source/stack/docker-dev/docker-compose.yaml exec ulthon_admin php think ...` +- 端口:应用 8000、MySQL 13306(容器内 3306,root/root,库名 ulthon)、Redis 16379、phpMyAdmin 18888 +- 访问地址:(后台,默认账号 admin / 123456) +- 注意:宿主机 `docker compose exec` 默认以 root 执行,产生的 runtime 文件 www-data 不可写;遇到 runtime 权限问题时 `chmod -R a+rwX runtime`(模式目录内 exec 可加 `--user www-data` 规避) +