Просмотр исходного кода

1、前端UI,选表时,显示实体名和个表名。
2、index.vue.vm和editDialog.vue.vm中都把主键固定为"id",这样不便于去处理一些老系统的表。所以这里改为动态获取主键名称。
3、Service.cs.vm中page的方法默认用Id排序,因为ID是雪花数,所以排序没有意义,改用CreateTime排序。
4、【关键】原来的代码生成的代码时是使用”字段“名来处理,这样在使用了 ColumnName 指定字段名使得字段名与实体Property名没有对照规则时,生成的代码不可用。因此生成的代码时应该以PropertyName为依热播剧而不是以字段名为依据。这冲啊份内容涉及到了CustomViewEngine.cs、SysCodeGenConfigService.cs、SysCodeGenService.cs

yzp 2 лет назад
Родитель
Сommit
bcb64c1b26

+ 87 - 80
Admin.NET/Admin.NET.Core/Service/CodeGen/CustomViewEngine.cs

@@ -1,76 +1,81 @@
-// 麻省理工学院许可证
-//
-// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
-//
-// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
-//
-// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
-// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
-
-namespace Admin.NET.Core.Service;
-
-public class CustomViewEngine : ViewEngineModel
-{
-    private readonly ISqlSugarClient _db;
-
-    public CustomViewEngine()
-    {
-    }
-
-    public CustomViewEngine(ISqlSugarClient db)
-    {
-        _db = db;
-    }
-
-    /// <summary>
-    /// 库定位器
-    /// </summary>
-    public string ConfigId { get; set; } = SqlSugarConst.ConfigId;
-
-    public string AuthorName { get; set; }
-
-    public string BusName { get; set; }
-
-    public string NameSpace { get; set; }
-
-    public string ClassName { get; set; }
-
-    public string ProjectLastName { get; set; }
-
-    public string LowerClassName
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+namespace Admin.NET.Core.Service;
+
+public class CustomViewEngine : ViewEngineModel
+{
+    private readonly ISqlSugarClient _db;
+
+    public CustomViewEngine()
+    {
+    }
+
+    public CustomViewEngine(ISqlSugarClient db)
+    {
+        _db = db;
+    }
+
+    /// <summary>
+    /// 库定位器
+    /// </summary>
+    public string ConfigId { get; set; } = SqlSugarConst.ConfigId;
+
+    public string AuthorName { get; set; }
+
+    public string BusName { get; set; }
+
+    public string NameSpace { get; set; }
+
+    public string ClassName { get; set; }
+
+    public string ProjectLastName { get; set; }
+
+    public string LowerClassName
+    {
+        get
+        {
+            return ClassName[..1].ToLower() + ClassName[1..]; // 首字母小写
+        }
+    }
+
+    public List<CodeGenConfig> QueryWhetherList { get; set; }
+
+    public List<CodeGenConfig> TableField { get; set; }
+
+    public bool IsJoinTable { get; set; }
+
+    public bool IsUpload { get; set; }
+
+    private List<ColumnOuput> ColumnList { get; set; }
+
+    public string GetColumnNetType(object tbName, object colName)
     {
-        get
-        {
-            return ClassName[..1].ToLower() + ClassName[1..]; // 首字母小写
-        }
-    }
-
-    public List<CodeGenConfig> QueryWhetherList { get; set; }
-
-    public List<CodeGenConfig> TableField { get; set; }
-
-    public bool IsJoinTable { get; set; }
-
-    public bool IsUpload { get; set; }
-
-    private List<ColumnOuput> ColumnList { get; set; }
-
-    public string GetColumnNetType(object tbName, object colName)
-    {
-        ColumnList = GetColumnListByTableName(tbName.ToString());
-        var col = ColumnList.Where(c => c.ColumnName == colName.ToString()).FirstOrDefault();
-        return col.NetType;
-    }
-
-    public List<ColumnOuput> GetColumnListByTableName(string tableName)
-    {
-        // 多库代码生成切换库
-        var provider = _db.AsTenant().GetConnectionScope(ConfigId != SqlSugarConst.ConfigId ? ConfigId : SqlSugarConst.ConfigId);
-
-        // 获取实体类型属性
+        var config = App.GetOptions<DbConnectionOptions>().ConnectionConfigs.FirstOrDefault(u => u.ConfigId == ConfigId);
+        ColumnList = GetColumnListByTableName(tbName.ToString());
+        //var col = ColumnList.Where(c => c.ColumnName == colName.ToString()).FirstOrDefault(); // 这句在设置了EnableUnderLine时会出错,要改用下面这句
+        var col = ColumnList.Where(c =>
+            (config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(c.ColumnName, new string[0]) : c.ColumnName) == colName.ToString())
+            .FirstOrDefault();
+        
+        return col.NetType;
+    }
+
+    public List<ColumnOuput> GetColumnListByTableName(string tableName)
+    {
+        // 多库代码生成切换库
+        var provider = _db.AsTenant().GetConnectionScope(ConfigId != SqlSugarConst.ConfigId ? ConfigId : SqlSugarConst.ConfigId);
+
+        // 获取实体类型属性
         var entityType = provider.DbMaintenance.GetTableInfoList().FirstOrDefault(u => u.Name == tableName);
 
-        // 因为ConfigId的表通常也会用到主库的表来做连接,所以在ConfigId中找不到实体也尝试一下在主库中查找
+        // 因为ConfigId的表通常也会用到主库的表来做连接,所以这里如果在ConfigId中找不到实体也尝试一下在主库中查找
         if (ConfigId == SqlSugarConst.ConfigId && entityType == null) return null;
         if (ConfigId != SqlSugarConst.ConfigId)
         {
@@ -79,14 +84,16 @@ public class CustomViewEngine : ViewEngineModel
             if (entityType == null) return null;
         }
 
-        // 按原始类型的顺序获取所有实体类型属性(不包含导航属性,会返回null)
-        return provider.DbMaintenance.GetColumnInfosByTableName(entityType.Name).Select(u => new ColumnOuput
-        {
-            ColumnName = u.DbColumnName,
-            ColumnKey = u.IsPrimarykey.ToString(),
-            DataType = u.DataType.ToString(),
-            NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
-            ColumnComment = u.ColumnDescription
-        }).ToList();
-    }
+        
+
+        // 按原始类型的顺序获取所有实体类型属性(不包含导航属性,会返回null)
+        return provider.DbMaintenance.GetColumnInfosByTableName(entityType.Name).Select(u => new ColumnOuput
+        {
+            ColumnName = u.DbColumnName,
+            ColumnKey = u.IsPrimarykey.ToString(),
+            DataType = u.DataType.ToString(),
+            NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
+            ColumnComment = u.ColumnDescription
+        }).ToList();
+    }
 }

