Преглед на файлове

!1868 修复连续大写字母问题的下划线转换bug
Merge pull request !1868 from 冰魄少年/v2

zuohuaijun преди 8 месеца
родител
ревизия
5c0902a66d

+ 44 - 0
Admin.NET/Admin.NET.Core/Extension/StringExtension.cs

@@ -125,4 +125,48 @@ public static class StringExtension
             return paramDict.TryGetValue(key, out string value) ? value : string.Empty;
         });
     }
+
+    /// <summary>
+    /// 驼峰转下划线
+    /// </summary>
+    /// <param name="str"></param>
+    /// <param name="isToUpper"></param>
+    /// <returns></returns>
+    public static string ToUnderLine(this string str, bool isToUpper = false)
+    {
+        if (string.IsNullOrEmpty(str) || str.Contains("_"))
+        {
+            return str;
+        }
+
+        int length = str.Length;
+        var result = new System.Text.StringBuilder(length + (length / 3));
+
+        result.Append(char.ToLowerInvariant(str[0]));
+
+        int lastIndex = length - 1;
+
+        for (int i = 1; i < length; i++)
+        {
+            char current = str[i];
+            if (!char.IsUpper(current))
+            {
+                result.Append(current);
+                continue;
+            }
+
+            bool prevIsLower = char.IsLower(str[i - 1]);
+            bool nextIsLower = (i < lastIndex) && char.IsLower(str[i + 1]);
+
+            if (prevIsLower || nextIsLower)
+            {
+                result.Append('_');
+            }
+
+            result.Append((char)(current | 0x20));
+        }
+
+        string converted = result.ToString();
+        return isToUpper ? converted.ToUpperInvariant() : converted;
+    }
 }

+ 6 - 6
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -188,7 +188,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
             if (item.Type.IsDefined(typeof(LogTableAttribute))) tbConfigId = SqlSugarConst.LogConfigId;
             if (tbConfigId != configId) continue;
 
-            var table = dbTableInfos.FirstOrDefault(u => string.Equals(u.Name, (config!.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(item.DbTableName) : item.DbTableName), StringComparison.CurrentCultureIgnoreCase));
+            var table = dbTableInfos.FirstOrDefault(u => string.Equals(u.Name, (config!.DbSettings.EnableUnderLine ? item.DbTableName.ToUnderLine() : item.DbTableName), StringComparison.CurrentCultureIgnoreCase));
             if (table == null) continue;
             tableOutputList.Add(new TableOutput
             {
@@ -211,7 +211,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         // 切库---多库代码生成用
         var provider = _db.AsTenant().GetConnectionScope(configId);
         var config = _dbConnectionOptions.ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == configId) ?? throw Oops.Oh(ErrorCodeEnum.D1401);
-        if (config.DbSettings.EnableUnderLine) tableName = UtilMethods.ToUnderLine(tableName);
+        if (config.DbSettings.EnableUnderLine) tableName = tableName.ToUnderLine();
         // 获取实体类型属性
         var entityType = provider.DbMaintenance.GetTableInfoList(false).FirstOrDefault(u => u.Name == tableName);
         if (entityType == null) return null;
@@ -225,7 +225,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         // 按原始类型的顺序获取所有实体类型属性(不包含导航属性,会返回null)
         var columnList = provider.DbMaintenance.GetColumnInfosByTableName(tableName).Select(u => new ColumnOuput
         {
-            ColumnName = config!.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(u.DbColumnName) : u.DbColumnName,
+            ColumnName = config!.DbSettings.EnableUnderLine ? u.DbColumnName.ToUnderLine() : u.DbColumnName,
             ColumnKey = u.IsPrimarykey.ToString(),
             DataType = u.DataType.ToString(),
             NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
@@ -233,7 +233,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         }).ToList();
         foreach (var column in columnList)
         {
-            var property = properties.FirstOrDefault(e => (config!.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(e.ColumnName) : e.ColumnName) == column.ColumnName);
+            var property = properties.FirstOrDefault(e => (config!.DbSettings.EnableUnderLine ? e.ColumnName.ToUnderLine() : e.ColumnName) == column.ColumnName);
             column.ColumnComment ??= property?.ColumnComment;
             column.PropertyName = property?.PropertyName;
         }
@@ -250,7 +250,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         if (entityType == null) return null;
 
         var config = _dbConnectionOptions.ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == input.ConfigId);
-        var dbTableName = config!.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(entityType.DbTableName) : entityType.DbTableName;
+        var dbTableName = config!.DbSettings.EnableUnderLine ? entityType.DbTableName.ToUnderLine() : entityType.DbTableName;
 
         // 切库---多库代码生成用
         var provider = _db.AsTenant().GetConnectionScope(!string.IsNullOrEmpty(input.ConfigId) ? input.ConfigId : SqlSugarConst.MainConfigId);
