Files
yidaima/RuoYi-Vue/docs/superpowers/plans/2026-07-07-template-reverse-generator.md

6.3 KiB

Template Reverse Generator 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: Build a backend-admin template reverse generator that uploads a complete project ZIP, identifies backend/admin frontend/user frontend/SQL assets, produces an extraction report, and prepares the data needed to publish a template bundle.

Architecture: Keep the first implementation safe by separating scan/report generation from template bundle publishing. The scanner is a pure Java service that classifies project files; the controller exposes upload/analyze endpoints in the RuoYi admin backend; the ruoyi-ui page shows the report and keeps publish actions explicit.

Tech Stack: Java 8, Spring Boot, MyBatis/RuoYi admin APIs, Vue 2 + Element UI, JUnit 4.


Task 1: Core Project Scanner

Files:

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/domain/template/TemplateImportComponent.java

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/domain/template/TemplateImportReport.java

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/service/TemplateImportScanner.java

  • Test: ruoyi-generator/src/test/java/com/ruoyi/generator/service/TemplateImportScannerTest.java

  • Step 1: Write failing tests

Create tests that build temporary project trees and verify:

  • A RuoYi-style project with backend, admin frontend, user frontend, and SQL is reported as four components.

  • Build artifacts and dependency folders are skipped.

  • A backend/admin/sql-only project does not claim frontend support.

  • Step 2: Run scanner tests and verify failure

Run: mvn -pl ruoyi-generator -Dtest=TemplateImportScannerTest test Expected: FAIL because TemplateImportScanner does not exist.

  • Step 3: Implement minimal scanner

Implement path walking with ignored directories: .git, .idea, node_modules, target, dist, build. Classify:

  • backend: directory containing pom.xml and src/main/java.

  • admin_frontend: Vue project with package.json plus admin markers such as src/permission.js, src/layout, src/views/system, src/views/tool/gen, or Element UI dependency.

  • frontend: Vue project with package.json plus src/views or src/pages, without admin markers.

  • sql: any .sql files outside ignored directories.

  • Step 4: Run scanner tests and verify pass

Run: mvn -pl ruoyi-generator -Dtest=TemplateImportScannerTest test Expected: PASS.

Task 2: Upload And Analysis Service

Files:

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/domain/template/TemplateImportAnalyzeResult.java

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/service/ITemplateImportService.java

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/service/TemplateImportServiceImpl.java

  • Test: ruoyi-generator/src/test/java/com/ruoyi/generator/service/TemplateImportServiceImplTest.java

  • Step 1: Write failing tests

Verify ZIP extraction rejects path traversal entries such as ../evil.txt, stores files under a configured workspace, and delegates to TemplateImportScanner.

  • Step 2: Run tests and verify failure

Run: mvn -pl ruoyi-generator -Dtest=TemplateImportServiceImplTest test Expected: FAIL because the service does not exist.

  • Step 3: Implement upload analysis

Use ZipInputStream, normalize each target path, reject entries escaping the task workspace, and return the scanner report. Keep the first version in filesystem workspace only; publishing to template tables is a later task.

  • Step 4: Run tests and verify pass

Run: mvn -pl ruoyi-generator -Dtest=TemplateImportServiceImplTest test Expected: PASS.

Task 3: Admin Backend API

Files:

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/controller/TemplateImportController.java

  • Modify: ruoyi-admin/src/main/resources/application.yml

  • Step 1: Add API endpoints

Expose:

  • POST /generator/templateImport/analyze with MultipartFile file, bundleCode, and bundleName.
  • GET /generator/templateImport/capabilities returning supported component types.

Use permission generator:template:import.

  • Step 2: Verify compilation

Run: mvn -pl ruoyi-generator -DskipTests compile Expected: SUCCESS.

Task 4: Admin Frontend Page

Files:

  • Create: ruoyi-ui/src/api/generator/templateImport.js

  • Create: ruoyi-ui/src/views/generator/templateImport/index.vue

  • Step 1: Add API wrapper

Implement analyzeTemplateImport(formData) and getTemplateImportCapabilities().

  • Step 2: Add page

Build a Vue 2 + Element UI admin page with ZIP upload, bundle code/name fields, analyze button, component cards for backend, admin_frontend, frontend, and sql, warnings, and file counts.

  • Step 3: Build frontend

Run: cd ruoyi-ui && npm run build:prod Expected: SUCCESS.

Task 5: Publishing Preparation

Files:

  • Modify: ruoyi-generator/src/main/java/com/ruoyi/generator/service/TemplateImportScanner.java

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/domain/template/TemplateImportPublishDraft.java

  • Step 1: Extend scanner output

Add safe draft data: supportBackend, supportAdminFrontend, supportFrontend, supportSql, detected root paths, skipped file count, and suggested template types.

  • Step 2: Verify tests

Run: mvn -pl ruoyi-generator -Dtest=TemplateImportScannerTest test Expected: PASS.

Task 6: Final Verification

Files:

  • No new files.

  • Step 1: Backend tests

Run: mvn -pl ruoyi-generator test Expected: PASS.

  • Step 2: Frontend build

Run: cd ruoyi-ui && npm run build:prod Expected: PASS.

  • Step 3: Manual smoke test

Upload a sample ZIP containing backend, admin frontend, user frontend, and SQL. Confirm all four cards appear and frontend is optional when absent.

Self-Review

  • Spec coverage: Covers backend/admin frontend/frontend/sql detection, admin-side upload, safe ZIP handling, and report UI.
  • Scope: Publishing into live template tables is deliberately separated from first scan/report delivery, because enabling templates changes generation behavior globally.
  • No placeholders: Each task has concrete files, commands, and expected behavior.