+ 6 - 1
Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/ColumnOuput.cs

@@ -17,7 +17,12 @@ public class ColumnOuput
     /// <summary>
     /// 字段名
     /// </summary>
-    public string ColumnName { get; set; }
+    public string ColumnName { get; set; }
+
+    /// <summary>
+    /// 实体的Property名
+    /// </summary>
+    public string PropertyName { get; set; }
 
     /// <summary>
     /// 数据库中类型

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

@@ -111,7 +111,9 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
             }
 
             codeGenConfig.CodeGenId = codeGenerate.Id;
-            codeGenConfig.ColumnName = tableColumn.ColumnName;
+            //这里不能用 ColumnName,应该用 PropertyName (因为Oracle是不区分大小写的,还有个别业务的实体的字段名与Propertty名不一定一样)
+            //目前不想去改模板,所以表结构里没有增加 PropertyName 字段,所以这里暂时先把PropertyName 赋给 ColumnName,以后有空再改
+            codeGenConfig.ColumnName = tableColumn.PropertyName; //tableColumn.ColumnName;
             codeGenConfig.ColumnComment = tableColumn.ColumnComment;
             codeGenConfig.NetType = tableColumn.DataType;
             codeGenConfig.WhetherRetract = YesNoEnum.N.ToString();

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

@@ -207,15 +207,32 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         var config = App.GetOptions<DbConnectionOptions>().ConnectionConfigs.FirstOrDefault(u => u.ConfigId == input.ConfigId);
         var dbTableName = config.DbSettings.EnableUnderLine ? UtilMethods.ToUnderLine(entityType.DbTableName) : entityType.DbTableName;
         var entityBasePropertyNames = _codeGenOptions.EntityBaseColumn[nameof(EntityTenant)];
