背景:开发机每次重启后被反馈需要重新用默认密码登录并强改,排查确认仓库启动链路(dev.sh / pnpm dev / API / worker / db:seed)均不重置密码;只有 db:reset / migrate reset / 重建数据卷会恢复种子密码。A2 收尾时为干净截图执行过 db:reset,是最近一次重置的直接原因。 改动: - 新增 pnpm db:init = prisma migrate deploy + 幂等 seed,作为首次/迁移后的安全初始化;不重置数据、不覆盖已有密码。 - README / dev.sh / AGENTS 命令契约 / SEED.md / A1·A2 实施报告明确:日常启动不需要 DB 命令,db:reset 仅用于清库。 - 实测:对已改密的 admin 执行 db:init 后 password_hash 与 must_change_password 均未变化。 验证:pnpm format:check / pnpm lint 通过;db:init 实际执行通过。
This commit is contained in:
1 parent
7fb458f62f
commit
7824bc7b32
7 files changed
+27
-11
No files matched your search
@@ -115,7 +115,7 @@ docs/ PRD / 技术架构 / 立项建议 / 工程规范
|
|||||||
| 构建 | `pnpm build` |
|
| 构建 | `pnpm build` |
|
||||||
| 质量 | `pnpm lint` · `pnpm lint:fix` · `pnpm format` · `pnpm format:check` · `pnpm typecheck` |
|
| 质量 | `pnpm lint` · `pnpm lint:fix` · `pnpm format` · `pnpm format:check` · `pnpm typecheck` |
|
||||||
| 测试 | `pnpm test` · `pnpm test:int` · `pnpm test:e2e` · `pnpm ci:local` |
|
| 测试 | `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` |
|
| 契约 | `pnpm openapi:diff` |
|
||||||
|
|
||||||
> 文档、脚本、CI 中出现的命令必须与上表一致,禁止自造别名。
|
> 文档、脚本、CI 中出现的命令必须与上表一致,禁止自造别名。
|
||||||
|
|||||||
@@ -77,11 +77,14 @@ docs/ PRD / 技术架构 / 开发计划 / 立项建议 / 工程规范
|
|||||||
cp .env.example .env.local
|
cp .env.example .env.local
|
||||||
cp .env.local .env # Prisma CLI 只读取 .env(两者均已 gitignore)
|
cp .env.local .env # Prisma CLI 只读取 .env(两者均已 gitignore)
|
||||||
pnpm check:dev # 检查本机 PostgreSQL / Redis 是否可用
|
pnpm check:dev # 检查本机 PostgreSQL / Redis 是否可用
|
||||||
pnpm db:migrate # 首次建表;后续由 Prisma 迁移管理
|
pnpm db:init # 首次/迁移后:应用已有迁移 + 幂等种子(不重置数据、不改已有密码)
|
||||||
pnpm db:seed # 幂等写入 system_configs 基线
|
|
||||||
pnpm dev # 并行启动 api(3000) / web(5173) / worker
|
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
|
```bash
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
# 特性:
|
# 特性:
|
||||||
# · 启动前自动检测端口占用,占用则结束对应进程(可用 --no-kill 改为直接失败)
|
# · 启动前自动检测端口占用,占用则结束对应进程(可用 --no-kill 改为直接失败)
|
||||||
# · 后台启动 + 健康检查,返回后可用 logs/status/stop 管理
|
# · 后台启动 + 健康检查,返回后可用 logs/status/stop 管理
|
||||||
|
# · 不执行任何数据库迁移 / 种子 / 重置;已有账号密码不会被本脚本改动
|
||||||
# · 停止时按进程组结束,并兜底清理端口,避免遗留孤儿进程
|
# · 停止时按进程组结束,并兜底清理端口,避免遗留孤儿进程
|
||||||
# · api(3000) / web(5173) / worker(无端口)
|
# · api(3000) / web(5173) / worker(无端口)
|
||||||
#
|
#
|
||||||
@@ -71,6 +72,9 @@ usage() {
|
|||||||
cat <<'EOF_USAGE'
|
cat <<'EOF_USAGE'
|
||||||
灵犀 · 开发机服务启动脚本(不启动 DB / Redis 容器)
|
灵犀 · 开发机服务启动脚本(不启动 DB / Redis 容器)
|
||||||
|
|
||||||
|
说明:本脚本只启停 api / web / worker,不执行迁移、seed 或 db:reset;
|
||||||
|
已有账号密码不会被改动。需要清库请显式运行 pnpm db:reset。
|
||||||
|
|
||||||
用法:
|
用法:
|
||||||
./dev.sh 启动服务并前台跟随运行日志(Ctrl+C 停止全部)
|
./dev.sh 启动服务并前台跟随运行日志(Ctrl+C 停止全部)
|
||||||
./dev.sh start 同上
|
./dev.sh start 同上
|
||||||
|
|||||||
@@ -86,13 +86,15 @@
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm check:dev # 确认 PG 5432 / Redis 6379
|
pnpm check:dev # 确认 PG 5432 / Redis 6379
|
||||||
pnpm db:reset # 迁移 + 种子(admin / lingxi2026,首次登录须改密)
|
pnpm db:init # 首次/迁移后:migrate deploy + 幂等种子(不重置数据、不改已有密码)
|
||||||
pnpm dev # API :3000 + Web :5173
|
pnpm dev # API :3000 + Web :5173(日常启动不需要任何 DB 命令)
|
||||||
# 浏览器打开 http://127.0.0.1:5173/login
|
# 浏览器打开 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`,首次登录强制修改。
|
种子账号:`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 已知差异与遗留
|
## 5 已知差异与遗留
|
||||||
|
|||||||
@@ -87,12 +87,14 @@ A2-QA-01 覆盖:6 个角色端点权限三态(200/201/204 vs 403 `40301`)
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm check:dev # 确认 PG 5432 / Redis 6379
|
pnpm check:dev # 确认 PG 5432 / Redis 6379
|
||||||
pnpm db:reset # 迁移 + 种子(admin / lingxi2026,首次登录须改密)
|
pnpm db:init # 首次/迁移后:migrate deploy + 幂等种子(不重置数据、不改已有密码)
|
||||||
pnpm dev # API :3000 + Web :5173
|
pnpm dev # API :3000 + Web :5173(日常启动不需要任何 DB 命令)
|
||||||
# 浏览器打开 http://127.0.0.1:5173/login → 管理中心 / 角色权限
|
# 浏览器打开 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。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
"ci:local": "node scripts/ci-local.mjs",
|
"ci:local": "node scripts/ci-local.mjs",
|
||||||
"db:generate": "prisma generate",
|
"db:generate": "prisma generate",
|
||||||
"db:migrate": "prisma migrate dev",
|
"db:migrate": "prisma migrate dev",
|
||||||
|
"db:init": "prisma migrate deploy && pnpm db:seed",
|
||||||
"db:reset": "prisma migrate reset --force",
|
"db:reset": "prisma migrate reset --force",
|
||||||
"db:seed": "tsx prisma/seed.ts",
|
"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",
|
"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",
|
||||||
|
|||||||
+7
-3
@@ -37,11 +37,15 @@ A0 只 seed「已建表」的 `system_configs`;A1 补齐组织、账号与角
|
|||||||
## 使用
|
## 使用
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm db:migrate # 应用 a2_role_permissions_data_scopes 迁移(expand:permissions / data_scopes 两张新表)
|
pnpm db:init # 推荐:migrate deploy + 幂等 seed(不重置数据、不覆盖已有密码)
|
||||||
pnpm db:seed # 幂等写入上述种子(可重复执行;空库与存量库均已验证)
|
pnpm db:migrate # 开发期新增迁移时使用(prisma migrate dev)
|
||||||
# 本地重置:pnpm db:reset(会重新执行全部迁移与 seed)
|
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 遗留的关系
|
||||||
|
|
||||||
- A1 记录的角色 / 用户种子已延续;A2 在其上补齐权限点目录、特殊权限口径(默认关闭、显式授予)与六类数据范围。
|
- A1 记录的角色 / 用户种子已延续;A2 在其上补齐权限点目录、特殊权限口径(默认关闭、显式授予)与六类数据范围。
|
||||||
|
|||||||
Reference in new issue
Block a user