Jelajahi Sumber

Merge commit 'refs/pull/519/head' of https://gitee.com/zuohuaijun/Admin.NET into next

zuohuaijun 3 tahun lalu
induk
melakukan
aab8290621

+ 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" // 后端生成到的项目
+  }
 }

+ 69 - 0
Admin.NET/Admin.NET.Core/Logging/ElasticSearchLogMessage.cs

@@ -0,0 +1,69 @@
+// Apache-2.0 License
+// Copyright (c) 2021-2022 xusn
+
+using Nest;
+
+namespace Admin.NET.Core;
+/// <summary>
+/// ES日志类
+/// </summary>
+public class ElasticSearchLogMessage
+{
+
+    /// <summary>
+    /// 记录器类别名称
+    /// </summary>
+    [Text] public string LogName { get; set; }
+
+    /// <summary>
+    /// 日志级别
+    /// </summary>
+    [Text] public string LogLevel { get; set; }
+
+    /// <summary>
+    /// 事件 Id
+    /// </summary>
+    [Text] public string EventId { get; set; }
+
+    /// <summary>
+    /// 日志消息
+    /// </summary>
+    [Text] public string Message { get; set; }
+
+    /// <summary>
+    /// 异常对象
+    /// </summary>
+    [Text] public string Exception { get; set; }
+
+    /// <summary>
+    /// 当前状态值
+    /// </summary>
+    /// <remarks>可以是任意类型</remarks>
+    [Text] public string State { get; set; }
+
+    /// <summary>
+    /// 日志记录时间
+    /// </summary>
+    [Text] public DateTime LogDateTime { get; set; } = DateTime.Now;
+
+    /// <summary>
+    /// 线程 Id
+    /// </summary>
+    [Text] public int ThreadId { get; set; }
+
+    /// <summary>
+    /// 是否使用 UTC 时间戳
+    /// </summary>
+    [Text] public bool UseUtcTimestamp { get; set; }
+
+    /// <summary>
+    /// 请求/跟踪 Id
+    /// </summary>
+    [Text] public string TraceId { get; set; }
+
+    /// <summary>
+    /// 监视
+    /// </summary>
+    [Text] public string Monitor { get; set; }
+
+}

+ 15 - 1
Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs

@@ -16,6 +16,20 @@ public class ElasticSearchLoggingWriter : IDatabaseLoggingWriter
 
     public void Write(LogMessage logMsg, bool flush)
     {
-        _esClient.IndexDocument(logMsg.Context.Get("loggingMonitor"));
+        var document = new ElasticSearchLogMessage
+        {
+            EventId = logMsg.EventId.Id.ToString(),
+            LogName = logMsg.LogName,
+            LogLevel = logMsg.LogLevel.ToString(),
+            Message = logMsg.Message,
+            Exception = logMsg.Exception?.ToString(),
+            State = logMsg.State.ToString(),
+            LogDateTime = logMsg.LogDateTime,
+            ThreadId = logMsg.ThreadId,
+            UseUtcTimestamp = logMsg.UseUtcTimestamp,
+            TraceId = logMsg.TraceId,
+            Monitor = logMsg.Context?.Get("loggingMonitor")?.ToString(),
+        };
+        _esClient.IndexDocument(document);
     }
 }

+ 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>

+ 6 - 0
Admin.NET/Admin.NET.Core/SeedData/SysDictDataSeedData.cs

