Support front draft project preview
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
package com.ruoyi.web.controller.front;
|
||||
|
||||
import java.io.IOException;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
@@ -8,6 +11,7 @@ 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.core.controller.BaseController;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
@@ -16,7 +20,9 @@ import com.ruoyi.generator.domain.front.dto.DatabaseDesignResponse;
|
||||
import com.ruoyi.generator.domain.front.dto.FrontProjectCreateRequest;
|
||||
import com.ruoyi.generator.domain.front.dto.FrontProjectUpdateRequest;
|
||||
import com.ruoyi.generator.domain.front.dto.GenerateDatabaseRequest;
|
||||
import com.ruoyi.generator.domain.front.dto.PreviewFileRequest;
|
||||
import com.ruoyi.generator.service.front.IAiGenerateService;
|
||||
import com.ruoyi.generator.service.front.IFrontProjectPreviewService;
|
||||
import com.ruoyi.generator.service.front.IFrontProjectService;
|
||||
|
||||
@RestController
|
||||
@@ -27,6 +33,8 @@ public class FrontProjectController extends BaseController
|
||||
private IFrontProjectService frontProjectService;
|
||||
@Autowired
|
||||
private IAiGenerateService aiGenerateService;
|
||||
@Autowired
|
||||
private IFrontProjectPreviewService frontProjectPreviewService;
|
||||
|
||||
@PostMapping("/create")
|
||||
public AjaxResult create(@RequestBody FrontProjectCreateRequest request)
|
||||
@@ -83,4 +91,40 @@ public class FrontProjectController extends BaseController
|
||||
Long userId = SecurityUtils.getUserId();
|
||||
return success(aiGenerateService.generateDatabase(userId, projectId, request));
|
||||
}
|
||||
|
||||
@PostMapping("/{projectId}/preview")
|
||||
public AjaxResult preview(@PathVariable Long projectId)
|
||||
{
|
||||
Long userId = SecurityUtils.getUserId();
|
||||
frontProjectPreviewService.getStructure(userId, projectId, "backend");
|
||||
frontProjectPreviewService.getStructure(userId, projectId, "frontend");
|
||||
frontProjectPreviewService.getStructure(userId, projectId, "admin_frontend");
|
||||
return toAjax(frontProjectPreviewService.markPreviewReady(userId, projectId));
|
||||
}
|
||||
|
||||
@GetMapping("/{projectId}/structure")
|
||||
public AjaxResult structure(@PathVariable Long projectId, @RequestParam String templateType)
|
||||
{
|
||||
Long userId = SecurityUtils.getUserId();
|
||||
return success(frontProjectPreviewService.getStructure(userId, projectId, templateType));
|
||||
}
|
||||
|
||||
@GetMapping("/{projectId}/file-content")
|
||||
public AjaxResult fileContent(@PathVariable Long projectId, PreviewFileRequest request)
|
||||
{
|
||||
Long userId = SecurityUtils.getUserId();
|
||||
return success(frontProjectPreviewService.getFileContent(userId, projectId, request));
|
||||
}
|
||||
|
||||
@GetMapping("/{projectId}/download")
|
||||
public void download(@PathVariable Long projectId, @RequestParam String templateType, HttpServletResponse response) throws IOException
|
||||
{
|
||||
Long userId = SecurityUtils.getUserId();
|
||||
byte[] data = frontProjectPreviewService.download(userId, projectId, templateType);
|
||||
response.reset();
|
||||
response.setHeader("Content-Disposition", "attachment; filename=\"project.zip\"");
|
||||
response.addHeader("Content-Length", "" + data.length);
|
||||
response.setContentType("application/octet-stream; charset=UTF-8");
|
||||
IOUtils.write(data, response.getOutputStream());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,28 +2,36 @@ package com.ruoyi.generator.service;
|
||||
|
||||
import com.ruoyi.common.exception.ServiceException;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.generator.domain.*;
|
||||
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.Template;
|
||||
import com.ruoyi.generator.domain.TemplateFile;
|
||||
import com.ruoyi.generator.mapper.GenProjectMapper;
|
||||
import com.ruoyi.generator.mapper.GenTableMapper;
|
||||
import com.ruoyi.generator.util.VelocityInitializer;
|
||||
import com.ruoyi.generator.util.VelocityUtils;
|
||||
import org.apache.velocity.VelocityContext;
|
||||
import org.apache.velocity.app.Velocity;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
import org.apache.velocity.VelocityContext;
|
||||
import org.apache.velocity.app.Velocity;
|
||||
|
||||
/**
|
||||
* 项目表 服务层实现
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
@Service
|
||||
public class GenProjectServiceImpl implements IGenProjectService {
|
||||
@Autowired
|
||||
@@ -43,96 +51,60 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
@Autowired
|
||||
private ISysProjectStructureService sysProjectStructureService;
|
||||
|
||||
/**
|
||||
* 查询项目信息
|
||||
*
|
||||
* @param projectId 项目ID
|
||||
* @return 项目信息
|
||||
*/
|
||||
@Override
|
||||
public GenProject selectGenProjectById(Long projectId) {
|
||||
return genProjectMapper.selectGenProjectById(projectId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目列表
|
||||
*
|
||||
* @param genProject 项目信息
|
||||
* @return 项目集合
|
||||
*/
|
||||
@Override
|
||||
public List<GenProject> selectGenProjectList(GenProject genProject) {
|
||||
return genProjectMapper.selectGenProjectList(genProject);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增项目
|
||||
*
|
||||
* @param genProject 项目信息
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int insertGenProject(GenProject genProject) {
|
||||
return genProjectMapper.insertGenProject(genProject);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改项目
|
||||
*
|
||||
* @param genProject 项目信息
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int updateGenProject(GenProject genProject) {
|
||||
return genProjectMapper.updateGenProject(genProject);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除项目对象
|
||||
*
|
||||
* @param projectId 项目ID
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int deleteGenProjectById(Long projectId) {
|
||||
return genProjectMapper.deleteGenProjectById(projectId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除项目信息
|
||||
*
|
||||
* @param projectIds 需要删除的项目ID
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int deleteGenProjectByIds(Long[] projectIds) {
|
||||
return genProjectMapper.deleteGenProjectByIds(projectIds);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取项目结构
|
||||
*
|
||||
* @param projectId 项目ID
|
||||
* @return 项目结构
|
||||
*/
|
||||
@Override
|
||||
public List<Map<String, Object>> getProjectStructure(Long projectId, String type) {
|
||||
GenProject project = getRequiredProject(projectId);
|
||||
project.setTables(genTableMapper.selectGenTablesByProjectId(projectId));
|
||||
return getProjectStructure(project, type);
|
||||
}
|
||||
|
||||
List<GenTable> projectTables = genTableMapper.selectGenTablesByProjectId(projectId);
|
||||
@Override
|
||||
public List<Map<String, Object>> getProjectStructure(GenProject project, String type) {
|
||||
if (project == null) {
|
||||
throw new ServiceException("项目信息不能为空");
|
||||
}
|
||||
List<GenTable> projectTables = project.getTables();
|
||||
if (projectTables == null) {
|
||||
projectTables = new ArrayList<GenTable>();
|
||||
project.setTables(projectTables);
|
||||
}
|
||||
|
||||
List<Map<String, Object>> structure = new ArrayList<>();
|
||||
List<Map<String, Object>> structure = new ArrayList<Map<String, Object>>();
|
||||
SysProjectTemplate projectTemplate = resolveProjectTemplate(project, type);
|
||||
List<SysProjectStructure> structureNodes = selectStructureNodes(project, projectTemplate);
|
||||
|
||||
// 获取项目模板
|
||||
SysProjectTemplate projectTemplate = getRequiredProjectTemplate(project, type);
|
||||
|
||||
// 获取模板关联的项目结构节点
|
||||
List<SysProjectStructure> structureNodes = sysProjectStructureService.selectProjectStructureListByModule(project.getProjectId(), projectTemplate.getTemplateId());
|
||||
|
||||
// 构建树形结构
|
||||
Map<Long, SysProjectStructure> sourceNodeMap = new HashMap<>();
|
||||
Map<String, Map<String, Object>> nodeMap = new LinkedHashMap<>();
|
||||
Map<Long, SysProjectStructure> sourceNodeMap = new HashMap<Long, SysProjectStructure>();
|
||||
Map<String, Map<String, Object>> nodeMap = new LinkedHashMap<String, Map<String, Object>>();
|
||||
for (SysProjectStructure node : structureNodes) {
|
||||
sourceNodeMap.put(node.getNodeId(), node);
|
||||
if (isTableScopedNode(node)) {
|
||||
@@ -146,41 +118,36 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
}
|
||||
}
|
||||
|
||||
// 构建父子关系
|
||||
for (SysProjectStructure node : structureNodes) {
|
||||
if (isTableScopedNode(node)) {
|
||||
// 处理表特定的节点
|
||||
for (GenTable table : projectTables) {
|
||||
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(getNodeKey(node.getNodeId(), null));
|
||||
addNodeToParent(structure, nodeData, node, nodeMap, sourceNodeMap, null);
|
||||
}
|
||||
}
|
||||
|
||||
return structure;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] downloadStructure(Long projectId, String type) {
|
||||
GenProject project = getRequiredProject(projectId);
|
||||
project.setTables(genTableMapper.selectGenTablesByProjectId(projectId));
|
||||
return downloadStructure(project, type);
|
||||
}
|
||||
|
||||
List<GenTable> projectTables = genTableMapper.selectGenTablesByProjectId(projectId);
|
||||
project.setTables(projectTables);
|
||||
|
||||
@Override
|
||||
public byte[] downloadStructure(GenProject project, String type) {
|
||||
if (project == null) {
|
||||
throw new ServiceException("项目信息不能为空");
|
||||
}
|
||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||
ZipOutputStream zip = new ZipOutputStream(outputStream);
|
||||
|
||||
try {
|
||||
// 获取项目结构
|
||||
List<Map<String, Object>> structure = getProjectStructure(projectId, type);
|
||||
|
||||
// 递归处理项目结构
|
||||
processStructure(structure, zip, project, type);
|
||||
|
||||
processStructure(getProjectStructure(project, type), zip, project, type);
|
||||
zip.close();
|
||||
return outputStream.toByteArray();
|
||||
} catch (IOException e) {
|
||||
@@ -201,19 +168,16 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
String fullPath = currentPath + name;
|
||||
|
||||
if ("folder".equals(nodeType)) {
|
||||
// 创建目录,确保以/结尾
|
||||
String folderPath = fullPath + "/";
|
||||
zip.putNextEntry(new ZipEntry(folderPath));
|
||||
zip.closeEntry();
|
||||
|
||||
// 处理子节点,传递当前完整路径
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Map<String, Object>> children = (List<Map<String, Object>>) node.get("children");
|
||||
if (children != null && !children.isEmpty()) {
|
||||
processStructureWithPath(children, zip, project, folderPath, type);
|
||||
}
|
||||
} else if ("file".equals(nodeType)) {
|
||||
// 生成文件内容
|
||||
String content = generateFileContent(project, category, (Long) tableId, type);
|
||||
if (content != null) {
|
||||
zip.putNextEntry(new ZipEntry(fullPath));
|
||||
@@ -224,33 +188,26 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 预览代码
|
||||
*
|
||||
* @param tableId 表编号
|
||||
* @return 预览数据列表
|
||||
*/
|
||||
@Override
|
||||
public Map<String, String> previewCode(Long projectId, Long tableId, String keyword, String type)
|
||||
{
|
||||
Map<String, String> dataMap = new LinkedHashMap<>();
|
||||
public Map<String, String> previewCode(Long projectId, Long tableId, String keyword, String type) {
|
||||
GenProject project = getRequiredProject(projectId);
|
||||
List<GenTable> projectTables = genTableMapper.selectGenTablesByProjectId(projectId);
|
||||
project.setTables(projectTables);
|
||||
project.setTables(genTableMapper.selectGenTablesByProjectId(projectId));
|
||||
return previewCode(project, tableId, keyword, type);
|
||||
}
|
||||
|
||||
SysProjectModule projectModuleFilter = new SysProjectModule();
|
||||
projectModuleFilter.setProjectId(project.getProjectId());
|
||||
List<SysProjectModule> modules = sysProjectModuleService.selectSysProjectModuleList(projectModuleFilter);
|
||||
@Override
|
||||
public Map<String, String> previewCode(GenProject project, Long tableId, String keyword, String type) {
|
||||
if (project == null) {
|
||||
throw new ServiceException("项目信息不能为空");
|
||||
}
|
||||
Map<String, String> dataMap = new LinkedHashMap<String, String>();
|
||||
List<SysProjectModule> modules = getProjectModules(project);
|
||||
|
||||
VelocityInitializer.initVelocity();
|
||||
|
||||
// 获取模板列表
|
||||
SysProjectTemplate projectTemplate = getRequiredProjectTemplate(project, type);
|
||||
SysProjectTemplate projectTemplate = resolveProjectTemplate(project, type);
|
||||
List<TemplateFile> templateFileList = getRequiredTemplateFiles(projectTemplate.getTemplateId());
|
||||
for (TemplateFile templateFile : templateFileList)
|
||||
{
|
||||
for (TemplateFile templateFile : templateFileList) {
|
||||
if (matchesTemplateFile(templateFile, keyword)) {
|
||||
// 渲染模板
|
||||
dataMap.put(templateFile.getFileName(), renderTemplate(project, tableId, modules, templateFile));
|
||||
}
|
||||
}
|
||||
@@ -261,22 +218,16 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
if (project == null) {
|
||||
throw new ServiceException("项目信息不能为空");
|
||||
}
|
||||
SysProjectModule projectModuleFilter = new SysProjectModule();
|
||||
projectModuleFilter.setProjectId(project.getProjectId());
|
||||
List<SysProjectModule> modules = sysProjectModuleService.selectSysProjectModuleList(projectModuleFilter);
|
||||
List<SysProjectModule> modules = getProjectModules(project);
|
||||
|
||||
VelocityInitializer.initVelocity();
|
||||
|
||||
// 获取模板列表
|
||||
SysProjectTemplate projectTemplate = getRequiredProjectTemplate(project, type);
|
||||
SysProjectTemplate projectTemplate = resolveProjectTemplate(project, type);
|
||||
List<TemplateFile> templateFileList = getRequiredTemplateFiles(projectTemplate.getTemplateId());
|
||||
for (TemplateFile templateFile : templateFileList)
|
||||
{
|
||||
for (TemplateFile templateFile : templateFileList) {
|
||||
if (matchesTemplateFile(templateFile, category)) {
|
||||
try {
|
||||
return renderTemplate(project, tableId, modules, templateFile);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new ServiceException("渲染模板失败,表名:" + tableId);
|
||||
}
|
||||
}
|
||||
@@ -284,6 +235,12 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
throw new ServiceException("未找到模板文件:" + category);
|
||||
}
|
||||
|
||||
private List<SysProjectModule> getProjectModules(GenProject project) {
|
||||
SysProjectModule projectModuleFilter = new SysProjectModule();
|
||||
projectModuleFilter.setProjectId(project.getProjectId());
|
||||
return sysProjectModuleService.selectSysProjectModuleList(projectModuleFilter);
|
||||
}
|
||||
|
||||
private GenProject getRequiredProject(Long projectId) {
|
||||
GenProject project = genProjectMapper.selectGenProjectById(projectId);
|
||||
if (project == null) {
|
||||
@@ -292,14 +249,41 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
return project;
|
||||
}
|
||||
|
||||
private SysProjectTemplate getRequiredProjectTemplate(GenProject project, String type) {
|
||||
private SysProjectTemplate resolveProjectTemplate(GenProject project, String type) {
|
||||
SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type);
|
||||
if (projectTemplate == null || projectTemplate.getTemplateId() == null) {
|
||||
throw new ServiceException("项目未配置" + type + "模板");
|
||||
}
|
||||
if (projectTemplate != null && projectTemplate.getTemplateId() != null) {
|
||||
return projectTemplate;
|
||||
}
|
||||
|
||||
Template templateFilter = new Template();
|
||||
templateFilter.setTemplateType(type);
|
||||
List<Template> templates = templateService.selectTemplateList(templateFilter);
|
||||
if (StringUtils.isNotEmpty(templates)) {
|
||||
for (Template template : templates) {
|
||||
if (template != null && template.getTemplateId() != null && Long.valueOf(0L).equals(template.getTemplateStatus())) {
|
||||
SysProjectTemplate fallbackTemplate = new SysProjectTemplate();
|
||||
fallbackTemplate.setProjectId(project.getProjectId());
|
||||
fallbackTemplate.setTemplateId(template.getTemplateId());
|
||||
fallbackTemplate.setTemplateType(type);
|
||||
return fallbackTemplate;
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new ServiceException("未配置可用模板:" + type);
|
||||
}
|
||||
|
||||
private List<SysProjectStructure> selectStructureNodes(GenProject project, SysProjectTemplate projectTemplate) {
|
||||
SysProjectTemplate boundProjectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(
|
||||
project.getProjectId(), projectTemplate.getTemplateType());
|
||||
if (boundProjectTemplate != null && boundProjectTemplate.getTemplateId() != null) {
|
||||
return sysProjectStructureService.selectProjectStructureListByModule(project.getProjectId(), projectTemplate.getTemplateId());
|
||||
}
|
||||
SysProjectStructure query = new SysProjectStructure();
|
||||
query.setTemplateId(projectTemplate.getTemplateId());
|
||||
query.setStatus("0");
|
||||
return sysProjectStructureService.selectSysProjectStructureList(query);
|
||||
}
|
||||
|
||||
private List<TemplateFile> getRequiredTemplateFiles(Long templateId) {
|
||||
List<TemplateFile> templateFileList = templateFileService.selectTemplateFilesByTemplateId(templateId);
|
||||
if (StringUtils.isEmpty(templateFileList)) {
|
||||
@@ -317,14 +301,14 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
}
|
||||
|
||||
private Map<String, Object> createStructureNodeData(SysProjectStructure node, GenProject project, GenTable table) {
|
||||
Map<String, Object> nodeData = new LinkedHashMap<>();
|
||||
Map<String, Object> nodeData = new LinkedHashMap<String, Object>();
|
||||
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<>());
|
||||
nodeData.put("children", new ArrayList<Map<String, Object>>());
|
||||
}
|
||||
return nodeData;
|
||||
}
|
||||
@@ -387,12 +371,10 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
|
||||
private VelocityContext prepareVelocityContext(GenProject project, Long tableId, List<SysProjectModule> modules, TemplateFile templateFile) {
|
||||
if (tableId != null && tableId != -1) {
|
||||
GenTable table = getRequiredTable(tableId);
|
||||
GenTable table = getRequiredTable(project, tableId);
|
||||
table.setModules(modules);
|
||||
table.setPackageName(project.getPackageName());
|
||||
// 设置主子表信息
|
||||
setSubTable(table);
|
||||
// 设置主键列信息
|
||||
setPkColumn(table);
|
||||
VelocityContext context = VelocityUtils.prepareContext(table);
|
||||
putSnippetVariables(context, table, modules, templateFile);
|
||||
@@ -401,7 +383,17 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
return VelocityUtils.prepareContextProject(project);
|
||||
}
|
||||
|
||||
private GenTable getRequiredTable(Long tableId) {
|
||||
private GenTable getRequiredTable(GenProject project, Long tableId) {
|
||||
if (project != null && StringUtils.isNotEmpty(project.getTables())) {
|
||||
for (GenTable projectTable : project.getTables()) {
|
||||
if (projectTable != null && tableId.equals(projectTable.getTableId())) {
|
||||
if (StringUtils.isEmpty(projectTable.getColumns())) {
|
||||
throw new ServiceException("业务表未配置字段:" + projectTable.getTableName());
|
||||
}
|
||||
return projectTable;
|
||||
}
|
||||
}
|
||||
}
|
||||
GenTable table = genTableMapper.selectGenTableById(tableId);
|
||||
if (table == null) {
|
||||
throw new ServiceException("业务表不存在:" + tableId);
|
||||
@@ -420,7 +412,7 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
return;
|
||||
}
|
||||
|
||||
Map<String, StringBuilder> snippetContentMap = new LinkedHashMap<>();
|
||||
Map<String, StringBuilder> snippetContentMap = new LinkedHashMap<String, StringBuilder>();
|
||||
for (SysCodeSnippet snippet : codeSnippetList) {
|
||||
if (StringUtils.isNotEmpty(snippet.getInsertPoint())) {
|
||||
snippetContentMap.putIfAbsent(snippet.getInsertPoint(), new StringBuilder());
|
||||
@@ -481,11 +473,6 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
|| matchesTemplateFile(templateFile, snippet.getTemplateFileName());
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置主键列信息
|
||||
*
|
||||
* @param table 业务表信息
|
||||
*/
|
||||
private void setPkColumn(GenTable table) {
|
||||
for (GenTableColumn column : table.getColumns()) {
|
||||
if (column.isPk()) {
|
||||
@@ -498,11 +485,6 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置主子表信息
|
||||
*
|
||||
* @param table 业务表信息
|
||||
*/
|
||||
public void setSubTable(GenTable table) {
|
||||
String subTableName = table.getSubTableName();
|
||||
if (StringUtils.isNotEmpty(subTableName)) {
|
||||
|
||||
@@ -69,6 +69,8 @@ public interface IGenProjectService
|
||||
*/
|
||||
public List<Map<String, Object>> getProjectStructure(Long projectId, String type);
|
||||
|
||||
public List<Map<String, Object>> getProjectStructure(GenProject project, String type);
|
||||
|
||||
/**
|
||||
* 预览代码
|
||||
*
|
||||
@@ -77,6 +79,8 @@ public interface IGenProjectService
|
||||
*/
|
||||
public Map<String, String> previewCode(Long projectId, Long tableId, String keyword, String type);
|
||||
|
||||
public Map<String, String> previewCode(GenProject project, Long tableId, String keyword, String type);
|
||||
|
||||
/**
|
||||
* 下载项目结构
|
||||
*
|
||||
@@ -84,4 +88,6 @@ public interface IGenProjectService
|
||||
* @return 项目结构ZIP文件字节数组
|
||||
*/
|
||||
public byte[] downloadStructure(Long projectId, String type);
|
||||
|
||||
public byte[] downloadStructure(GenProject project, String type);
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package com.ruoyi.generator.service.front;
|
||||
|
||||
import com.ruoyi.generator.domain.GenProject;
|
||||
import com.ruoyi.generator.domain.front.FrontProject;
|
||||
import com.ruoyi.generator.domain.front.FrontProjectTable;
|
||||
import com.ruoyi.generator.domain.front.dto.PreviewFileRequest;
|
||||
import com.ruoyi.generator.mapper.front.FrontProjectColumnMapper;
|
||||
import com.ruoyi.generator.mapper.front.FrontProjectMapper;
|
||||
import com.ruoyi.generator.mapper.front.FrontProjectTableMapper;
|
||||
import com.ruoyi.generator.service.IGenProjectService;
|
||||
import com.ruoyi.common.exception.ServiceException;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class FrontProjectPreviewServiceImpl implements IFrontProjectPreviewService
|
||||
{
|
||||
@Autowired
|
||||
private IFrontProjectService frontProjectService;
|
||||
@Autowired
|
||||
private IGenProjectService genProjectService;
|
||||
@Autowired
|
||||
private FrontProjectTableMapper frontProjectTableMapper;
|
||||
@Autowired
|
||||
private FrontProjectColumnMapper frontProjectColumnMapper;
|
||||
@Autowired
|
||||
private FrontProjectMapper frontProjectMapper;
|
||||
|
||||
@Override
|
||||
public List<Map<String, Object>> getStructure(Long userId, Long projectId, String templateType)
|
||||
{
|
||||
GenProject genProject = loadGenProject(userId, projectId);
|
||||
return genProjectService.getProjectStructure(genProject, templateType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getFileContent(Long userId, Long projectId, PreviewFileRequest request)
|
||||
{
|
||||
if (request == null)
|
||||
{
|
||||
throw new ServiceException("预览文件参数不能为空");
|
||||
}
|
||||
GenProject genProject = loadGenProject(userId, projectId);
|
||||
return genProjectService.previewCode(genProject, request.getTableId(), request.getCategory(), request.getTemplateType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] download(Long userId, Long projectId, String templateType)
|
||||
{
|
||||
GenProject genProject = loadGenProject(userId, projectId);
|
||||
return genProjectService.downloadStructure(genProject, templateType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int markPreviewReady(Long userId, Long projectId)
|
||||
{
|
||||
frontProjectService.getProject(userId, projectId);
|
||||
FrontProject project = new FrontProject();
|
||||
project.setProjectId(projectId);
|
||||
project.setPreviewStatus("1");
|
||||
return frontProjectMapper.updateFrontProject(project);
|
||||
}
|
||||
|
||||
private GenProject loadGenProject(Long userId, Long projectId)
|
||||
{
|
||||
FrontProject frontProject = frontProjectService.getProject(userId, projectId);
|
||||
if (frontProject.getTables() == null)
|
||||
{
|
||||
List<FrontProjectTable> tables = frontProjectTableMapper.selectTablesByProjectId(projectId);
|
||||
if (tables == null)
|
||||
{
|
||||
tables = new ArrayList<FrontProjectTable>();
|
||||
}
|
||||
for (FrontProjectTable table : tables)
|
||||
{
|
||||
table.setColumns(frontProjectColumnMapper.selectColumnsByTableId(table.getTableId()));
|
||||
}
|
||||
frontProject.setTables(tables);
|
||||
}
|
||||
return FrontProjectConverter.toGenProject(frontProject);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.ruoyi.generator.service.front;
|
||||
|
||||
import com.ruoyi.generator.domain.front.dto.PreviewFileRequest;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public interface IFrontProjectPreviewService
|
||||
{
|
||||
public List<Map<String, Object>> getStructure(Long userId, Long projectId, String templateType);
|
||||
|
||||
public Map<String, String> getFileContent(Long userId, Long projectId, PreviewFileRequest request);
|
||||
|
||||
public byte[] download(Long userId, Long projectId, String templateType);
|
||||
|
||||
public int markPreviewReady(Long userId, Long projectId);
|
||||
}
|
||||
@@ -7,11 +7,13 @@ 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.Template;
|
||||
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.ArgumentCaptor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
@@ -25,6 +27,8 @@ import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
public class GenProjectServiceImplTest {
|
||||
private GenProjectServiceImpl service;
|
||||
@@ -34,6 +38,8 @@ public class GenProjectServiceImplTest {
|
||||
@Mock
|
||||
private GenTableMapper genTableMapper;
|
||||
@Mock
|
||||
private ITemplateService templateService;
|
||||
@Mock
|
||||
private ITemplateFileService templateFileService;
|
||||
@Mock
|
||||
private ISysCodeSnippetService codeSnippetService;
|
||||
@@ -50,6 +56,7 @@ public class GenProjectServiceImplTest {
|
||||
service = new GenProjectServiceImpl();
|
||||
setField("genProjectMapper", genProjectMapper);
|
||||
setField("genTableMapper", genTableMapper);
|
||||
setField("templateService", templateService);
|
||||
setField("templateFileService", templateFileService);
|
||||
setField("codeSnippetService", codeSnippetService);
|
||||
setField("sysProjectModuleService", sysProjectModuleService);
|
||||
@@ -134,6 +141,38 @@ public class GenProjectServiceImplTest {
|
||||
assertFalse(content.contains("public void wrong() {}"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getProjectStructureForDraftProjectUsesFirstActiveTemplateWithoutLoadingProject() {
|
||||
GenProject project = project();
|
||||
project.setTables(Arrays.asList(table(11L, "sys_user", "User")));
|
||||
|
||||
when(sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(1L, "backend")).thenReturn(null);
|
||||
when(templateService.selectTemplateList(any(Template.class))).thenReturn(Arrays.asList(
|
||||
template(99L, 1L),
|
||||
template(101L, 0L)
|
||||
));
|
||||
when(sysProjectStructureService.selectSysProjectStructureList(any(SysProjectStructure.class))).thenReturn(Arrays.asList(
|
||||
structure(1L, 0L, "{projectName}", "folder", null, null),
|
||||
structure(2L, 1L, "{ClassName}.java", "file", 0L, "controller.java.vm")
|
||||
));
|
||||
|
||||
List<Map<String, Object>> structure = service.getProjectStructure(project, "backend");
|
||||
|
||||
Map<String, Object> root = structure.get(0);
|
||||
assertEquals("demo-app", root.get("name"));
|
||||
assertEquals("User.java", child(root, 0).get("name"));
|
||||
verify(genProjectMapper, never()).selectGenProjectById(any(Long.class));
|
||||
|
||||
ArgumentCaptor<Template> templateCaptor = ArgumentCaptor.forClass(Template.class);
|
||||
verify(templateService).selectTemplateList(templateCaptor.capture());
|
||||
assertEquals("backend", templateCaptor.getValue().getTemplateType());
|
||||
|
||||
ArgumentCaptor<SysProjectStructure> structureCaptor = ArgumentCaptor.forClass(SysProjectStructure.class);
|
||||
verify(sysProjectStructureService).selectSysProjectStructureList(structureCaptor.capture());
|
||||
assertEquals(Long.valueOf(101L), structureCaptor.getValue().getTemplateId());
|
||||
assertEquals("0", structureCaptor.getValue().getStatus());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private Map<String, Object> child(Map<String, Object> node, int index) {
|
||||
return ((List<Map<String, Object>>) node.get("children")).get(index);
|
||||
@@ -190,6 +229,14 @@ public class GenProjectServiceImplTest {
|
||||
return projectTemplate;
|
||||
}
|
||||
|
||||
private Template template(Long templateId, Long templateStatus) {
|
||||
Template template = new Template();
|
||||
template.setTemplateId(templateId);
|
||||
template.setTemplateType("backend");
|
||||
template.setTemplateStatus(templateStatus);
|
||||
return template;
|
||||
}
|
||||
|
||||
private SysProjectModule projectModule(Long moduleId) {
|
||||
SysProjectModule module = new SysProjectModule();
|
||||
module.setProjectId(1L);
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
package com.ruoyi.generator.service.front;
|
||||
|
||||
import com.ruoyi.generator.domain.GenProject;
|
||||
import com.ruoyi.generator.domain.front.FrontProject;
|
||||
import com.ruoyi.generator.domain.front.FrontProjectColumn;
|
||||
import com.ruoyi.generator.domain.front.FrontProjectTable;
|
||||
import com.ruoyi.generator.service.IGenProjectService;
|
||||
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.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
public class FrontProjectPreviewServiceImplTest
|
||||
{
|
||||
private FrontProjectPreviewServiceImpl previewService;
|
||||
|
||||
@Mock
|
||||
private IFrontProjectService frontProjectService;
|
||||
@Mock
|
||||
private IGenProjectService genProjectService;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception
|
||||
{
|
||||
MockitoAnnotations.initMocks(this);
|
||||
previewService = new FrontProjectPreviewServiceImpl();
|
||||
setField("frontProjectService", frontProjectService);
|
||||
setField("genProjectService", genProjectService);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void returnsStructureForDraftProject()
|
||||
{
|
||||
when(frontProjectService.getProject(100L, 200L)).thenReturn(frontProjectWithOneTable());
|
||||
when(genProjectService.getProjectStructure(any(GenProject.class), eq("backend")))
|
||||
.thenReturn(Collections.singletonList(Collections.singletonMap("label", "backend")));
|
||||
|
||||
List<Map<String, Object>> structure = previewService.getStructure(100L, 200L, "backend");
|
||||
|
||||
assertEquals("backend", structure.get(0).get("label"));
|
||||
}
|
||||
|
||||
private void setField(String name, Object value) throws Exception
|
||||
{
|
||||
Field field = FrontProjectPreviewServiceImpl.class.getDeclaredField(name);
|
||||
field.setAccessible(true);
|
||||
field.set(previewService, value);
|
||||
}
|
||||
|
||||
private FrontProject frontProjectWithOneTable()
|
||||
{
|
||||
FrontProject project = new FrontProject();
|
||||
project.setProjectId(200L);
|
||||
project.setProjectName("Demo");
|
||||
project.setProjectFileName("demo");
|
||||
project.setPackageName("com.example.demo");
|
||||
project.setTables(Arrays.asList(table()));
|
||||
return project;
|
||||
}
|
||||
|
||||
private FrontProjectTable table()
|
||||
{
|
||||
FrontProjectTable table = new FrontProjectTable();
|
||||
table.setTableId(300L);
|
||||
table.setTableName("sys_user");
|
||||
table.setClassName("User");
|
||||
table.setColumns(Arrays.asList(column()));
|
||||
return table;
|
||||
}
|
||||
|
||||
private FrontProjectColumn column()
|
||||
{
|
||||
FrontProjectColumn column = new FrontProjectColumn();
|
||||
column.setTableId(300L);
|
||||
column.setColumnName("id");
|
||||
column.setJavaType("Long");
|
||||
column.setJavaField("id");
|
||||
column.setIsPk("1");
|
||||
return column;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user