9.7 KiB
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.