完善代码生成项目功能和测试数据

This commit is contained in:
王鹏
2026-05-21 19:35:00 +08:00
parent a8bd6c53be
commit 23b6cbcdac
9 changed files with 2366 additions and 258 deletions

View File

@@ -35,6 +35,18 @@
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
</project>

View File

@@ -117,10 +117,7 @@ public class GenProjectServiceImpl implements IGenProjectService {
*/
@Override
public List<Map<String, Object>> getProjectStructure(Long projectId, String type) {
GenProject project = genProjectMapper.selectGenProjectById(projectId);
if (project == null) {
return new ArrayList<>();
}
GenProject project = getRequiredProject(projectId);
List<GenTable> projectTables = genTableMapper.selectGenTablesByProjectId(projectId);
project.setTables(projectTables);
@@ -128,95 +125,39 @@ public class GenProjectServiceImpl implements IGenProjectService {
List<Map<String, Object>> structure = new ArrayList<>();
// 获取项目模板
SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type);
if (projectTemplate == null) {
return structure;
}
SysProjectTemplate projectTemplate = getRequiredProjectTemplate(project, type);
// 获取模板关联的项目结构节点
List<SysProjectStructure> structureNodes = sysProjectStructureService.selectProjectStructureListByModule(project.getProjectId(), projectTemplate.getTemplateId());
// 构建树形结构
Map<Long, Map<String, Object>> nodeMap = new HashMap<>();
Map<Long, SysProjectStructure> sourceNodeMap = new HashMap<>();
Map<String, Map<String, Object>> nodeMap = new LinkedHashMap<>();
for (SysProjectStructure node : structureNodes) {
Map<String, Object> nodeData = new HashMap<>();
String nodeName = node.getNodeName();
if(nodeName.contains("{projectName}")){
nodeName = nodeName.replace("{projectName}", project.getProjectFileName());
} else if(nodeName.contains("{packageName}")){
nodeName = nodeName.replace("{packageName}", project.getPackageName());
}
Long tableId = node.getTableId();
if(tableId != null && tableId == 0){
for(GenTable table : projectTables){
Map<String, Object> tableNodeData = new HashMap<>();
String tableNodeName = nodeName;
if(tableNodeName.contains("{ClassName}")){
tableNodeName = tableNodeName.replace("{ClassName}", table.getClassName());
}
Long nodeId = node.getNodeId() * 1000 + table.getTableId();
tableNodeData.put("id", nodeId);
tableNodeData.put("name", tableNodeName);
tableNodeData.put("type", node.getNodeType());
tableNodeData.put("category", node.getCategory());
tableNodeData.put("tableId", table.getTableId());
nodeMap.put(nodeId, tableNodeData);
sourceNodeMap.put(node.getNodeId(), node);
if (isTableScopedNode(node)) {
for (GenTable table : projectTables) {
Map<String, Object> tableNodeData = createStructureNodeData(node, project, table);
nodeMap.put(getNodeKey(node.getNodeId(), table.getTableId()), tableNodeData);
}
} else{
nodeData.put("id", node.getNodeId());
nodeData.put("name", nodeName);
nodeData.put("type", node.getNodeType());
nodeData.put("category", node.getCategory());
nodeData.put("tableId", tableId);
nodeMap.put(node.getNodeId(), nodeData);
}
if ("folder".equals(node.getNodeType())) {
nodeData.put("children", new ArrayList<>());
nodeMap.put(node.getNodeId(), nodeData);
} else {
Map<String, Object> nodeData = createStructureNodeData(node, project, null);
nodeMap.put(getNodeKey(node.getNodeId(), null), nodeData);
}
}
// 构建父子关系
for (SysProjectStructure node : structureNodes) {
if (node.getTableId() != null && node.getTableId() == 0) {
if (isTableScopedNode(node)) {
// 处理表特定的节点
for (GenTable table : projectTables) {
Long nodeId = node.getNodeId() * 1000 + table.getTableId();
Map<String, Object> nodeData = nodeMap.get(nodeId);
if (nodeData != null) {
if (node.getParentId() == 0) {
structure.add(nodeData);
} else {
Map<String, Object> parentNode = nodeMap.get(node.getParentId());
if (parentNode != null) {
@SuppressWarnings("unchecked")
List<Map<String, Object>> children = (List<Map<String, Object>>) parentNode.get("children");
if (children != null) {
children.add(nodeData);
}
}
}
}
Map<String, Object> nodeData = nodeMap.get(getNodeKey(node.getNodeId(), table.getTableId()));
addNodeToParent(structure, nodeData, node, nodeMap, sourceNodeMap, table);
}
} else {
// 处理普通节点
Map<String, Object> nodeData = nodeMap.get(node.getNodeId());
if (nodeData != null) {
if (node.getParentId() == 0) {
structure.add(nodeData);
} else {
Map<String, Object> parentNode = nodeMap.get(node.getParentId());
if (parentNode != null) {
@SuppressWarnings("unchecked")
List<Map<String, Object>> children = (List<Map<String, Object>>) parentNode.get("children");
if (children != null) {
children.add(nodeData);
}
}
}
}
Map<String, Object> nodeData = nodeMap.get(getNodeKey(node.getNodeId(), null));
addNodeToParent(structure, nodeData, node, nodeMap, sourceNodeMap, null);
}
}
@@ -225,10 +166,7 @@ public class GenProjectServiceImpl implements IGenProjectService {
@Override
public byte[] downloadStructure(Long projectId, String type) {
GenProject project = genProjectMapper.selectGenProjectById(projectId);
if (project == null) {
throw new ServiceException("项目不存在");
}
GenProject project = getRequiredProject(projectId);
List<GenTable> projectTables = genTableMapper.selectGenTablesByProjectId(projectId);
project.setTables(projectTables);
@@ -296,7 +234,7 @@ public class GenProjectServiceImpl implements IGenProjectService {
public Map<String, String> previewCode(Long projectId, Long tableId, String keyword, String type)
{
Map<String, String> dataMap = new LinkedHashMap<>();
GenProject project = genProjectMapper.selectGenProjectById(projectId);
GenProject project = getRequiredProject(projectId);
List<GenTable> projectTables = genTableMapper.selectGenTablesByProjectId(projectId);
project.setTables(projectTables);
@@ -305,38 +243,15 @@ public class GenProjectServiceImpl implements IGenProjectService {
List<SysProjectModule> modules = sysProjectModuleService.selectSysProjectModuleList(projectModuleFilter);
VelocityInitializer.initVelocity();
VelocityContext context = null;
String tplCategory = "";
if(!Objects.isNull(tableId) && tableId != -1){
// 查询表信息
GenTable table = genTableMapper.selectGenTableById(tableId);
table.setModules(modules);
tplCategory = table.getTplCategory();
table.setPackageName(project.getPackageName());
// 设置主子表信息
setSubTable(table);
// 设置主键列信息
setPkColumn(table);
// 设置代码片段
setCodeSnippet(table);
context = VelocityUtils.prepareContext(table);
} else{
context = VelocityUtils.prepareContextProject(project);
}
// 获取模板列表
SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type);
List<TemplateFile> templateFileList = templateFileService.selectTemplateFilesByTemplateId(projectTemplate.getTemplateId());
SysProjectTemplate projectTemplate = getRequiredProjectTemplate(project, type);
List<TemplateFile> templateFileList = getRequiredTemplateFiles(projectTemplate.getTemplateId());
for (TemplateFile templateFile : templateFileList)
{
if(templateFile.getFileName().contains(keyword)){
if(matchesTemplateFile(templateFile, keyword)){
// 渲染模板
StringWriter sw = new StringWriter();
String tplContent = templateFile.getFileContent();
Velocity.evaluate(context, sw, "", tplContent);
dataMap.put(templateFile.getFileName(), sw.toString());
dataMap.put(templateFile.getFileName(), renderTemplate(project, tableId, modules, templateFile));
}
}
return dataMap;
@@ -351,67 +266,219 @@ public class GenProjectServiceImpl implements IGenProjectService {
List<SysProjectModule> modules = sysProjectModuleService.selectSysProjectModuleList(projectModuleFilter);
VelocityInitializer.initVelocity();
VelocityContext context = null;
String tplCategory = "";
if(!Objects.isNull(tableId) && tableId != -1){
// 查询表信息
GenTable table = genTableMapper.selectGenTableById(tableId);
table.setModules(modules);
tplCategory = table.getTplCategory();
table.setPackageName(project.getPackageName());
// 设置主子表信息
setSubTable(table);
// 设置主键列信息
setPkColumn(table);
// 设置代码片段
setCodeSnippet(table);
context = VelocityUtils.prepareContext(table);
} else {
context = VelocityUtils.prepareContextProject(project);
}
// 获取模板列表
SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type);
List<TemplateFile> templateFileList = templateFileService.selectTemplateFilesByTemplateId(projectTemplate.getTemplateId());
SysProjectTemplate projectTemplate = getRequiredProjectTemplate(project, type);
List<TemplateFile> templateFileList = getRequiredTemplateFiles(projectTemplate.getTemplateId());
for (TemplateFile templateFile : templateFileList)
{
if(templateFile.getFileName().contains(category)){
if(matchesTemplateFile(templateFile, category)){
try {
StringWriter sw = new StringWriter();
String tplContent = templateFile.getFileContent();
Velocity.evaluate(context, sw, "", tplContent);
return sw.toString();
return renderTemplate(project, tableId, modules, templateFile);
} catch (Exception e) {
e.printStackTrace();
throw new ServiceException("渲染模板失败,表名:" + tableId);
}
}
}
return null;
throw new ServiceException("未找到模板文件:" + category);
}
/**
* 设置代码片段
* @param table
*/
private void setCodeSnippet(GenTable table) {
private GenProject getRequiredProject(Long projectId) {
GenProject project = genProjectMapper.selectGenProjectById(projectId);
if (project == null) {
throw new ServiceException("项目不存在");
}
return project;
}
private SysProjectTemplate getRequiredProjectTemplate(GenProject project, String type) {
SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type);
if (projectTemplate == null || projectTemplate.getTemplateId() == null) {
throw new ServiceException("项目未配置" + type + "模板");
}
return projectTemplate;
}
private List<TemplateFile> getRequiredTemplateFiles(Long templateId) {
List<TemplateFile> templateFileList = templateFileService.selectTemplateFilesByTemplateId(templateId);
if (StringUtils.isEmpty(templateFileList)) {
throw new ServiceException("模板未配置文件");
}
return templateFileList;
}
private boolean isTableScopedNode(SysProjectStructure node) {
return node.getTableId() != null && node.getTableId() == 0;
}
private String getNodeKey(Long nodeId, Long tableId) {
return tableId == null ? String.valueOf(nodeId) : nodeId + "-" + tableId;
}
private Map<String, Object> createStructureNodeData(SysProjectStructure node, GenProject project, GenTable table) {
Map<String, Object> nodeData = new LinkedHashMap<>();
nodeData.put("id", table == null ? node.getNodeId() : getNodeKey(node.getNodeId(), table.getTableId()));
nodeData.put("name", replaceNodeName(node.getNodeName(), project, table));
nodeData.put("type", node.getNodeType());
nodeData.put("category", node.getCategory());
nodeData.put("tableId", table == null ? node.getTableId() : table.getTableId());
if ("folder".equals(node.getNodeType())) {
nodeData.put("children", new ArrayList<>());
}
return nodeData;
}
private String replaceNodeName(String nodeName, GenProject project, GenTable table) {
if (nodeName == null) {
return "";
}
String result = nodeName;
result = result.replace("{projectName}", StringUtils.defaultString(project.getProjectFileName()));
result = result.replace("{packageName}", StringUtils.defaultString(project.getPackageName()));
if (table != null) {
result = result.replace("{ClassName}", StringUtils.defaultString(table.getClassName()));
result = result.replace("{className}", StringUtils.uncapitalize(StringUtils.defaultString(table.getClassName())));
result = result.replace("{tableName}", StringUtils.defaultString(table.getTableName()));
result = result.replace("{businessName}", StringUtils.defaultString(table.getBusinessName()));
}
return result;
}
private void addNodeToParent(List<Map<String, Object>> roots, Map<String, Object> nodeData,
SysProjectStructure node, Map<String, Map<String, Object>> nodeMap,
Map<Long, SysProjectStructure> sourceNodeMap, GenTable table) {
if (nodeData == null) {
return;
}
if (node.getParentId() == null || node.getParentId() == 0) {
roots.add(nodeData);
return;
}
SysProjectStructure parentSource = sourceNodeMap.get(node.getParentId());
Long parentTableId = parentSource != null && isTableScopedNode(parentSource) && table != null ? table.getTableId() : null;
Map<String, Object> parentNode = nodeMap.get(getNodeKey(node.getParentId(), parentTableId));
if (parentNode == null) {
return;
}
@SuppressWarnings("unchecked")
List<Map<String, Object>> children = (List<Map<String, Object>>) parentNode.get("children");
if (children != null) {
children.add(nodeData);
}
}
private boolean matchesTemplateFile(TemplateFile templateFile, String templateFileName) {
if (templateFile == null || StringUtils.isEmpty(templateFileName)) {
return false;
}
return StringUtils.equals(templateFile.getFileName(), templateFileName)
|| StringUtils.equals(templateFile.getFilePath(), templateFileName);
}
private String renderTemplate(GenProject project, Long tableId, List<SysProjectModule> modules, TemplateFile templateFile) {
VelocityContext context = prepareVelocityContext(project, tableId, modules, templateFile);
StringWriter sw = new StringWriter();
Velocity.evaluate(context, sw, "", StringUtils.defaultString(templateFile.getFileContent()));
return sw.toString();
}
private VelocityContext prepareVelocityContext(GenProject project, Long tableId, List<SysProjectModule> modules, TemplateFile templateFile) {
if (tableId != null && tableId != -1) {
GenTable table = getRequiredTable(tableId);
table.setModules(modules);
table.setPackageName(project.getPackageName());
// 设置主子表信息
setSubTable(table);
// 设置主键列信息
setPkColumn(table);
VelocityContext context = VelocityUtils.prepareContext(table);
putSnippetVariables(context, table, modules, templateFile);
return context;
}
return VelocityUtils.prepareContextProject(project);
}
private GenTable getRequiredTable(Long tableId) {
GenTable table = genTableMapper.selectGenTableById(tableId);
if (table == null) {
throw new ServiceException("业务表不存在:" + tableId);
}
if (StringUtils.isEmpty(table.getColumns())) {
throw new ServiceException("业务表未配置字段:" + table.getTableName());
}
return table;
}
private void putSnippetVariables(VelocityContext context, GenTable table, List<SysProjectModule> modules, TemplateFile templateFile) {
SysCodeSnippet codeSnippet = new SysCodeSnippet();
// codeSnippet.setRelationTableName(table.getTableName());
codeSnippet.setStatus("0");
List<SysCodeSnippet> codeSnippetList = codeSnippetService.selectSysCodeSnippetList(codeSnippet);
table.setCodeSnippetList(codeSnippetList);
if (StringUtils.isEmpty(codeSnippetList)) {
return;
}
Map<String, StringBuilder> snippetContentMap = new LinkedHashMap<>();
for (SysCodeSnippet snippet : codeSnippetList) {
if (StringUtils.isNotEmpty(snippet.getInsertPoint())) {
snippetContentMap.putIfAbsent(snippet.getInsertPoint(), new StringBuilder());
}
}
for (SysCodeSnippet snippet : codeSnippetList) {
if (matchesSnippet(snippet, table, modules, templateFile)) {
StringBuilder content = snippetContentMap.get(snippet.getInsertPoint());
if (content.length() > 0) {
content.append(System.lineSeparator());
}
content.append(snippet.getSnippetContent());
}
}
for (Map.Entry<String, StringBuilder> entry : snippetContentMap.entrySet()) {
context.put(entry.getKey(), entry.getValue().toString());
}
}
/**
* 获取包前缀
*
* @param packageName 包名称
* @return 包前缀名称
*/
private String getPackagePrefix(String packageName) {
int lastIndex = packageName.lastIndexOf(".");
return StringUtils.substring(packageName, 0, lastIndex);
private boolean matchesSnippet(SysCodeSnippet snippet, GenTable table, List<SysProjectModule> modules, TemplateFile templateFile) {
return snippet != null
&& StringUtils.isNotEmpty(snippet.getInsertPoint())
&& StringUtils.isNotEmpty(snippet.getSnippetContent())
&& isSnippetEnabled(snippet)
&& matchesSnippetModule(snippet, modules)
&& matchesSnippetTable(snippet, table)
&& matchesSnippetTemplate(snippet, templateFile);
}
private boolean isSnippetEnabled(SysCodeSnippet snippet) {
return (StringUtils.isEmpty(snippet.getStatus()) || "0".equals(snippet.getStatus()))
&& (StringUtils.isEmpty(snippet.getDelFlag()) || "0".equals(snippet.getDelFlag()));
}
private boolean matchesSnippetModule(SysCodeSnippet snippet, List<SysProjectModule> modules) {
if (snippet.getModuleId() == null) {
return true;
}
if (StringUtils.isEmpty(modules)) {
return false;
}
for (SysProjectModule module : modules) {
if (snippet.getModuleId().equals(module.getModuleId())
&& (StringUtils.isEmpty(module.getStatus()) || "0".equals(module.getStatus()))) {
return true;
}
}
return false;
}
private boolean matchesSnippetTable(SysCodeSnippet snippet, GenTable table) {
return StringUtils.isEmpty(snippet.getRelationTableName())
|| StringUtils.equals(snippet.getRelationTableName(), table.getTableName());
}
private boolean matchesSnippetTemplate(SysCodeSnippet snippet, TemplateFile templateFile) {
return StringUtils.isEmpty(snippet.getTemplateFileName())
|| matchesTemplateFile(templateFile, snippet.getTemplateFileName());
}
/**
@@ -442,4 +509,4 @@ public class GenProjectServiceImpl implements IGenProjectService {
table.setSubTable(genTableMapper.selectGenTableByName(subTableName));
}
}
}
}

View File

@@ -78,17 +78,44 @@ public class VelocityUtils {
List<SysProjectModule> modules = genTable.getModules();
if (!Objects.isNull(codeList)) {
for (SysCodeSnippet code : codeList) {
if (modules.stream().anyMatch(module -> module.getModuleId().equals(code.getModuleId()))
&& code.getRelationTableName().equals(genTable.getTableName())) {
velocityContext.put(code.getInsertPoint(), code.getSnippetContent());
} else {
if (StringUtils.isNotEmpty(code.getInsertPoint())) {
velocityContext.put(code.getInsertPoint(), "");
}
}
for (SysCodeSnippet code : codeList) {
if (matchesSnippet(code, modules, genTable)) {
String existing = StringUtils.defaultString((String) velocityContext.get(code.getInsertPoint()));
String value = StringUtils.isEmpty(existing) ? code.getSnippetContent() : existing + System.lineSeparator() + code.getSnippetContent();
velocityContext.put(code.getInsertPoint(), value);
}
}
}
return velocityContext;
}
private static boolean matchesSnippet(SysCodeSnippet code, List<SysProjectModule> modules, GenTable genTable) {
if (code == null || StringUtils.isEmpty(code.getInsertPoint()) || StringUtils.isEmpty(code.getSnippetContent())) {
return false;
}
if (StringUtils.isNotEmpty(code.getStatus()) && !"0".equals(code.getStatus())) {
return false;
}
if (StringUtils.isNotEmpty(code.getDelFlag()) && !"0".equals(code.getDelFlag())) {
return false;
}
if (StringUtils.isNotEmpty(code.getRelationTableName()) && !code.getRelationTableName().equals(genTable.getTableName())) {
return false;
}
if (code.getModuleId() == null) {
return true;
}
if (StringUtils.isEmpty(modules)) {
return false;
}
return modules.stream().anyMatch(module -> code.getModuleId().equals(module.getModuleId())
&& (StringUtils.isEmpty(module.getStatus()) || "0".equals(module.getStatus())));
}
/**
* 设置模板变量信息
*

View File

@@ -0,0 +1,233 @@
package com.ruoyi.generator.service;
import com.ruoyi.generator.domain.GenProject;
import com.ruoyi.generator.domain.GenTable;
import com.ruoyi.generator.domain.GenTableColumn;
import com.ruoyi.generator.domain.SysCodeSnippet;
import com.ruoyi.generator.domain.SysProjectModule;
import com.ruoyi.generator.domain.SysProjectStructure;
import com.ruoyi.generator.domain.SysProjectTemplate;
import com.ruoyi.generator.domain.TemplateFile;
import com.ruoyi.generator.mapper.GenProjectMapper;
import com.ruoyi.generator.mapper.GenTableMapper;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
public class GenProjectServiceImplTest {
private GenProjectServiceImpl service;
@Mock
private GenProjectMapper genProjectMapper;
@Mock
private GenTableMapper genTableMapper;
@Mock
private ITemplateFileService templateFileService;
@Mock
private ISysCodeSnippetService codeSnippetService;
@Mock
private ISysProjectModuleService sysProjectModuleService;
@Mock
private ISysProjectTemplateService sysProjectTemplateService;
@Mock
private ISysProjectStructureService sysProjectStructureService;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
service = new GenProjectServiceImpl();
setField("genProjectMapper", genProjectMapper);
setField("genTableMapper", genTableMapper);
setField("templateFileService", templateFileService);
setField("codeSnippetService", codeSnippetService);
setField("sysProjectModuleService", sysProjectModuleService);
setField("sysProjectTemplateService", sysProjectTemplateService);
setField("sysProjectStructureService", sysProjectStructureService);
}
@Test
public void getProjectStructureAttachesTableScopedChildrenToEachGeneratedTableFolder() {
GenProject project = project();
GenTable userTable = table(11L, "sys_user", "User");
GenTable roleTable = table(12L, "sys_role", "Role");
SysProjectTemplate projectTemplate = projectTemplate(100L);
when(genProjectMapper.selectGenProjectById(1L)).thenReturn(project);
when(genTableMapper.selectGenTablesByProjectId(1L)).thenReturn(Arrays.asList(userTable, roleTable));
when(sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(1L, "backend")).thenReturn(projectTemplate);
when(sysProjectStructureService.selectProjectStructureListByModule(1L, 100L)).thenReturn(Arrays.asList(
structure(1L, 0L, "{projectName}", "folder", null, null),
structure(2L, 1L, "src", "folder", null, null),
structure(3L, 2L, "{ClassName}", "folder", 0L, null),
structure(4L, 3L, "{ClassName}Controller.java", "file", 0L, "controller.java.vm")
));
List<Map<String, Object>> structure = service.getProjectStructure(1L, "backend");
Map<String, Object> root = structure.get(0);
assertEquals("demo-app", root.get("name"));
Map<String, Object> src = child(root, 0);
Map<String, Object> userFolder = child(src, 0);
Map<String, Object> roleFolder = child(src, 1);
assertEquals("User", userFolder.get("name"));
assertEquals("Role", roleFolder.get("name"));
assertEquals("UserController.java", child(userFolder, 0).get("name"));
assertEquals("RoleController.java", child(roleFolder, 0).get("name"));
}
@Test
public void previewCodeUsesExactTemplateFileNameMatch() {
GenProject project = project();
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", "controller"),
templateFile("my-controller.java.vm", "wrong")
));
Map<String, String> preview = service.previewCode(1L, 11L, "controller.java.vm", "backend");
assertEquals(1, preview.size());
assertTrue(preview.containsKey("controller.java.vm"));
assertFalse(preview.containsKey("my-controller.java.vm"));
}
@Test
public void previewCodeAppliesOnlyMatchingActiveSnippetToTemplateInsertPoint() {
GenProject project = project();
GenTable table = table(11L, "sys_user", "User");
SysCodeSnippet matching = snippet(1L, "sys_user", "controller.java.vm", "controllerExtraMethods", "public void audit() {}");
SysCodeSnippet unrelatedTable = snippet(1L, "sys_role", "controller.java.vm", "controllerExtraMethods", "public void wrong() {}");
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(matching, unrelatedTable));
when(sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(1L, "backend")).thenReturn(projectTemplate(100L));
when(templateFileService.selectTemplateFilesByTemplateId(100L)).thenReturn(Arrays.asList(
templateFile("controller.java.vm", "class UserController { $controllerExtraMethods }")
));
Map<String, String> preview = service.previewCode(1L, 11L, "controller.java.vm", "backend");
String content = preview.get("controller.java.vm");
assertTrue(content.contains("public void audit() {}"));
assertFalse(content.contains("public void wrong() {}"));
}
@SuppressWarnings("unchecked")
private Map<String, Object> child(Map<String, Object> node, int index) {
return ((List<Map<String, Object>>) node.get("children")).get(index);
}
private void setField(String name, Object value) throws Exception {
Field field = GenProjectServiceImpl.class.getDeclaredField(name);
field.setAccessible(true);
field.set(service, value);
}
private GenProject project() {
GenProject project = new GenProject();
project.setProjectId(1L);
project.setProjectName("Demo");
project.setProjectFileName("demo-app");
project.setPackageName("com.example.demo");
project.setTables(Arrays.asList(table(11L, "sys_user", "User")));
return project;
}
private GenTable table(Long tableId, String tableName, String className) {
GenTable table = new GenTable();
table.setTableId(tableId);
table.setTableName(tableName);
table.setTableComment(className);
table.setClassName(className);
table.setModuleName("system");
table.setBusinessName(className.toLowerCase());
table.setFunctionName(className);
table.setFunctionAuthor("tester");
table.setTplCategory("crud");
table.setOptions("{}");
table.setColumns(Arrays.asList(pkColumn(tableId)));
return table;
}
private GenTableColumn pkColumn(Long tableId) {
GenTableColumn column = new GenTableColumn();
column.setTableId(tableId);
column.setColumnName("id");
column.setColumnType("bigint");
column.setJavaType("Long");
column.setJavaField("id");
column.setIsPk("1");
return column;
}
private SysProjectTemplate projectTemplate(Long templateId) {
SysProjectTemplate projectTemplate = new SysProjectTemplate();
projectTemplate.setProjectId(1L);
projectTemplate.setTemplateId(templateId);
projectTemplate.setTemplateType("backend");
return projectTemplate;
}
private SysProjectModule projectModule(Long moduleId) {
SysProjectModule module = new SysProjectModule();
module.setProjectId(1L);
module.setModuleId(moduleId);
module.setStatus("0");
return module;
}
private SysProjectStructure structure(Long nodeId, Long parentId, String name, String type, Long tableId, String category) {
SysProjectStructure structure = new SysProjectStructure();
structure.setNodeId(nodeId);
structure.setParentId(parentId);
structure.setNodeName(name);
structure.setNodeType(type);
structure.setTemplateId(100L);
structure.setTableId(tableId);
structure.setCategory(category);
structure.setStatus("0");
return structure;
}
private TemplateFile templateFile(String fileName, String fileContent) {
TemplateFile templateFile = new TemplateFile();
templateFile.setTemplateId(100L);
templateFile.setFileName(fileName);
templateFile.setFileContent(fileContent);
return templateFile;
}
private SysCodeSnippet snippet(Long moduleId, String relationTableName, String templateFileName, String insertPoint, String content) {
SysCodeSnippet snippet = new SysCodeSnippet();
snippet.setModuleId(moduleId);
snippet.setRelationTableName(relationTableName);
snippet.setTemplateFileName(templateFileName);
snippet.setInsertPoint(insertPoint);
snippet.setSnippetContent(content);
snippet.setStatus("0");
snippet.setDelFlag("0");
return snippet;
}
}