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

150 lines
6.3 KiB
Markdown

# 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.