diff --git a/.gitignore b/.gitignore index 68855934284e3025eeadfa115868ce8a34eb3fb1..88c285538c8a9203f764d78037394597e31eb965 100644 --- a/.gitignore +++ b/.gitignore @@ -81,3 +81,7 @@ /Net6.SqlSugar/VOL.System/bin /Net6.SqlSugar/VOL.WebApi/obj /Net6.SqlSugar/VOL.WebApi/bin +/Net6.SqlSugar/App.Workspace/obj +/Net6.SqlSugar/App.Workspace/bin +/Net6.SqlSugar/VOL.Order/bin/Debug/net6.0 +/Net6.SqlSugar/VOL.Order/obj diff --git a/Net6.SqlSugar/VOL.Builder/IServices/Core/Partial/ISys_TableInfoService.cs b/Net6.SqlSugar/VOL.Builder/IServices/Core/Partial/ISys_TableInfoService.cs index c77a18f570971d37fe7ccfda32bae5430a42a52f..8106af67e49d405814ce6ae7520a6e409d2ca1cc 100644 --- a/Net6.SqlSugar/VOL.Builder/IServices/Core/Partial/ISys_TableInfoService.cs +++ b/Net6.SqlSugar/VOL.Builder/IServices/Core/Partial/ISys_TableInfoService.cs @@ -19,7 +19,7 @@ namespace VOL.Builder.IServices string CreateVuePage(Sys_TableInfo sysTableInfo, string vuePath); - object LoadTable(int parentId, string tableName, string columnCNName, string nameSpace, string foldername, int table_Id, bool isTreeLoad); + object LoadTable(int parentId, string tableName, string columnCNName, string nameSpace, string foldername, int table_Id, bool isTreeLoad,bool isAlias); Task SyncTable(string tableName); Task DelTree(int table_Id); } diff --git a/Net6.SqlSugar/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs b/Net6.SqlSugar/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs index 89c02db68cfa6908903dec38bf1927bc9a3aae69..557cd97ca20de0493222b1e87bda2efbdd941d15 100644 --- a/Net6.SqlSugar/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs +++ b/Net6.SqlSugar/VOL.Builder/Services/Core/Partial/Sys_TableInfoService.cs @@ -31,6 +31,7 @@ namespace VOL.Builder.Services private string webProject = null; private string apiNameSpace = null; private string startName = ""; + private string StratName { get @@ -42,6 +43,7 @@ namespace VOL.Builder.Services return startName; } } + private string WebProject { get @@ -56,6 +58,7 @@ namespace VOL.Builder.Services return webProject; } } + private string ApiNameSpace { get @@ -97,7 +100,6 @@ namespace VOL.Builder.Services string startsWith = WebProject.Substring(0, WebProject.IndexOf('.')); return (treeList.Count() == 0 ? "[]" : treeList.Serialize() ?? "", ProjectPath.GetProjectFileName(startsWith)); ; - } /// @@ -156,7 +158,6 @@ DISTINCT table_name = ?tableName {GetMysqlTableSchema()};"; } - /// /// 获取SqlServer表结构信息 /// @@ -164,9 +165,9 @@ DISTINCT private string GetSqlServerModelInfo() { return $@" - SELECT CASE WHEN t.ColumnType IN ('DECIMAL','smallmoney','money') THEN + SELECT CASE WHEN t.ColumnType IN ('DECIMAL','smallmoney','money') THEN CONVERT(VARCHAR(30),t.Prec)+','+CONVERT(VARCHAR(30),t.Scale) ELSE '' - END + END AS Prec_Scale,t.ColumnType,t.ColumnName FROM ( SELECT col.prec AS 'Prec',col.scale AS 'Scale',t.name AS ColumnType,col.name AS ColumnName FROM dbo.syscolumns col @@ -183,6 +184,7 @@ DISTINCT AND epTwo.name = 'MS_Description' WHERE obj.name =@tableName) AS t"; } + /// /// 获取PgSQl表结构信息 /// 2020.08.07完善PGSQL @@ -240,26 +242,24 @@ DISTINCT && x.BaseType == typeof(BaseEntity))) { if (entity.Name == tableTrueName && !string.IsNullOrEmpty(tableName) && tableName != tableTrueName) - return webResponse.Error($"实际表名【{tableTrueName }】已创建实体,不能创建别名【{tableName}】实体"); + return webResponse.Error($"实际表名【{tableTrueName}】已创建实体,不能创建别名【{tableName}】实体"); if (entity.Name != tableName) { var tableAttr = entity.GetCustomAttribute(); if (tableAttr != null && tableAttr.Name == tableTrueName) { - return webResponse.Error($"实际表名【{tableTrueName }】已被【{entity.Name}】创建建实体,不能创建别名【{tableName}】实体,请将别名更换为【{entity.Name}】"); + return webResponse.Error($"实际表名【{tableTrueName}】已被【{entity.Name}】创建建实体,不能创建别名【{tableName}】实体,请将别名更换为【{entity.Name}】"); } } } } catch (Exception ex) { - Console.WriteLine("查找文件异常:" + ex.Message); } } return webResponse; - } /// @@ -295,9 +295,11 @@ DISTINCT case "MySql": sql = GetMySqlModelInfo(); break; + case "PgSql": sql = GetPgSqlModelInfo(); break; + default: sql = GetSqlServerModelInfo(); break; @@ -324,6 +326,11 @@ DISTINCT { return WebResponseContent.Instance.Error($"父级id不能为自己"); } + //检查别名是否重复 + if (DuplicateAliasCheck(sysTableInfo.TableName)) + { + return new WebResponseContent().Error("表别名已经存,请重新命名"); + } if (sysTableInfo.TableColumns != null && sysTableInfo.TableColumns.Any(x => !string.IsNullOrEmpty(x.DropNo) && x.ColumnName == sysTableInfo.ExpressField)) { return WebResponseContent.Instance.Error($"不能将字段【{sysTableInfo.ExpressField}】设置为快捷编辑,因为已经设置了数据源"); @@ -332,7 +339,8 @@ DISTINCT { sysTableInfo.TableColumns.ForEach(x => { - x.TableName = sysTableInfo.TableName; + // x.TableName = sysTableInfo.TableName; + x.TableName = sysTableInfo.TableTrueName; //使用主子表别名时,明细字段需要实际表名 }); } @@ -345,7 +353,7 @@ DISTINCT }); repository.SqlSugarClient.UpdateNav(sysTableInfo).Include(x => x.TableColumns).ExecuteCommand(); return webResponse.OK("保存成功", sysTableInfo); - // return repository.UpdateRange(sysTableInfo, true, true, null, null, true); + // return repository.UpdateRange(sysTableInfo, true, true, null, null, true); } /// @@ -381,7 +389,7 @@ DISTINCT WebResponseContent webResponse = new WebResponseContent(); if (string.IsNullOrEmpty(tableName)) return webResponse.OK("表名不能为空"); - Sys_TableInfo tableInfo = repository.FindAsIQueryable(x => x.TableName == tableName) + Sys_TableInfo tableInfo = repository.FindAsIQueryable(x => x.TableTrueName == tableName) .Includes(o => o.TableColumns).FirstOrDefault(); if (tableInfo == null) return webResponse.Error("未获取到【" + tableName + "】的配置信息,请使用新建功能"); @@ -398,7 +406,6 @@ DISTINCT if (columns == null || columns.Count == 0) return webResponse.Error("未获取到【" + tableName + "】表结构信息,请确认表是否存在"); - //获取现在配置好的表结构 List detailList = tableInfo.TableColumns ?? new List(); List addColumns = new List(); @@ -410,7 +417,7 @@ DISTINCT //新加的列 if (tableColumn == null) { - item.TableName = tableInfo.TableName; + item.TableName = tableInfo.TableTrueName; item.Table_Id = tableInfo.Table_Id; addColumns.Add(item); continue; @@ -449,13 +456,16 @@ DISTINCT /// public string CreateServices(string tableName, string nameSpace, string foldername, bool webController, bool apiController) { - var tableColumn = repository.FindAsyncFirst(x => x.TableName == tableName).Result; - + var tableinfo = repository.FindFirstAsync(x => x.TableName == tableName).Result; + if (tableinfo == null) + { + return $"没有查到{tableName}表信息"; + } + var tableColumn = repository.FindAsyncFirst(x => x.TableName == tableinfo.TableTrueName).Result; if (tableColumn == null) { return $"没有查到{tableName}表信息"; } - if (string.IsNullOrEmpty(nameSpace) || string.IsNullOrEmpty(foldername)) { return $"命名空间、项目文件夹都不能为空"; @@ -500,8 +510,7 @@ DISTINCT frameworkFolder + string.Format("\\{0}\\IRepositories\\{1}\\", nameSpace, foldername), "I" + tableName + "Repository.cs", domainContent); - - string path = $"{frameworkFolder}\\{nameSpace}\\IServices\\{ foldername}\\"; + string path = $"{frameworkFolder}\\{nameSpace}\\IServices\\{foldername}\\"; string fileName = "I" + tableName + "Service.cs"; @@ -516,8 +525,7 @@ DISTINCT domainContent = FileHelper.ReadFile("Template\\IServices\\IServiceBase.html").Replace("{Namespace}", nameSpace).Replace("{TableName}", tableName).Replace("{StartName}", StratName); FileHelper.WriteFile(path, fileName, domainContent); - - path = $"{frameworkFolder}\\{nameSpace}\\Services\\{ foldername}\\"; + path = $"{frameworkFolder}\\{nameSpace}\\Services\\{foldername}\\"; fileName = tableName + "Service.cs"; //生成Partial Service类 domainContent = FileHelper.ReadFile("Template\\Services\\ServiceBasePartial.html").Replace("{Namespace}", nameSpace).Replace("{TableName}", tableName).Replace("{StartName}", StratName); @@ -533,10 +541,9 @@ DISTINCT .Replace("{StartName}", StratName); FileHelper.WriteFile(path, fileName, domainContent); - if (webController) { - path = $"{frameworkFolder}\\{nameSpace}\\Controllers\\{ foldername}\\"; + path = $"{frameworkFolder}\\{nameSpace}\\Controllers\\{foldername}\\"; fileName = tableName + "Controller.cs"; //生成Partial web控制器 if (!FileHelper.FileExists(path + "Partial\\" + fileName)) @@ -738,7 +745,6 @@ DISTINCT pageContent = FileHelper.ReadFile("Template\\Page\\VueSearchPage.html"); } - if (string.IsNullOrEmpty(pageContent)) { return "未找到Template模板文件"; @@ -780,6 +786,7 @@ DISTINCT Replace("#Foots", " "). Replace("#cnName", sysTableInfo.ColumnCNName). Replace("#url", "/" + sysTableInfo.TableName + "/"). + Replace("$TableName", sysTableInfo.TableName). Replace("#folder", spaceFolder). Replace("#editFormFileds", formFileds). Replace("#editFormOptions", formOptions. @@ -787,17 +794,15 @@ DISTINCT Replace("],[", "],\r\n [")); vuePath = vuePath.Replace("//", "\\").Trim('\\'); - - //如果有明细,加载明细的数据 if (!string.IsNullOrEmpty(sysTableInfo.DetailName) && !isApp) { - Sys_TableInfo detailTable = repository.FindAsIQueryable(x => x.TableName == sysTableInfo.DetailName) + Sys_TableInfo detailTable = repository.FindAsIQueryable(x => x.TableTrueName == sysTableInfo.DetailName) .Includes(x => x.TableColumns).FirstOrDefault(); if (detailTable == null) - return $"请先生成明细表{ sysTableInfo.DetailName}的配置!"; + return $"请先生成明细表{sysTableInfo.DetailName}的配置!"; if (detailTable.TableColumns == null || detailTable.TableColumns.Count == 0) - return $"明细表{ sysTableInfo.DetailName}没有列的信息,请确认是否有列数据或列数据是否被删除!"; + return $"明细表{sysTableInfo.DetailName}没有列的信息,请确认是否有列数据或列数据是否被删除!"; var _name = detailTable.TableColumns.Where(x => x.IsImage < 4 && x.EditRowNo > 0).Select(s => s.ColumnName).FirstOrDefault(); //if (!string.IsNullOrEmpty(_name)) //{ @@ -823,7 +828,6 @@ DISTINCT .Replace("#detailSortName", ""); } - //生成扩展逻辑页面(只创建一次) //获取view的上一级目录 string srcPath = new DirectoryInfo(vuePath.MapPath()).Parent.FullName; @@ -835,19 +839,17 @@ DISTINCT if (!isApp) { if (!FileHelper.FileExists(extensionPath + exFileName) - || FileHelper.FileExists($"{extensionPath}+\\{ sysTableInfo.FolderName.ToLower()}\\{ exFileName}")) + || FileHelper.FileExists($"{extensionPath}+\\{sysTableInfo.FolderName.ToLower()}\\{exFileName}")) { //2021.03.06增加前端生成文件到指定文件夹(以前生成过的文件不受影响) - extensionPath = $"{srcPath}\\extension\\{spaceFolder}\\{ sysTableInfo.FolderName.ToLower()}\\"; + extensionPath = $"{srcPath}\\extension\\{spaceFolder}\\{sysTableInfo.FolderName.ToLower()}\\"; spaceFolder = spaceFolder + "\\" + sysTableInfo.FolderName.ToLower(); tableName = sysTableInfo.FolderName.ToLower() + "/" + tableName; } } - if (!isApp && !FileHelper.FileExists(extensionPath + exFileName)) { - string exContent = FileHelper.ReadFile("Template\\Page\\VueExtension.html"); FileHelper.WriteFile(extensionPath, exFileName, exContent); } @@ -856,20 +858,20 @@ DISTINCT if (isApp) { - if (!FileHelper.FileExists($"{vuePath}\\{ spaceFolder}\\{sysTableInfo.TableName}\\{sysTableInfo.TableName}Extend.js")) + if (!FileHelper.FileExists($"{vuePath}\\{spaceFolder}\\{sysTableInfo.TableName}\\{sysTableInfo.TableName}Extend.js")) { //生成扩展文件 string pageContentEx = FileHelper.ReadFile("Template\\Page\\app\\extension.html"); - FileHelper.WriteFile($"{vuePath}\\{ spaceFolder}\\{sysTableInfo.TableName}\\", sysTableInfo.TableName + "Extend.js", pageContentEx); + FileHelper.WriteFile($"{vuePath}\\{spaceFolder}\\{sysTableInfo.TableName}\\", sysTableInfo.TableName + "Extend.js", pageContentEx); } //生成app配置options.js文件 - FileHelper.WriteFile($"{vuePath}\\{ spaceFolder}\\{sysTableInfo.TableName}\\", sysTableInfo.TableName + "Options.js", pageContent); + FileHelper.WriteFile($"{vuePath}\\{spaceFolder}\\{sysTableInfo.TableName}\\", sysTableInfo.TableName + "Options.js", pageContent); - if (!FileHelper.FileExists($"{vuePath}\\{ spaceFolder}\\{sysTableInfo.TableName}\\{sysTableInfo.TableName}.vue")) + if (!FileHelper.FileExists($"{vuePath}\\{spaceFolder}\\{sysTableInfo.TableName}\\{sysTableInfo.TableName}.vue")) { //生成vue文件 pageContent = FileHelper.ReadFile("Template\\Page\\app\\page.html").Replace("#TableName", sysTableInfo.TableName); - FileHelper.WriteFile($"{vuePath}\\{ spaceFolder}\\{sysTableInfo.TableName}\\", sysTableInfo.TableName + ".vue", pageContent); + FileHelper.WriteFile($"{vuePath}\\{spaceFolder}\\{sysTableInfo.TableName}\\", sysTableInfo.TableName + ".vue", pageContent); } string name = FileHelper.ReadFile(@$"{srcPath}\pages.json"); @@ -896,7 +898,7 @@ DISTINCT { // spaceFolder = spaceFolder; //+ "\\" + sysTableInfo.FolderName.ToLower(); //生成vue页面 - FileHelper.WriteFile($"{vuePath}\\{ spaceFolder}\\", sysTableInfo.TableName + ".vue", pageContent); + FileHelper.WriteFile($"{vuePath}\\{spaceFolder}\\", sysTableInfo.TableName + ".vue", pageContent); //生成路由 string routerPath = $"{srcPath}\\router\\viewGird.js"; @@ -913,9 +915,8 @@ DISTINCT return "页面创建成功!"; } - /// - /// + /// /// /// /// @@ -933,7 +934,7 @@ DISTINCT { return $@"SELECT DISTINCT Column_Name AS ColumnName, - '{ tableName}' as tableName, + '{tableName}' as tableName, Column_Comment AS ColumnCnName, CASE WHEN data_type IN( 'BIT', 'BOOL', 'bit', 'bool') THEN @@ -953,11 +954,11 @@ DISTINCT END AS ColumnType, case WHEN CHARACTER_MAXIMUM_LENGTH>8000 THEN 0 ELSE CHARACTER_MAXIMUM_LENGTH end AS Maxlength, CASE - WHEN COLUMN_KEY <> '' THEN + WHEN COLUMN_KEY <> '' THEN 1 ELSE 0 END AS IsKey, CASE - WHEN Column_Name IN( 'CreateID', 'ModifyID', '' ) + WHEN Column_Name IN( 'CreateID', 'ModifyID', '' ) OR COLUMN_KEY<> '' THEN 0 ELSE 1 END AS IsDisplay, @@ -1238,6 +1239,20 @@ DISTINCT }); } + /// + /// 重复别名检查 + /// + /// + private bool DuplicateAliasCheck(string tableName) + { + var duplicateNames = repository.Find(x => x.TableName == tableName) + .GroupBy(x => x.TableName) + .Where(group => group.Count() > 1) + .Select(group => group.Key) + .ToList(); + return duplicateNames.Count >= 1; + } + /// /// 初始化生成配置对应表的数据信息 /// @@ -1248,8 +1263,9 @@ DISTINCT /// /// /// + /// true则将文件夹名称作为别名,默认不启用 /// - private int InitTable(int parentId, string tableName, string columnCNName, string nameSpace, string foldername, int tableId, bool isTreeLoad) + private int InitTable(int parentId, string tableName, string columnCNName, string nameSpace, string foldername, int tableId, bool isTreeLoad, bool isAlias) { if (isTreeLoad) return tableId; @@ -1259,12 +1275,18 @@ DISTINCT if (tableId > 0) return tableId; bool isMySql = DBType.Name == DbCurrentType.MySql.ToString(); + //检查别名是否重复 + if (DuplicateAliasCheck(isAlias ? foldername : tableName)) + { + return -2; + } Sys_TableInfo tableInfo = new Sys_TableInfo() { ParentId = parentId, ColumnCNName = columnCNName, CnName = columnCNName, - TableName = tableName, + TableName = isAlias ? foldername : tableName, //文件夹名是否启用作为别名 + TableTrueName = tableName, //实际表名 Namespace = nameSpace, FolderName = foldername, Enable = 1 @@ -1278,6 +1300,7 @@ DISTINCT columns[i].OrderNo = orderNo; orderNo = orderNo - 50; columns[i].EditRowNo = 0; + columns[i].TableName = tableName; //修正为实际表名 } SetMaxLength(columns); @@ -1296,14 +1319,19 @@ DISTINCT /// /// /// true只加载表数据 + /// true则将文件夹名称作为别名,默认不启用 /// - public object LoadTable(int parentId, string tableName, string columnCNName, string nameSpace, string foldername, int tableId, bool isTreeLoad) + public object LoadTable(int parentId, string tableName, string columnCNName, string nameSpace, string foldername, int tableId, bool isTreeLoad, bool isAlias) { if (!UserContext.Current.IsSuperAdmin && !isTreeLoad) { return new WebResponseContent().Error("只有超级管理员才能进行此操作"); } - tableId = InitTable(parentId, tableName?.Trim(), columnCNName, nameSpace, foldername, tableId, isTreeLoad); + tableId = InitTable(parentId, tableName?.Trim(), columnCNName, nameSpace, foldername, tableId, isTreeLoad, isAlias); + if (tableId == -2) + { + return new WebResponseContent().Error("表别名已经存,请重新命名"); + } Sys_TableInfo tableInfo = repository .FindAsIQueryable(x => x.Table_Id == tableId) .Includes(c => c.TableColumns) @@ -1433,15 +1461,16 @@ DISTINCT } else { - switch (item.EditType) { case "date": sb.Append("editor:'datebox',"); break; + case "datetime": sb.Append("editor:'datetimebox',"); break; + case "drop": case "dropList": case "select": @@ -1455,6 +1484,7 @@ DISTINCT sb.Append(editText + ": 'text',"); } break; + default: sb.Append(editText + ":'text',"); break; @@ -1524,6 +1554,8 @@ DISTINCT /// 1、创建实体类,2创建apiinput类,3、创建apioutput类 private string CreateEntityModel(List sysColumn, Sys_TableInfo tableInfo, List tableColumnInfoList, int createType) { + var detaileTable = repository.FindFirst(x => x.TableTrueName == tableInfo.DetailName); + string template = ""; if (createType == 1) { @@ -1580,7 +1612,6 @@ DISTINCT if (column.ColumnType == "string" && column.Maxlength > 0 && column.Maxlength < 8000) { - AttributeBuilder.Append(" [MaxLength(" + column.Maxlength + ")]"); AttributeBuilder.Append("\r\n"); } @@ -1601,7 +1632,7 @@ DISTINCT AttributeBuilder.Append(" [DisplayFormat(DataFormatString=\"" + tableColumnInfo.Prec_Scale + "\")]"); AttributeBuilder.Append("\r\n"); } - + if ((column.IsKey == 1 && (column.ColumnType == "uniqueidentifier")) || tableColumnInfo.ColumnType.ToLower() == "guid" || (IsMysql() && column.ColumnType == "string" && column.Maxlength == 36)) @@ -1609,7 +1640,6 @@ DISTINCT tableColumnInfo.ColumnType = "uniqueidentifier"; } - string maxLength = string.Empty; if (tableColumnInfo.ColumnType != "uniqueidentifier") { @@ -1627,7 +1657,7 @@ DISTINCT maxLength = "(" + column.Maxlength + ")"; } } - else if (column.IsKey == 1 && column.ColumnType.ToLower() == "string" && column.Maxlength!=36) + else if (column.IsKey == 1 && column.ColumnType.ToLower() == "string" && column.Maxlength != 36) { maxLength = "(" + column.Maxlength + ")"; } @@ -1635,7 +1665,6 @@ DISTINCT AttributeBuilder.Append(" [Column(TypeName=\"" + tableColumnInfo.ColumnType + maxLength + "\")]"); AttributeBuilder.Append("\r\n"); - //if ((tableColumnInfo.ColumnType == "int" || tableColumnInfo.ColumnType == "bigint" || tableColumnInfo.ColumnType == "long") && column.ColumnType.ToLower() == "string") if (tableColumnInfo.ColumnType == "int" || tableColumnInfo.ColumnType == "bigint" || tableColumnInfo.ColumnType == "long") { @@ -1689,7 +1718,11 @@ DISTINCT // [Navigate(NavigateType.OneToMany, nameof(Dic_ID), nameof(Dic_ID))] AttributeBuilder.Append("[Navigate(NavigateType.OneToMany,nameof(" + keyName + "),nameof(" + keyName + "))]"); AttributeBuilder.Append("\r\n "); - AttributeBuilder.Append("public List<" + tableInfo.DetailName + "> " + tableInfo.DetailName + " { get; set; }"); + if (detaileTable != null) + { + AttributeBuilder.Append("public List<" + detaileTable.TableName + "> " + tableInfo.DetailName + " { get; set; }"); + } + AttributeBuilder.Append("\r\n"); } if (addIgnore && createType == 1) @@ -1718,13 +1751,23 @@ DISTINCT } if (!string.IsNullOrEmpty(tableInfo.DetailName) && createType == 1) { - // 'typeof('+[1,2].join('),typeof(')+')' - string typeArr = " new Type[] { typeof(" + string.Join("),typeof(", tableInfo.DetailName.Split(',')) + ")}"; + string typeArr = string.Empty; + + if (detaileTable != null) + { + typeArr = " new Type[] { typeof(" + string.Join("),typeof(", detaileTable.TableName) + ")}"; + } + else + { + // 'typeof('+[1,2].join('),typeof(')+')' + // typeArr = " new Type[] { typeof(" + string.Join("),typeof(", tableInfo.DetailName.Split(',')) + ")}"; + return "明细表别名出错"; + } + entityAttribute.Add("DetailTable = " + typeArr + ""); } if (!string.IsNullOrEmpty(tableInfo.DetailCnName)) { - entityAttribute.Add("DetailTableCnName = \"" + tableInfo.DetailCnName + "\""); } if (!string.IsNullOrEmpty(tableInfo.DBServer) && createType == 1) @@ -1763,7 +1806,9 @@ DISTINCT { tableTrueName = tableTrueName.ToLower(); } - tableAttr = tableAttr + "\r\n[Table(\"" + tableInfo.TableTrueName + "\")]"; + tableAttr = tableAttr + "\r\n [Table(\"" + tableInfo.TableTrueName + "\")]"; + //添加SqlSugarROM特性 + tableAttr = tableAttr + "\r\n [SugarTable(\"" + tableInfo.TableTrueName + "\")]"; } domainContent = domainContent.Replace("{AttributeManager}", tableAttr).Replace("{Namespace}", modelNameSpace); @@ -1811,6 +1856,7 @@ DISTINCT } private static string[] formType = new string[] { "bigint", "int", "decimal", "float", "byte" }; + private string GetDisplayType(bool search, string searchType, string editType, string columnType) { string type = ""; @@ -1896,11 +1942,11 @@ DISTINCT } } - private static bool IsMysql() { return DBType.Name.ToLower() == DbCurrentType.MySql.ToString().ToLower(); } + private WebResponseContent ValidColumnString(Sys_TableInfo tableInfo) { WebResponseContent webResponse = new WebResponseContent(true); @@ -1913,17 +1959,17 @@ DISTINCT // .Select(s => s.ColumnName) .FirstOrDefault(); if (mainTableColumn == null) - return webResponse.Error($"请勾选表[{tableInfo.TableName}]的主键"); + return webResponse.Error($"请勾选表[{tableInfo.TableTrueName}]的主键"); string key = mainTableColumn.ColumnName; //明细表外键列的配置信息 Sys_TableColumn tableColumn = repository - .Find(x => x.TableName == tableInfo.DetailName && x.ColumnName == key) + .Find(x => x.Table_Id == tableInfo.Table_Id && x.ColumnName == key) ?.FirstOrDefault(); if (tableColumn == null) - return webResponse.Error($"明细表必须包括[{tableInfo.TableName}]主键字段[{key}]"); + return webResponse.Error($"明细表必须包括[{tableInfo.TableTrueName}]主键字段[{key}]"); if (mainTableColumn.ColumnType?.ToLower() != tableColumn.ColumnType?.ToLower()) { @@ -1938,10 +1984,7 @@ DISTINCT return webResponse.Error($"主表主键类型为Guid,明细表[{tableInfo.DetailName}]配置的字段[{key}]长度必须是36,请重将明细表字段[{key}]长度设置为36,点击保存与生成Model"); } - //mysql如果主键使用的是guid,需要判断明细表的外键是否配置正确 - - } //if (tableInfo.TableColumns.Exists(x => x.ColumnType == "string" && (x.Maxlength ?? 0) <= 0)) @@ -1950,9 +1993,8 @@ DISTINCT //} return webResponse; } - - } + public class PanelHtml { public string text { get; set; } @@ -1966,5 +2008,4 @@ DISTINCT public int colSize { get; set; } public int fileMaxCount { get; set; } } -} - +} \ No newline at end of file diff --git a/Net6.SqlSugar/VOL.Core/DBManager/DBServerProvider.cs b/Net6.SqlSugar/VOL.Core/DBManager/DBServerProvider.cs index 59a06865a60f30f6e2bb2c10f198a8c9bd8c5651..f704f300bfe145ee87c08f77dc35ba6871b68cd9 100644 --- a/Net6.SqlSugar/VOL.Core/DBManager/DBServerProvider.cs +++ b/Net6.SqlSugar/VOL.Core/DBManager/DBServerProvider.cs @@ -14,16 +14,16 @@ using VOL.Core.Extensions; namespace VOL.Core.DBManager { - public partial class DBServerProvider: DbManger + public partial class DBServerProvider : DbManger { private static Dictionary ConnectionArray = new Dictionary(StringComparer.OrdinalIgnoreCase); - private static readonly string DefaultConnName = "defalut"; static DBServerProvider() { SetConnection(DefaultConnName, AppSetting.DbConnectionString); } + public static void SetConnection(string key, string val) { if (ConnectionArray.ContainsKey(key)) @@ -33,13 +33,14 @@ namespace VOL.Core.DBManager } ConnectionArray.Add(key, val); } + /// /// 设置默认数据库连接 /// /// public static void SetDefaultConnection(string val) { - SetConnection(DefaultConnName, val); + SetConnection(DefaultConnName, val); } public static string GetConnectionString(string key) @@ -51,6 +52,7 @@ namespace VOL.Core.DBManager } return key; } + /// /// 获取默认数据库连接 /// @@ -59,9 +61,10 @@ namespace VOL.Core.DBManager { return GetConnectionString(DefaultConnName); } + public static VOLContext DbContext { get { return Utilities.HttpContext.Current.RequestServices.GetService(typeof(VOLContext)) as VOLContext; } } } -} +} \ No newline at end of file diff --git a/Net6.SqlSugar/VOL.WebApi/Controllers/Builder/BuilderController.cs b/Net6.SqlSugar/VOL.WebApi/Controllers/Builder/BuilderController.cs index b61e9393dc5553115c5e4227118d5136a4af181f..9e4aaf41ab14ff1de7310a5a86774eee5243737c 100644 --- a/Net6.SqlSugar/VOL.WebApi/Controllers/Builder/BuilderController.cs +++ b/Net6.SqlSugar/VOL.WebApi/Controllers/Builder/BuilderController.cs @@ -63,9 +63,9 @@ namespace VOL.WebApi.Controllers.Builder } [Route("LoadTableInfo")] [HttpPost] - public ActionResult LoadTable(int parentId, string tableName, string columnCNName, string nameSpace, string foldername, int table_Id, bool isTreeLoad) + public ActionResult LoadTable(int parentId, string tableName, string columnCNName, string nameSpace, string foldername, int table_Id, bool isTreeLoad,bool isAlias) { - return Json(Service.LoadTable(parentId, tableName, columnCNName, nameSpace, foldername, table_Id, isTreeLoad)); + return Json(Service.LoadTable(parentId, tableName, columnCNName, nameSpace, foldername, table_Id, isTreeLoad,isAlias)); } [Route("delTree")] diff --git a/Net6.SqlSugar/VOL.WebApi/Template/Page/Vue3SearchPage.html b/Net6.SqlSugar/VOL.WebApi/Template/Page/Vue3SearchPage.html index 178cb77db281b45783b16b1da9ad6b524ec21cd9..931b5904df91b65822d08df957c5eb606f98b8b5 100644 --- a/Net6.SqlSugar/VOL.WebApi/Template/Page/Vue3SearchPage.html +++ b/Net6.SqlSugar/VOL.WebApi/Template/Page/Vue3SearchPage.html @@ -25,7 +25,7 @@ key: '#key', footer: "Foots", cnName: '#cnName', - name: '#TableName', + name: '$TableName', url: "#url", sortName: "#SortName" }); diff --git a/Net6.SqlSugar/VOL.WebApi/Template/Page/VueSearchPage.html b/Net6.SqlSugar/VOL.WebApi/Template/Page/VueSearchPage.html index bed17735c98f79dbb94e5de968bee283d44bd213..9a7c66f499b6b32023e6e6f540b3c1ea0ac5fdcd 100644 --- a/Net6.SqlSugar/VOL.WebApi/Template/Page/VueSearchPage.html +++ b/Net6.SqlSugar/VOL.WebApi/Template/Page/VueSearchPage.html @@ -35,7 +35,7 @@ key: '#key', footer: "Foots", cnName: '#cnName', - name: '#TableName', + name: '$TableName', url: "#url", sortName: "#SortName" }, diff --git "a/Vol.Vue3\347\211\210\346\234\254/src/router/viewGird.js" "b/Vol.Vue3\347\211\210\346\234\254/src/router/viewGird.js" index a047b90183eab1887873ff613183323f7512629b..d26be0aa27728793c07dcac1a060de1116cdfce9 100644 --- "a/Vol.Vue3\347\211\210\346\234\254/src/router/viewGird.js" +++ "b/Vol.Vue3\347\211\210\346\234\254/src/router/viewGird.js" @@ -129,6 +129,22 @@ let viewgird = [ path: '/Sys_Department', name: 'Sys_Department', component: () => import('@/views/system/system/Sys_Department.vue') + } ,{ + path: '/OrDetail', + name: 'OrDetail', + component: () => import('@/views/order/ordetail/OrDetail.vue') + } ,{ + path: '/Order', + name: 'Order', + component: () => import('@/views/order/order/Order.vue') + } ,{ + path: '/Trde', + name: 'Trde', + component: () => import('@/views/order/trde/Trde.vue') + } ,{ + path: '/OrderHeader2', + name: 'OrderHeader2', + component: () => import('@/views/order/orderheader2/OrderHeader2.vue') }] export default viewgird diff --git "a/Vol.Vue3\347\211\210\346\234\254/src/views/builder/builderData.js" "b/Vol.Vue3\347\211\210\346\234\254/src/views/builder/builderData.js" index 9437d78de329a6bd9f54df3f51bc9e5643541f90..5d815a52e43da7b84dbe96df5f9eca243bfd9e78 100644 --- "a/Vol.Vue3\347\211\210\346\234\254/src/views/builder/builderData.js" +++ "b/Vol.Vue3\347\211\210\346\234\254/src/views/builder/builderData.js" @@ -74,7 +74,8 @@ let data = { enable: 0, vuePath: '', appPath: "", - userPermissionDesc: '开启后当前用户只能操作自己(与下级角色)创建的数据,如:查询、删除、修改等操作' + userPermissionDesc: '开启后当前用户只能操作自己(与下级角色)创建的数据,如:查询、删除、修改等操作', + isAlias:false }, addOptions: [ [{ "title": "父 级 ID", min: 0, "field": "parentId", "required": true, type: 'number', placeholder: '放在【代码生成配置】列表的文件夹ID下,如果填入【0】就是一级目录' }], @@ -88,7 +89,9 @@ let data = { }], [{ "title": "表中文名", "field": "columnCNName", "required": true, placeholder: "表对应的中文名字,界面上显示会用到" }], [{ "title": "实际表名", "field": "tableName", "required": true, placeholder: "数据库实际表名或者视图名(多表关联请创建视图再生成代码)" }], - [{ "title": "文件夹名", placeholder: "生成文件所在类库中的文件夹名(文件夹可以不存在);注意只需要填写文件夹名,不是路径", "field": "folderName", "required": true }] + [{ "title": "文件夹名", placeholder: "生成文件所在类库中的文件夹名(文件夹可以不存在);注意只需要填写文件夹名,不是路径", "field": "folderName", "required": true }], + [{ "title": "表别名", placeholder: "文件夹名作为表的别名,默认不启用", field: "isAlias", bind: { data: [{ key: true, value: '是', key: false, value: '否' }] }, type: 'switch' }] + ], options: [ [ diff --git "a/Vol.Vue3\347\211\210\346\234\254/src/views/builder/coder.vue" "b/Vol.Vue3\347\211\210\346\234\254/src/views/builder/coder.vue" index 9ade78282f79dbe0df7fb63c408229ae68c39317..cd0c890f37f13c4a4e9023e93dedef276781cc83 100644 --- "a/Vol.Vue3\347\211\210\346\234\254/src/views/builder/coder.vue" +++ "b/Vol.Vue3\347\211\210\346\234\254/src/views/builder/coder.vue" @@ -13,6 +13,8 @@ 1、如果只是创建目录,父级id填0,其他随便填写;
2、如果是生成代码,父级id填写【代码生成配置】列表页面的id +
+ 3、文件夹名称可以作为表的别名,默认不启用
@@ -240,7 +242,8 @@ export default { this.layOutOptins.fields.namespace + '&foldername=' + this.layOutOptins.fields.folderName + - '&isTreeLoad=false'; + '&isTreeLoad=false'+ + '&isAlias='+this.layOutOptins.fields.isAlias; this.http .post('/api/builder/LoadTableInfo?' + queryParam, {}, true) .then((x) => { @@ -390,7 +393,7 @@ export default { this.http .post( '/api/builder/syncTable?tableName=' + - this.layOutOptins.fields.tableName, + this.layOutOptins.fields.tableTrueName, {}, true )