Files
yidaima/RuoYi-Vue/docs/superpowers/plans/2026-06-26-database-generation-metadata-and-seed-data.md

193 lines
9.7 KiB
Markdown

# Database Generation Metadata And Seed Data 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:** Make generated database projects use auto-increment primary keys by default, separate UI field labels from database comments, generate Chinese dictionary options, and include 10 seed rows per generated business table.
**Architecture:** Add field-label and dictionary-option metadata to the database design DTO and persisted front-project column model, then thread that metadata through AI normalization, manual save/load, generation conversion, qing Vue templates, and schema SQL generation. Keep DDL comments sourced from `columnComment`; use `columnLabel` only for UI labels and generated sample text. Generate mock seed SQL on the backend from normalized table metadata so AI and manual database designs behave consistently.
**Tech Stack:** Java, Spring services, MyBatis mapper XML, Velocity templates, Vue single-file component source checks, JUnit 4, Mockito, Node test runner.
---
### Task 1: Metadata Persistence
**Files:**
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/domain/front/dto/DatabaseColumnDesign.java`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/domain/front/FrontProjectColumn.java`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java`
- Modify: `ruoyi-generator/src/main/resources/mapper/front/FrontProjectColumnMapper.xml`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/FrontProjectServiceImpl.java`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/AiGenerateServiceImpl.java`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/FrontProjectConverter.java`
- Modify: `sql/db.sql`
- Modify: `sql/front_workbench.sql`
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/FrontProjectServiceImplTest.java`
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/AiGenerateServiceImplTest.java`
- [ ] **Step 1: Write failing tests**
Add assertions that saved columns preserve `columnLabel` and `dictOptions`, and that AI-generated columns default `columnLabel` separately from `columnComment`.
- [ ] **Step 2: Run tests to verify failure**
Run: `mvn -q -pl ruoyi-generator -Dtest=FrontProjectServiceImplTest,AiGenerateServiceImplTest test`
Expected: compilation or assertion failure because metadata fields do not exist or are not persisted.
- [ ] **Step 3: Add metadata fields and persistence**
Add `columnLabel` and `dictOptions` string properties with getters/setters. Update mapper select/insert/update SQL and schema SQL with `column_label varchar(100)` and `dict_options text`. Copy these fields in service converter methods.
- [ ] **Step 4: Run tests to verify pass**
Run: `mvn -q -pl ruoyi-generator -Dtest=FrontProjectServiceImplTest,AiGenerateServiceImplTest test`
Expected: tests pass.
### Task 2: Primary Key Defaults And Admin Form Rendering
**Files:**
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/AiGenerateServiceImpl.java`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/FrontProjectServiceImpl.java`
- Modify: `ruoyi-generator/src/main/resources/qing/admin-index.vue.vm`
- Modify: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/FrontProjectServiceImplTest.java`
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/AiGenerateServiceImplTest.java`
- [ ] **Step 1: Write failing tests**
Add coverage that manual save without a primary key gets an `id` auto-increment column, and generated admin forms hide auto-increment fields on create while showing them disabled on edit.
- [ ] **Step 2: Run tests to verify failure**
Run: `mvn -q -pl ruoyi-generator -Dtest=FrontProjectServiceImplTest,AiGenerateServiceImplTest test`
Expected: manual missing-primary-key test fails under current validation, and template source check fails because admin template lacks `autoIncrementField`.
- [ ] **Step 3: Implement defaults and template guard**
Normalize every table before validation. Ensure the primary key is auto-increment integer-like, `isInsert=0`, `isEdit=0`, `isList=0`, `htmlType=input`. In `qing/admin-index.vue.vm`, use the same `v-if="form.<pk>"` and disabled rendering that the frontend template already uses.
- [ ] **Step 4: Run tests to verify pass**
Run: `mvn -q -pl ruoyi-generator -Dtest=FrontProjectServiceImplTest,AiGenerateServiceImplTest test`
Expected: tests pass.
### Task 3: Chinese Dictionary Options
**Files:**
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/AiGenerateServiceImpl.java`
- Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/DictOptionSupport.java`
- Modify: `ruoyi-generator/src/main/resources/qing/vue-dict.js.vm`
- Modify: `ruoyi-generator/src/main/resources/qing/index.vue.vm`
- Modify: `ruoyi-generator/src/main/resources/qing/admin-index.vue.vm`
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/AiGenerateServiceImplTest.java`
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/DictOptionSupportTest.java`
- [ ] **Step 1: Write failing tests**
Add tests that English dictionary values like `pending/approved/rejected` normalize to Chinese labels and values such as `待审核/已通过/已驳回`.
- [ ] **Step 2: Run tests to verify failure**
Run: `mvn -q -pl ruoyi-generator -Dtest=AiGenerateServiceImplTest,DictOptionSupportTest test`
Expected: tests fail because dictionary option support does not exist.
- [ ] **Step 3: Implement dictionary option normalization**
Represent options as JSON stored in `dictOptions`. Normalize common status, yes/no, gender, enabled/disabled, and publish states to Chinese values. Generate `vue-dict.js.vm` data from `column.dictOptions`, falling back to empty arrays for remote dictionaries.
- [ ] **Step 4: Run tests to verify pass**
Run: `mvn -q -pl ruoyi-generator -Dtest=AiGenerateServiceImplTest,DictOptionSupportTest test`
Expected: tests pass.
### Task 4: Mock Seed SQL
**Files:**
- Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/MockDataSqlBuilder.java`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/MysqlDdlBuilder.java`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/AiGenerateServiceImpl.java`
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/FrontProjectServiceImpl.java`
- Modify: `ruoyi-generator/src/main/resources/qing/sql.vm`
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/MockDataSqlBuilderTest.java`
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/AiGenerateServiceImplTest.java`
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/FrontProjectServiceImplTest.java`
- [ ] **Step 1: Write failing tests**
Add tests proving generated SQL includes exactly 10 insert values per business table, excludes auto-increment primary keys, and uses Chinese dictionary values when present.
- [ ] **Step 2: Run tests to verify failure**
Run: `mvn -q -pl ruoyi-generator -Dtest=MockDataSqlBuilderTest,AiGenerateServiceImplTest,FrontProjectServiceImplTest test`
Expected: tests fail because seed SQL is not generated.
- [ ] **Step 3: Implement seed SQL builder**
Generate deterministic values per column type: Chinese text for string fields, numbers for integer/decimal fields, `date`/`datetime` literals for temporal fields, dictionary option values for dictionary fields, and file/image placeholders for upload fields. Append seed SQL to `createTableSql` after DDL so `qing/sql.vm` emits both.
- [ ] **Step 4: Run tests to verify pass**
Run: `mvn -q -pl ruoyi-generator -Dtest=MockDataSqlBuilderTest,AiGenerateServiceImplTest,FrontProjectServiceImplTest test`
Expected: tests pass.
### Task 5: Frontend Editor And Template Source Checks
**Files:**
- Modify: `easycode-web/src/components/DatabaseDesigner.vue`
- Modify: `easycode-web/src/components/databaseDesigner.test.mjs`
- Modify: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/FrontProjectSchemaScriptTest.java`
- [ ] **Step 1: Write failing tests**
Add source checks that the database designer exposes `columnLabel` and `dictOptions`, and that schema scripts include the new metadata columns.
- [ ] **Step 2: Run tests to verify failure**
Run: `node --test easycode-web/src/components/databaseDesigner.test.mjs`
Run: `mvn -q -pl ruoyi-generator -Dtest=FrontProjectSchemaScriptTest test`
Expected: source checks fail before UI and schema updates.
- [ ] **Step 3: Update editor defaults**
Add display-name and dictionary-options inputs to the field table. Normalize `columnLabel` and `dictOptions`, and set primary-key defaults to non-insert/non-edit in newly added tables.
- [ ] **Step 4: Run focused tests**
Run: `node --test easycode-web/src/components/databaseDesigner.test.mjs`
Run: `mvn -q -pl ruoyi-generator -Dtest=FrontProjectSchemaScriptTest test`
Expected: tests pass.
### Task 6: Final Verification
**Files:**
- Run affected Java and Node tests.
- [ ] **Step 1: Run Java focused tests**
Run: `mvn -q -pl ruoyi-generator -Dtest=AiGenerateServiceImplTest,FrontProjectServiceImplTest,DictOptionSupportTest,MockDataSqlBuilderTest,FrontProjectSchemaScriptTest test`
Expected: all focused Java tests pass.
- [ ] **Step 2: Run frontend focused tests**
Run: `node --test easycode-web/src/components/databaseDesigner.test.mjs`
Expected: all focused Node tests pass.
- [ ] **Step 3: Inspect diff**
Run: `git diff --stat` and `git diff --check`
Expected: no whitespace errors; diff limited to database generation metadata, seed SQL, qing templates, and focused tests.