diff --git a/changelog.md b/changelog.md
index e694b1dee3fc00ede4e3708e40e9bdb164f3141d..660c06ec568bd22136af80e01ffbb6a3af18564f 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,11 +1,20 @@
# changelog
+## 1.5.2
+
+- 支持`SqlServer`字段长度信息(`${column.maxLength}`,`${column.scale}`)
+- 修复没有主键无法生成问题
+
+## 1.5.1
+
+- 表字段信息,增加字段长度信息(`${column.maxLength}`,`${column.scale}`),目前只支持 mysql 和 oracle. [PR](https://gitee.com/durcframework/code-gen/pulls/12)
+
## 1.5.0
**注意:**
> 从1.5.0开始前端打包后的文件不再放到`resource/public`下,而是单独放到外面`gen/view`下。
-> 理论上前端打包后的文件也属于编译后的文件,同class文件一样,不能提交到git,git只存放源码,这样在做些PR合并的时候会减少文件的冲突。
+> 理论上前端打包后的文件也属于编译后的文件,同class文件一样,不能提交到git,git只存放源码,这样在合并PR的时候会减少文件的冲突。
- 支持oracle服务名和SID连接 [pr](https://gitee.com/durcframework/code-gen/pulls/11)
- 支持模板指定目录名称 by Mario Luo
diff --git a/front/README.md b/front/README.md
index 6823cfbc704b8df9fbdff35fd7990b59e9d95ead..ac13180bcd2c8774c28bd39706d1dee1837c7613 100644
--- a/front/README.md
+++ b/front/README.md
@@ -4,8 +4,8 @@
1. 启动服务端程序
2. `cd front`
-3. 执行`npm install --registry=https://registry.npm.taobao.org`
-4. 执行`npm run dev`,访问`http://localhost:9528/`
+3. 执行`npm install --registry=https://registry.npm.taobao.org`,(下载依赖,执行一次即可)
+4. 执行`npm run dev`,访问`http://localhost:9528/`,(后续每次启动都需要执行)
- 修改端口号:打开`vue.config.js`,找到`port`属性
diff --git a/front/public/velocity/java.json b/front/public/velocity/java.json
index 38f64ca873ad21335fab73f24c798b44089b2107..28e970a51d9ca4c50ee7dd07263040dec5ee7df3 100644
--- a/front/public/velocity/java.json
+++ b/front/public/velocity/java.json
@@ -165,6 +165,14 @@
{
"expression": "${column.comment}",
"text": "字段注释"
+ },
+ {
+ "expression": "${column.maxLength}",
+ "text": "字段长度"
+ },
+ {
+ "expression": "${column.scale}",
+ "text": "小数位长度"
}
]
}
diff --git a/front/src/views/generate/GenerateConfig/index.vue b/front/src/views/generate/GenerateConfig/index.vue
index c6c087878f8d85a45daabcabcaf2934ad583df6c..474ebdaa5bc600ae7587c06dc6fb2df435639981 100644
--- a/front/src/views/generate/GenerateConfig/index.vue
+++ b/front/src/views/generate/GenerateConfig/index.vue
@@ -31,6 +31,9 @@
+
+
+
@@ -153,7 +156,7 @@
-
+
+
+
+
rowMap){
Set columnSet = rowMap.keySet();
-
+
for (String columnInfo : columnSet) {
rowMap.put(columnInfo.toUpperCase(), rowMap.get(columnInfo));
}
-
+
ColumnDefinition columnDefinition = new ColumnDefinition();
columnDefinition.setColumnName(FieldUtil.convertString(rowMap.get("FIELD")));
-
+
boolean isIdentity = "auto_increment".equalsIgnoreCase(FieldUtil.convertString(rowMap.get("EXTRA")));
columnDefinition.setIsIdentity(isIdentity);
-
+
boolean isPk = "PRI".equalsIgnoreCase(FieldUtil.convertString(rowMap.get("KEY")));
columnDefinition.setIsPk(isPk);
-
+
String type = FieldUtil.convertString(rowMap.get("TYPE"));
columnDefinition.setType(TYPE_FORMATTER.format(type));
-
+
columnDefinition.setComment(FieldUtil.convertString(rowMap.get("COMMENT")));
-
+
+ String maxLength = FieldUtil.convertString(rowMap.get("MAXLENGTH"));
+ columnDefinition.setMaxLength(new Integer(StringUtils.isEmpty(maxLength) ? "0" : maxLength));
+
+ String scale = FieldUtil.convertString(rowMap.get("SCALE"));
+ columnDefinition.setScale(new Integer(StringUtils.isEmpty(scale) ? "0" : scale));
+
return columnDefinition;
}
-}
+}
\ No newline at end of file
diff --git a/gen/src/main/java/com/gitee/gen/gen/oracle/OracleColumnSelector.java b/gen/src/main/java/com/gitee/gen/gen/oracle/OracleColumnSelector.java
index 987496a0263bc0fbdf0ef78c219b4a51ed3e60e4..f4ea5150af12ab2caf97b940e9853a26b689e22c 100644
--- a/gen/src/main/java/com/gitee/gen/gen/oracle/OracleColumnSelector.java
+++ b/gen/src/main/java/com/gitee/gen/gen/oracle/OracleColumnSelector.java
@@ -18,7 +18,7 @@ public class OracleColumnSelector extends ColumnSelector {
private static final TypeFormatter TYPE_FORMATTER = new OracleTypeFormatter();
// private static final String COLUMN_SQL = "select "
-// + " utc.column_name as FIELD,utc.data_type TYPE, utc.data_scale SCALE, utc.data_length 最大长度, "
+// + " utc.column_name as FIELD,utc.data_type TYPE, utc.data_scale SCALE, utc.data_length MAXLENGTH, "
// + " CASE utc.nullable WHEN 'N' THEN '否' ELSE '是' END 可空, "
// + " utc.data_default 默认值,ucc.comments COMMENTS,UTC.table_name 表名, "
// + " CASE UTC.COLUMN_NAME "
@@ -39,7 +39,7 @@ public class OracleColumnSelector extends ColumnSelector {
// + " column_id ";
private static final String COLUMN_SQL = " SELECT " +
- " atc.COLUMN_NAME FIELD, atc.DATA_TYPE TYPE, atc.DATA_SCALE SCALE, atc.DATA_LENGTH 最大长度, " +
+ " atc.COLUMN_NAME FIELD, atc.DATA_TYPE TYPE, atc.DATA_SCALE SCALE, atc.DATA_LENGTH MAXLENGTH, " +
" CASE atc.NULLABLE WHEN 'N' THEN '否' ELSE '是' END 可空, " +
" atc.DATA_DEFAULT 默认值, acc.COMMENTS COMMENTS, atc.TABLE_NAME 表名, " +
" CASE atc.COLUMN_NAME " +
@@ -66,24 +66,24 @@ public class OracleColumnSelector extends ColumnSelector {
String owner = this.getGeneratorConfig().getSchemaName();
return String.format(COLUMN_SQL, tableName, owner, tableName, owner);
}
-
+
@Override
protected ColumnDefinition buildColumnDefinition(Map rowMap){
Set columnSet = rowMap.keySet();
-
+
for (String columnInfo : columnSet) {
rowMap.put(columnInfo.toUpperCase(), rowMap.get(columnInfo));
}
-
+
ColumnDefinition columnDefinition = new ColumnDefinition();
-
+
columnDefinition.setColumnName(FieldUtil.convertString(rowMap.get("FIELD")));
columnDefinition.setIsIdentity(false);
-
+
boolean isPk = "true".equalsIgnoreCase(FieldUtil.convertString(rowMap.get("KEY")));
columnDefinition.setIsPk(isPk);
-
+
String type = FieldUtil.convertString(rowMap.get("TYPE"));
// 如果是number
if (StringUtils.containsIgnoreCase(type, "number")) {
@@ -96,11 +96,17 @@ public class OracleColumnSelector extends ColumnSelector {
type = "0".equals(scale) ? "int" : "decimal";
}
columnDefinition.setType(TYPE_FORMATTER.format(type));
-
+
columnDefinition.setComment(FieldUtil.convertString(rowMap.get("COMMENTS")));
+ String maxLength = FieldUtil.convertString(rowMap.get("MAXLENGTH"));
+ columnDefinition.setMaxLength(new Integer(StringUtils.isEmpty(maxLength) ? "0" : maxLength));
+
+ String scale = FieldUtil.convertString(rowMap.get("SCALE"));
+ columnDefinition.setScale(new Integer(StringUtils.isEmpty(scale) ? "0" : scale));
+
return columnDefinition;
}
-
-}
+
+}
\ No newline at end of file
diff --git a/gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlColumnSelector.java b/gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlColumnSelector.java
index 4c99314803714fec447fbe519fe8af9ebd7b9aa1..c330875c27ec63564ff1149e80c91a6fef7dc44d 100644
--- a/gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlColumnSelector.java
+++ b/gen/src/main/java/com/gitee/gen/gen/postgresql/PostgreSqlColumnSelector.java
@@ -30,13 +30,14 @@ public class PostgreSqlColumnSelector extends ColumnSelector {
"CASE WHEN POSITION ( 'nextval' IN column_default ) > 0 THEN 1 ELSE 0 END AS is_identity " +
"FROM " +
" pg_constraint " +
- " INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid " +
- " INNER JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid " +
- " INNER JOIN pg_type ON pg_type.oid = pg_attribute.atttypid " +
- " INNER JOIN information_schema.COLUMNS C ON C.TABLE_NAME = pg_class.relname " +
+ " RIGHT JOIN pg_class ON pg_constraint.conrelid = pg_class.oid " +
+ " RIGHT JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid " +
+ " RIGHT JOIN pg_type ON pg_type.oid = pg_attribute.atttypid " +
+ " RIGHT JOIN information_schema.COLUMNS C ON C.TABLE_NAME = pg_class.relname " +
" AND C.COLUMN_NAME = pg_attribute.attname " +
"WHERE " +
- " pg_class.relname = '%s' and pg_constraint.contype = 'p' " +
+ " pg_class.relname = '%s' " +
+// " and pg_constraint.contype = 'p' " +
" AND pg_attribute.attnum > 0";
@Override
@@ -69,7 +70,7 @@ public class PostgreSqlColumnSelector extends ColumnSelector {
boolean isIdentity = "1".equals(convertString(rowMap.get("IS_IDENTITY")));
columnDefinition.setIsIdentity(isIdentity);
- boolean isPk = (Boolean) rowMap.get("IS_PK");
+ boolean isPk = (Boolean) (rowMap.get("IS_PK") != null ? rowMap.get("IS_PK") : false);
columnDefinition.setIsPk(isPk);
String type = convertString(rowMap.get("TYPE"));
diff --git a/gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerColumnSelector.java b/gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerColumnSelector.java
index 99d8b89115c15f2115a0003aad395d6e005ca2ed..1e26a08e1c635053c6e04c68f39334bd7e18cd2c 100644
--- a/gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerColumnSelector.java
+++ b/gen/src/main/java/com/gitee/gen/gen/sqlserver/SqlServerColumnSelector.java
@@ -4,6 +4,7 @@ import com.gitee.gen.gen.ColumnDefinition;
import com.gitee.gen.gen.ColumnSelector;
import com.gitee.gen.gen.GeneratorConfig;
import com.gitee.gen.util.FieldUtil;
+import org.springframework.util.StringUtils;
import java.util.Map;
import java.util.Set;
@@ -15,6 +16,8 @@ public class SqlServerColumnSelector extends ColumnSelector {
private static String TABKE_DETAIL_SQL = new StringBuilder()
.append("SELECT")
.append(" col.name AS column_name")
+ .append(" , col.max_length AS MaxLength") //sqlserver 字段长度
+ .append(" , col.scale AS Scale") //sqlserver 字段精度
.append(" , bt.name AS type")
.append(" , col.is_identity")
.append(" , ext.value AS comment")
@@ -101,6 +104,13 @@ public class SqlServerColumnSelector extends ColumnSelector {
columnDefinition.setType(TYPE_FORMATTER.format(type));
columnDefinition.setComment(FieldUtil.convertString(rowMap.get("COMMENT")));
+
+ //sqlserver 字段长度
+ String maxLength = FieldUtil.convertString(rowMap.get("MAXLENGTH"));
+ columnDefinition.setMaxLength(Integer.parseInt(StringUtils.isEmpty(maxLength) ? "0" : maxLength));
+ //sqlserver 字段精度
+ String scale = FieldUtil.convertString(rowMap.get("SCALE"));
+ columnDefinition.setScale(Integer.parseInt(StringUtils.isEmpty(scale) ? "0" : scale));
return columnDefinition;
}
diff --git a/gen/src/main/java/com/gitee/gen/service/GeneratorService.java b/gen/src/main/java/com/gitee/gen/service/GeneratorService.java
index da3dd34a658546953c0da952e10acc22178aad6f..bd07cf6b8880255dea91c46d0a6a1170255808aa 100644
--- a/gen/src/main/java/com/gitee/gen/service/GeneratorService.java
+++ b/gen/src/main/java/com/gitee/gen/service/GeneratorService.java
@@ -18,6 +18,7 @@ import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
@@ -55,6 +56,7 @@ public class GeneratorService {
for (SQLContext sqlContext : contextList) {
setPackageName(sqlContext, generatorParam.getPackageName());
setDelPrefix(sqlContext, generatorParam.getDelPrefix());
+ setAuthor(sqlContext, generatorParam.getAuthor());
for (int tcId : generatorParam.getTemplateConfigIdList()) {
TemplateConfig template = templateConfigService.getById(tcId);
String folder = template.getFolder();
@@ -127,15 +129,24 @@ public class GeneratorService {
}
}
+ private void setAuthor(SQLContext sqlContext, String author) {
+ if (StringUtils.hasText(author)) {
+ sqlContext.setAuthor(author);
+ }
+ }
+
private String doGenerator(SQLContext sqlContext, String template) {
if (template == null) {
return "";
}
VelocityContext context = new VelocityContext();
-
+ Object pkColumn = sqlContext.getTableDefinition().getPkColumn();
+ if (pkColumn == null) {
+ pkColumn = Collections.emptyMap();
+ }
context.put("context", sqlContext);
context.put("table", sqlContext.getTableDefinition());
- context.put("pk", sqlContext.getTableDefinition().getPkColumn());
+ context.put("pk", pkColumn);
context.put("columns", sqlContext.getTableDefinition().getColumnDefinitions());
context.put("csharpColumns", sqlContext.getTableDefinition().getCsharpColumnDefinitions());
diff --git a/gen/src/main/java/com/gitee/gen/service/UpgradeService.java b/gen/src/main/java/com/gitee/gen/service/UpgradeService.java
index 88c5e9c9ebf191e5198cf2657be7f9996c1f7ea2..bc3eb1a91229aef9d0476a33228cc7cd7298bdc4 100644
--- a/gen/src/main/java/com/gitee/gen/service/UpgradeService.java
+++ b/gen/src/main/java/com/gitee/gen/service/UpgradeService.java
@@ -53,6 +53,7 @@ public class UpgradeService {
upgradeV1_4_0();
upgradeV1_4_12();
upgradeV1_4_17();
+ upgradeV1_5_2();
}
private void upgradeV1_4_17() {
@@ -82,6 +83,18 @@ public class UpgradeService {
runSql("update template_config set group_id=1,group_name='default' where group_id IS NULL");
}
+ /**
+ * 升级v1.5.2
+ * 1、前端:修复修改数据源时候不管什么数据库都带出oracle数据库
+ * 2、前端:新增oracle类型数据库 数据库角色可以为空
+ * 3、前端:修复数据库类型为oracle数据库时候测试连接服务器字段展示undefined问题
+ * 4、前后端:新增author作者名配置,方便模板中插入作者
+ * 5、后端:修复postgresql数据库表如果没有设置主键无法获取列数组问题
+ */
+ private void upgradeV1_5_2() {
+ this.addColumn(TABLE_DATASOURCE_CONFIG, "author", "varchar(255)");
+ }
+
private void runSql(String sql) {
upgradeMapper.runSql(sql);
}
diff --git a/readme.md b/readme.md
index ab121d0242c2661869d9455ebe91bfcf079a503f..4fad04546766dc0055fb24b85b2d1ef21139f638 100644
--- a/readme.md
+++ b/readme.md
@@ -48,6 +48,11 @@ clone代码,然后执行`docker-build.sh`脚本
- db:数据库初始化文件
- script:辅助脚本
+## 本地开发
+
+- 运行`gen`下的`com.gitee.gen.GenApplication`(SpringBoot工程)
+- 运行`front`下的前端项目,详见:[readme](./front/README.md)
+
## 参与贡献
欢迎贡献代码,完善功能,PR请提交到`pr`分支