diff --git a/AGENTS.md b/AGENTS.md index 17b1191..3dfa64e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -115,7 +115,7 @@ docs/ PRD / 技术架构 / 立项建议 / 工程规范 | 构建 | `pnpm build` | | 质量 | `pnpm lint` · `pnpm lint:fix` · `pnpm format` · `pnpm format:check` · `pnpm typecheck` | | 测试 | `pnpm test` · `pnpm test:int` · `pnpm test:e2e` · `pnpm ci:local` | -| 数据库 | `pnpm db:migrate` · `pnpm db:reset`(禁止手工删库 / 删数据卷) | +| 数据库 | `pnpm db:init`(迁移 + 幂等种子,不重置数据)· `pnpm db:migrate` · `pnpm db:reset`(清库重建,慎用;禁止手工删库 / 删数据卷) | | 契约 | `pnpm openapi:diff` | > 文档、脚本、CI 中出现的命令必须与上表一致,禁止自造别名。 diff --git a/README.md b/README.md index 02bd449..fe27580 100644 --- a/README.md +++ b/README.md @@ -77,11 +77,14 @@ docs/ PRD / 技术架构 / 开发计划 / 立项建议 / 工程规范 cp .env.example .env.local cp .env.local .env # Prisma CLI 只读取 .env(两者均已 gitignore) pnpm check:dev # 检查本机 PostgreSQL / Redis 是否可用 -pnpm db:migrate # 首次建表;后续由 Prisma 迁移管理 -pnpm db:seed # 幂等写入 system_configs 基线 +pnpm db:init # 首次/迁移后:应用已有迁移 + 幂等种子(不重置数据、不改已有密码) pnpm dev # 并行启动 api(3000) / web(5173) / worker ``` +> **日常启动不需要执行任何数据库命令**。`pnpm dev` / `./dev.sh` 都不会迁移、播种或重置数据库,已有账号密码保持不变。 +> **只有需要清空本地库时才用 `pnpm db:reset`**:它会执行 `prisma migrate reset --force`,重建全部表并重新 seed,admin 等种子账号会回到初始密码 `lingxi2026` 且 `must_change_password=true`(这是“清库”的预期结果,不是启动行为)。 +> 生产环境部署只用 `prisma migrate deploy`(`db:init` 的第一步),**不执行 seed / reset**;用户密码不会因重启或发布被重置。 + 也可以使用一键脚本(自动检测并释放端口、带健康检查,启动后默认跟随日志): ```bash diff --git a/dev.sh b/dev.sh index 04596e0..da02abb 100755 --- a/dev.sh +++ b/dev.sh @@ -8,6 +8,7 @@ # 特性: # · 启动前自动检测端口占用,占用则结束对应进程(可用 --no-kill 改为直接失败) # · 后台启动 + 健康检查,返回后可用 logs/status/stop 管理 +# · 不执行任何数据库迁移 / 种子 / 重置;已有账号密码不会被本脚本改动 # · 停止时按进程组结束,并兜底清理端口,避免遗留孤儿进程 # · api(3000) / web(5173) / worker(无端口) # @@ -71,6 +72,9 @@ usage() { cat <<'EOF_USAGE' 灵犀 · 开发机服务启动脚本(不启动 DB / Redis 容器) +说明:本脚本只启停 api / web / worker,不执行迁移、seed 或 db:reset; + 已有账号密码不会被改动。需要清库请显式运行 pnpm db:reset。 + 用法: ./dev.sh 启动服务并前台跟随运行日志(Ctrl+C 停止全部) ./dev.sh start 同上 diff --git a/docs/开发计划/灵犀_A1身份认证与用户管理_实施报告_V0.1.md b/docs/开发计划/灵犀_A1身份认证与用户管理_实施报告_V0.1.md index ac6ec9b..64e9888 100644 --- a/docs/开发计划/灵犀_A1身份认证与用户管理_实施报告_V0.1.md +++ b/docs/开发计划/灵犀_A1身份认证与用户管理_实施报告_V0.1.md @@ -86,13 +86,15 @@ ```bash pnpm check:dev # 确认 PG 5432 / Redis 6379 -pnpm db:reset # 迁移 + 种子(admin / lingxi2026,首次登录须改密) -pnpm dev # API :3000 + Web :5173 +pnpm db:init # 首次/迁移后:migrate deploy + 幂等种子(不重置数据、不改已有密码) +pnpm dev # API :3000 + Web :5173(日常启动不需要任何 DB 命令) # 浏览器打开 http://127.0.0.1:5173/login ``` 种子账号:`admin`(超级管理员);示例成员 `chen.mo` / `lin.qing` / `zhou.an` / `zhao.yinuo` / `gao.cen` / `su.he` / `shen.zhiyuan` / `jiang.lan`;停用示例 `tang.jia` / `he.an`。初始密码统一 `lingxi2026`,首次登录强制修改。 +> 只有需要清空本地库时才执行 `pnpm db:reset`(会重建并恢复种子密码);`./dev.sh` / `pnpm dev` / `pnpm db:init` 不会重置已有账号密码。 + --- ## 5 已知差异与遗留 diff --git a/docs/开发计划/灵犀_A2角色权限与数据范围_实施报告_V0.1.md b/docs/开发计划/灵犀_A2角色权限与数据范围_实施报告_V0.1.md index 606f2ab..6e7ff95 100644 --- a/docs/开发计划/灵犀_A2角色权限与数据范围_实施报告_V0.1.md +++ b/docs/开发计划/灵犀_A2角色权限与数据范围_实施报告_V0.1.md @@ -87,12 +87,14 @@ A2-QA-01 覆盖:6 个角色端点权限三态(200/201/204 vs 403 `40301`) ```bash pnpm check:dev # 确认 PG 5432 / Redis 6379 -pnpm db:reset # 迁移 + 种子(admin / lingxi2026,首次登录须改密) -pnpm dev # API :3000 + Web :5173 +pnpm db:init # 首次/迁移后:migrate deploy + 幂等种子(不重置数据、不改已有密码) +pnpm dev # API :3000 + Web :5173(日常启动不需要任何 DB 命令) # 浏览器打开 http://127.0.0.1:5173/login → 管理中心 / 角色权限 ``` -种子账号:`admin` 超管、`jiang.lan` 平台管理员等 11 个账号;初始密码 `lingxi2026`,首次登录强制修改。 +种子账号:`admin` 超管、`jiang.lan` 平台管理员等 11 个账号;初始密码 `lingxi2026`,首次登录强制修改(仅 `must_change_password=true` 时;改完即持久为 false)。 + +> 只有需要清空本地库时才执行 `pnpm db:reset`:它会 `migrate reset --force` 并重新 seed,admin 回到 `lingxi2026` + 首登改密标记。`./dev.sh` / `pnpm dev` / `pnpm db:init` 都不会重置账号密码。生产部署只执行 `prisma migrate deploy`,不执行 seed / reset。 --- diff --git a/package.json b/package.json index 4eb57f5..5b6b949 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "ci:local": "node scripts/ci-local.mjs", "db:generate": "prisma generate", "db:migrate": "prisma migrate dev", + "db:init": "prisma migrate deploy && pnpm db:seed", "db:reset": "prisma migrate reset --force", "db:seed": "tsx prisma/seed.ts", "openapi:export": "tsx --tsconfig apps/api/tsconfig.json apps/api/src/scripts/export-openapi.ts && openapi-typescript openapi/lingxi.openapi.json -o apps/web/src/api/generated/openapi.d.ts && prettier --write apps/web/src/api/generated/openapi.d.ts", diff --git a/prisma/SEED.md b/prisma/SEED.md index f1d5eef..950b22d 100644 --- a/prisma/SEED.md +++ b/prisma/SEED.md @@ -37,11 +37,15 @@ A0 只 seed「已建表」的 `system_configs`;A1 补齐组织、账号与角 ## 使用 ```bash -pnpm db:migrate # 应用 a2_role_permissions_data_scopes 迁移(expand:permissions / data_scopes 两张新表) -pnpm db:seed # 幂等写入上述种子(可重复执行;空库与存量库均已验证) -# 本地重置:pnpm db:reset(会重新执行全部迁移与 seed) +pnpm db:init # 推荐:migrate deploy + 幂等 seed(不重置数据、不覆盖已有密码) +pnpm db:migrate # 开发期新增迁移时使用(prisma migrate dev) +pnpm db:seed # 只跑种子;幂等,不覆盖已有密码 +# 本地清库:pnpm db:reset(会重建全部表并重新 seed,账号回到初始密码 + 首登改密标记) ``` +> **密码何时会被重置**:只有执行 `db:reset` / `prisma migrate reset` / 手工删库或重建 PG 数据卷时,种子账号才会回到 `lingxi2026` 且 `must_change_password=true`。 +> `dev.sh`、`pnpm dev`、`pnpm db:init`、`pnpm db:seed` 都不会覆盖已有用户密码;`must_change_password` 在用户成功改密后写为 `false`,之后登录不再要求改密。 + ## 与 A1 / A2 遗留的关系 - A1 记录的角色 / 用户种子已延续;A2 在其上补齐权限点目录、特殊权限口径(默认关闭、显式授予)与六类数据范围。