-        return provider.DbMaintenance.GetColumnInfosByTableName(dbTableName, false).Select(u => new ColumnOuput
+        var columnInfos = provider.DbMaintenance.GetColumnInfosByTableName(dbTableName, false);
+        var result = columnInfos.Select(u => new ColumnOuput
         {
-            // 转下划线后的列名需要再转回来
-            ColumnName = config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames) : u.DbColumnName,
+            // 转下划线后的列名需要再转回来,2023/9/11,后面会根据字段名获取对应Property,所以这里不用转换了,以后面转换。
+            //ColumnName = config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames) : u.DbColumnName,
+            ColumnName = u.DbColumnName,
             ColumnKey = u.IsPrimarykey.ToString(),
             NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
             DataType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
             ColumnComment = string.IsNullOrWhiteSpace(u.ColumnDescription) ? u.DbColumnName : u.ColumnDescription
         }).ToList();
+        // 获取实体的属性信息,并赋值给PropertyName属性
+        var entityProperties = entityType.Type.GetProperties();
+        //foreach (var columnOutput in result)
+        for (int i= result.Count-1;i>=0;i--)
+        {
+            var columnOutput = result[i];
+            var propertyName = entityProperties.FirstOrDefault(p =>
+                p.Name == (config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(columnOutput.ColumnName, entityBasePropertyNames) : columnOutput.ColumnName) || 
+                p.GetCustomAttribute<SugarColumn>()?.ColumnName?.ToLower() == columnOutput.ColumnName.ToLower()).Name;
+            if (propertyName != null)
+                columnOutput.PropertyName = propertyName;
+            else
+                result.RemoveAt(i);// 如果实体中都没有定义这个属性,那么显示字段也没有意义,所以这里移除它
+        }
+        return result;
     }
 
     /// <summary>
@@ -265,7 +282,8 @@ public class SysCodeGenService : IDynamicApiController, ITransient
             {
                 EntityName = c.Name,
                 DbTableName = sugarAttribute == null ? c.Name : ((SugarTable)sugarAttribute).TableName,
-                TableDescription = description
+                TableDescription = description,
+                Type = c
             });
         }
         return await Task.FromResult(entityInfos);
@@ -295,7 +313,6 @@ public class SysCodeGenService : IDynamicApiController, ITransient
             targetPathList = GetTargetPathList(input);
 
         var tableFieldList = await _codeGenConfigService.GetList(new CodeGenConfig() { CodeGenId = input.Id }); // 字段集合
-
         var queryWhetherList = tableFieldList.Where(u => u.QueryWhether == YesNoEnum.Y.ToString()).ToList(); // 前端查询集合
         var joinTableList = tableFieldList.Where(u => u.EffectType == "Upload" || u.EffectType == "fk" || u.EffectType == "ApiTreeSelect").ToList(); // 需要连表查询的字段
         (string joinTableNames, string lowerJoinTableNames) = GetJoinTableStr(joinTableList); // 获取连表的实体名和别名
@@ -499,7 +516,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
 
         var menuList = new List<SysMenu>() { menuType2, menuType2_1, menuType2_2, menuType2_3, menuType2_4 };
         // 加入fk、Upload、ApiTreeSelect 等接口的权限
-        var fkTableList = tableFieldList.Where(u => u.EffectType == "fk").ToList();
+        var fkTableList = tableFieldList.Where(u => u.EffectType == "fk").ToList(); 
         foreach (var @column in fkTableList)
         {
             var menuType = new SysMenu

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

@@ -86,7 +86,7 @@ if (@column.QueryWhether == "Y"){
     }
 }
 }
