基础平台任务清单¶
状态:已批准技术设计,T001—T063 均已按证据逐条验证。后端完整 52 项、真实 Docker 栈浏览器完整 12 项通过;见 completion-report.md。新 GitLab 仓库、CI、文档站及公网发布仍属后续骨架交付。任务路径以 lab-edu/ 为根;编号只在本清单内使用。
[SPEC-KIT APPENDED 2026-10-29] 用户提供自有域名 lab-edu.team 后,依 ADR-004 将当前 Java 路径统一为 team/lab_edu;既有任务与验收要求不变,旧验证证据保留原包名,新命名另行 clean verify。
故事映射:US1=auth.US1 注册/登录闭环;US2=auth.US2 + admin.US2 账户生命周期;US3=auth.US3 本人改密;US4=admin.US1 只读后台;US5=admin.US3 角色与操作授权;US6=admin.US4 菜单展示。
共享鉴权、实体和权限目录是 Foundational,不把某个故事的 UI 当另一个故事的前提。各故事以受控测试数据独立验收;跨故事只扩展既有接口,不重构前序交付。一个逻辑 MR 可含多条相关任务,仍逐条验证和标记。
service 与策略适配任务的配套单元测试统一使用 core/src/test/java/ 下同包、同类名加 Test.java 的路径;它们作为跨文件 service 交付的一部分,不以集成测试替代。控制器契约输入可用同文件专用记录类型,避免引入清单外的大批 DTO 文件。T050 是账户管理与只读故事共用的资源页,T052 仅接入动作组件。
Phase 1:Setup¶
仅最初两条 [P] 无未完成依赖,位于不同文件;其余按依赖顺序。后续如并行重排,须在依赖完成后重新判断,不把静态 [P] 当绕过门槛许可。
- [X] T001 [P] 建立 core/pom.xml,锁 Boot/JDK,声明经批准的框架与测试依赖,配置 verify 门槛
- [X] T002 [P] 建立 web/package.json,锁已验证框架组合,定义 lint/typecheck/build/test 脚本并生成对应锁文件作为该构建配置的伴生产物
- [X] T003 建立 core/src/main/java/team/lab_edu/LabEduApplication.java,提供可启动上下文(depends on T001)
- [X] T004 建立 core/src/main/resources/application.yml,外部化数据源与 Cookie,关闭自动改表、启用迁移与会话配置(depends on T001)
- [X] T005 建立 web/next.config.ts,仅转发开发 API,不增加业务或身份逻辑(depends on T002)
- [X] T006 建立 core/src/test/java/team/lab_edu/AcceptanceSupport.java,读取独立测试库配置并隔离测试数据;配置缺失须明确失败而非跳过(depends on T003, T004)
门禁:core 测试上下文可编译,web 依赖安装无冲突;记录实际命令与退出码。设置失败停止,不能带病写业务。
Phase 2:Tests¶
测试来源为宪法 §5、auth FR-001—017、admin FR-001—016。此阶段先形成可编译的黑盒 HTTP/浏览器测试,不宣称执行了 TDD 红绿循环;相关实现后逐项运行。测试不依赖尚不存在的业务类,避免把缺类编译失败冒充行为失败。
- [X] T007 [US1] 编写 core/src/test/java/team/lab_edu/AuthenticationApiTest.java,覆盖注册、额外字段、并发唯一性、登录与失败暂停(depends on T006)
- [X] T008 编写 core/src/test/java/team/lab_edu/SessionPolicyTest.java,使用可控时钟覆盖双期限、自动请求不续期、撤权版本与待改密限制(depends on T006)
- [X] T009 [US2] 编写 core/src/test/java/team/lab_edu/UserManagementApiTest.java,覆盖独立操作许可、恢复密码、并发最后管理员和全部会话撤销(depends on T006)
- [X] T010 [US3] 编写 core/src/test/java/team/lab_edu/PasswordChangeApiTest.java,覆盖码点长度、多字节密码、错误原密码及改密撤销(depends on T006)
- [X] T011 [US4] 编写 core/src/test/java/team/lab_edu/AdminReadApiTest.java,覆盖 25 账户分页筛选、只读访问和无敏感字段(depends on T006)
- [X] T012 [US5] 编写 core/src/test/java/team/lab_edu/RoleManagementApiTest.java,覆盖完整赋权范围、角色并发分配/删除、版本冲突与默认角色保护(depends on T006)
- [X] T013 [US6] 编写 core/src/test/java/team/lab_edu/MenuManagementApiTest.java,覆盖已有菜单编辑、不可变映射及恢复导航(depends on T006)
门禁:测试编译通过;运行时未实现行为不得标为通过。后续服务任务必须包含框架策略的单元用例,集成测试不能替代宪法要求的单元测试;这些相关测试文件作为跨文件 service 任务的验证部分,不另拆加断言级任务。
Phase 3:Core / Foundational¶
- [X] T014 建立 core/src/main/resources/db/migration/V1__platform.sql,包含基础平台、框架 JDBC session schema 与治理种子;通过空库迁移及重复启动验证(depends on T004, T007, T008, T009, T010, T011, T012, T013)
- [X] T015 建立 core/src/main/java/team/lab_edu/access/Role.java,定义角色、内置标记与授权版本(depends on T014)
- [X] T016 建立 core/src/main/java/team/lab_edu/account/Account.java,定义单角色关系、账户与编辑/认证版本,不泄漏凭证(depends on T014, T015)
- [X] T017 建立 core/src/main/java/team/lab_edu/access/MenuItem.java,定义固定页面映射与可编辑展示属性(depends on T014)
- [X] T018 建立 core/src/main/java/team/lab_edu/account/AccountRepository.java,提供唯一性、版本与治理事务所需查询(depends on T015, T016)
- [X] T019 建立 core/src/main/java/team/lab_edu/access/RoleRepository.java,提供角色范围和包含禁用账户的关联检查(depends on T016, T018)
- [X] T020 建立 core/src/main/java/team/lab_edu/access/MenuRepository.java,读取已有菜单与展示版本(depends on T017)
- [X] T021 建立 core/src/main/java/team/lab_edu/access/PermissionCatalog.java,唯一维护契约目录、恢复集合与展示动作派生(depends on T016)
- [X] T022 实现 core/src/main/java/team/lab_edu/governance/GovernanceService.java 及其单元测试,封装统一锁顺序、当前操作者复核、完整目标范围与恢复不变量;service 可涉及配套事务查询文件(depends on T018, T019, T021)
- [X] T023 实现 core/src/main/java/team/lab_edu/security/LoginAttemptService.java 及其单元测试,原子计数已知/未知登录名、暂停边界和成功清零(depends on T018, T008)
- [X] T024 实现 core/src/main/java/team/lab_edu/security/SecurityConfig.java,框架认证/授权/CSRF、PBKDF2 和默认拒绝;关闭无关认证入口(depends on T021, T022, T023)
- [X] T025 实现 core/src/main/java/team/lab_edu/security/SessionPolicyFilter.java 及其单元测试,核实双期限、认证/授权版本、待改密限制和成功业务活动(depends on T024, T008)
- [X] T026 实现 core/src/main/java/team/lab_edu/security/SessionEndpoints.java,返回 CSRF 与本人身份派生许可,框架登录/退出返回契约结果;不另建会话存储(depends on T024, T025)
- [X] T027 实现 core/src/main/java/team/lab_edu/governance/BootstrapRunner.java,受控 secret 文件初始化首管理员,重复运行不覆盖;非 bootstrap 模式不开放初始化接口(depends on T022, T024, T014)
- [X] T028 实现 core/src/main/java/team/lab_edu/security/RestProblemAdvice.java,统一状态码与无敏感信息错误,no-store,原密码错误不误注销(depends on T024, T026)
共享层门禁:迁移、初始化、框架上下文和会话策略单元测试通过;缺少真实数据库时明确未验证,不以替代内存库结果放行并发保护。
Phase 3:Core / Stories¶
- [X] T029 [US1] 实现 core/src/main/java/team/lab_edu/account/RegistrationService.java 及单元测试,固定默认角色、严格输入、凭证编码与原子唯一性(depends on T018, T022, T024, T028)
- [X] T030 [US1] 实现 core/src/main/java/team/lab_edu/account/RegistrationController.java,契约 DTO 不接受额外提权字段,注册不登录(depends on T029)
- [X] T031 [US2] 实现 core/src/main/java/team/lab_edu/account/UserManagementService.java 及单元测试,独立启用/禁用/分配/重置、目标权限上界及版本撤销(depends on T022, T025, T028)
- [X] T032 [US2] 实现 core/src/main/java/team/lab_edu/account/UserManagementController.java,契约操作与可分配角色上下文,不提供管理员开户(depends on T031)
- [X] T033 [US3] 实现 core/src/main/java/team/lab_edu/account/PasswordService.java 及单元测试,原密码核实、Unicode 边界、新旧不同与全部会话失效(depends on T024, T025, T028)
- [X] T034 [US3] 实现 core/src/main/java/team/lab_edu/account/PasswordController.java,只操作本人,受限会话允许改密(depends on T033)
- [X] T035 [US4] 实现 core/src/main/java/team/lab_edu/account/AdminQueryService.java 及单元测试,固定分页、筛选、稳定次序与安全摘要(depends on T018, T021, T028)
- [X] T036 [US4] 实现 core/src/main/java/team/lab_edu/account/AdminQueryController.java,列表/详情分别核实查看许可,拒绝先于存在性泄漏(depends on T035)
- [X] T037 [US5] 实现 core/src/main/java/team/lab_edu/access/RoleManagementService.java 及单元测试,目录引用、完整范围、内置保护、角色删除/分配并发与版本撤权(depends on T019, T021, T022, T025, T028)
- [X] T038 [US5] 实现 core/src/main/java/team/lab_edu/access/RoleManagementController.java,角色 CRUD、配置上下文、权限目录与原子集合替换(depends on T037)
- [X] T039 [US6] 实现 core/src/main/java/team/lab_edu/access/NavigationService.java 及单元测试,已有项展示编辑、可见性与恢复导航(depends on T020, T021, T028)
- [X] T040 [US6] 实现 core/src/main/java/team/lab_edu/access/NavigationController.java,区分本人导航、全目录与展示写入许可(depends on T039)
每条 service 完成即运行本服务单元测试和对应 HTTP 测试,失败停止并保持任务未完成。整段门禁为 core mvn verify 与正式需求场景映射,不批量标记。
Phase 4:Integration / Web¶
- [X] T041 建立 web/src/providers/api-client.ts,凭证同源、内存 CSRF、错误/失效处理、no-store,敏感写入不自动重放(depends on T005, T026, T028)
- [X] T042 建立 web/src/providers/data-provider.ts,映射唯一契约的分页/总数与资源操作,不复制业务规则(depends on T041, T036, T038, T040)
- [X] T043 建立 web/src/providers/auth-provider.ts,连接框架登录/退出/本人身份/改密结果,身份失效清理缓存(depends on T041)
- [X] T044 建立 web/src/providers/access-control-provider.ts,只消费 core 的 access 派生结果,缺项拒绝,不写角色策略(depends on T043)
- [X] T045 建立 web/src/app/(protected)/layout.tsx,核实身份后展示资源导航、固定身份/退出;禁用资源轮询和自动重取(depends on T042, T043, T044)
- [X] T046 [US1] 建立 web/src/app/(public)/register/page.tsx,自助输入本人凭证,成功回登录,错误不泄漏内部信息(depends on T030, T041)
- [X] T047 [US1] 建立 web/src/app/(public)/login/page.tsx,框架表单编码、统一失败/暂停提示、成功后重新取 CSRF(depends on T026, T043)
- [X] T048 [US1] 建立 web/src/app/(protected)/page.tsx,本人身份首页和无管理许可状态,不加入实验业务入口(depends on T045)
- [X] T049 [US3] 建立 web/src/app/(protected)/change-password/page.tsx,普通/强制改密、成功重新登录、错误旧密码保留会话(depends on T034, T045)
- [X] T050 建立共享资源页 web/src/app/(protected)/admin/users/page.tsx,复用列表与详情、分页筛选及资源许可展示(depends on T036, T045)
- [X] T051 [US2] 建立 web/src/components/account-actions.tsx,分别启用/禁用/分配/重置,敏感结果一次显示(depends on T032, T045)
- [X] T052 [US2] 扩展 web/src/app/(protected)/admin/users/page.tsx 接入账户动作组件,保留原只读列表并按独立许可展示(depends on T050, T051)
- [X] T053 [US5] 建立 web/src/app/(protected)/admin/roles/page.tsx,角色创建/改名/删除/许可差异确认、关联数量与冲突处理(depends on T038, T045)
- [X] T054 [US5] 建立 web/src/app/(protected)/admin/permissions/page.tsx,查看固定许可及可授予标记,不自由新增(depends on T038, T045)
- [X] T055 [US6] 建立 web/src/app/(protected)/admin/menus/page.tsx,仅展示属性编辑、固定映射及恢复入口反馈(depends on T040, T045)
- [X] T056 [US1] 编写并运行 web/tests/authentication.spec.ts,验证真实注册/登录/刷新/退出、同浏览器标签页与未知退出结果(depends on T046, T047, T048, T049)
- [X] T057 [US2] 编写并运行 web/tests/account-lifecycle.spec.ts,验证真实账户操作许可、重置一次显示与两个独立上下文失效(depends on T052)
- [X] T058 [US4] 编写并运行 web/tests/admin-read.spec.ts,验证只读身份、分页筛选、无权直接访问与账户切换缓存清理(depends on T050)
- [X] T059 [US5] 编写并运行 web/tests/roles.spec.ts,验证角色编辑、无权赋权、权限变更后的真实会话失效(depends on T053, T054)
- [X] T060 [US6] 编写并运行 web/tests/menus.spec.ts,验证展示编辑不授予权限及恢复导航(depends on T055)
门禁:真实 core + PostgreSQL,web lint/typecheck/build 和上述浏览器场景均通过;不能用兼容实验的固定 provider 通过结果替代。
Phase 5:Polish(3 项)¶
- [X] T061 更新 docs/agents/platform-001/quickstart.md 的命令和预期结果为实际工程验证版本,保留执行证据与环境限制(depends on T056, T057, T058, T059, T060)
- [X] T062 编写 docs/agents/platform-001/completion-report.md,含任务完成、Spec 符合度、宪法符合度、测试覆盖四表,逐项区分未通过门槛(depends on T061)
- [X] T063 更新 docs/specs/roadmap.md 的阶段进度说明,仅按真实证据记完成;部署/文档站未完成不得标为整个 MVP 完成(depends on T062)
项目级 CI、Compose 一键启动与文档站发布依已批准路线图另立骨架交付 Spec/Plan,不塞进本任务清单的 Final Phase。它们没有因本设计包完成而自动完成。