徐少年 пре 3 година
родитељ
комит
aa878449db

+ 12 - 5
Admin.NET/Admin.NET.Application/Configuration/CodeGen.json

@@ -2,9 +2,16 @@
     "$schema": "https://gitee.com/dotnetchina/Furion/raw/net6/schemas/v3/furion-schema.json",
 
     // 代码生成配置项-程序集名称集合
-    "CodeGen": {
-        "EntityAssemblyNames": [ "Admin.NET.Core", "Admin.NET.Application" ],
-        "FrontRootPath": "Web", // 前端文件根目录
-        "BackendApplicationNamespace": "Admin.NET.Application" // 后端生成到的项目
-    }
+  "CodeGen": {
+    "EntityAssemblyNames": [ "Admin.NET.Core", "Admin.NET.Application" ],
+    "BaseEntityNames": [ "EntityTenant", "EntityBase", "EntityBaseId" ],
+    "EntityBaseColumn": {
+      "EntityTenant": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "IsDelete", "TenantId" ],
+      "EntityBase": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "IsDelete" ],
+      "EntityBaseId": [ "Id", "TenantId" ],
+      "BaseId": [ "Id" ]
+    },
+    "FrontRootPath": "Web", // 前端文件根目录
+    "BackendApplicationNamespace": "Admin.NET.Application" // 后端生成到的项目
+  }
 }

+ 10 - 0
Admin.NET/Admin.NET.Core/Option/CodeGenOptions.cs

@@ -10,6 +10,16 @@ public sealed class CodeGenOptions : IConfigurableOptions
     /// </summary>
     public List<string> EntityAssemblyNames { get; set; }
 
+    /// <summary>
+    /// 数据库基础实体名称集合
+    /// </summary>
+    public List<string> BaseEntityNames { get; set; }
+
+    /// <summary>
+    /// 基础实体名
+    /// </summary>
+    public Dictionary<string, string[]> EntityBaseColumn { get; set; }
+
     /// <summary>
     /// 前端文件根目录
     /// </summary>

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/CodeGen/CustomViewEngine.cs

@@ -68,7 +68,7 @@ public class CustomViewEngine : ViewEngineModel
             ColumnName = u.DbColumnName,
             ColumnKey = u.IsPrimarykey.ToString(),
             DataType = u.DataType.ToString(),
-            NetType = CodeGenUtil.ConvertDataType(u.DataType.ToString()),
+            NetType = CodeGenUtil.ConvertDataType(u),
             ColumnComment = u.ColumnDescription
         }).ToList();
     }

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs

@@ -95,7 +95,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
             codeGenConfig.CodeGenId = codeGenerate.Id;
             codeGenConfig.ColumnName = tableColumn.ColumnName;
             codeGenConfig.ColumnComment = tableColumn.ColumnComment;
-            codeGenConfig.NetType = CodeGenUtil.ConvertDataType(tableColumn.DataType);
+            codeGenConfig.NetType = tableColumn.DataType;
             codeGenConfig.WhetherRetract = YesNoEnum.N.ToString();
 
             codeGenConfig.WhetherRequired = YesNoEnum.N.ToString();

+ 7 - 4
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -150,13 +150,14 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         // 获取实体类型属性
         var entityType = provider.DbMaintenance.GetTableInfoList(false).FirstOrDefault(u => u.Name == tableName);
         if (entityType == null) return null;
+        var entityBasePropertyNames = _codeGenOptions.EntityBaseColumn[nameof(EntityTenant)];
         // 按原始类型的顺序获取所有实体类型属性(不包含导航属性,会返回null)
         return provider.DbMaintenance.GetColumnInfosByTableName(entityType.Name).Select(u => new ColumnOuput
         {
-            ColumnName = u.DbColumnName,
+            ColumnName = CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames),
             ColumnKey = u.IsPrimarykey.ToString(),
             DataType = u.DataType.ToString(),
-            NetType = CodeGenUtil.ConvertDataType(u.DataType.ToString()),
+            NetType = CodeGenUtil.ConvertDataType(u),
             ColumnComment = u.ColumnDescription
         }).ToList();
     }
@@ -174,11 +175,13 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         if (entityType == null)
             return null;
 
