diff --git a/generator-code/pom.xml b/generator-code/pom.xml index 9d6ed83..aa09dbf 100644 --- a/generator-code/pom.xml +++ b/generator-code/pom.xml @@ -95,11 +95,19 @@ fastjson2 + + + com.google.guava + guava + 33.4.7-jre + + org.apache.velocity velocity-engine-core 2.3 + diff --git a/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java b/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java index e675ab7..927cf47 100644 --- a/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java +++ b/generator-code/src/main/java/cn/bunny/service/impl/VmsServiceImpl.java @@ -76,6 +76,9 @@ public class VmsServiceImpl implements VmsService { // 生成模板 VmsUtil.commonVms(writer, context, "vms/" + path, dto); + // 处理 vm 文件名 + path = VmsUtil.handleVmFilename(path, dto.getClassName()); + return GeneratorVo.builder() .code(writer.toString()) .comment(tableMetaData.getComment()) diff --git a/generator-code/src/main/java/cn/bunny/utils/ConvertUtil.java b/generator-code/src/main/java/cn/bunny/utils/ConvertUtil.java index 3ffdff4..d1aac22 100644 --- a/generator-code/src/main/java/cn/bunny/utils/ConvertUtil.java +++ b/generator-code/src/main/java/cn/bunny/utils/ConvertUtil.java @@ -1,6 +1,12 @@ package cn.bunny.utils; +import com.google.common.base.CaseFormat; +import org.assertj.core.util.introspection.CaseFormatUtils; + +import java.util.regex.Pattern; + public class ConvertUtil { + /** * 将数据库类型转换为Java类型 */ @@ -9,17 +15,17 @@ public class ConvertUtil { columnType = columnType.toLowerCase(); return switch (columnType) { - case "varchar" , "char" , "text" , "longtext" , "mediumtext" , "tinytext" -> "String"; - case "int" , "integer" , "tinyint" , "smallint" -> "Integer"; + case "varchar", "char", "text", "longtext", "mediumtext", "tinytext" -> "String"; + case "int", "integer", "tinyint", "smallint" -> "Integer"; case "bigint" -> "Long"; - case "decimal" , "numeric" -> "BigDecimal"; + case "decimal", "numeric" -> "BigDecimal"; case "float" -> "Float"; case "double" -> "Double"; - case "boolean" , "bit" , "tinyint unsigned" -> "Boolean"; - case "date" , "year" -> "Date"; + case "boolean", "bit", "tinyint unsigned" -> "Boolean"; + case "date", "year" -> "Date"; case "time" -> "Time"; - case "datetime" , "timestamp" -> "LocalDateTime"; - case "blob" , "longblob" , "mediumblob" , "tinyblob" -> "byte[]"; + case "datetime", "timestamp" -> "LocalDateTime"; + case "blob", "longblob", "mediumblob", "tinyblob" -> "byte[]"; default -> "Object"; }; } @@ -34,45 +40,35 @@ public class ConvertUtil { /** * 下划线命名转驼峰命名 * - * @param name 原始名称 + * @param name 原始名称,传入的值可以是 + * `xxx_xxx` `CaseFormat` + * `caseFormat` * @param firstLetterCapital 首字母是否大写 */ public static String convertToCamelCase(String name, boolean firstLetterCapital) { if (name == null || name.isEmpty()) return name; - StringBuilder result = new StringBuilder(); - String[] parts = name.split("_" ); + // 首字母不大写 + if (!firstLetterCapital) return CaseFormatUtils.toCamelCase(name); - for (int i = 0; i < parts.length; i++) { - String part = parts[i]; - if (part.isEmpty()) { - continue; - } - - if (i == 0 && !firstLetterCapital) { - result.append(part.toLowerCase()); - } else { - result.append(Character.toUpperCase(part.charAt(0))) - .append(part.substring(1).toLowerCase()); - } + // 检查是否全大写带下划线 (UPPER_UNDERSCORE) + if (Pattern.matches("^[A-Z]+(_[A-Z]+)*$", name)) { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name); } - return result.toString(); - } - - /** - * 辅助方法:将列名转换为字段名(如user_name -> userName) - * - * @param columnName 列名称 - * @return 列名称 - */ - public static String convertToFieldName(String columnName) { - String[] parts = columnName.split("_" ); - StringBuilder fieldName = new StringBuilder(parts[0].toLowerCase()); - for (int i = 1; i < parts.length; i++) { - fieldName.append(parts[i].substring(0, 1).toUpperCase()) - .append(parts[i].substring(1).toLowerCase()); + // 检查是否小写带下划线 (LOWER_UNDERSCORE) + if (Pattern.matches("^[a-z]+(_[a-z]+)*$", name)) { + return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name); } - return fieldName.toString(); + + // 检查是否大驼峰 (UpperCamelCase) + if (Character.isUpperCase(name.charAt(0)) && + !name.contains("_") && + name.chars().anyMatch(Character::isLowerCase)) { + return CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_CAMEL, name); + } + + // 默认认为是小驼峰 (lowerCamelCase) + return CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, name); } } diff --git a/generator-code/src/main/java/cn/bunny/utils/DbInfoUtil.java b/generator-code/src/main/java/cn/bunny/utils/DbInfoUtil.java index 7afdd6f..13e13af 100644 --- a/generator-code/src/main/java/cn/bunny/utils/DbInfoUtil.java +++ b/generator-code/src/main/java/cn/bunny/utils/DbInfoUtil.java @@ -148,7 +148,7 @@ public class DbInfoUtil { // 设置列字段 column.setColumnName(columnName); // 列字段转成 下划线 -> 小驼峰 - column.setFieldName(ConvertUtil.convertToFieldName(column.getColumnName())); + column.setFieldName(ConvertUtil.convertToCamelCase(column.getColumnName())); // 字段类型 column.setJdbcType(columnsRs.getString("TYPE_NAME")); @@ -166,7 +166,6 @@ public class DbInfoUtil { boolean isPrimaryKey = primaryKeyColumns.contains(columnName); column.setIsPrimaryKey(isPrimaryKey); } - columns.add(column); } } diff --git a/generator-code/src/main/java/cn/bunny/utils/VmsUtil.java b/generator-code/src/main/java/cn/bunny/utils/VmsUtil.java index a84905c..3f16e6a 100644 --- a/generator-code/src/main/java/cn/bunny/utils/VmsUtil.java +++ b/generator-code/src/main/java/cn/bunny/utils/VmsUtil.java @@ -1,6 +1,7 @@ package cn.bunny.utils; import cn.bunny.dao.dto.VmsArgumentDto; +import com.google.common.base.CaseFormat; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; @@ -8,10 +9,19 @@ import org.apache.velocity.app.Velocity; import java.io.StringWriter; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Map; import java.util.concurrent.atomic.AtomicReference; public class VmsUtil { + private static final Map TYPE_MAPPINGS = Map.of( + "controller", "Controller", + "service", "Service", + "serviceImpl", "ServiceImpl", + "mapper", "Mapper", + "resourceMapper", "Mapper" + ); + /** * 生成模板 * @@ -53,13 +63,52 @@ public class VmsUtil { context.put("requestMapping", requestMapping); // 将类名称转成小驼峰 - context.put("classLowercaseName", ConvertUtil.convertToCamelCase(replaceTableName.get())); + String toCamelCase = ConvertUtil.convertToCamelCase(replaceTableName.get()); + context.put("classLowercaseName", toCamelCase); // 将类名称转成大驼峰 - context.put("classUppercaseName", ConvertUtil.convertToCamelCase(replaceTableName.get(), true)); + String convertToCamelCase = ConvertUtil.convertToCamelCase(replaceTableName.get(), true); + context.put("classUppercaseName", convertToCamelCase); // Velocity 生成模板 Template servicePathTemplate = Velocity.getTemplate(templateName, "UTF-8"); servicePathTemplate.merge(context, writer); } + + /** + * 处理 vm 文件名 + * + * @param path 文件路径 + * @param className 类名 + */ + public static String handleVmFilename(String path, String className) { + String[] splitPaths = path.split("/"); + int splitPathsSize = splitPaths.length - 1; + + // 大驼峰名称 + String CamelCase = ConvertUtil.convertToCamelCase(className, true); + // 小驼峰名称 + String camelCase = ConvertUtil.convertToCamelCase(className); + + // 当前文件名 + String filename = splitPaths[splitPathsSize]; + filename = filename.replace(".vm", ""); + + // 文件名称 + String name = filename.split("\\.")[0]; + // 文件扩展名 + String extension = filename.split("\\.")[1]; + + // 判断是否是 Java 或者 xml 文件 + if (filename.contains("java") || filename.contains("xml")) { + filename = CamelCase + TYPE_MAPPINGS.get(name) + "." + extension; + } + + if (filename.contains("vue") && !filename.contains("index")) { + filename = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, camelCase) + "-" + name + "." + extension; + } + + splitPaths[splitPathsSize] = filename; + return String.join("/", splitPaths); + } } diff --git a/generator-code/src/main/resources/vms/server/controller.java.vm b/generator-code/src/main/resources/vms/server/controller/controller.java.vm similarity index 100% rename from generator-code/src/main/resources/vms/server/controller.java.vm rename to generator-code/src/main/resources/vms/server/controller/controller.java.vm diff --git a/generator-code/src/main/resources/vms/server/mapper.java.vm b/generator-code/src/main/resources/vms/server/mapper/mapper.java.vm similarity index 100% rename from generator-code/src/main/resources/vms/server/mapper.java.vm rename to generator-code/src/main/resources/vms/server/mapper/mapper.java.vm diff --git a/generator-code/src/main/resources/vms/server/resourceMapper.xml.vm b/generator-code/src/main/resources/vms/server/mapper/resourceMapper.xml.vm similarity index 100% rename from generator-code/src/main/resources/vms/server/resourceMapper.xml.vm rename to generator-code/src/main/resources/vms/server/mapper/resourceMapper.xml.vm diff --git a/generator-code/src/main/resources/vms/server/serviceImpl.java.vm b/generator-code/src/main/resources/vms/server/service/impl/serviceImpl.java.vm similarity index 100% rename from generator-code/src/main/resources/vms/server/serviceImpl.java.vm rename to generator-code/src/main/resources/vms/server/service/impl/serviceImpl.java.vm diff --git a/generator-code/src/main/resources/vms/server/service.java.vm b/generator-code/src/main/resources/vms/server/service/service.java.vm similarity index 100% rename from generator-code/src/main/resources/vms/server/service.java.vm rename to generator-code/src/main/resources/vms/server/service/service.java.vm diff --git a/generator-code/src/test/java/cn/bunny/JDBCTest.java b/generator-code/src/test/java/cn/bunny/JDBCTest.java index 5f1fe1d..efba744 100644 --- a/generator-code/src/test/java/cn/bunny/JDBCTest.java +++ b/generator-code/src/test/java/cn/bunny/JDBCTest.java @@ -84,7 +84,7 @@ public class JDBCTest { while (columnsRs.next()) { ColumnMetaData column = new ColumnMetaData(); column.setColumnName(columnsRs.getString("COLUMN_NAME")); - column.setFieldName(ConvertUtil.convertToFieldName(column.getColumnName())); + column.setFieldName(ConvertUtil.convertToCamelCase(column.getColumnName())); column.setJdbcType(columnsRs.getString("TYPE_NAME")); column.setJavaType(ConvertUtil.convertToJavaType(column.getJdbcType())); column.setComment(columnsRs.getString("REMARKS")); diff --git a/generator-code/src/test/java/cn/bunny/StringFormatTest.java b/generator-code/src/test/java/cn/bunny/StringFormatTest.java new file mode 100644 index 0000000..45e53d0 --- /dev/null +++ b/generator-code/src/test/java/cn/bunny/StringFormatTest.java @@ -0,0 +1,36 @@ +package cn.bunny; + +import cn.bunny.utils.ConvertUtil; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.introspection.CaseFormatUtils; +import org.junit.jupiter.api.Test; + +public class StringFormatTest { + + @Test + void test1() { + System.out.println(CaseFormatUtils.toCamelCase("user_login")); + System.out.println(CaseFormatUtils.toCamelCase("userLogin")); + System.out.println(CaseFormatUtils.toCamelCase("UserLogin")); + + System.out.println("--------------------------------"); + + System.out.println(StringUtils.lowerCase("user_login")); + System.out.println(StringUtils.lowerCase("userLogin")); + System.out.println(StringUtils.lowerCase("UserLogin")); + + System.out.println("--------------------------------"); + + System.out.println(StringUtils.upperCase("user_login")); + System.out.println(StringUtils.upperCase("userLogin")); + System.out.println(StringUtils.upperCase("UserLogin")); + } + + @Test + void test2() { + System.out.println(ConvertUtil.convertToCamelCase("user_login_A")); + System.out.println(ConvertUtil.convertToCamelCase("User_Login_A")); + System.out.println(ConvertUtil.convertToCamelCase("userLoginA")); + System.out.println(ConvertUtil.convertToCamelCase("UserLoginA")); + } +}