This commit is contained in:
oneao committed 2026-10-17 17:17:39 +08:00
1 parent 025d3232c4
commit 1d7d75eeba
98 files changed
+4144 -12063

No files matched your search

+33 -16
View File
@@ -33,22 +33,36 @@ mvn "-Dspring-boot.run.jvmArguments=-Djava.security.properties=./config/legacy-t
## 开发期免登录(省掉每次填账号 + 拖滑块)
`web/.env.development` 里配好了测试账号,`pnpm dev` 打开页面**已是登录态**:
两条互补的路径,共用 `web/.env.development` 里的同一组 `VITE_DEV_*`:
| 场景 | 机制 |
|---|---|
| 打开任意非 `/login` 页面 | `web/src/dev/auto-login.ts` 自动登录,页面直接是登录态 |
| 打开 `/login`(或点了退出) | 登录页底部的「**一键登录**」按钮,一步进去 |
登录页的按钮只在 **DEV 且 `VITE_DEV_ORG`/`VITE_DEV_ACCOUNT` 配齐**时渲染(`devCred`),
调的是同一个 `loginApi`,因此同样不需要滑块验证码。
`web/.env.development` 里配好了测试账号:
| 变量 | 值 | 说明 |
|---|---|---|
| `VITE_DEV_AUTO_LOGIN` | `1` | 设为 `0` 关闭(例如要调登录页本身) |
| `VITE_DEV_AUTO_LOGIN` | `1` | 设为 `0` 关闭自动登录(例如要调登录页本身),**一键登录按钮不受它影响** |
| `VITE_DEV_ORG` | `G3HD` | 机构码,需对应 `server/config/dbconfigs/{机构码}.properties` |
| `VITE_DEV_ACCOUNT` | `demo_zhangwei` | 实测可登录,但**只有审批中心权限**(见下) |
| `VITE_DEV_PASSWORD` | `demo_zhangwei` | 演示账号密码=账号名 |
| `VITE_DEV_ACCOUNT` | `g3soft` | 前后端唯一超管,免查 `s_power`,能进全部页面 |
| `VITE_DEV_PASSWORD` | `g3soft` | 2026-10-14 实测有效 |
实现见 `web/src/dev/auto-login.ts`:调 `POST /api/auth/login` 拿 token 写进 store,
**只在 `import.meta.env.DEV` 下生效**,生产构建里被 tree-shake。
实现见 `web/src/dev/auto-login.ts`(自动登录)与 `web/src/dev/credentials.ts`(凭据读取,
两个消费方共用),**只在 `import.meta.env.DEV` 下生效**,生产构建里被 tree-shake。
滑块验证码是纯前端校验(不发请求),所以走接口登录不需要它。
覆盖面:入口是 `/login` 时不自动登录;已有 token 时不重复登录。
覆盖面:入口是 `/login` 时不自动登录(留给「一键登录」按钮);已有 token 时不重复登录。
个人覆盖用 `web/.env.development.local`(已被 gitignore,优先级更高)。
> ⚠️ `g3soft` 是超管,且 `VITE_DEV_ACCOUNT` 已默认改成它 —— 若有人在用同一个 `g3soft`
> 跑系统,你的 dev server 会把他踢下线(反之亦然)。需要并行时用
> `.env.development.local` 换回 `demo_zhangwei`(权限窄,只够进审批页)。
命令行取 token(例如要用 curl 直接打业务接口):
```bash
@@ -90,7 +104,8 @@ pnpm test:e2e:ui # 带 UI 的调试模式
重复登录会互踢(业务码 `40101`)。并发 worker 各登录一次就会互相把对方踢下线。
> 所以:**不要在用例里提交登录表单**。要测登录流程本身,得用一个专用账号,
> 并把 `VITE_DEV_AUTO_LOGIN` 设为 `0`(否则应用自己会先把你登录了)。
> 并把 `VITE_DEV_AUTO_LOGIN` 设为 `0`(否则应用自己会先把你登录了);
> 登录页那个「一键登录」按钮同样会真的登进去,测登录表单时别点它。
账号沿用 `web/.env.development` 的 `VITE_DEV_*`,可用 `E2E_ORG` / `E2E_ACCOUNT` / `E2E_PASSWORD`
覆盖;`E2E_BASE_URL` 换前端地址,`E2E_API_TARGET` 换后端地址,`E2E_CHANNEL=msedge|chrome`
@@ -99,8 +114,9 @@ pnpm test:e2e:ui # 带 UI 的调试模式
### 写用例时注意
- 落点别选 `/dashboard`:它**没有任何权限点**(`sql/20_registration/14_dashboard_menu.sql`
明确「不建权限点」),只有超管可见;默认账号 `demo_zhangwei` 进它会被守卫送到 `/403`。
`e2e/smoke.spec.ts` 用 `/approval/todo`,演示账号和超管都能进。
明确「不建权限点」),只有超管可见。默认走 `VITE_DEV_ACCOUNT=g3soft`(超管)时能进,
但**换个非超管账号(`E2E_ACCOUNT=demo_zhangwei`)就会被守卫送到 `/403`**。
`e2e/smoke.spec.ts` 用 `/approval/todo`,超管和演示账号都能进 —— 换账号也不会挂。
- 断言用 `toHaveURL(/\/approval\/todo$/)` 这种**正向**断言,别用 `not.toHaveURL(/\/login/)`:
`goto` 之后 URL 立刻就是目标值,否定断言会在重定向发生之前就通过,等于什么都没断言。
- dev server 是按需转译的,某页**第一次**访问要现编依赖图,实测 5-11s。
@@ -110,16 +126,17 @@ pnpm test:e2e:ui # 带 UI 的调试模式
| 账号 | 密码 | 权限 | 用途 |
|---|---|---|---|
| `g3soft` | `g3soft` | 前后端唯一超管,免查 `s_power`(`permission.ts:61`、`SqlPermissionService.ADMIN_ACCOUNT`) | **默认账号**,能进全部页面 |
| `demo_zhangwei` / `demo_liqiang` / `demo_wangfang` / `demo_liumin` | 同账号名 | 只授了 `menu.approval%` 与 `action.v_b_othercompany.%`(`sql/90_mock/02_*.sql:186`) | 已实测可登录;侧栏只有「审批中心」,其他页面会被守卫拦到 `/403` |
| `g3soft` | **未知** | 前后端唯一超管,免查 `s_power`(`permission.ts:61`、`SqlPermissionService.ADMIN_ACCOUNT`) | 测全部页面得用它 |
机构码统一 `G3HD`。
**`g3soft` 的密码待确认**:2026-10-14 实测 `G3HD/g3soft/空密码` 返回 `code=401`
(`AuthServiceTests` 里「超管空密码」是纯 mock,不代表 G3HD 库的真实数据)。
拿到真实密码后填进 `web/.env.development` 的 `VITE_DEV_PASSWORD` 即可——
**一次配置,不必每次查库**。另外 `g3soft` 在 `b_user` 里是否存在也需确认:
本仓库的 `sql/` 没有任何脚本创建它(只建 `demo_*`),假定它来自 G3HD 核心库。
**`g3soft` 的密码已确认**:2026-10-14 实测 `G3HD/g3soft/g3soft` 登录成功
(返回 `user.name = 超级管理员`);`/空密码` 返回 `code=401`。
已填进 `web/.env.development` 的 `VITE_DEV_PASSWORD` —— **不必再查库**。
> 需要**并行**时才换账号:`g3soft` 是超管且默认,你和别人共用它就会互相踢下线,
> 此时用 `web/.env.development.local` 换回 `demo_zhangwei`(记得它只有审批页权限)。
账号密码不用去查库。库里没有的账号靠 `sql/` 下的脚本建(执行顺序见 `sql/README.md`);
要给 `demo_*` 放开更多菜单,用 `sql/README.md` 里「可选:给普通账号授权」那段。