From c742bf59b8212891e428fb02777b0000fe7b936a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=B9=8F?= Date: Sat, 23 May 2026 13:43:00 +0800 Subject: [PATCH] Add business blueprint generation templates --- .../service/GenProjectServiceImpl.java | 22 + .../ruoyi/generator/util/VelocityUtils.java | 6 +- .../service/GenProjectServiceImplTest.java | 37 + .../FrontProjectPreviewServiceImplTest.java | 19 + .../sql/business_blueprint_templates.sql | 1117 +++++++++++++++++ 5 files changed, 1200 insertions(+), 1 deletion(-) create mode 100644 RuoYi-Vue/sql/business_blueprint_templates.sql diff --git a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenProjectServiceImpl.java b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenProjectServiceImpl.java index 1181a5a..a3a1421 100644 --- a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenProjectServiceImpl.java +++ b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenProjectServiceImpl.java @@ -11,6 +11,7 @@ import com.ruoyi.generator.domain.SysProjectStructure; import com.ruoyi.generator.domain.SysProjectTemplate; import com.ruoyi.generator.domain.Template; import com.ruoyi.generator.domain.TemplateFile; +import com.ruoyi.generator.domain.front.dto.BusinessActionDesign; import com.ruoyi.generator.mapper.GenProjectMapper; import com.ruoyi.generator.mapper.GenTableMapper; import com.ruoyi.generator.util.VelocityInitializer; @@ -25,6 +26,7 @@ import java.io.IOException; import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -392,12 +394,32 @@ public class GenProjectServiceImpl implements IGenProjectService { setSubTable(table); setPkColumn(table); VelocityContext context = VelocityUtils.prepareContext(table); + putTableBusinessActions(context, project, table); putSnippetVariables(context, table, modules, templateFile); return context; } return VelocityUtils.prepareContextProject(project); } + private void putTableBusinessActions(VelocityContext context, GenProject project, GenTable table) { + List tableBusinessActions = filterTableBusinessActions(project, table); + context.put("tableBusinessActions", tableBusinessActions); + context.put("hasTableBusinessActions", StringUtils.isNotEmpty(tableBusinessActions)); + } + + private List filterTableBusinessActions(GenProject project, GenTable table) { + if (project == null || table == null || StringUtils.isEmpty(project.getBusinessActions())) { + return Collections.emptyList(); + } + List tableBusinessActions = new ArrayList(); + for (BusinessActionDesign action : project.getBusinessActions()) { + if (action != null && StringUtils.equals(action.getOwnerTable(), table.getTableName())) { + tableBusinessActions.add(action); + } + } + return tableBusinessActions; + } + private GenTable getRequiredTable(GenProject project, Long tableId) { if (project != null && StringUtils.isNotEmpty(project.getTables())) { for (GenTable projectTable : project.getTables()) { diff --git a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index 5f1cfa4..099ae85 100644 --- a/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/RuoYi-Vue/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -127,12 +127,16 @@ public class VelocityUtils { velocityContext.put("packageName", genProject.getPackageName()); velocityContext.put("projectName", genProject.getProjectName()); velocityContext.put("projectFileName", genProject.getProjectFileName()); + List tables = genProject.getTables() == null + ? Collections.emptyList() : genProject.getTables(); + velocityContext.put("tables", tables); + velocityContext.put("hasTables", StringUtils.isNotEmpty(tables)); List businessActions = genProject.getBusinessActions() == null ? Collections.emptyList() : genProject.getBusinessActions(); velocityContext.put("businessActions", businessActions); velocityContext.put("hasBusinessActions", StringUtils.isNotEmpty(businessActions)); StringBuffer createTableSql = new StringBuffer(); - for (GenTable table : genProject.getTables()) { + for (GenTable table : tables) { createTableSql.append("\n"); createTableSql.append(table.getCreateTableSql()); createTableSql.append("\n"); diff --git a/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/GenProjectServiceImplTest.java b/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/GenProjectServiceImplTest.java index 1bcf2d9..b667130 100644 --- a/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/GenProjectServiceImplTest.java +++ b/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/GenProjectServiceImplTest.java @@ -10,6 +10,7 @@ import com.ruoyi.generator.domain.SysProjectStructure; import com.ruoyi.generator.domain.SysProjectTemplate; import com.ruoyi.generator.domain.Template; import com.ruoyi.generator.domain.TemplateFile; +import com.ruoyi.generator.domain.front.dto.BusinessActionDesign; import com.ruoyi.generator.mapper.GenProjectMapper; import com.ruoyi.generator.mapper.GenTableMapper; import org.junit.Before; @@ -142,6 +143,32 @@ public class GenProjectServiceImplTest { assertFalse(content.contains("public void wrong() {}")); } + @Test + public void previewCodeExposesBusinessActionsForCurrentTableOnly() { + GenProject project = project(); + project.setBusinessActions(Arrays.asList( + businessAction("borrow_book", "sys_user"), + businessAction("return_book", "sys_role") + )); + GenTable table = table(11L, "sys_user", "User"); + + when(genProjectMapper.selectGenProjectById(1L)).thenReturn(project); + when(genTableMapper.selectGenTablesByProjectId(1L)).thenReturn(Arrays.asList(table)); + when(genTableMapper.selectGenTableById(11L)).thenReturn(table); + when(sysProjectModuleService.selectSysProjectModuleList(any(SysProjectModule.class))).thenReturn(Arrays.asList(projectModule(1L))); + when(codeSnippetService.selectSysCodeSnippetList(any(SysCodeSnippet.class))).thenReturn(Arrays.asList()); + when(sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(1L, "backend")).thenReturn(projectTemplate(100L)); + when(templateFileService.selectTemplateFilesByTemplateId(100L)).thenReturn(Arrays.asList( + templateFile("controller.java.vm", "#if($hasTableBusinessActions)#foreach($action in $tableBusinessActions)${action.code} #end#end") + )); + + Map preview = service.previewCode(1L, 11L, "controller.java.vm", "backend"); + + String content = preview.get("controller.java.vm"); + assertTrue(content.contains("borrow_book")); + assertFalse(content.contains("return_book")); + } + @Test public void getProjectStructureForDraftProjectUsesFirstActiveTemplateWithoutLoadingProject() { GenProject project = project(); @@ -326,4 +353,14 @@ public class GenProjectServiceImplTest { snippet.setDelFlag("0"); return snippet; } + + private BusinessActionDesign businessAction(String code, String ownerTable) { + BusinessActionDesign action = new BusinessActionDesign(); + action.setCode(code); + action.setName(code); + action.setOwnerTable(ownerTable); + action.setMethod("POST"); + action.setPath("/" + code); + return action; + } } diff --git a/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/FrontProjectPreviewServiceImplTest.java b/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/FrontProjectPreviewServiceImplTest.java index 701c24f..34cc875 100644 --- a/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/FrontProjectPreviewServiceImplTest.java +++ b/RuoYi-Vue/ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/FrontProjectPreviewServiceImplTest.java @@ -1,6 +1,7 @@ package com.ruoyi.generator.service.front; import com.ruoyi.generator.domain.GenProject; +import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.front.FrontProject; import com.ruoyi.generator.domain.front.FrontProjectColumn; import com.ruoyi.generator.domain.front.FrontProjectTable; @@ -99,6 +100,24 @@ public class FrontProjectPreviewServiceImplTest assertFalse((Boolean) context.get("hasBusinessActions")); } + @Test + public void projectVelocityContextExposesTablesForProjectLevelTemplates() + { + GenProject genProject = new GenProject(); + genProject.setProjectName("Demo"); + genProject.setProjectFileName("demo"); + genProject.setPackageName("com.example.demo"); + GenTable table = new GenTable(); + table.setTableName("book_info"); + table.setClassName("BookInfo"); + table.setBusinessName("bookInfo"); + genProject.setTables(Arrays.asList(table)); + + VelocityContext context = VelocityUtils.prepareContextProject(genProject); + + assertEquals(genProject.getTables(), context.get("tables")); + } + @Test public void downloadAllPackagesBackendFrontendAndAdminFrontend() throws Exception { diff --git a/RuoYi-Vue/sql/business_blueprint_templates.sql b/RuoYi-Vue/sql/business_blueprint_templates.sql new file mode 100644 index 0000000..425ac17 --- /dev/null +++ b/RuoYi-Vue/sql/business_blueprint_templates.sql @@ -0,0 +1,1117 @@ +-- Business blueprint Velocity templates +-- Import this script after sql/db.sql. +-- Template ids: +-- 9101 backend: RuoYi Spring Boot + MyBatis +-- 9102 admin_frontend: Vue2 + Element UI for RuoYi admin +-- 9103 frontend: Vue3 + Element Plus portal + +SET FOREIGN_KEY_CHECKS = 0; + +DELETE FROM sys_project_template WHERE template_id IN (9101, 9102, 9103); +DELETE FROM sys_project_structure WHERE template_id IN (9101, 9102, 9103) OR node_id BETWEEN 910100 AND 910399; +DELETE FROM sys_template_file WHERE template_id IN (9101, 9102, 9103) OR template_file_id BETWEEN 910100 AND 910399; +DELETE FROM sys_template WHERE template_id IN (9101, 9102, 9103); + +INSERT INTO sys_template (template_id, template_name, template_path, template_desc, template_type, template_status, create_by, create_time, remark) VALUES +(9101, 'Business Blueprint Backend', '/blueprint/backend', 'RuoYi backend with CRUD and blueprint action stubs', 'backend', 0, 'admin', sysdate(), 'business blueprint'), +(9102, 'Business Blueprint Admin Frontend', '/blueprint/admin_frontend', 'Vue2 Element UI admin pages with blueprint action buttons', 'admin_frontend', 0, 'admin', sysdate(), 'business blueprint'), +(9103, 'Business Blueprint Portal Frontend', '/blueprint/frontend', 'Vue3 Element Plus portal pages with blueprint action buttons', 'frontend', 0, 'admin', sysdate(), 'business blueprint'); + +-- Backend template files +INSERT INTO sys_template_file (template_file_id, template_id, file_name, module_id, file_path, file_content, create_by, create_time) VALUES +(910101, 9101, 'pom.xml.vm', NULL, 'pom.xml.vm', +' + 4.0.0 + ${packageName} + ${projectFileName}-backend + 1.0.0 + ${projectName} + Generated backend with business blueprint actions + + + com.ruoyi + ruoyi + 3.8.8 + + + + + com.ruoyi + ruoyi-common + + + com.ruoyi + ruoyi-framework + + + +', 'admin', sysdate()), +(910102, 9101, 'application.yml.vm', NULL, 'application.yml.vm', +'server: + port: 8080 + +spring: + application: + name: ${projectFileName}-backend +', 'admin', sysdate()), +(910103, 9101, 'README.md.vm', NULL, 'README.md.vm', +'# ${projectName} Backend + +Generated from EasyCode business blueprint templates. + +Create table SQL: + +```sql +${createTableSql} +``` + +# Business Actions + +#if($hasBusinessActions) +#foreach($action in $businessActions) +- ${action.name} `${action.code}` `${action.method} ${action.path}` owner `${action.ownerTable}` +#end +#else +No business actions in blueprint. +#end +', 'admin', sysdate()), +(910104, 9101, 'domain.java.vm', NULL, 'domain.java.vm', +'package ${packageName}.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * ${functionName} object ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${ClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** ${column.columnComment} */ +#if($column.javaType == "Date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") +#end +#if($column.isList == "1") + @Excel(name = "${column.columnComment}") +#end + private ${column.javaType} ${column.javaField}; + +#end +#end +#foreach($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + public void set${column.capJavaField}(${column.javaType} ${column.javaField}) + { + this.${column.javaField} = ${column.javaField}; + } + + public ${column.javaType} get${column.capJavaField}() + { + return ${column.javaField}; + } + +#end +#end + @Override + public String toString() + { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) +#foreach($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + .append("${column.javaField}", get${column.capJavaField}()) +#end +#end + .toString(); + } +} +', 'admin', sysdate()), +(910105, 9101, 'mapper.java.vm', NULL, 'mapper.java.vm', +'package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName} Mapper + */ +public interface ${ClassName}Mapper +{ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + public int insert${ClassName}(${ClassName} ${className}); + + public int update${ClassName}(${ClassName} ${className}); + + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); +} +', 'admin', sysdate()), +(910106, 9101, 'mapper.xml.vm', NULL, 'mapper.xml.vm', +' + + + + +#foreach($column in $columns) +#if($column.isPk == "1") + +#else + +#end +#end + + + + select +#foreach($column in $columns) + ${column.columnName}#if($foreach.hasNext),#end +#end + from ${tableName} + + + + + + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.isInsert == "1" && $column.isIncrement != "1") + ${column.columnName}, +#end +#end + + +#foreach($column in $columns) +#if($column.isInsert == "1" && $column.isIncrement != "1") + #{${column.javaField}}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.isEdit == "1" && $column.isPk != "1") + ${column.columnName} = #{${column.javaField}}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + + +', 'admin', sysdate()), +(910107, 9101, 'service.java.vm', NULL, 'service.java.vm', +'package ${packageName}.service; + +import java.util.List; +import java.util.Map; +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName} Service + */ +public interface I${ClassName}Service +{ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + public int insert${ClassName}(${ClassName} ${className}); + + public int update${ClassName}(${ClassName} ${className}); + + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + +#if($hasTableBusinessActions) +#foreach($action in $tableBusinessActions) + public int ${action.code}(Map params); + +#end +#end +} +', 'admin', sysdate()), +(910108, 9101, 'serviceImpl.java.vm', NULL, 'serviceImpl.java.vm', +'package ${packageName}.service.impl; + +import java.util.List; +import java.util.Map; +import javax.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.ruoyi.common.exception.ServiceException; +import ${packageName}.domain.${ClassName}; +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.service.I${ClassName}Service; + +/** + * ${functionName} Service implementation + */ +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service +{ + @Resource + private ${ClassName}Mapper ${className}Mapper; + + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) + { + return ${className}Mapper.select${ClassName}List(${className}); + } + + @Override + public int insert${ClassName}(${ClassName} ${className}) + { + return ${className}Mapper.insert${ClassName}(${className}); + } + + @Override + public int update${ClassName}(${ClassName} ${className}) + { + return ${className}Mapper.update${ClassName}(${className}); + } + + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) + { + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); + } + + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + +#if($hasTableBusinessActions) +#foreach($action in $tableBusinessActions) + /** + * ${action.name} +#if($action.requestFields) + * Request fields: +#foreach($field in $action.requestFields) + * - ${field} +#end +#end +#if($action.rules) + * Rules: +#foreach($rule in $action.rules) + * - ${rule} +#end +#end +#if($action.effects) + * Effects: +#foreach($effect in $action.effects) + * - ${effect.type} ${effect.targetTable}.${effect.targetField} ${effect.value} ${effect.description} +#end +#end + */ + @Transactional(rollbackFor = Exception.class) + @Override + public int ${action.code}(Map params) + { + throw new ServiceException("Business action not implemented: ${action.name}"); + } + +#end +#end +} +', 'admin', sysdate()), +(910109, 9101, 'controller.java.vm', NULL, 'controller.java.vm', +'package ${packageName}.controller; + +import java.util.List; +import java.util.Map; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; + +/** + * ${functionName} Controller + */ +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + @Resource + private I${ClassName}Service ${className}Service; + + @GetMapping("/list") + public TableDataInfo list(${ClassName} ${className}) + { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } + + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + util.exportExcel(response, list, "${functionName}"); + } + + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.update${ClassName}(${className})); + } + + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); + } + +#if($hasTableBusinessActions) +#foreach($action in $tableBusinessActions) + @Log(title = "${action.name}", businessType = BusinessType.OTHER) +#if($action.method == "GET") + @GetMapping("${action.path}") + public AjaxResult ${action.code}(@RequestParam Map params) + { + return toAjax(${className}Service.${action.code}(params)); + } +#elseif($action.method == "PUT") + @PutMapping("${action.path}") + public AjaxResult ${action.code}(@RequestBody Map params) + { + return toAjax(${className}Service.${action.code}(params)); + } +#elseif($action.method == "DELETE") + @DeleteMapping("${action.path}") + public AjaxResult ${action.code}(@RequestBody(required = false) Map params) + { + return toAjax(${className}Service.${action.code}(params)); + } +#else + @PostMapping("${action.path}") + public AjaxResult ${action.code}(@RequestBody Map params) + { + return toAjax(${className}Service.${action.code}(params)); + } +#end + +#end +#end +} +', 'admin', sysdate()); + +-- Admin frontend template files +INSERT INTO sys_template_file (template_file_id, template_id, file_name, module_id, file_path, file_content, create_by, create_time) VALUES +(910201, 9102, 'package.json.vm', NULL, 'package.json.vm', +'{ + "name": "${projectFileName}-admin", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "vue-cli-service serve", + "build": "vue-cli-service build" + }, + "dependencies": { + "element-ui": "2.15.14", + "vue": "2.6.14", + "vue-router": "3.6.5", + "vuex": "3.6.2" + } +} +', 'admin', sysdate()), +(910202, 9102, 'api.js.vm', NULL, 'api.js.vm', +'import request from "@/utils/request" + +const baseUrl = "/${moduleName}/${businessName}" + +export function list${ClassName}(query) { + return request({ + url: baseUrl + "/list", + method: "get", + params: query + }) +} + +export function get${ClassName}(${pkColumn.javaField}) { + return request({ + url: baseUrl + "/" + ${pkColumn.javaField}, + method: "get" + }) +} + +export function add${ClassName}(data) { + return request({ + url: baseUrl, + method: "post", + data + }) +} + +export function update${ClassName}(data) { + return request({ + url: baseUrl, + method: "put", + data + }) +} + +export function del${ClassName}(${pkColumn.javaField}) { + return request({ + url: baseUrl + "/" + ${pkColumn.javaField}, + method: "delete" + }) +} + +#if($hasTableBusinessActions) +#foreach($action in $tableBusinessActions) +export function ${action.code}(data) { + return request({ + url: baseUrl + "${action.path}", + method: "${action.method.toLowerCase()}", +#if($action.method == "GET") + params: data +#else + data +#end + }) +} + +#end +#end +', 'admin', sysdate()), +(910203, 9102, 'index.vue.vm', NULL, 'index.vue.vm', +' + + +', 'admin', sysdate()); + +-- Portal frontend template files +INSERT INTO sys_template_file (template_file_id, template_id, file_name, module_id, file_path, file_content, create_by, create_time) VALUES +(910301, 9103, 'package.json.vm', NULL, 'package.json.vm', +'{ + "name": "${projectFileName}-portal", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --host 0.0.0.0", + "build": "vite build" + }, + "dependencies": { + "@vitejs/plugin-vue": "5.0.5", + "axios": "1.7.2", + "element-plus": "2.7.6", + "vite": "5.3.1", + "vue": "3.4.29", + "vue-router": "4.4.0" + }, + "devDependencies": {} +} +', 'admin', sysdate()), +(910302, 9103, 'index.html.vm', NULL, 'index.html.vm', +' + + + + + ${projectName} + + +
+ + + +', 'admin', sysdate()), +(910303, 9103, 'main.js.vm', NULL, 'main.js.vm', +'import { createApp } from "vue" +import ElementPlus from "element-plus" +import "element-plus/dist/index.css" +import App from "./App.vue" +import router from "./router" + +createApp(App).use(router).use(ElementPlus).mount("#app") +', 'admin', sysdate()), +(910304, 9103, 'App.vue.vm', NULL, 'App.vue.vm', +' + + +', 'admin', sysdate()), +(910305, 9103, 'router.js.vm', NULL, 'router.js.vm', +'import { createRouter, createWebHistory } from "vue-router" +#foreach($table in $tables) +import ${table.className}Index from "../views/${table.businessName}/index.vue" +import ${table.className}Detail from "../views/${table.businessName}/detail.vue" +#end + +const routes = [ +#if($hasTables) +#set($firstTable = $tables.get(0)) + { + path: "/", + redirect: "/${firstTable.businessName}" + }, +#else + { + path: "/", + component: { template: "
" } + } +#end +#foreach($table in $tables) + { + path: "/${table.businessName}", + component: ${table.className}Index + }, + { + path: "/${table.businessName}/:id", + component: ${table.className}Detail + }#if($foreach.hasNext),#end +#end +] + +export default createRouter({ + history: createWebHistory(), + routes +}) +', 'admin', sysdate()), +(910306, 9103, 'request.js.vm', NULL, 'request.js.vm', +'import axios from "axios" +import { ElMessage } from "element-plus" + +const request = axios.create({ + baseURL: import.meta.env.VITE_APP_BASE_API || "", + timeout: 15000 +}) + +request.interceptors.response.use( + response => response.data, + error => { + ElMessage.error(error.response?.data?.msg || error.message || "请求失败") + return Promise.reject(error) + } +) + +export default request +', 'admin', sysdate()), +(910307, 9103, 'api.js.vm', NULL, 'api.js.vm', +'import request from "./request" + +const baseUrl = "/${moduleName}/${businessName}" + +export function list${ClassName}(query) { + return request({ + url: baseUrl + "/list", + method: "get", + params: query + }) +} + +export function get${ClassName}(${pkColumn.javaField}) { + return request({ + url: baseUrl + "/" + ${pkColumn.javaField}, + method: "get" + }) +} + +#if($hasTableBusinessActions) +#foreach($action in $tableBusinessActions) +export function ${action.code}(data) { + return request({ + url: baseUrl + "${action.path}", + method: "${action.method.toLowerCase()}", +#if($action.method == "GET") + params: data +#else + data +#end + }) +} + +#end +#end +', 'admin', sysdate()), +(910308, 9103, 'index.vue.vm', NULL, 'index.vue.vm', +' + + + + +', 'admin', sysdate()), +(910309, 9103, 'detail.vue.vm', NULL, 'detail.vue.vm', +' + + + + +', 'admin', sysdate()); + +-- Backend project structure +INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES +(910100, 0, '{projectName}-backend', 'folder', NULL, 9101, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910101, 910100, 'pom.xml', 'file', NULL, 9101, -1, 'pom.xml.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910102, 910100, 'README.md', 'file', NULL, 9101, -1, 'README.md.vm', 2, '0', 'admin', sysdate(), '', NULL), +(910103, 910100, 'src', 'folder', NULL, 9101, NULL, NULL, 3, '0', 'admin', sysdate(), '', NULL), +(910104, 910103, 'main', 'folder', NULL, 9101, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910105, 910104, 'java', 'folder', NULL, 9101, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910106, 910105, '{packageName}', 'folder', NULL, 9101, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910107, 910106, 'domain', 'folder', NULL, 9101, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910108, 910106, 'mapper', 'folder', NULL, 9101, NULL, NULL, 2, '0', 'admin', sysdate(), '', NULL), +(910109, 910106, 'service', 'folder', NULL, 9101, NULL, NULL, 3, '0', 'admin', sysdate(), '', NULL), +(910110, 910109, 'impl', 'folder', NULL, 9101, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910111, 910106, 'controller', 'folder', NULL, 9101, NULL, NULL, 4, '0', 'admin', sysdate(), '', NULL), +(910112, 910104, 'resources', 'folder', NULL, 9101, NULL, NULL, 2, '0', 'admin', sysdate(), '', NULL), +(910113, 910112, 'mapper', 'folder', NULL, 9101, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910114, 910113, '{moduleName}', 'folder', NULL, 9101, 0, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910115, 910112, 'application.yml', 'file', NULL, 9101, -1, 'application.yml.vm', 2, '0', 'admin', sysdate(), '', NULL), +(910116, 910107, '{ClassName}.java', 'file', NULL, 9101, 0, 'domain.java.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910117, 910108, '{ClassName}Mapper.java', 'file', NULL, 9101, 0, 'mapper.java.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910118, 910109, 'I{ClassName}Service.java', 'file', NULL, 9101, 0, 'service.java.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910119, 910110, '{ClassName}ServiceImpl.java', 'file', NULL, 9101, 0, 'serviceImpl.java.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910120, 910111, '{ClassName}Controller.java', 'file', NULL, 9101, 0, 'controller.java.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910121, 910114, '{ClassName}Mapper.xml', 'file', NULL, 9101, 0, 'mapper.xml.vm', 1, '0', 'admin', sysdate(), '', NULL); + +-- Admin frontend project structure +INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES +(910200, 0, '{projectName}-admin', 'folder', NULL, 9102, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910201, 910200, 'package.json', 'file', NULL, 9102, -1, 'package.json.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910202, 910200, 'src', 'folder', NULL, 9102, NULL, NULL, 2, '0', 'admin', sysdate(), '', NULL), +(910203, 910202, 'api', 'folder', NULL, 9102, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910204, 910203, '{moduleName}', 'folder', NULL, 9102, 0, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910205, 910204, '{businessName}.js', 'file', NULL, 9102, 0, 'api.js.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910206, 910202, 'views', 'folder', NULL, 9102, NULL, NULL, 2, '0', 'admin', sysdate(), '', NULL), +(910207, 910206, '{moduleName}', 'folder', NULL, 9102, 0, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910208, 910207, '{businessName}', 'folder', NULL, 9102, 0, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910209, 910208, 'index.vue', 'file', NULL, 9102, 0, 'index.vue.vm', 1, '0', 'admin', sysdate(), '', NULL); + +-- Portal frontend project structure +INSERT INTO sys_project_structure (node_id, parent_id, node_name, node_type, module, template_id, table_id, category, sort_order, status, create_by, create_time, update_by, update_time) VALUES +(910300, 0, '{projectName}-portal', 'folder', NULL, 9103, NULL, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910301, 910300, 'package.json', 'file', NULL, 9103, -1, 'package.json.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910302, 910300, 'index.html', 'file', NULL, 9103, -1, 'index.html.vm', 2, '0', 'admin', sysdate(), '', NULL), +(910303, 910300, 'src', 'folder', NULL, 9103, NULL, NULL, 3, '0', 'admin', sysdate(), '', NULL), +(910304, 910303, 'main.js', 'file', NULL, 9103, -1, 'main.js.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910305, 910303, 'App.vue', 'file', NULL, 9103, -1, 'App.vue.vm', 2, '0', 'admin', sysdate(), '', NULL), +(910306, 910303, 'router', 'folder', NULL, 9103, NULL, NULL, 3, '0', 'admin', sysdate(), '', NULL), +(910307, 910306, 'index.js', 'file', NULL, 9103, -1, 'router.js.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910308, 910303, 'api', 'folder', NULL, 9103, NULL, NULL, 4, '0', 'admin', sysdate(), '', NULL), +(910309, 910308, 'request.js', 'file', NULL, 9103, -1, 'request.js.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910310, 910308, '{businessName}.js', 'file', NULL, 9103, 0, 'api.js.vm', 2, '0', 'admin', sysdate(), '', NULL), +(910311, 910303, 'views', 'folder', NULL, 9103, NULL, NULL, 5, '0', 'admin', sysdate(), '', NULL), +(910312, 910311, '{businessName}', 'folder', NULL, 9103, 0, NULL, 1, '0', 'admin', sysdate(), '', NULL), +(910313, 910312, 'index.vue', 'file', NULL, 9103, 0, 'index.vue.vm', 1, '0', 'admin', sysdate(), '', NULL), +(910314, 910312, 'detail.vue', 'file', NULL, 9103, 0, 'detail.vue.vm', 2, '0', 'admin', sysdate(), '', NULL); + +SET FOREIGN_KEY_CHECKS = 1;