@@ -54,6 +54,12 @@ public class SysDictDataSeedData : ISqlSugarEntitySeedData<SysDictData>
             new SysDictData{ Id=269037953140003, DictTypeId=269037954200001, Value="区级", Code="区级", OrderNo=3, Remark="区级", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysDictData{ Id=269037953140004, DictTypeId=269037954200001, Value="县级", Code="县级", OrderNo=4, Remark="县级", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysDictData{ Id=269037953140005, DictTypeId=269037954200001, Value="其他", Code="其他", OrderNo=5, Remark="其他", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
+
+            new SysDictData{ Id=269037953140001, DictTypeId=269037954100005, Value="EntityBaseId【基础实体Id】", Code="EntityBaseId", OrderNo=1, Remark="【基础实体Id】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
+            new SysDictData{ Id=269037953140002, DictTypeId=269037954100005, Value="EntityBase【基础实体】", Code="EntityBase", OrderNo=1, Remark="【基础实体】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
+            new SysDictData{ Id=269037953140003, DictTypeId=269037954100005, Value="EntityTenantId【租户实体Id】", Code="EntityTenantId", OrderNo=1, Remark="【租户实体Id】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
+            new SysDictData{ Id=269037953140004, DictTypeId=269037954100005, Value="EntityTenant【租户实体】", Code="EntityTenant", OrderNo=1, Remark="【租户实体】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
+            new SysDictData{ Id=269037953140005, DictTypeId=269037954100005, Value="EntityBaseData【业务实体】", Code="EntityBaseData", OrderNo=1, Remark="【业务实体】", Status=StatusEnum.Disable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
         };
     }
 }

+ 1 - 0
Admin.NET/Admin.NET.Core/SeedData/SysDictTypeSeedData.cs

@@ -18,6 +18,7 @@ public class SysDictTypeSeedData : ISqlSugarEntitySeedData<SysDictType>
             new SysDictType{ Id=269037954100002, Name="代码生成查询类型", Code="code_gen_query_type", OrderNo=100, Remark="代码生成查询类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysDictType{ Id=269037954100003, Name="代码生成.NET类型", Code="code_gen_net_type", OrderNo=100, Remark="代码生成.NET类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysDictType{ Id=269037954100004, Name="代码生成方式", Code="code_gen_create_type", OrderNo=100, Remark="代码生成方式", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
+            new SysDictType{ Id=269037954100005, Name="代码生成基类", Code="code_gen_base_class_name", OrderNo=100, Remark="代码生成基类", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
         };
     }
 }

+ 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>

+ 9 - 7
Web/src/views/system/database/component/genEntity.vue

@@ -22,11 +22,7 @@
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 						<el-form-item label="基类" prop="baseClassName">
 							<el-select v-model="ruleForm.baseClassName" clearable class="w100">
-								<el-option label="EntityBaseId【基础实体Id】" value="EntityBaseId" />
-								<el-option label="EntityBase【基础实体】" value="EntityBase" />
-								<el-option label="EntityTenantId【租户实体Id】" value="EntityTenantId" />
-								<el-option label="EntityTenant【租户实体】" value="EntityTenant" />
-								<el-option label="EntityBaseData【业务实体】" value="EntityBaseData" />
+								<el-option v-for="item in codeGenBaseClassName" :key="item.value" :label="item.label" :value="item.value" />
 							</el-select>
 						</el-form-item>
 					</el-col>
@@ -51,11 +47,11 @@
 </template>
 
 <script lang="ts">
-import { reactive, toRefs, defineComponent, ref } from 'vue';
+import { reactive, toRefs, onMounted, defineComponent, ref } from 'vue';
 import mittBus from '/@/utils/mitt';
 
 import { getAPI } from '/@/utils/axios-utils';
-import { SysDatabaseApi } from '/@/api-services/api';
+import { SysDatabaseApi ,SysDictDataApi } from '/@/api-services/api';
 
 export default defineComponent({
 	name: 'sysGenEntity',
@@ -65,6 +61,12 @@ export default defineComponent({
 		const state = reactive({
 			isShowDialog: false,
 			ruleForm: {} as any,
+			codeGenBaseClassName: [] as any,
+		});
+
+		onMounted(async () => {
+			let resDicData = await getAPI(SysDictDataApi).sysDictDataDictDataDropdownCodeGet('code_gen_base_class_name');
+			state.codeGenBaseClassName = resDicData.data.result;
 		});
 
 		// 打开弹窗