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`分支