@@ -335,7 +335,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
             if (des.Length > 0) description = ((DescriptionAttribute)des[0]).Description;
 
             var dbTableName = sugarAttribute == null || string.IsNullOrWhiteSpace(((SugarTable)sugarAttribute).TableName) ? ct.Name : ((SugarTable)sugarAttribute).TableName;
-            if (config.DbSettings.EnableUnderLine) dbTableName = UtilMethods.ToUnderLine(dbTableName);
+            if (config.DbSettings.EnableUnderLine) dbTableName = dbTableName.ToUnderLine();
 
             entityInfos.Add(new EntityInfo
             {

+ 6 - 6
Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs

@@ -70,7 +70,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
                 var visualColumn = new VisualColumn
                 {
                     TableName = columnInfo.DbTableName,
-                    ColumnName = dbOptions.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(columnInfo.DbColumnName) : columnInfo.DbColumnName,
+                    ColumnName = dbOptions.DbSettings.EnableUnderLine ? columnInfo.DbColumnName.ToUnderLine() : columnInfo.DbColumnName,
                     DataType = columnInfo.PropertyInfo.PropertyType.Name,
                     DataLength = columnInfo.Length.ToString(),
                     ColumnDescription = columnInfo.ColumnDescription,
@@ -86,10 +86,10 @@ public class SysDatabaseService : IDynamicApiController, ITransient
                     var relation = new ColumnRelation
                     {
                         SourceTableName = columnInfo.DbTableName,
-                        SourceColumnName = dbOptions.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(name1) : name1,
+                        SourceColumnName = dbOptions.DbSettings.EnableUnderLine ? name1.ToUnderLine() : name1,
                         Type = columnInfo.Navigat.GetNavigateType() == NavigateType.OneToOne ? "ONE_TO_ONE" : "ONE_TO_MANY",
-                        TargetTableName = dbOptions.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(columnInfo.DbColumnName) : columnInfo.DbColumnName,
-                        TargetColumnName = dbOptions.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(targetColumnName) : targetColumnName
+                        TargetTableName = dbOptions.DbSettings.EnableUnderLine ? columnInfo.DbColumnName.ToUnderLine() : columnInfo.DbColumnName,
+                        TargetColumnName = dbOptions.DbSettings.EnableUnderLine ? targetColumnName.ToUnderLine() : targetColumnName
                     };
                     columnRelationList.Add(relation);
                 }
@@ -304,7 +304,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
         var typeBuilder = db.DynamicBuilder().CreateClass(input.TableName, new SugarTable() { TableName = input.TableName, TableDescription = input.Description });
         input.DbColumnInfoList.ForEach(u =>
         {
-            var dbColumnName = config!.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(u.DbColumnName.Trim()) : u.DbColumnName.Trim();
+            var dbColumnName = config!.DbSettings.EnableUnderLine ? u.DbColumnName.Trim().ToUnderLine() : u.DbColumnName.Trim();
             // 虚拟类都默认string类型,具体以列数据类型为准
             typeBuilder.CreateProperty(dbColumnName, typeof(string), new SugarColumn()
             {
@@ -431,7 +431,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
         Type entityType = null;
         foreach (var item in entityInfos)
         {
-            if (tableInfo.Name.ToLower() != (config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(item.DbTableName) : item.DbTableName).ToLower()) continue;
+            if (tableInfo.Name.ToLower() != (config.DbSettings.EnableUnderLine ? item.DbTableName.ToUnderLine() : item.DbTableName).ToLower()) continue;
             entityType = item.Type;
             break;
         }

+ 2 - 2
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -82,7 +82,7 @@ public static class SqlSugarSetup
                 if (!type.GetCustomAttributes<SugarTable>().Any())
                     return;
                 if (config.DbSettings.EnableUnderLine && !entity.DbTableName.Contains('_'))
-                    entity.DbTableName = UtilMethods.ToUnderLine(entity.DbTableName); // 驼峰转下划线
+                    entity.DbTableName = entity.DbTableName.ToUnderLine(); // 驼峰转下划线
             },
             EntityService = (type, column) => // 处理列
             {
@@ -92,7 +92,7 @@ public static class SqlSugarSetup
                 if (new NullabilityInfoContext().Create(type).WriteState is NullabilityState.Nullable)
                     column.IsNullable = true;
                 if (config.DbSettings.EnableUnderLine && !column.IsIgnore && !column.DbColumnName.Contains('_'))
-                    column.DbColumnName = UtilMethods.ToUnderLine(column.DbColumnName); // 驼峰转下划线
+                    column.DbColumnName = column.DbColumnName.ToUnderLine(); // 驼峰转下划线
             },
             DataInfoCacheService = new SqlSugarCache(),
         };