-        query = query.OrderBuilder(input);
+        query = query.OrderBuilder(input, "", "CreateTime");
         return await query.ToPagedListAsync(input.Page, input.PageSize);
     }
 

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

@@ -1,4 +1,6 @@
 @{Dictionary<string, int> definedObjects = new Dictionary<string, int>();}
+@{var pkField = Model.TableField.Where(c => c.ColumnKey == "True").FirstOrDefault();}
+@{string pkFieldName = LowerFirstLetter(pkField.ColumnName);}
 <template>
 	<div class="@(@Model.LowerClassName)-container">
 		<el-dialog v-model="isShowDialog" :title="props.title" :width="800" draggable="">
@@ -219,10 +221,10 @@ const submit = async () => {
   ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => {
     if (isValid) {
       let values = ruleForm.value;
-      if (ruleForm.value.id != undefined && ruleForm.value.id > 0) {
-        await update@(@Model.ClassName)(values);
-      } else {
+      if (ruleForm.value.@(@pkFieldName) == undefined || ruleForm.value.@(@pkFieldName) == null || ruleForm.value.@(@pkFieldName) == "" || ruleForm.value.@(@pkFieldName) == 0) {
         await add@(@Model.ClassName)(values);
+      } else {
+		await update@(@Model.ClassName)(values);
       }
       closeDialog();
     } else {

+ 5 - 3
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm

@@ -1,3 +1,5 @@
+@{var pkField = Model.TableField.Where(c => c.ColumnKey == "True").FirstOrDefault();}
+@{string pkFieldName = LowerFirstLetter(pkField.ColumnName);}
 <template>
   <div class="@(@Model.LowerClassName)-container">
     <el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
@@ -69,7 +71,7 @@
 				style="width: 100%"
 				v-loading="loading"
 				tooltip-effect="light"
-				row-key="id"
+				row-key="@(@pkFieldName)"
 				border="">
         <el-table-column type="index" label="序号" width="55" align="center"/>
         @foreach (var column in Model.TableField){
@@ -93,7 +95,7 @@
             @:<span>{{scope.row.@LowerFirstLetter(@column.ColumnName)@(column.DisplayColumn)}}</span>
             }else if(@column.EffectType == "Switch"){
             @:<el-tag v-if="scope.row.@(@column.LowerColumnName)"> 是 </el-tag>
-            @:<el-tag type="danger" v-else=""> 否 </el-tag>
+            @:<el-tag type="danger" v-else> 否 </el-tag>
             }else if(@column.EffectType == "ConstSelector"){
             @:<span>{{codeToName(scope.row.@(@column.LowerColumnName), '@(@column.DictTypeCode)')}}</span>
             }
@@ -103,7 +105,7 @@
         </el-table-column>
         }
         else {
-        @: <el-table-column prop="@column.LowerColumnName" label="@column.ColumnComment" width="@(column.ColumnComment!=null && column.ColumnComment.Length > 5 ? column.ColumnComment.Length * 15 : 120)" show-overflow-tooltip="" />
+        @:<el-table-column prop="@column.LowerColumnName" label="@column.ColumnComment" width="@(column.ColumnComment!=null && column.ColumnComment.Length > 5 ? column.ColumnComment.Length * 15 : 130)" show-overflow-tooltip="" />
         }
         }
         }

+ 1 - 1
Web/src/views/system/codeGen/component/editCodeGenDialog.vue

@@ -46,7 +46,7 @@
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="生成表" prop="tableName" :rules="[{ required: true, message: '生成表不能为空', trigger: 'blur' }]">
 							<el-select v-model="state.ruleForm.tableName" filterable clearable class="w100">
-								<el-option v-for="item in state.tableData" :key="item.entityName" :label="item.tableName" :value="item.entityName" />
+								<el-option v-for="item in state.tableData" :key="item.entityName" :label="item.entityName + ' ( ' + item.tableName +' )'" :value="item.entityName" />
 							</el-select>
 						</el-form-item>
 					</el-col>