Skip to content

Commit 559d8c7

Browse files
committed
##35 add base project
1 parent fb288e5 commit 559d8c7

25 files changed

+1026
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.fluent.base;
2+
3+
import io.fluent.base.upload.model.UploadFileModel;
4+
import org.springframework.boot.autoconfigure.domain.EntityScan;
5+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
6+
import org.springframework.context.annotation.ComponentScan;
7+
import org.springframework.context.annotation.Configuration;
8+
import xyz.erupt.core.annotation.EruptScan;
9+
import xyz.erupt.core.constant.MenuTypeEnum;
10+
import xyz.erupt.core.module.EruptModule;
11+
import xyz.erupt.core.module.EruptModuleInvoke;
12+
import xyz.erupt.core.module.MetaMenu;
13+
import xyz.erupt.core.module.ModuleInfo;
14+
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
@Configuration
19+
@ComponentScan
20+
@EntityScan
21+
@EruptScan
22+
@EnableConfigurationProperties
23+
public class FluentUploadTCModule implements EruptModule {
24+
25+
public FluentUploadTCModule() {
26+
}
27+
28+
@Override
29+
public ModuleInfo info() {
30+
return ModuleInfo.builder().name("fluent-tc-sync").build();
31+
}
32+
33+
@Override
34+
public void run() {
35+
EruptModule.super.run();
36+
}
37+
38+
@Override
39+
public List<MetaMenu> initMenus() {
40+
List<MetaMenu> menus = new ArrayList<>();
41+
menus.add(MetaMenu.createRootMenu("$tc-upload", "测试文件管理", "fa fa-file", 100));
42+
MetaMenu tfUploadSyncMenu = MetaMenu.createEruptClassMenu(UploadFileModel.class, menus.get(0), 0, MenuTypeEnum.TABLE);
43+
tfUploadSyncMenu.setIcon("fa fa-folder-open");
44+
tfUploadSyncMenu.setName("测试文件同步");
45+
tfUploadSyncMenu.setCode("$tc-upload-sync");
46+
menus.add(tfUploadSyncMenu);
47+
return menus;
48+
}
49+
50+
static {
51+
EruptModuleInvoke.addEruptModule(FluentUploadTCModule.class);
52+
}
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package io.fluent.base.upload.model;
2+
3+
import io.fluent.base.upload.proxy.UploadFileDataProxy;
4+
import io.fluent.base.product.model.ProductModuleModel;
5+
import lombok.Data;
6+
import xyz.erupt.annotation.Erupt;
7+
import xyz.erupt.annotation.EruptField;
8+
import xyz.erupt.annotation.PreDataProxy;
9+
import xyz.erupt.annotation.sub_field.Edit;
10+
import xyz.erupt.annotation.sub_field.EditType;
11+
import xyz.erupt.annotation.sub_field.View;
12+
import xyz.erupt.annotation.sub_field.sub_edit.AttachmentType;
13+
import xyz.erupt.annotation.sub_field.sub_edit.ChoiceType;
14+
import xyz.erupt.annotation.sub_field.sub_edit.InputType;
15+
import xyz.erupt.annotation.sub_field.sub_edit.Search;
16+
import xyz.erupt.toolkit.handler.SqlChoiceFetchHandler;
17+
18+
import javax.persistence.Entity;
19+
import javax.persistence.Table;
20+
21+
@Erupt(name = "测试相关文件上传同步", orderBy = "UploadFileModel.createTime desc")
22+
@Table(name = "uploaded_files")
23+
@Entity
24+
@Data
25+
@PreDataProxy(value = UploadFileDataProxy.class)
26+
public class UploadFileModel extends ProductModuleModel {
27+
28+
@EruptField(
29+
views = @View(title = "用途"),
30+
edit = @Edit(
31+
search = @Search,
32+
title = "获取可选类型",
33+
type = EditType.CHOICE,
34+
desc = "动态获取可选类型",
35+
notNull = true,
36+
choiceType = @ChoiceType(
37+
fetchHandler = SqlChoiceFetchHandler.class,
38+
fetchHandlerParams = "select distinct code,name from master_data where category='UPLOAD_FILE_USAGE' and valid=true"
39+
))
40+
)
41+
private String usage;
42+
43+
44+
@EruptField(
45+
views = @View(title = "文件上传"),
46+
edit = @Edit(title = "文件上传", type = EditType.ATTACHMENT,
47+
attachmentType = @AttachmentType(size = 100000))
48+
)
49+
private String attachment;
50+
51+
@EruptField(
52+
views = @View(
53+
title = "用途描述"
54+
),
55+
edit = @Edit(
56+
title = "用途描述",
57+
type = EditType.TEXTAREA, notNull = true,
58+
inputType = @InputType
59+
)
60+
)
61+
private String comments;
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package io.fluent.base.upload;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package io.fluent.base.upload.proxy;
2+
3+
4+
5+
import cn.hutool.core.bean.BeanUtil;
6+
import io.fluent.excel.ExcelReadWriter;
7+
import io.fluent.base.product.model.ProductModuleModel;
8+
import io.fluent.qtm.tc.dto.TestCaseDTO;
9+
import io.fluent.qtm.tc.service.TestCaseService;
10+
import io.fluent.qtm.tc.service.impl.MindMappingService;
11+
import lombok.extern.slf4j.Slf4j;
12+
import xyz.erupt.core.prop.EruptProp;
13+
import xyz.erupt.core.util.EruptSpringUtil;
14+
import xyz.erupt.jpa.model.MetaDataProxy;
15+
import xyz.erupt.jpa.model.MetaModel;
16+
17+
import java.util.List;
18+
19+
@Slf4j
20+
public class UploadFileDataProxy extends MetaDataProxy {
21+
private final MindMappingService mindMappingService;
22+
private final TestCaseService testCaseService;
23+
private final EruptProp eruptProp;
24+
private final ExcelReadWriter excelReadWriter;
25+
26+
public UploadFileDataProxy() {
27+
mindMappingService = EruptSpringUtil.getBean(MindMappingService.class);
28+
testCaseService = EruptSpringUtil.getBean(TestCaseService.class);
29+
eruptProp = EruptSpringUtil.getBean(EruptProp.class);
30+
excelReadWriter = new ExcelReadWriter();
31+
}
32+
33+
@Override
34+
public void beforeAdd(MetaModel metaModel) {
35+
//before add, add some check here
36+
super.beforeAdd(metaModel);
37+
}
38+
39+
@Override
40+
public void afterAdd(MetaModel metaModel) {
41+
//after add, then doing business process
42+
log.info("start handler uploaded file");
43+
String filePath = getUploaderFilePath(metaModel);
44+
String uploadType = BeanUtil.getProperty(metaModel, "usage");
45+
46+
if(UploadFileTypeEnum.parseType(uploadType).equals(UploadFileTypeEnum.EXCEL_TC)){
47+
ProductModuleModel product = BeanUtil.getProperty(metaModel, "product");
48+
ProductModuleModel module = BeanUtil.getProperty(metaModel, "module");
49+
testCaseService.saveTestCases(getExcelTestCases(filePath),product,module,metaModel.getUpdateBy());
50+
}
51+
if(UploadFileTypeEnum.parseType(uploadType).equals(UploadFileTypeEnum.FREEMIND)){
52+
mindMappingService.saveTestCases(filePath,metaModel);
53+
}
54+
}
55+
56+
private List<TestCaseDTO> getExcelTestCases(String filePath){
57+
return excelReadWriter.readExcel(filePath, TestCaseDTO.class);
58+
}
59+
60+
private String getUploaderFilePath(MetaModel metaModel) {
61+
return eruptProp.getUploadPath() + BeanUtil.getProperty(metaModel, "attachment");
62+
}
63+
64+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.fluent.base.upload.proxy;
2+
3+
public enum UploadFileTypeEnum {
4+
EXCEL_TC,FREEMIND,PM,MINDMAP;
5+
6+
public static UploadFileTypeEnum parseType(String uploadFileType) {
7+
for (UploadFileTypeEnum uploadFileTypeEnum : UploadFileTypeEnum.values()) {
8+
if (uploadFileTypeEnum.name().equals(uploadFileType)) {
9+
return uploadFileTypeEnum;
10+
}
11+
}
12+
throw new RuntimeException("UploadFileTypeEnum is not found for " + uploadFileType);
13+
}
14+
}

fluent-apps/workspace/pom.xml

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>io.fluentqa</groupId>
8+
<artifactId>fluent-apps</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
</parent>
11+
12+
<artifactId>workspace</artifactId>
13+
14+
<properties>
15+
<maven.compiler.source>21</maven.compiler.source>
16+
<maven.compiler.target>21</maven.compiler.target>
17+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18+
</properties>
19+
20+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.fluent;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.boot.autoconfigure.domain.EntityScan;
6+
import org.springframework.scheduling.annotation.EnableAsync;
7+
import xyz.erupt.core.annotation.EruptScan;
8+
9+
@SpringBootApplication
10+
@EnableAsync
11+
@EruptScan
12+
@EntityScan
13+
public class QAMApp {
14+
/**
15+
* QA Management Application Entrypoint
16+
* @param args
17+
*/
18+
public static void main(String[] args) {
19+
SpringApplication.run(QAMApp.class);
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package io.fluent.base;
2+
3+
import io.fluent.base.masterdata.model.MasterData;
4+
import io.fluent.base.product.model.ProductModuleModel;
5+
import io.fluent.base.project.model.ProjectModel;
6+
import org.springframework.boot.autoconfigure.domain.EntityScan;
7+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
8+
import org.springframework.context.annotation.ComponentScan;
9+
import org.springframework.context.annotation.Configuration;
10+
import xyz.erupt.core.annotation.EruptScan;
11+
import xyz.erupt.core.constant.MenuTypeEnum;
12+
import xyz.erupt.core.module.EruptModule;
13+
import xyz.erupt.core.module.EruptModuleInvoke;
14+
import xyz.erupt.core.module.MetaMenu;
15+
import xyz.erupt.core.module.ModuleInfo;
16+
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
20+
@Configuration
21+
@ComponentScan
22+
@EntityScan
23+
@EruptScan
24+
@EnableConfigurationProperties
25+
public class FluentProductConfigModule implements EruptModule {
26+
27+
public FluentProductConfigModule() {
28+
}
29+
30+
@Override
31+
public ModuleInfo info() {
32+
return ModuleInfo.builder().name("fluent-product").build();
33+
}
34+
35+
@Override
36+
public void run() {
37+
EruptModule.super.run();
38+
}
39+
40+
@Override
41+
public List<MetaMenu> initMenus() {
42+
List<MetaMenu> menus = new ArrayList<>();
43+
menus.add(MetaMenu.createRootMenu("$fluent-master", "产品配置", "fa fa-product-hunt", 90));
44+
MetaMenu productMetaMenu = MetaMenu.createEruptClassMenu(ProductModuleModel.class, menus.get(0), 0, MenuTypeEnum.TABLE);
45+
productMetaMenu.setIcon("fa fa-group");
46+
productMetaMenu.setName("产品元数据");
47+
productMetaMenu.setCode("$product-meta");
48+
menus.add(productMetaMenu);
49+
MetaMenu masterDataMenu = MetaMenu.createEruptClassMenu(MasterData.class, menus.get(0), 1, MenuTypeEnum.TABLE);
50+
masterDataMenu.setIcon("fa fa-times");
51+
masterDataMenu.setName("产品字典表配置");
52+
masterDataMenu.setCode("$master-data");
53+
menus.add(masterDataMenu);
54+
MetaMenu projectMenu = MetaMenu.createEruptClassMenu(ProjectModel.class, menus.get(0), 2, MenuTypeEnum.TABLE);
55+
projectMenu.setIcon("fa fa-linode");
56+
projectMenu.setName("项目配置");
57+
projectMenu.setCode("$project-meta");
58+
menus.add(projectMenu);
59+
return menus;
60+
}
61+
62+
static {
63+
EruptModuleInvoke.addEruptModule(FluentProductConfigModule.class);
64+
}
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# README
2+
3+
shared component:
4+
5+
- master data: shared configurations
6+
- upload data: upload component
7+
- product: product module
8+
- project: project module
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package io.fluent.base.masterdata.model;
2+
3+
import io.fluent.base.handlers.SqlTagFetchHandler;
4+
import io.fluent.base.model.ModelWithValidFlagVo;
5+
import lombok.Data;
6+
import xyz.erupt.annotation.Erupt;
7+
import xyz.erupt.annotation.EruptField;
8+
import xyz.erupt.annotation.sub_erupt.Power;
9+
import xyz.erupt.annotation.sub_field.Edit;
10+
import xyz.erupt.annotation.sub_field.EditType;
11+
import xyz.erupt.annotation.sub_field.View;
12+
import xyz.erupt.annotation.sub_field.sub_edit.InputType;
13+
import xyz.erupt.annotation.sub_field.sub_edit.Search;
14+
import xyz.erupt.annotation.sub_field.sub_edit.TagsType;
15+
16+
import javax.persistence.Entity;
17+
import javax.persistence.Table;
18+
19+
20+
@Erupt(name = "产品字典值配置", power = @Power(importable = true, export = true))
21+
@Table(name = "master_data")
22+
@Entity
23+
@Data
24+
public class MasterData extends ModelWithValidFlagVo {
25+
26+
@EruptField(
27+
views = @View(title = "分类"),
28+
edit = @Edit(
29+
search = @Search(vague = true),
30+
title = "获取可选种类",
31+
type = EditType.TAGS,
32+
desc = "动态获取可选种类",
33+
tagsType = @TagsType(
34+
fetchHandler = SqlTagFetchHandler.class,
35+
fetchHandlerParams = "select distinct category from master_data where valid=true"
36+
))
37+
)
38+
private String category;
39+
40+
@EruptField(
41+
views = @View(
42+
title = "名称"
43+
),
44+
edit = @Edit(
45+
title = "名称",
46+
type = EditType.INPUT, search = @Search, notNull = true,
47+
inputType = @InputType
48+
)
49+
)
50+
private String name;
51+
52+
@EruptField(
53+
views = @View(
54+
title = "详细描述"
55+
),
56+
edit = @Edit(
57+
title = "详细描述",
58+
type = EditType.INPUT,
59+
inputType = @InputType
60+
)
61+
)
62+
private String detail;
63+
64+
@EruptField(
65+
views = @View(
66+
title = "代号"
67+
),
68+
edit = @Edit(
69+
title = "代号",
70+
type = EditType.INPUT, search = @Search, notNull = true,
71+
inputType = @InputType
72+
)
73+
)
74+
private String code;
75+
76+
}

0 commit comments

Comments
 (0)