SaaS系统从0到1搭建,07代码生成(逻辑篇) 前言 思路

前言

车队管理类似的SaaS平台,从0到1,继续..

上一篇咱撸到代码生成的模板,模板或者说代码生成更加友好、更可配的方式,有一些方案各有优劣吧,那本篇继续模板后的实现逻辑。

(我是后半夜Java,在掘金这分享下经验,那些靠copy的搬运作者,未经允许,不要copy文章了)

思路

通过表名,获取表相关信息,调用模板去生成对应代码

实现

control就不写了,就个表名List 就可以,我们先看Service逻辑。这个是参考人人开源的,目前开源的项目还是蛮多的。
返回byte字节是方便给前端导出下载,,让人你要直接生成放到本地路径也可以

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
typescript复制代码import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipOutputStream;

/**
* 代码生成器
*/
@Service
public class SysGeneratorService {
@Autowired
private GeneratorDao generatorDao;

/**
* 通过表名称去生成代码,支持多表一起
* @param tableNames 表明集合
* @return
*/
public byte[] generatorCode(String[] tableNames) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
for(String tableName : tableNames){
//查询表信息
Map<String, String> table = queryTable(tableName);
//查询列信息
List<Map<String, String>> columns = queryColumns(tableName);
//生成代码
GenUtils.generatorCode(table, columns, zip);
}
IOUtils.closeQuietly(zip);
return outputStream.toByteArray();
}
/**
* 根据表名查询表相关信息
* @param tableName
* @return
*/
public Map<String, String> queryTable(String tableName) {
return generatorDao.queryTable(tableName);
}

/**
* 通过表名获取表的字段信息
* @param tableName
* @return
*/
public List<Map<String, String>> queryColumns(String tableName) {
return generatorDao.queryColumns(tableName);
}
}

代码生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
ini复制代码private static final String COLUMN_NAME = "columnName";
private static final String TABLE_NAME = "tableName";
private static final String TABLE_COMMENT = "tableComment";
private static final String TABLE_PREFIX = "tablePrefix";
private static final String DATA_TYPE = "dataType";
private static final String COLUMN_COMMENT = "columnComment";
private static final String EXTRA = "extra";
private static final String UNKNOW_TYPE = "unknowType";
private static final String BIGDECIMAL = "BigDecimal";
private static final String COLUMN_KEY = "columnKey";
private static final String PRI = "PRI";
/**
* 生成代码
*/
public static void generatorCode(Map<String, String> table,
List<Map<String, String>> columns, ZipOutputStream zip){
//配置信息
Configuration config = getConfig();
boolean hasBigDecimal = false;
//表信息
TableEntity tableEntity = new TableEntity();
tableEntity.setTableName(table.get(TABLE_NAME));
tableEntity.setComments(table.get(TABLE_COMMENT));
//表名转换成Java类名
String className = tableToJava(tableEntity.getTableName(), config.getString(TABLE_PREFIX));
tableEntity.setClassName(className);
tableEntity.setClassname(StringUtils.uncapitalize(className));

//列信息
List<ColumnEntity> columsList = new ArrayList<>();
for(Map<String, String> column : columns){
ColumnEntity entity = new ColumnEntity();
entity.setColumnName(column.get(COLUMN_NAME));
entity.setDataType(column.get(DATA_TYPE));
entity.setComments(column.get(COLUMN_COMMENT));
entity.setExtra(column.get(EXTRA));
String attrName = columnToJava(entity.getColumnName());
entity.setAttrName(attrName);
entity.setAttrname(StringUtils.uncapitalize(attrName));
String attrType = config.getString(entity.getDataType(), UNKNOW_TYPE);
entity.setAttrType(attrType);
if (!hasBigDecimal && attrType.equals(BIGDECIMAL)) {
hasBigDecimal = true;
}
//是否主键
if(PRI.equalsIgnoreCase(column.get(COLUMN_KEY)) && tableEntity.getPk() == null){
tableEntity.setPk(entity);
}
columsList.add(entity);
}
tableEntity.setColumns(columsList);

//没主键,则第一个字段为主键
if(tableEntity.getPk() == null){
tableEntity.setPk(tableEntity.getColumns().get(0));
}

总结

代码生成,有很多案例,没有哪个最好,先这样吧,感觉这个大家手头估计都有几个。

SaaS系统从0到1搭建,未完待续….

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%