feat(m0): 后端骨架 + 账号体系(M0 验收 36/36 通过)
技术栈(已在 4.1.1 上实测跑通,非纸面选型)
Java 21 + Spring Boot 4.1.1 + MyBatis-Plus 3.5.17(boot4) + PostgreSQL 16.15
+ Redis 7 + Flyway 12.4 + springdoc 3.1.1;前端定 Vue 3 + Element Plus + uni-app
交付内容
M0-01 基础设施 deploy/docker-compose.yml(PG + Redis + MinIO,容器名与端口避让本机既有项目)
M0-02 后端骨架 xt-common + xt-server;统一响应 / 全局异常 / 58 个错误码 /
多租户拦截 / 软删除 / 字段自动填充 / AES-GCM / HMAC 索引 / RSA / JWT
M0-05 租户 开通租户(一次完成建租户 + 发 6 个内置角色 + 建首个管理员)、列表、详情
M0-06 组织 CRUD + 组织树 + ancestor_path 自动维护 + 占用校验
M0-07 PC 登录 RSA 解密 + 图形验证码 + 失败锁定 + 等时比较防账号枚举 + 审计日志
M0-08 登出/当前用户 Token 黑名单(存 SHA-256,TTL 到自然过期)
M0-01 数据库 Flyway 2 个迁移 → 26 张表(20 业务 + 5 标准 + 1 迁移记录)
安全姿态
· 租户拦截器【默认拒绝】:匿名请求触及租户表直接抛 40101,不做「不加条件放行」
· 权限码定义在代码里(PermissionDef / BuiltinRole),不建 sys_permission 表,杜绝前后端漂移
· 匿名接口只靠 @PublicApi 放行,不做路径白名单,避免两套机制各说各话
· 账号不存在时也跑一次 BCrypt(假哈希),拉平响应时间防枚举
· 登录密码 RSA 传输,防止网关/APM 把明文密码记进日志
脚本
scripts/sync-ddl.py 文档 DDL → Flyway 迁移,带 --check 防漂移
scripts/e2e-m0.py M0 验收 36 项,可进 CI
scripts/verify-docs.py 文档一致性(接口数【逐节】核对、错误码、跨文档数字、表格列数)
scripts/dev-login.py RSA 加密登录助手
scripts/dev-clean-e2e.py 清理 E2E 测试数据
文档修正(实测暴露,非人工审查)
· DDL 缺陷:sys_tenant.contact_phone / sys_user.phone / collect_roster.phone
原 varchar(20) 按明文长度建,装不下 AES-GCM 密文(约 52 字符),改 varchar(128)(PRD V2.4)
· 错误码 40007b/40007c 带字母后缀与「code 为数字」的约定冲突,规范化为 40071/40072
· 07-开发实施计划 新增 §9 版本兼容踩坑记录(10 条实录)与 §10 M0 完成情况
This commit is contained in:
+8
-3
@@ -289,9 +289,9 @@ with unzip(result.zip) as z:
|
||||
|
||||
| # | 场景 | 期望 |
|
||||
|:--:|---|---|
|
||||
| E1 | 门禁连错 11 次 | 第 11 次返回 `40007b`,提示稍后再试 |
|
||||
| E1 | 门禁连错 11 次 | 第 11 次返回 `40071`,提示稍后再试 |
|
||||
| E2 | 同一 IP 20 人同时门禁 | **全部通过**(NAT 不误伤) |
|
||||
| E3 | 并发 100 请求抢同一名册项 | **恰好 1 个成功**,99 个 `40007c` |
|
||||
| E3 | 并发 100 请求抢同一名册项 | **恰好 1 个成功**,99 个 `40072` |
|
||||
| E4 | 门禁失败后查库 | **无明文证件号**,只有 hash |
|
||||
| E5 | 学籍表 4 项材料证件号均与名册不符 | 标 `VAL-19` 疑似串档,**不自动改** |
|
||||
| E6 | 学生提交后撤回,再改再提交 | 正常;驳回次数不因撤回增加 |
|
||||
@@ -382,7 +382,7 @@ with unzip(result.zip) as z:
|
||||
| F-500-10 | 门禁限流 | openid 10 次/小时;IP 20 次/分钟 |
|
||||
| F-500-11 | **并发绑定** | 100 并发抢同一项,恰好 1 个成功 |
|
||||
| F-500-12 | 失败不留明文 | 查库确认只有 hash |
|
||||
| F-500-13 | 已绑定提示 | `40007c`,**这一条明确提示** |
|
||||
| F-500-13 | 已绑定提示 | `40072`,**这一条明确提示** |
|
||||
|
||||
### F-509 名单加入申请(客户确认新增)
|
||||
|
||||
@@ -608,3 +608,8 @@ with unzip(result.zip) as z:
|
||||
|---|---|---|
|
||||
| **V1.1** | **2026-09-28** | **客户确认后修订:修正「文件归属」设计缺陷**。原设计把"文件名姓名/证件号与名册不符"处理为"自动按名册修正"(信息级),**会把传错的文件静默洗白**。修正为:<br>① 新增 **7 条归属断言 G-14b~G-14h**(Golden 29 → **36**);② 判定优先级改为 **证件号反查名册 > OCR 内容 > 姓名(仅辅助)**;③ 新增 **VAL-21 文件归属校验(阻断,且无"仍然继续")**;④ **姓名不再作为独立规则**(客户确认);⑤ 新增 **7 条功能验收 F-600-14~20**(104 → **111**)与 **4 条异常边界 E24~E27**(23 → **27**)<br>**修订后总计:36 条断言 / 111 条功能验收 / 27 条异常边界 / 6 条视觉 / 9 项性能 / 12 项安全** |
|
||||
| V1.0 | 2026-09-28 | 首版。**29 条 Golden Assertions**(可直接写成自动化)、3 条端到端主流程(32 步)、23 条异常边界、**104 条功能验收项**(含 F-509 共 19 条)、6 条视觉验收、9 项性能、12 项安全;含里程碑签署表与 7 条 Go/No-Go 条件 |
|
||||
|
||||
---
|
||||
|
||||
> **实现说明(2026-09-28)**:本文件中的 `40007b` / `40007c` 已规范化为 **`40071`** / **`40072`**。
|
||||
> 原因:`code` 按 §1.3 约定是数字,带字母后缀会在 JSON 里变成字符串,破坏前端 `code === 0` 的判断。
|
||||
|
||||
Reference in New Issue
Block a user