Harden front draft preview isolation

This commit is contained in:
王鹏
2026-05-22 16:02:34 +08:00
parent 1593db9189
commit ca3242915b
4 changed files with 87 additions and 5 deletions

View File

@@ -55,6 +55,8 @@ public class GenProject extends BaseEntity
@Excel(name = "状态", readConverterExp = "0=正常,1=停用") @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
private String status; private String status;
private transient Boolean frontDraft;
private List<GenTable> tables; private List<GenTable> tables;
public void setProjectId(Long projectId) public void setProjectId(Long projectId)
@@ -165,6 +167,18 @@ public class GenProject extends BaseEntity
this.tables = tables; this.tables = tables;
} }
public Boolean getFrontDraft() {
return frontDraft;
}
public void setFrontDraft(Boolean frontDraft) {
this.frontDraft = frontDraft;
}
public boolean isFrontDraft() {
return Boolean.TRUE.equals(frontDraft);
}
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -185,4 +199,4 @@ public class GenProject extends BaseEntity
.append("remark", getRemark()) .append("remark", getRemark())
.toString(); .toString();
} }
} }

View File

@@ -236,6 +236,9 @@ public class GenProjectServiceImpl implements IGenProjectService {
} }
private List<SysProjectModule> getProjectModules(GenProject project) { private List<SysProjectModule> getProjectModules(GenProject project) {
if (project.isFrontDraft()) {
return new ArrayList<SysProjectModule>();
}
SysProjectModule projectModuleFilter = new SysProjectModule(); SysProjectModule projectModuleFilter = new SysProjectModule();
projectModuleFilter.setProjectId(project.getProjectId()); projectModuleFilter.setProjectId(project.getProjectId());
return sysProjectModuleService.selectSysProjectModuleList(projectModuleFilter); return sysProjectModuleService.selectSysProjectModuleList(projectModuleFilter);
@@ -250,11 +253,17 @@ public class GenProjectServiceImpl implements IGenProjectService {
} }
private SysProjectTemplate resolveProjectTemplate(GenProject project, String type) { private SysProjectTemplate resolveProjectTemplate(GenProject project, String type) {
SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type); if (!project.isFrontDraft()) {
if (projectTemplate != null && projectTemplate.getTemplateId() != null) { SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type);
return projectTemplate; if (projectTemplate != null && projectTemplate.getTemplateId() != null) {
return projectTemplate;
}
} }
return resolveActiveTemplate(project.getProjectId(), type);
}
private SysProjectTemplate resolveActiveTemplate(Long projectId, String type) {
Template templateFilter = new Template(); Template templateFilter = new Template();
templateFilter.setTemplateType(type); templateFilter.setTemplateType(type);
List<Template> templates = templateService.selectTemplateList(templateFilter); List<Template> templates = templateService.selectTemplateList(templateFilter);
@@ -262,7 +271,7 @@ public class GenProjectServiceImpl implements IGenProjectService {
for (Template template : templates) { for (Template template : templates) {
if (template != null && template.getTemplateId() != null && Long.valueOf(0L).equals(template.getTemplateStatus())) { if (template != null && template.getTemplateId() != null && Long.valueOf(0L).equals(template.getTemplateStatus())) {
SysProjectTemplate fallbackTemplate = new SysProjectTemplate(); SysProjectTemplate fallbackTemplate = new SysProjectTemplate();
fallbackTemplate.setProjectId(project.getProjectId()); fallbackTemplate.setProjectId(projectId);
fallbackTemplate.setTemplateId(template.getTemplateId()); fallbackTemplate.setTemplateId(template.getTemplateId());
fallbackTemplate.setTemplateType(type); fallbackTemplate.setTemplateType(type);
return fallbackTemplate; return fallbackTemplate;
@@ -273,6 +282,12 @@ public class GenProjectServiceImpl implements IGenProjectService {
} }
private List<SysProjectStructure> selectStructureNodes(GenProject project, SysProjectTemplate projectTemplate) { private List<SysProjectStructure> selectStructureNodes(GenProject project, SysProjectTemplate projectTemplate) {
if (project.isFrontDraft()) {
SysProjectStructure query = new SysProjectStructure();
query.setTemplateId(projectTemplate.getTemplateId());
query.setStatus("0");
return sysProjectStructureService.selectSysProjectStructureList(query);
}
SysProjectTemplate boundProjectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType( SysProjectTemplate boundProjectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(
project.getProjectId(), projectTemplate.getTemplateType()); project.getProjectId(), projectTemplate.getTemplateType());
if (boundProjectTemplate != null && boundProjectTemplate.getTemplateId() != null) { if (boundProjectTemplate != null && boundProjectTemplate.getTemplateId() != null) {
@@ -394,6 +409,9 @@ public class GenProjectServiceImpl implements IGenProjectService {
} }
} }
} }
if (project != null && project.isFrontDraft()) {
throw new ServiceException("Table is not in front draft: " + tableId);
}
GenTable table = genTableMapper.selectGenTableById(tableId); GenTable table = genTableMapper.selectGenTableById(tableId);
if (table == null) { if (table == null) {
throw new ServiceException("业务表不存在:" + tableId); throw new ServiceException("业务表不存在:" + tableId);

View File

@@ -18,6 +18,7 @@ public class FrontProjectConverter
return null; return null;
} }
GenProject genProject = new GenProject(); GenProject genProject = new GenProject();
genProject.setFrontDraft(true);
genProject.setProjectId(project.getProjectId()); genProject.setProjectId(project.getProjectId());
genProject.setProjectName(project.getProjectName()); genProject.setProjectName(project.getProjectName());
genProject.setProjectFileName(project.getProjectFileName()); genProject.setProjectFileName(project.getProjectFileName());

View File

@@ -1,5 +1,6 @@
package com.ruoyi.generator.service; package com.ruoyi.generator.service;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.generator.domain.GenProject; import com.ruoyi.generator.domain.GenProject;
import com.ruoyi.generator.domain.GenTable; import com.ruoyi.generator.domain.GenTable;
import com.ruoyi.generator.domain.GenTableColumn; import com.ruoyi.generator.domain.GenTableColumn;
@@ -173,6 +174,54 @@ public class GenProjectServiceImplTest {
assertEquals("0", structureCaptor.getValue().getStatus()); assertEquals("0", structureCaptor.getValue().getStatus());
} }
@Test
public void frontDraftProjectStructureIgnoresProjectTemplateBindingAndModules() {
GenProject project = project();
project.setFrontDraft(true);
project.setTables(Arrays.asList(table(11L, "sys_user", "User")));
when(sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(1L, "backend")).thenReturn(projectTemplate(999L));
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");
assertEquals("demo-app", structure.get(0).get("name"));
assertEquals("User.java", child(structure.get(0), 0).get("name"));
verify(sysProjectTemplateService, never()).selectSysProjectTemplateByProjectAndType(1L, "backend");
verify(sysProjectStructureService, never()).selectProjectStructureListByModule(1L, 999L);
verify(sysProjectModuleService, never()).selectSysProjectModuleList(any(SysProjectModule.class));
ArgumentCaptor<SysProjectStructure> structureCaptor = ArgumentCaptor.forClass(SysProjectStructure.class);
verify(sysProjectStructureService).selectSysProjectStructureList(structureCaptor.capture());
assertEquals(Long.valueOf(101L), structureCaptor.getValue().getTemplateId());
assertEquals("0", structureCaptor.getValue().getStatus());
}
@Test(expected = ServiceException.class)
public void frontDraftPreviewRejectsTableOutsideDraftWithoutMapperFallback() {
GenProject project = project();
project.setFrontDraft(true);
project.setTables(Arrays.asList(table(11L, "sys_user", "User")));
when(templateService.selectTemplateList(any(Template.class))).thenReturn(Arrays.asList(template(101L, 0L)));
when(templateFileService.selectTemplateFilesByTemplateId(101L)).thenReturn(Arrays.asList(
templateFile("controller.java.vm", "class Outside {}")
));
try {
service.previewCode(project, 99L, "controller.java.vm", "backend");
} finally {
verify(genTableMapper, never()).selectGenTableById(99L);
}
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private Map<String, Object> child(Map<String, Object> node, int index) { private Map<String, Object> child(Map<String, Object> node, int index) {
return ((List<Map<String, Object>>) node.get("children")).get(index); return ((List<Map<String, Object>>) node.get("children")).get(index);