From dd6063ebdc4e07eee1db72a47e5a0e244efee707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=B6=E8=AE=AD?= Date: Fri, 31 Jul 2026 18:21:59 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=84=E5=88=92=20MyBatis=20=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E5=B8=83=E5=B1=80=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plans/2026-07-31-mybatis-output-layout.md | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 docs/superpowers/plans/2026-07-31-mybatis-output-layout.md diff --git a/docs/superpowers/plans/2026-07-31-mybatis-output-layout.md b/docs/superpowers/plans/2026-07-31-mybatis-output-layout.md new file mode 100644 index 0000000..3d4a932 --- /dev/null +++ b/docs/superpowers/plans/2026-07-31-mybatis-output-layout.md @@ -0,0 +1,111 @@ +# MyBatis Output Layout Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** 通过项目根目录推导 MyBatis 生成目录,并提供生成前风险摘要与生成后文件差异。 + +**Architecture:** `OutputLayoutPolicy` 只负责纯路径推导;`GenerationPlanner` 负责目录状态与已有文件统计;`OutputSnapshot` 负责前后文件差异;`GenerateArtifactsUseCase` 编排计划、快照和网关执行。JavaFX Window 只绑定根目录、自定义开关、摘要和结果。 + +**Tech Stack:** Java 17、Java NIO、JavaFX、JUnit 5、Maven + +## Global Constraints + +- 默认 Model/Mapper 为 `/src/main/java`,XML 为 `/src/main/resources`。 +- 不改变 `MyBatisGeneratorService` 的覆盖行为。 +- 不连接数据库或在 UI 验收中执行生成。 +- Git 评审不参与修改。 +- 所有新增领域对象不可变且不依赖 JavaFX。 + +--- + +### Task 1: 输出布局策略 + +**Files:** +- Create: `src/main/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayout.java` +- Create: `src/main/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicy.java` +- Test: `src/test/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicyTest.java` + +**Interfaces:** +- Produces: `OutputLayout derive(Path projectRoot)`、`OutputLayout custom(Path root, Path model, Path xml, Path mapper)` + +- [ ] 写测试:标准推导返回规范化绝对路径,空值和普通文件被拒绝,自定义目录保持明确映射。 +- [ ] 运行 `-Dtest=OutputLayoutPolicyTest` 并确认因类型不存在而失败。 +- [ ] 实现不可变 record 和无状态策略。 +- [ ] 重跑测试并确认通过。 + +### Task 2: 生成前风险计划 + +**Files:** +- Create: `src/main/java/com/example/workutils/biz/mybatisgenerator/application/DirectoryRisk.java` +- Create: `src/main/java/com/example/workutils/biz/mybatisgenerator/application/GenerationPlan.java` +- Create: `src/main/java/com/example/workutils/biz/mybatisgenerator/application/GenerationPlanner.java` +- Test: `src/test/java/com/example/workutils/biz/mybatisgenerator/application/GenerationPlannerTest.java` + +**Interfaces:** +- Consumes: `OutputLayout`、表名列表 +- Produces: `GenerationPlan plan(List tables, OutputLayout layout)` + +- [ ] 写测试:待创建目录、可写目录、已有 Java/XML 文件数及不可写目录验证。 +- [ ] 运行测试并确认失败。 +- [ ] 用 `Files.walk` 实现扩展名计数,去重相同的 Java 输出根目录。 +- [ ] 重跑测试并确认通过。 + +### Task 3: 输出文件快照与结果 + +**Files:** +- Create: `src/main/java/com/example/workutils/biz/mybatisgenerator/application/OutputSnapshot.java` +- Create: `src/main/java/com/example/workutils/biz/mybatisgenerator/application/GenerationResult.java` +- Test: `src/test/java/com/example/workutils/biz/mybatisgenerator/application/OutputSnapshotTest.java` + +**Interfaces:** +- Produces: `OutputSnapshot capture(OutputLayout layout)`、`GenerationResult compare(OutputSnapshot after, String message)` + +- [ ] 写测试:区分新增、更新和未变化文件,并保留 warning 与原始消息。 +- [ ] 运行测试并确认失败。 +- [ ] 以路径、大小、最后修改时间保存不可变指纹并实现差异比较。 +- [ ] 重跑测试并确认通过。 + +### Task 4: 生成用例编排 + +**Files:** +- Modify: `src/main/java/com/example/workutils/biz/mybatisgenerator/application/GenerateArtifactsRequest.java` +- Modify: `src/main/java/com/example/workutils/biz/mybatisgenerator/application/GenerateArtifactsUseCase.java` +- Modify: `src/test/java/com/example/workutils/biz/mybatisgenerator/application/GeneratorRequestTest.java` +- Modify: `src/test/java/com/example/workutils/biz/mybatisgenerator/application/GeneratorUseCaseTest.java` + +**Interfaces:** +- Request consumes: `List tables, OutputLayout layout` +- UseCase produces: `GenerationResult execute(GenerateArtifactsRequest request)` + +- [ ] 先更新测试,要求网关接收布局目录且用例返回文件差异。 +- [ ] 运行两组测试并确认旧接口导致失败。 +- [ ] 最小修改请求与用例,执行前后快照,网关仍接收三个字符串目录。 +- [ ] 重跑测试并确认通过。 + +### Task 5: JavaFX 表单与结果反馈 + +**Files:** +- Modify: `src/main/java/com/example/workutils/biz/mybatisgenerator/MyBatisGeneratorWindow.java` +- Create: `src/test/java/com/example/workutils/biz/mybatisgenerator/MyBatisGeneratorWindowArchitectureTest.java` + +**Interfaces:** +- Consumes: `OutputLayoutPolicy`、`GenerationPlanner`、`GenerationResult` +- Produces: 根目录输入、只读派生目录、自定义开关、生成前摘要和结构化结果文本 + +- [ ] 写源码结构测试:一个根目录字段、一个自定义开关、三字段只读切换、Window 不调用 `Files.walk`。 +- [ ] 运行测试并确认失败。 +- [ ] 改造目录区域,根目录变化时刷新预览;自定义模式才允许编辑。 +- [ ] 生成前显示确认摘要;确认后提交请求;完成后显示新增/更新/未变化文件。 +- [ ] 重置恢复标准推导模式。 +- [ ] 重跑窗口结构测试和 MyBatis generator 全部测试。 + +### Task 6: 完整验证 + +**Files:** +- Verify only + +- [ ] 运行 `\.\mvnw.cmd -q test`。 +- [ ] 运行 `\.\mvnw.cmd -q -DskipTests compile`。 +- [ ] 运行 `git diff --check`。 +- [ ] 启动应用做只读 UI 验收,不查询数据库、不生成文件。 +- [ ] 提交 P0 重构。