主题
系统设置与平台运维 · 测试与验收文档
文档版本:1.00 | 最近核对日期:2026-10-14 Agent 验证结论:历史入口及最小权限检查的覆盖范围见正文;流程核心接口权限、缓存及任务运维动作等边界仍见正文的限制。
1. 范围
本批次覆盖系统用户、角色、菜单、部门、岗位、字典、参数、通知、对象存储、客户端,活动/操作/登录日志,以及在线用户、缓存、任务、AI、代码生成等实际菜单入口;BIM/GIS 页面和业务结论排除。
2. 真实页面和权限准备
管理员已打开上述实际菜单入口,未发现 404 或“页面不存在”;本次又从实际菜单链接冒烟核对 67 个非 BIM/GIS 唯一路由,均保持在对应本地页面地址。测试业主单位、覆盖性测试角色、最小权限只读角色、E2E 测试人员和岗位数据已按本批次建立/复用;角色菜单、按钮和工程数据范围配置已在页面回读。覆盖性测试角色用于覆盖入口,不代表最小权限角色;第3条按方案 B 接受其范围较宽的测试夹具风险,本轮不再扩展模块化权限矩阵。
| 验证项 | 结果 | 说明 |
|---|---|---|
| 用户/角色/菜单/组织/岗位入口 | 通过 | 页面实际加载;测试用户可检索,角色权限树可打开 |
| 按钮权限可见性 | 通过(代表性负向) | 最小权限角色仅保留公文台账查询;新增、修改、删除、导出按钮均未显示 |
| 菜单/路由权限负向 | 通过(代表性负向) | 最小权限账号直达系统用户管理、公文待办均被统一 404 拦截;允许的公文台账可进入 |
| 工程/数据范围 | 历史记录(角色数据范围机制已移除,不适用现行模型) | 2026-09-13 曾以“仅本人”角色数据范围做过代表性负向核验;该 @DataPermission 机制已于 2026-09-29 整体移除,SYS_ROLE.DATA_SCOPE 为遗留列、SYS_ROLE_DEPT 为 0 行,此条不作为当前权限模型的通过证据,现行数据范围由三轨 UserDataScopeHelper 授权承担 |
| 日志与监控入口 | 通过(入口/只读页面) | 活动、操作、登录日志及在线用户、缓存、代码生成等本地页面可达;未执行清理/重启/缓存删除 |
| 外部监控服务状态 | 受限 | 页面配置的 localhost:9090/admin/applications、localhost:8800/snail-job、localhost:8900/snail-ai 均实测连接被拒绝;对应嵌入页面无法完成真实运维/AI 链路 |
| 默认头像兜底 | 通过 | gender=0 使用男头像,gender=1 使用女头像,gender=2/空值/其他值使用原狮子头像;定向回归 userAvatar.spec.ts 为 2/2 |
| 岗位展示 | 已修复(展示层) | 根因为存量岗位 postName 的历史十六进制转义格式;用户新增/编辑岗位下拉、用户详情和个人中心统一通过 displayPostName 归一化显示,岗位 ID、提交值、权限关系和主数据不变;定向 4/4,当前前端全量 38/198 回归通过 |
| 流程任务接口权限 | 设计问题已确认 | E2E只读员 访问“全部待办”和系统用户列表均返回 403;但使用管理员可见的其他任务标识访问未标注显式权限的 getTask、currentTaskAllUser、getBackTaskNode 均返回 200 并带回任务/办理人/可退回节点信息;无效任务标识调用办理/退回/转办/终止接口进入业务层而非权限 403,详见本节第 5 项 |
3. 自动化与结论
本次头像规则变更后的前端全量 38 个测试文件、198 项通过,类型检查、lint、生产构建通过;系统模块既有测试 4 项通过;全仓显式开启测试的 Maven 回归成功。头像定向命令为 pnpm exec vitest run src/store/modules/userAvatar.spec.ts,全量命令为 pnpm exec vitest run。当前结论为“入口和代表性最小权限边界通过,高风险运维动作待专项”,未执行删除、清缓存、重启任务或其他不可逆操作。
3.1 默认头像内置端到端回归(2026-09-14)
通过内置浏览器完成真实登录、页面加载和退出登录链路,未创建、修改或删除业务数据。验证入口为 /system/user,头像通过页面 DOM 只读回读并结合截图确认:
| 场景 | 浏览器结果 | 回读证据 |
|---|---|---|
| 女性用户登录 | 通过 | 顶部 .user-avatar 加载 /src/assets/images/default-avatar-female.jpg,尺寸 768×768,页面以圆形头像展示 |
| 男性用户登录 | 通过 | 顶部 .user-avatar 加载 /src/assets/images/default-avatar-male.jpg,尺寸 768×768,页面以圆形头像展示 |
| 未知性别/空性别登录 | 浏览器条件待补 | 当前可直接复用的登录测试账号中未找到“未知/空性别且未设置头像”的账号;管理员使用自定义头像,不能代表兜底分支;userAvatar.spec.ts 已覆盖 gender=2、空值和其他值回退原狮子头像 |
因此,本轮内置浏览器 E2E 已确认男女默认头像的真实登录链路和页面展示;未知性别的选择逻辑已由定向自动化测试确认,浏览器实链待补充专用测试夹具后再验收,不以修改现有业务数据制造条件。
4. 最小权限真实页面证据
管理员建立 E2E只读验证角色-20260913,菜单树仅勾选“公文台账”,按钮权限仅保留“查询”,数据权限选择“仅本人”;随后建立测试单位下的 E2E只读员 并分配该角色和现有岗位。该账号用于代表性最小权限负向核验;覆盖性测试角色仍只承担全模块链路可达性验证。本轮按方案 B 保留现有测试夹具,不再为所有模块补建等价角色或扩展跨项目接口专项。该账号登录后:
- 公文台账可进入,只显示查询/重置,新增、导出等按钮隐藏;管理员创建的测试草稿不在列表中;
- 直达
/system/user和/business/document/todo均显示统一 404; - 首页“我管理的工程节点”为 0,未获得工程范围即不可见。
岗位名称展示已按方案 A 修复:历史转义文本只在前端展示层归一化,未修改岗位主数据;后续新建岗位应直接保存正常 UTF-8 名称。
本轮修复后的岗位弹窗未新增浏览器截图证据:内置浏览器原登录会话已过期,重新登录未完成;定向单测、前端全量测试、类型检查、lint 和生产构建均已通过,页面视觉结果待有效登录后补核。
5. 流程任务接口级权限边界证据
对 E2E只读员(仅公文台账查询、仅本人数据)执行了不产生业务写入的接口核对:登录和用户信息接口正常;/workflow/task/pageByTaskWait 只返回该账号自己的 0 条任务;无 workflow:task:list 权限的 /workflow/task/pageByAllTaskWait 返回 403;无系统用户查询权限的 /system/user/list 返回 403。随后以管理员可见的一条任务标识作为只读对照,调用未显式声明 @SaCheckPermission 的 /workflow/task/getTask/{taskId}、/workflow/task/currentTaskAllUser/{taskId} 和 /workflow/task/getBackTaskNode/{taskId}/{nodeCode},分别返回 200 和任务详情、1 名办理人、7 个可退回节点;getNextNodeList 也可被调用但本次任务返回 0 个下一节点。
该证据已纳入全局报告 DESIGN-E2E-003。本轮按方案 B 接受现状,不修改流程核心接口:列表接口的用户范围过滤有效,但任务详情/流程拓扑接口存在菜单/按钮权限之外的读取边界缺口;无效任务标识对办理、退回、转办、终止接口的探针均进入业务层并返回任务不存在等错误,没有产生写入,说明这些接口没有在控制器入口形成统一权限门禁。前端 buttonObj 仅控制按钮展示,不能替代后端鉴权;当前写操作的主要运行时约束仍是 Warm-Flow 的任务身份/归属校验和业务数据范围校验。有效任务的未授权写操作未用测试账号触发,因此不能把本次证据扩大解释为“已确认存在有效任务写越权”。如后续统一增加平台权限码,需另行确认授权模型并补做有效任务的负向回归。
6. 组织架构台账列精简与响应式验证(2026-10-14)
| 验证项 | 验证方式 | 结果 | 说明 |
|---|---|---|---|
| 表格字段精简 | 代码审查与静态检查 | 通过 | 组织架构表格中已移除统一社会信用代码、负责人、联系电话、邮箱 4 列,仅保留单位名称、组织类型、单位简称、组织架构编码、排序、创建时间、状态与操作列;弹窗表单中对应字段完整保留 |
| 1920×911 视口无横向滚动条 | 布局计算与静态校验 | 通过 | 基础列最小宽度总和为 1270px,远小于 1920 视口可用宽度(~1612px),单位名称、单位简称、组织架构编码自适应弹性伸展,消除横向滚动条 |
| 前端工程构建与代码检查 | oxlint / oxfmt / vite build | 通过 | oxlint 检查 0 warning 0 error;oxfmt 校验通过;vite build 编译通过 |
7. 公司下属合资公司与类型纠正(2026-10-14)
| 验证项 | 当前证据与状态 |
|---|---|
| 渝西快线存量记录 | 项目开发 MCP 回读:ID 2199000000000600042,父级 101,类型已为 joint_venture,祖级 0,100,101,无下级,有 1 条项目引用;无需类型迁移。真实页面保持原资料保存后回读确认 ID、父级、祖级、类型、排序、状态及项目引用不变,原空 relation_type 按既有派生规则补为 affiliated |
| 公司下允许合资公司及已有记录编辑 | SysDeptServiceImplTest 验证业主公司允许合资公司、参建公司及分公司不允许该下级。真实本地页面以管理员登录,筛选渝西快线公司,编辑弹窗显示分公司/合资公司/部门并正确选中合资公司;保持类型保存提示成功,重新打开仍选中合资公司。本轮未创建新的业务组织 |
| 已引用公司/分公司原位纠正为合资公司 | 定向服务用例通过,验证保存的 ID、父级、祖级不变及关系类型正确派生;不兼容下级拒绝且不执行写入。编辑与 Excel 覆盖导入复用同一守卫已独立核对调用链;真实 Excel 导入本轮未执行,不声称导入链路已通过 |
| 反向转换、移动、跨体系、根保护 | 组织服务负向用例通过:引用中的合资公司改分公司、公司改部门、类型纠正同时移动、跨体系转换、集团根改合资公司均拒绝且未写入。真实页面将渝西快线公司选为分公司保存,收到引用保护提示;重新选择合资公司可保存 |
| 共享业主单位调用方 | OrgRulesTest、BiddingBusinessRulesTest、UnitRefValidatorTest 共 15 用例通过,覆盖业主合资公司、经办部门子树、参建与容器拒绝。前端招投标归属及组织 ID 用例 2 文件共 19 用例通过,包括最近合资公司解析与字符串大 ID;改动的 7 个前端文件 lint/format 通过。最终全量 vue-tsc 未通过:当前工作区另一组工程数据授权改动在 api/business/engineering/dataScope.ts、views/business/engineering/data-scope/index.vue 共报告 12 个类型错误,本次修改文件未报告类型错误;不将早期通过结果作为当前全量通过证据。投资默认归属及安质环候选完成代码/契约核对,不以此声称其他业务全流程页面验收通过 |
最终后端定向回归为组织服务 11 用例与业务共享规则 15 用例,合计 26 用例,失败、错误、跳过均为 0;两次 Maven 均显式使用 -Dmaven.test.skip=false。本地前后端在本轮启动并加载修改后代码,实际组织编辑保存已验证;本轮技术验证不替代业务方验收。