完善代码生成项目功能和测试数据
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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())));
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置模板变量信息
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user