修改: 控制层代码生成

master
曹世达 6 months ago
parent 301e0cf0e0
commit 365deda38d

@ -45,9 +45,9 @@ public class ColumnBuilder {
ColumnInfo result = new ColumnInfo(); ColumnInfo result = new ColumnInfo();
String columnName = SQL_HELPER.getLabelColumnName(); String columnName = SQL_HELPER.getLabelColumnName();
result.setColumnName(column.get(columnName)); result.setColumnName(column.get(columnName));
String fieldName = StrUtils.toCamelCase(result.getColumnName(), false); String fieldName = StrUtils.snakeToCamelCase(result.getColumnName());
result.setFieldName(fieldName); result.setFieldName(fieldName);
String fieldNameCap = StrUtils.toCamelCase(result.getColumnName(), true); String fieldNameCap = StrUtils.snakeToPascalCase(result.getColumnName());
result.setFieldNameCap(fieldNameCap); result.setFieldNameCap(fieldNameCap);
String columnComment = SQL_HELPER.getLabelColumnComment(); String columnComment = SQL_HELPER.getLabelColumnComment();
@ -57,6 +57,9 @@ public class ColumnBuilder {
result.setDbType(column.get(dbType)); result.setDbType(column.get(dbType));
String javaType = TypeUtils.toJavaType(result.getDbType()); String javaType = TypeUtils.toJavaType(result.getDbType());
result.setJavaType(javaType); result.setJavaType(javaType);
result.setDecimalType(TypeUtils.isDecimalType(javaType));
result.setDateType(TypeUtils.isDateType(javaType));
String autoIncrement = SQL_HELPER.getLabelAutoIncrement(); String autoIncrement = SQL_HELPER.getLabelAutoIncrement();
result.setAutoIncrement(SqlHelper.VALUE_AUTO_INCREMENT_YES.equals(column.get(autoIncrement))); result.setAutoIncrement(SqlHelper.VALUE_AUTO_INCREMENT_YES.equals(column.get(autoIncrement)));

@ -123,6 +123,8 @@ public class SourceBuilder {
} }
private Map<String, Object> loadExtra(String tableName) { private Map<String, Object> loadExtra(String tableName) {
extra.put("apiPrefix", CfgUtils.getProjectApiPrefix());
extra.put("moduleName", CfgUtils.getModuleName());
extra.put("mapperPackageName", CfgUtils.getMapperPackageName()); extra.put("mapperPackageName", CfgUtils.getMapperPackageName());
extra.put("entityPackageName", CfgUtils.getEntityPackageName()); extra.put("entityPackageName", CfgUtils.getEntityPackageName());
extra.put("resPackageName", CfgUtils.getResPackageName()); extra.put("resPackageName", CfgUtils.getResPackageName());
@ -142,9 +144,11 @@ public class SourceBuilder {
extra.put("reqNameSuffix", CfgUtils.getReqNameSuffix()); extra.put("reqNameSuffix", CfgUtils.getReqNameSuffix());
extra.put("queryNameSuffix", CfgUtils.getQueryNameSuffix()); extra.put("queryNameSuffix", CfgUtils.getQueryNameSuffix());
extra.put("mybatisMapperEnable", CfgUtils.mybatisMapperEnable()); extra.put("mybatisMapperEnable", CfgUtils.mybatisMapperEnable());
String tableNameWithoutPrefix = getTableNameWithoutPrefix(tableName); String tableNameWithoutPrefix = getTableNameWithoutPrefix(tableName);
extra.put("ClassName", StrUtils.toCamelCase(tableNameWithoutPrefix, true)); extra.put("ClassName", StrUtils.snakeToPascalCase(tableNameWithoutPrefix));
extra.put("className", StrUtils.toCamelCase(tableNameWithoutPrefix, false)); extra.put("className", StrUtils.snakeToCamelCase(tableNameWithoutPrefix));
extra.put("urlName", StrUtils.snakeToKebabCase(tableNameWithoutPrefix));
return extra; return extra;
} }
@ -152,9 +156,9 @@ public class SourceBuilder {
private String getTableNameWithoutPrefix(String tableNameWithoutPrefix) { private String getTableNameWithoutPrefix(String tableNameWithoutPrefix) {
List<String> tablePrefixes = CONFIG.getStringList(CfgUtils.DATABASE_TABLE_PREFIXES); List<String> tablePrefixes = CONFIG.getStringList(CfgUtils.DATABASE_TABLE_PREFIXES);
for (String tablePrefix : tablePrefixes) { for (String tablePrefix : tablePrefixes) {
tableNameWithoutPrefix = StrUtils.removePrefix(tableNameWithoutPrefix, tablePrefix); tableNameWithoutPrefix = StrUtils.removePrefixCaseIgnore(tableNameWithoutPrefix, tablePrefix);
} }
return tableNameWithoutPrefix; return tableNameWithoutPrefix.toLowerCase();
} }
private void build(TableInfo tableInfo, List<OutputInfo> outputInfoList) { private void build(TableInfo tableInfo, List<OutputInfo> outputInfoList) {

@ -8,7 +8,6 @@ import space.caoshd.otone.helper.SqlHelper;
import space.caoshd.otone.util.CfgUtils; import space.caoshd.otone.util.CfgUtils;
import space.caoshd.otone.util.DBUtils; import space.caoshd.otone.util.DBUtils;
import space.caoshd.otone.util.JsonUtils; import space.caoshd.otone.util.JsonUtils;
import space.caoshd.otone.util.TypeUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -55,11 +54,8 @@ public class TableBuilder {
List<ColumnInfo> columnInfo = loadColumnInfo(tableSchema, tableName); List<ColumnInfo> columnInfo = loadColumnInfo(tableSchema, tableName);
result.setColumns(columnInfo); result.setColumns(columnInfo);
result.setDateExists(columnInfo.stream() result.setDateExists(columnInfo.stream().anyMatch(ColumnInfo::getDateType));
.anyMatch(column -> TypeUtils.JAVA_TYPE_DATE.equals(column.getJavaType()))); result.setDecimalExists(columnInfo.stream().anyMatch(ColumnInfo::getDecimalType));
result.setDecimalExists(columnInfo.stream()
.anyMatch(column -> TypeUtils.JAVA_TYPE_DECIMAL.equals(column.getJavaType())));
String invalidColumn = columnInfo.stream() String invalidColumn = columnInfo.stream()
.map(ColumnInfo::getColumnName) .map(ColumnInfo::getColumnName)

@ -10,6 +10,8 @@ public class ColumnInfo {
private String comment; private String comment;
private Boolean autoIncrement; private Boolean autoIncrement;
private Boolean primary; private Boolean primary;
private Boolean dateType;
private Boolean decimalType;
public String getColumnName() { public String getColumnName() {
return columnName; return columnName;
@ -75,4 +77,19 @@ public class ColumnInfo {
this.primary = primary; this.primary = primary;
} }
public Boolean getDateType() {
return dateType;
}
public void setDateType(Boolean dateType) {
this.dateType = dateType;
}
public Boolean getDecimalType() {
return decimalType;
}
public void setDecimalType(Boolean decimalType) {
this.decimalType = decimalType;
}
} }

@ -21,6 +21,7 @@ public class CfgUtils {
// 项目配置 // 项目配置
public static final String PROJECT_PATH_BASE = "project.path.base"; public static final String PROJECT_PATH_BASE = "project.path.base";
public static final String PROJECT_PATH_JAVA = "project.path.java"; public static final String PROJECT_PATH_JAVA = "project.path.java";
public static final String PROJECT_API_PREFIX = "project.api.prefix";
public static final String PROJECT_PATH_RESOURCES = "project.path.resources"; public static final String PROJECT_PATH_RESOURCES = "project.path.resources";
// 包配置 // 包配置
@ -115,6 +116,10 @@ public class CfgUtils {
// 私有化构造器 // 私有化构造器
private CfgUtils() {} private CfgUtils() {}
public static String getProjectApiPrefix() {
return CONFIG.getString(PROJECT_API_PREFIX);
}
public static String getDatabaseType() { public static String getDatabaseType() {
return CONFIG.getString(DATABASE_TYPE); return CONFIG.getString(DATABASE_TYPE);
} }
@ -132,6 +137,10 @@ public class CfgUtils {
return CONFIG.getString(PROJECT_PATH_BASE).replaceAll("\\\\", "/"); return CONFIG.getString(PROJECT_PATH_BASE).replaceAll("\\\\", "/");
} }
public static String getModuleName() {
return StrUtils.getSuffix(getProjectBasePath(), "/");
}
public static Boolean mybatisMapperEnable() { public static Boolean mybatisMapperEnable() {
return CONFIG.getBoolean(OUTPUT_MYBATIS_MAPPER, Boolean.TRUE); return CONFIG.getBoolean(OUTPUT_MYBATIS_MAPPER, Boolean.TRUE);
} }
@ -218,7 +227,7 @@ public class CfgUtils {
} }
public static String getControllerPackageName() { public static String getControllerPackageName() {
String moduleName = getServiceModuleName(); String moduleName = getControllerModuleName();
String packageName = CONFIG.getString( String packageName = CONFIG.getString(
PACKAGE_NAME_CONTROLLER, PACKAGE_NAME_CONTROLLER,
DEFAULT_PACKAGE_NAME_CONTROLLER DEFAULT_PACKAGE_NAME_CONTROLLER

@ -14,7 +14,7 @@ public class StrUtils {
return split.length >= 1 ? split[0] : ""; return split.length >= 1 ? split[0] : "";
} }
public static String removePrefix(String str, String prefix) { public static String removePrefixCaseIgnore(String str, String prefix) {
if (str.toLowerCase().startsWith(prefix)) { if (str.toLowerCase().startsWith(prefix)) {
return str.substring(prefix.length()); return str.substring(prefix.length());
} else { } else {
@ -22,8 +22,8 @@ public class StrUtils {
} }
} }
public static String removeSuffix(String str, String suffix) { public static String removeSuffixCaseIgnore(String str, String suffix) {
if (str.endsWith(suffix)) { if (str.toLowerCase().endsWith(suffix)) {
return str.substring(0, str.length() - suffix.length()); return str.substring(0, str.length() - suffix.length());
} else { } else {
return str; return str;
@ -37,24 +37,79 @@ public class StrUtils {
return str; return str;
} }
public static String toCamelCase(String str, boolean capitalizeFirstLetter) { public static String snakeToCamelCase(String snakeCase) {
String lowerCaseStr = str.toLowerCase(); if (snakeCase == null || snakeCase.isEmpty()) {
StringBuilder sb = new StringBuilder(); return snakeCase;
boolean upperCase = capitalizeFirstLetter; }
for (int i = 0; i < lowerCaseStr.length(); i++) {
char c = lowerCaseStr.charAt(i); // 将字符串首字母转为小写,然后按下划线分割成数组
if (c == '_') { String[] parts = snakeCase.toLowerCase().split("_");
upperCase = true;
} else { // 初始化结果字符串,并将第一个单词的首字母转为小写
if (upperCase) { StringBuilder camelCase = new StringBuilder(parts[0]);
sb.append(Character.toUpperCase(c));
upperCase = false; // 从第二个单词开始遍历数组,将每个单词的首字母大写并拼接到结果字符串中
} else { for (int i = 1; i < parts.length; i++) {
sb.append(c); String part = parts[i];
if (!part.isEmpty()) {
camelCase.append(Character.toUpperCase(part.charAt(0)));
camelCase.append(part.substring(1));
}
}
// 返回转换后的驼峰命名字符串
return camelCase.toString();
}
public static String snakeToPascalCase(String snakeCase) {
if (snakeCase == null || snakeCase.isEmpty()) {
return snakeCase;
}
// 将字符串首字母转为大写,其余部分转为小写,并按下划线分割成数组
String[] parts = snakeCase.toLowerCase().split("_");
// 创建一个 StringBuilder 对象来构建结果字符串
StringBuilder pascalCase = new StringBuilder();
// 遍历分割后的数组,将每个部分的首字母大写并拼接到结果字符串中
for (String part : parts) {
if (part.isEmpty()) continue; // 跳过空字符串部分
pascalCase.append(Character.toUpperCase(part.charAt(0)));
if (part.length() > 1) {
pascalCase.append(part.substring(1));
}
}
// 返回转换后的大驼峰命名字符串
return pascalCase.toString();
}
public static String camelToKebabCase(String camelCase) {
StringBuilder result = new StringBuilder();
boolean isPreviousUpperCase = false;
for (int i = 0; i < camelCase.length(); i++) {
char currentChar = camelCase.charAt(i);
if (Character.isUpperCase(currentChar)) {
if (i != 0 && !isPreviousUpperCase) {
result.append("-");
} }
result.append(Character.toLowerCase(currentChar));
isPreviousUpperCase = true;
} else {
result.append(currentChar);
isPreviousUpperCase = false;
} }
} }
return sb.toString(); return result.toString();
}
public static String snakeToKebabCase(String snakeCase) {
if (snakeCase == null || snakeCase.isEmpty()) {
return snakeCase;
}
// 将下划线替换为连字符
return snakeCase.replace("_", "-");
} }
} }

@ -58,4 +58,11 @@ public class TypeUtils {
throw new RuntimeException("unknown sql type:" + sqlType); throw new RuntimeException("unknown sql type:" + sqlType);
} }
public static Boolean isDecimalType(String javaType) {
return JAVA_TYPE_DECIMAL.equals(javaType);
}
public static Boolean isDateType(String javaType) {
return JAVA_TYPE_DATE.equals(javaType);
}
} }

@ -1,13 +1,9 @@
package space.caoshd.otone.builder; package space.caoshd.otone.builder;
import org.junit.Test; import org.junit.Test;
import space.caoshd.otone.helper.PropHelper;
import space.caoshd.otone.util.PathConsts;
public class SourceBuilderTest { public class SourceBuilderTest {
private static final PropHelper CONFIG = new PropHelper(PathConsts.MYSQL_PROPERTIES_PATH);
@Test @Test
public void build() { public void build() {
new SourceBuilder() new SourceBuilder()

@ -15,16 +15,18 @@ public class StrUtilsTest {
@Test @Test
public void removePrefix() { public void removePrefix() {
String username = StrUtils.removePrefix("t_user_name", "t_"); String username = StrUtils.removePrefixCaseIgnore("t_user_name", "t_");
System.out.println(username); System.out.println(username);
} }
@Test @Test
public void toCamelCase() { public void toCamelCase() {
String userName = StrUtils.toCamelCase("user_name", false); String userName = StrUtils.snakeToCamelCase("user_name");
String className = StrUtils.toCamelCase("class_name", true); String className = StrUtils.snakeToPascalCase("class_name");
String class_name = StrUtils.camelToKebabCase("userName");
System.out.println(userName); System.out.println(userName);
System.out.println(className); System.out.println(className);
System.out.println(class_name);
} }
} }

@ -1,4 +1,4 @@
project.path.base=D:/workspace/otono-debug/ project.path.base=D:/workspace/otono-debug
package.name.base=space.caoshd.navigator package.name.base=space.caoshd.navigator
database.type=h2 database.type=h2
database.table.includes= database.table.includes=
@ -7,6 +7,7 @@ output.cover_if_exists=true
#project.path.java=src/main/java #project.path.java=src/main/java
#project.path.resources=src/main/resources #project.path.resources=src/main/resources
project.api.prefix=/api/v1
#package.name.entity=repository.entity #package.name.entity=repository.entity
#package.name.mapper=repository.mapper #package.name.mapper=repository.mapper
#package.name.service.impl=service.impl #package.name.service.impl=service.impl

@ -2,4 +2,4 @@ username=root
password=otone@132! password=otone@132!
#url=jdbc:mysql://121.43.48.195:3306/otone?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai #url=jdbc:mysql://121.43.48.195:3306/otone?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
url=jdbc:h2:~/h2db/otone url=jdbc:h2:~/h2db/otone
driver-class-name=com.mysql.cj.jdbc.Driver driver-class-name=org.h2.Driver

@ -18,6 +18,9 @@ package ${ext.controllerPackageName};
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import ${ext.reqPackageName}.${ReqName}; import ${ext.reqPackageName}.${ReqName};
import ${ext.resPackageName}.${ResName}; import ${ext.resPackageName}.${ResName};
@ -32,6 +35,7 @@ import java.util.stream.Collectors;
* ${authorComment}${versionComment} * ${authorComment}${versionComment}
*/ */
@RestController @RestController
@RequestMapping("${ext.apiPrefix}/${ext.moduleName}/${ext.urlName}")
public class ${ClassName} { public class ${ClassName} {
@Autowired @Autowired
@ -43,6 +47,7 @@ public class ${ClassName} {
* @param req 主键为空-新增实体、主键非空-更新条件 * @param req 主键为空-新增实体、主键非空-更新条件
* @return 影响记录数 * @return 影响记录数
*/ */
@PostMapping("/update-insert")
Integer updateInsert(${ReqName} req){ Integer updateInsert(${ReqName} req){
return ${serviceName}.updateInsert(req); return ${serviceName}.updateInsert(req);
} }
@ -53,6 +58,7 @@ public class ${ClassName} {
* @param reqs 主键为空-新增实体、主键非空-更新条件 * @param reqs 主键为空-新增实体、主键非空-更新条件
* @return 影响记录数 * @return 影响记录数
*/ */
@PostMapping("/update-insert-batch")
Integer updateInsertBatch(List<${ReqName}> reqs) { Integer updateInsertBatch(List<${ReqName}> reqs) {
return ${serviceName}.updateInsertBatch(reqs); return ${serviceName}.updateInsertBatch(reqs);
} }
@ -63,6 +69,7 @@ public class ${ClassName} {
* @param req 删除条件 * @param req 删除条件
* @return 影响记录数 * @return 影响记录数
*/ */
@PostMapping("/delete")
Integer delete(${ReqName} req) { Integer delete(${ReqName} req) {
return ${serviceName}.delete(req); return ${serviceName}.delete(req);
} }
@ -74,6 +81,7 @@ public class ${ClassName} {
* @param req 删除条件 * @param req 删除条件
* @return 影响记录数 * @return 影响记录数
*/ */
@PostMapping("/invalid")
Integer invalid(${ReqName} req) { Integer invalid(${ReqName} req) {
return ${serviceName}.invalid(req); return ${serviceName}.invalid(req);
} }
@ -85,6 +93,7 @@ public class ${ClassName} {
* @param req 查询条件 * @param req 查询条件
* @return 单个 * @return 单个
*/ */
@GetMapping("/any")
${ResName} anyOne(${ReqName} req) { ${ResName} anyOne(${ReqName} req) {
${EntityName} entity = ${serviceName}.anyOne(req); ${EntityName} entity = ${serviceName}.anyOne(req);
${ResName} res = new ${ResName}(); ${ResName} res = new ${ResName}();
@ -98,6 +107,7 @@ public class ${ClassName} {
* @param req 查询条件 * @param req 查询条件
* @return 单个 * @return 单个
*/ */
@GetMapping("/only")
${ResName} onlyOne(${ReqName} req) { ${ResName} onlyOne(${ReqName} req) {
${EntityName} entity = ${serviceName}.onlyOne(req); ${EntityName} entity = ${serviceName}.onlyOne(req);
${ResName} res = new ${ResName}(); ${ResName} res = new ${ResName}();
@ -111,6 +121,7 @@ public class ${ClassName} {
* @param req 查询条件 * @param req 查询条件
* @return 列表 * @return 列表
*/ */
@GetMapping("/list")
List<${ResName}> list(${ReqName} req) { List<${ResName}> list(${ReqName} req) {
List<${EntityName} > entities = ${serviceName}.list(req); List<${EntityName} > entities = ${serviceName}.list(req);
return entities.stream().map(entity -> { return entities.stream().map(entity -> {
@ -126,6 +137,7 @@ public class ${ClassName} {
* @param req 查询条件 * @param req 查询条件
* @return 统计结果 * @return 统计结果
*/ */
@GetMapping("/count")
Long count(${ReqName} req) { Long count(${ReqName} req) {
return ${serviceName}.count(req); return ${serviceName}.count(req);
} }

@ -10,10 +10,44 @@
#end #end
#set(${ClassName}="${ext.ClassName}$!{ext.reqNameSuffix}") #set(${ClassName}="${ext.ClassName}$!{ext.reqNameSuffix}")
package ${ext.reqPackageName}; package ${ext.reqPackageName};
#if(${tbl.decimalExists})
import java.math.BigDecimal;
#end
#if(${tbl.dateExists})
import java.util.Date;
#end
/** /**
* $!{tbl.comment}表单提交 * $!{tbl.comment}表单提交
* ${authorComment}${versionComment} * ${authorComment}${versionComment}
*/ */
public class ${ClassName} { public class ${ClassName} {
#foreach($column in ${tbl.columns})
/**
* ${column.comment}
*/
private ${column.javaType} ${column.fieldName};
#end
#foreach($column in ${tbl.columns})
/**
* 获取${column.comment}
*
* @return ${column.comment}
*/
public ${column.javaType} get${column.fieldNameCap}() {
return ${column.fieldName};
}
/**
* 设置${column.comment}
*
* @param ${column.fieldName} ${column.comment}
*/
public void set${column.fieldNameCap}(${column.javaType} ${column.fieldName}) {
this.${column.fieldName} = ${column.fieldName};
}
#end
} }

@ -10,6 +10,13 @@
#end #end
#set(${ClassName}="${ext.ClassName}$!{ext.resNameSuffix}") #set(${ClassName}="${ext.ClassName}$!{ext.resNameSuffix}")
package ${ext.resPackageName}; package ${ext.resPackageName};
#if(${tbl.decimalExists})
import java.math.BigDecimal;
#end
#if(${tbl.dateExists})
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
#end
/** /**
* $!{tbl.comment}视图 * $!{tbl.comment}视图
@ -17,4 +24,34 @@ package ${ext.resPackageName};
*/ */
public class ${ClassName} { public class ${ClassName} {
#foreach($column in ${tbl.columns})
/**
* ${column.comment}
*/
#if(${column.dateType})
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
#end
private ${column.javaType} ${column.fieldName};
#end
#foreach($column in ${tbl.columns})
/**
* 获取${column.comment}
*
* @return ${column.comment}
*/
public ${column.javaType} get${column.fieldNameCap}() {
return ${column.fieldName};
}
/**
* 设置${column.comment}
*
* @param ${column.fieldName} ${column.comment}
*/
public void set${column.fieldNameCap}(${column.javaType} ${column.fieldName}) {
this.${column.fieldName} = ${column.fieldName};
}
#end
} }
Loading…
Cancel
Save