mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-10-29 08:58:22 +08:00
refactor(install): 种子退役,migrate:run 一条命令完成建表与初始数据
新增 InitDataAlignService 六域对齐(超管/角色/权限节点/配置/快捷入口/商城演示)与 20260909130000 迁移;SystemAdmin 快照以字面量哈希入库;删除种子三件与安装锁依赖,seeds 目录留 .gitkeep;README/tests/规则等 11 处说明同步。 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -38,7 +38,7 @@ use think\facade\Db;
|
||||
* Mcp-Protocol-Version 用 initialize 返回的协商版本。
|
||||
*
|
||||
* ===== 超管创建者 =====
|
||||
* 不造 admin id=1(seed 已存在);用全新管理员 + 全新角色(避开 SystemAuthNode 60s
|
||||
* 不造 admin id=1(初始化迁移已创建);用全新管理员 + 全新角色(避开 SystemAuthNode 60s
|
||||
* 缓存与 adminInfo autoCache 窗口,learnings Task 4/6 的既定模式)。
|
||||
*
|
||||
* ===== 403 分支 =====
|
||||
|
||||
@@ -212,7 +212,7 @@ class McpServiceTest extends TestCase
|
||||
|
||||
public function test_drift_super_admin_creator_gets_full_whitelist(): void
|
||||
{
|
||||
// 超管(seed 的 id=1,auth_ids 空):判定链超管直通,白名单全保留
|
||||
// 超管(初始化迁移创建的 id=1,auth_ids 空):判定链超管直通,白名单全保留
|
||||
// (含未注册节点也放行——超管对全量节点可见)
|
||||
$fakeNode = 'nonexist.fake_node/action';
|
||||
$key = $this->createKey(1, [self::NODE_A, $fakeNode, self::NODE_B]);
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# 测试数据库初始化
|
||||
|
||||
本目录提供测试数据库(默认 `ulthon_admin_test`)的初始化脚本。运行一次即可在与 `.env`
|
||||
同实例的 MySQL 上建出框架运行所需的**全部表**(系统表 + 业务表),并插入最小参考数据。
|
||||
同实例的 MySQL 上建出框架运行所需的**全部表**(系统表 + 业务表),并写入全部初始数据
|
||||
(超管、角色、系统配置、快捷入口、菜单等,由数据迁移随 `migrate:run` 一并交付)。
|
||||
|
||||
## 测试库策略:参数化,无需专用 Docker 容器
|
||||
|
||||
@@ -23,7 +24,7 @@ ulthon 是框架仓库,测试库策略**与衍生项目(wkbox)不同**:
|
||||
|
||||
| 文件 | 作用 |
|
||||
|------|------|
|
||||
| `setup_test_db.php` | 真正的运行器(PHP)。启动 ThinkPHP 容器、读 `.env`、PDO 建测试库、config 级覆盖连接、按序调用 `migrate:run` / `scheme:sync` / `seed:run`、查 `information_schema` 自验证。 |
|
||||
| `setup_test_db.php` | 真正的运行器(PHP)。启动 ThinkPHP 容器、读 `.env`、PDO 建测试库、config 级覆盖连接、按序调用 `migrate:run` / `scheme:sync`、查 `information_schema` 自验证。 |
|
||||
| `setup_test_db.ps1` | Windows / PowerShell 包装器:检测 php 在 PATH → 调 PHP 运行器 → 透传退出码。 |
|
||||
| `setup_test_db.sh` | bash / CI 包装器:逻辑同上,Linux / macOS / CI 用。 |
|
||||
| `bootstrap.php` | PHPUnit 引导脚本(已存在,独立维护)。连接覆盖逻辑与本脚本完全一致,二者必须保持同步——否则 PHPUnit 跑的测试库与本脚本初始化的不是同一个。 |
|
||||
@@ -61,10 +62,12 @@ ulthon 的建表有**两个独立的来源**,二者不能互相替代:
|
||||
- **只跑 `scheme:sync`**:得到业务表,但没有系统表,框架无法登录、无法鉴权。
|
||||
- **必须两个都跑**,业务表通常引用系统表(如外键关联 `system_admin`)。
|
||||
|
||||
`seed:run` 负责最小参考数据(超级管理员、权限节点、系统设置、菜单、快捷入口等),由
|
||||
`database/seeds/InitBaseAdminData.php` 提供,自带 install-lock,重复执行安全跳过。
|
||||
初始数据不再走 seed:`migrate:run` 建表的同时由数据迁移(`20260909130000_system_init_data.php`)
|
||||
写入全部初始数据(超级管理员、角色、系统配置、快捷入口、商城演示、菜单等),数据源自
|
||||
`extend/base/admin/service/adminInitData/` 快照。seed 机制已退役,`seed:run` 为空操作,
|
||||
仅保留给下游业务项目放自己的种子。
|
||||
|
||||
本脚本在**同一进程**内依次调用这三条命令(见下节),确保它们都指向测试库。
|
||||
本脚本在**同一进程**内依次调用这两条命令(见下节),确保它们都指向测试库。
|
||||
|
||||
## 技术细节:为什么用 config 级覆盖,而不是环境变量
|
||||
|
||||
@@ -79,7 +82,7 @@ ThinkPHP 的 `Env` 组件加载 `.env` 文件,且 **`.env` 的值优先于 OS
|
||||
|
||||
**唯一可靠**的覆盖点是 **config 级**:在 `App::initialize()` 之后,直接改写
|
||||
`config/database.php` 解析出的连接配置数组。因为 `Db` facade 运行时读 config,
|
||||
config 被改写后,后续所有 DB 操作(包括 `migrate:run` / `scheme:sync` / `seed:run`
|
||||
config 被改写后,后续所有 DB 操作(包括 `migrate:run` / `scheme:sync`
|
||||
内部)都连到测试库。
|
||||
|
||||
`setup_test_db.php` 的核心步骤:
|
||||
@@ -122,7 +125,6 @@ if (stripos(\think\facade\Config::get('database.connections.main.database'), 'te
|
||||
// 同进程内调用 think 命令,config 覆盖对它们同样生效
|
||||
\think\facade\Console::call('migrate:run', ['--force-force']);
|
||||
\think\facade\Console::call('scheme:sync', ['--force-force']); // --force-force 跳过交互确认
|
||||
\think\facade\Console::call('seed:run', ['--force-force']);
|
||||
```
|
||||
|
||||
### 关于 `--force-force`(`-ff`)
|
||||
@@ -131,7 +133,7 @@ if (stripos(\think\facade\Config::get('database.connections.main.database'), 'te
|
||||
数据库吗?")。非 TTY 环境(脚本、CI)下 `think\console\Output::confirm` 会抛
|
||||
"Aborted" 而失败。框架提供了全局 `--force-force` / `-ff` 选项(见
|
||||
`extend/base/common/provider/ConsoleBase.php`、`extend/base/common/console/OutputBase.php`),
|
||||
命中时 `confirm()` 直接返回默认值,跳过所有交互确认。本脚本对三条命令统一带上该参数,
|
||||
命中时 `confirm()` 直接返回默认值,跳过所有交互确认。本脚本对两条命令统一带上该参数,
|
||||
保证非交互可运行、可重跑。
|
||||
|
||||
### 关于默认连接名 `main`
|
||||
@@ -144,9 +146,8 @@ if (stripos(\think\facade\Config::get('database.connections.main.database'), 'te
|
||||
|
||||
脚本可安全重复执行:
|
||||
|
||||
- `migrate:run`:已执行的迁移记录在 `ul_migrations`(phinxlog),二次运行直接 "All Done" 无操作。
|
||||
- `migrate:run`:已执行的迁移记录在 `ul_migrations`(phinxlog),二次运行直接 "All Done" 无操作(初始数据由迁移交付,同样只执行一次且幂等)。
|
||||
- `scheme:sync`:无差异时打印 "未检测到 Scheme 变更";有差异时先备份原表(`ul_backup_<时间戳>_<表名>`)再改,不报错。
|
||||
- `seed:run`:`InitBaseAdminData` 自带 install-lock(`base_admin_install` 配置项),二次运行打印 "系统已初始化,跳过当前程序"。
|
||||
- `CREATE DATABASE IF NOT EXISTS`:库已存在时无操作。
|
||||
|
||||
> 注:`scheme:sync` 每次遇到差异都会生成 `ul_backup_*` 备份表,这是框架的设计行为
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
* - 不 require 全局 common.php(App::initialize() + autoload 已够引导 facade,
|
||||
* helper.php 全局函数测试基建用不到)
|
||||
* - 不开事务(事务隔离由 TestCaseBase.setUp 负责)
|
||||
* - 不跑 migrate/scheme/seed(由独立的 setup 脚本负责)
|
||||
* - 不跑 migrate/scheme(由独立的 setup 脚本负责)
|
||||
* - 不销毁容器(容器跨测试复用,tearDown 只回滚事务)
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
/**
|
||||
* 测试数据库初始化脚本(参数化版).
|
||||
*
|
||||
* 在与 .env 同实例的 MySQL 上建出 ulthon_admin_test 库,并初始化全部表:
|
||||
* 1. migrate:run 建系统/框架表(database/migrations/,如 ul_system_admin / ul_system_menu)
|
||||
* 在与 .env 同实例的 MySQL 上建出 ulthon_admin_test 库,并初始化全部表与初始数据:
|
||||
* 1. migrate:run 建系统/框架表(database/migrations/,如 ul_system_admin / ul_system_menu),
|
||||
* 并写入全部初始数据(超管、配置、菜单等,数据迁移随迁移一同执行)
|
||||
* 2. scheme:sync 建业务表(app/admin/scheme/)
|
||||
* 3. seed:run 插入最小参考数据(database/seeds/InitBaseAdminData)
|
||||
*
|
||||
* 与 wkbox 衍生项目的区别:
|
||||
* - 完全参数化:连接参数(hostname/hostport/username/password/charset/prefix/database)
|
||||
@@ -19,7 +19,7 @@
|
||||
* 都无法覆盖已存在的 .env 键,唯一可靠覆盖点是 config 级。
|
||||
* - think\Config::set 的第二参数只支持单段一级名,不能传 'database.connections.main'。
|
||||
*
|
||||
* 幂等:migrate:run / scheme:sync / seed:run 均可安全重复执行(详见 README)。
|
||||
* 幂等:migrate:run / scheme:sync 均可安全重复执行(详见 README)。
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
@@ -135,12 +135,10 @@ if (!is_string($resolvedDb) || stripos($resolvedDb, 'test') === false) {
|
||||
// scheme:sync 在非 TTY 下不带它会被 parent::confirm 抛 "Aborted"。
|
||||
// ----------------------------------------------------------------------------
|
||||
$commands = [
|
||||
// 系统/框架表(Phinx 迁移):ul_system_admin / ul_system_menu / ul_system_auth_node / ul_system_config / ...
|
||||
['migrate:run', '系统/框架表(database/migrations/)'],
|
||||
// 系统/框架表 + 全部初始数据(Phinx 迁移):ul_system_admin / ul_system_menu / ul_system_config / ...
|
||||
['migrate:run', '系统/框架表 + 初始数据(database/migrations/)'],
|
||||
// 业务表(Scheme 同步):app/admin/scheme/ 下声明的表
|
||||
['scheme:sync', '业务表(app/admin/scheme/)'],
|
||||
// 参考数据(seed):InitBaseAdminData,自带 install-lock 跳过,可安全重跑
|
||||
['seed:run', '参考数据(database/seeds/)'],
|
||||
];
|
||||
|
||||
$handleProp = (new \ReflectionProperty(\think\console\Output::class, 'handle'));
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
(e.g. ulthon_admin -> ulthon_admin_test)
|
||||
3. CREATE DATABASE IF NOT EXISTS on the same MySQL instance (no Docker)
|
||||
4. config-level override connections.main -> test DB
|
||||
5. php think migrate:run -> system/framework tables (database/migrations/)
|
||||
5. php think migrate:run -> system/framework tables + all initial data
|
||||
(database/migrations/)
|
||||
6. php think scheme:sync -> business tables (app/admin/scheme/)
|
||||
7. php think seed:run -> reference data (database/seeds/)
|
||||
8. queries information_schema to verify the tables landed in the test DB
|
||||
7. queries information_schema to verify the tables landed in the test DB
|
||||
|
||||
Fully parameterized: no hardcoded host/port/credentials. The MySQL instance
|
||||
is whatever .env points at (typically a single local MySQL).
|
||||
|
||||
@@ -6,10 +6,9 @@
|
||||
# 2. 派生测试库名 = {env.database} + '_test'(如 ulthon_admin -> ulthon_admin_test)
|
||||
# 3. 在同一 MySQL 实例上 CREATE DATABASE IF NOT EXISTS(无需专用 Docker 容器)
|
||||
# 4. config 级覆盖 connections.main 指向测试库
|
||||
# 5. php think migrate:run 建系统/框架表(database/migrations/)
|
||||
# 5. php think migrate:run 建系统/框架表 + 全部初始数据(database/migrations/)
|
||||
# 6. php think scheme:sync 建业务表(app/admin/scheme/)
|
||||
# 7. php think seed:run 插参考数据(database/seeds/)
|
||||
# 8. 查 information_schema 验证表已落到测试库
|
||||
# 7. 查 information_schema 验证表已落到测试库
|
||||
#
|
||||
# 完全参数化:不硬编码 host/port/credentials。MySQL 实例 = .env 指向的那个。
|
||||
# 详见 tests/README.md。
|
||||
|
||||
Reference in New Issue
Block a user