+        var entityBasePropertyNames = _codeGenOptions.EntityBaseColumn[nameof(EntityTenant)];
         return provider.DbMaintenance.GetColumnInfosByTableName(entityType.DbTableName, false).Select(u => new ColumnOuput
         {
-            ColumnName = u.DbColumnName,
+            ColumnName = CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames),
             ColumnKey = u.IsPrimarykey.ToString(),
-            DataType = u.DataType.ToString(),
+            NetType = CodeGenUtil.ConvertDataType(u),
+            DataType = CodeGenUtil.ConvertDataType(u),
             ColumnComment = string.IsNullOrWhiteSpace(u.ColumnDescription) ? u.DbColumnName : u.ColumnDescription
         }).ToList();
     }

+ 13 - 28
Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs

@@ -8,11 +8,15 @@ public class SysDatabaseService : IDynamicApiController, ITransient
 {
     private readonly ISqlSugarClient _db;
     private readonly IViewEngine _viewEngine;
+    private readonly CodeGenOptions _codeGenOptions;
 
-    public SysDatabaseService(ISqlSugarClient db, IViewEngine viewEngine)
+    public SysDatabaseService(ISqlSugarClient db,
+        IViewEngine viewEngine,
+        IOptions<CodeGenOptions> codeGenOptions)
     {
         _db = db;
         _viewEngine = viewEngine;
+        _codeGenOptions = codeGenOptions.Value;
     }
 
     /// <summary>
@@ -182,7 +186,9 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     public void CreateEntity(CreateEntityInput input)
     {
         input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Admin.NET.Application" : input.Position;
-        input.BaseClassName = string.IsNullOrWhiteSpace(input.BaseClassName) ? "" : $" : {input.BaseClassName}";
+        input.EntityName = (input.EntityName == input.TableName && input.EntityName.Contains("_")) ? CodeGenUtil.CamelColumnName(input.EntityName, null) : input.EntityName;
+        string[] dbColumnNames = _codeGenOptions.EntityBaseColumn[input.BaseClassName];
+
         var templatePath = GetEntityTemplatePath();
         var targetPath = GetEntityTargetPath(input);
         var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
@@ -190,40 +196,19 @@ public class SysDatabaseService : IDynamicApiController, ITransient
         if (dbTableInfo == null)
             throw Oops.Oh(ErrorCodeEnum.db1001);
         List<DbColumnInfo> dbColumnInfos = db.DbMaintenance.GetColumnInfosByTableName(input.TableName, false);
-
-        if (input.BaseClassName.Contains("EntityTenant"))
-        {
-            dbColumnInfos = dbColumnInfos.Where(c => c.DbColumnName != "Id"
-                && c.DbColumnName != "TenantId"
-                && c.DbColumnName != "CreateTime"
-                && c.DbColumnName != "UpdateTime"
-                && c.DbColumnName != "CreateUserId"
-                && c.DbColumnName != "UpdateUserId"
-                && c.DbColumnName != "IsDelete").ToList();
-        }
-        else if (input.BaseClassName.Contains("EntityBase"))
-        {
-            dbColumnInfos = dbColumnInfos.Where(c => c.DbColumnName != "Id"
-                && c.DbColumnName != "CreateTime"
-                && c.DbColumnName != "UpdateTime"
-                && c.DbColumnName != "CreateUserId"
-                && c.DbColumnName != "UpdateUserId"
-                && c.DbColumnName != "IsDelete").ToList();
-        }
-        else if (input.BaseClassName.Contains("EntityBaseId"))
-        {
-            dbColumnInfos = dbColumnInfos.Where(c => c.DbColumnName != "Id").ToList();
-        }
+        if (_codeGenOptions.BaseEntityNames.Contains(input.BaseClassName, StringComparer.OrdinalIgnoreCase))
+            dbColumnInfos = dbColumnInfos.Where(c => !dbColumnNames.Contains(c.DbColumnName, StringComparer.OrdinalIgnoreCase)).ToList();
         dbColumnInfos.ForEach(m =>
         {
-            m.DataType = CodeGenUtil.ConvertDataType(m.DataType);
+            m.DataType = CodeGenUtil.ConvertDataType(m);
         });
         var tContent = File.ReadAllText(templatePath);
         var tResult = _viewEngine.RunCompileFromCached(tContent, new
         {
+            NameSpace = $"{input.Position}.Entity",
             input.TableName,
             input.EntityName,
-            input.BaseClassName,
+            BaseClassName = string.IsNullOrWhiteSpace(input.BaseClassName) ? "" : $" : {input.BaseClassName}",
             input.ConfigId,
             dbTableInfo.Description,
             TableField = dbColumnInfos

+ 118 - 3
Admin.NET/Admin.NET.Core/Util/CodeGenUtil.cs

@@ -7,17 +7,132 @@ namespace Admin.NET.Core.Util;
 /// </summary>
 public static class CodeGenUtil
 {
+    /// <summary>
+    /// 转换大驼峰法命名
+    /// </summary>
+    /// <param name="columnName">字段名</param>
+    /// <param name="dbColumnNames">EntityBase 实体属性名称</param>
+    /// <returns></returns>
+    public static string CamelColumnName(string columnName, string[] dbColumnNames)
+    {
+        if (columnName.Contains("_"))
+        {
+            var arrColName = columnName.Split('_');
+            StringBuilder sb = new StringBuilder();
+            foreach (var col in arrColName)
+            {
+                sb.Append(col[..1].ToUpper() + col[1..].ToLower());
+            }
+            columnName = sb.ToString();
+        }
+        else
+        {
+            var propertyName = dbColumnNames.FirstOrDefault(c => c.ToLower() == columnName.ToLower());
+            if (!string.IsNullOrEmpty(propertyName))
+            {
+                columnName = propertyName;
+            }
+            else
+            {
+                columnName = columnName[..1].ToUpper() + columnName[1..].ToLower();
+            }
+        }
+        return columnName;
+    }
+
     // 根据数据库类型来处理对应的数据字段类型
-    public static string ConvertDataType(string dataType)
+    public static string ConvertDataType(DbColumnInfo dbColumnInfo)
     {
         var dbType = App.GetOptions<DbConnectionOptions>().ConnectionConfigs[0].DbType;
         return dbType switch
         {
-            DbType.PostgreSQL => ConvertDataType_PostgreSQL(dataType),
-            _ => ConvertDataType_Default(dataType),
+            DbType.Oracle => ConvertDataType_OracleSQL(string.IsNullOrEmpty(dbColumnInfo.OracleDataType) ? dbColumnInfo.DataType : dbColumnInfo.OracleDataType, dbColumnInfo.Length, dbColumnInfo.Scale),
+            DbType.PostgreSQL => ConvertDataType_PostgreSQL(dbColumnInfo.DataType),
+            _ => ConvertDataType_Default(dbColumnInfo.DataType),
         };
     }
 
+    public static string ConvertDataType_OracleSQL(string dataType, int? length, int? scale)
+    {
+        switch (dataType.ToLower())
+        {
+            case "interval year to month":
+                return "int";
+            case "interval day to second":
+                return "TimeSpan";
+
+            case "smallint":
+                return "Int16";
+
+            case "int":
+            case "integer":
+                return "int";
+
+            case "long":
+                return "long";
+
+            case "float":
+                return "float";
+
+            case "decimal":
+                return "decimal";
+
+            case "number":
+                if (length != null)
+                {
+                    if (scale != null && scale > 0)
+                    {
+                        return "decimal";
+                    }
+                    else if ((scale != null && scale == 0) || scale == null)
+                    {
+                        if (length > 1 && length < 12)
+                        {
+                            return "int";
+                        }
+                        else if (length > 11)
+                        {
+                            return "long";
+                        }
+                    }
+                    if (length == 1)
+                    {
+                        return "bool";
+                    }
+                }
+                return "decimal";
+
+            case "char":
+            case "clob":
+            case "nclob":
+            case "nchar":
+            case "nvarchar":
+            case "varchar":
+            case "nvarchar2":
+            case "varchar2":
+            case "rowid":
+                return "string";
+
+            case "timestamp":
+            case "timestamp with time zone":
+            case "timestamptz":
+            case "timestamp without time zone":
+            case "date":
+            case "time":
+            case "time with time zone":
+            case "timetz":
+            case "time without time zone":
+                return "DateTime";
+
+            case "bfile":
+            case "blob":
+            case "raw":
+                return "byte[]";
+            default:
+                return "object";
+        }
+    }
+
     //PostgreSQL数据类型对应的字段类型
     public static string ConvertDataType_PostgreSQL(string dataType)
     {

+ 1 - 1
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Entity.cs.vm

@@ -2,7 +2,7 @@
 using SqlSugar;
 using System.ComponentModel;
 using Admin.NET.Core;
-namespace Admin.NET.Application.Entity
+namespace @Model.NameSpace
 {
      /// <summary>
      /// @(@Model.Description)

+ 1 - 1
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/editDialog.vue.vm

@@ -93,7 +93,7 @@
 					}
 				</el-row>
 			</el-form>
-			<template #footer="">
+			<template #footer>
 				<span class="dialog-footer">
 					<el-button @@click="cancel" size="default">取 消</el-button>
 					<el-button type="primary" @@click="submit" size="default">确 定</el-button>