From 56abca6bbe8a300b7366138198b6588f1797c4c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=88=E3=83=BE=E9=AD=82?= <283591387@qq.com> Date: Sun, 17 Dec 2023 10:30:35 +0000 Subject: [PATCH 1/5] update README.md. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 靈ヾ魂 <283591387@qq.com> --- README.md | 60 +++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index be45be72..e612478a 100644 --- a/README.md +++ b/README.md @@ -43,83 +43,83 @@ App、H5、微信小程序: [http://v2.volcore.xyz/app/guide](http://v2.volcore. sqlsugar: [https://www.donet5.com/](https://www.donet5.com/) ## 2023.05.13增加审批流程分支、条件功能 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/flow.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/flow2.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/flow3.png) +![Home](/imgs/flow.png) +![Home](/imgs/flow2.png) +![Home](/imgs/flow3.png) ## 框架移动端(uniapp)已发布,同样全自动生成代码,扫描小程序二维码即可查看 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/qrcode.png) +![Home](/imgs/qrcode.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/app-01.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/app-02.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/m001.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/m002.png) +![Home](/imgs/app-01.png) +![Home](/imgs/app-02.png) +![Home](/imgs/m001.png) +![Home](/imgs/m002.png) ## 框架已支持Vue3版本 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/v3.png) +![Home](/imgs/v3.png) ## 框架已增加低代码设计器 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/fd01.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/fd02.png) +![Home](/imgs/fd01.png) +![Home](/imgs/fd02.png) ## 框架2.0已更新(部分新增功能截图) 增加切换皮肤功能 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/h.png) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/home_them.png) +![Home](/imgs/h.png) +![Home](/imgs/home_them.png) 增加可复用的后台请求参数校验 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/validator.png) +![Home](/imgs/validator.png) 增加树形菜单与代码生成页面使用 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/x7tree.png) +![Home](/imgs/x7tree.png) 增加文本编辑器直接发布静态页面功能 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/editor.png) +![Home](/imgs/editor.png) 一对一多从表显示(只需要少量代码就可完成成,其他都由代码生成器生成) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/m1.png) +![Home](/imgs/m1.png) 表合并显示 (只需要几行代码完成代码生成器生成的页面实现扩展) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/span.png) +![Home](/imgs/span.png) 从图上传图片 (只需要几行代码完成代码生成器生成的页面实现扩展) -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/p1.png) +![Home](/imgs/p1.png) 一对多从表(不限从表数量)扩展 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/multi.png) +![Home](/imgs/multi.png) 图表 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/charts.png) +![Home](/imgs/charts.png) ## 1、只读基础表单 整个只读的基础表单的所有前后端代码,全部由代码生成器生成,代码生成器中几乎不需要配置,并支持并后端业务代码扩展,直接生成代码后,配置菜单权限即可 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/table1.png) +![Home](/imgs/table1.png) ## 2、自动绑定下拉框数据表单 整个自动绑定下拉框数据表单的所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,在代码生成器中只需要指定数据源编号,页面加载时会根据编号自动加载数据源并绑定 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/table2.png) +![Home](/imgs/table2.png) ## 3、启用图片支持、审核表单 整个启用图片支持、审核表单的所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,审核功能需要在菜单配置权限、代码生成器中勾选启用图片支持 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/table3.png) +![Home](/imgs/table3.png) ## 4、高级查询 整个表单的所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,查询字段、类型(下拉框、日期、TextArea等)、所在行与列都由代码生成器完成,不需要写任何代码 - ![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/tablesearch4.png) + ![Home](/imgs/tablesearch4.png) ## 5、主从表新建、编辑 主从表新建、编辑所有前后端代码,全部由代码生成器生成,并支持并后端业务代码扩展,新建、编辑从表配置、字段、类型(下拉框、日期、TextArea等)、所在行与列、字段是否只读、标签显示的长度等都由代码生成器完成,不需要写任何代码 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/editTbale2.png) +![Home](/imgs/editTbale2.png) ## 6、excel导入 excel导入整个页面都由代码生成器生成,导入的字段、字段是否必填,下载模板也由代码生成器上配置(自己根据实际需要决定是否采用此方法),导入时会验证是否为空与数据的合法性,逻辑校验自己实现扩展方法即可 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/importTable1.png) +![Home](/imgs/importTable1.png) ## 7、H5开发 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/h5.jpg) +![Home](/imgs/h5.jpg) ## 8、权限分配 目前只实现了对用户的角色的Action进行权限分配 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/auth.png) +![Home](/imgs/auth.png) ## 9、代码生成器 代码生成器提供了20多种可配置的属性,可灵活配置显示、查询、编辑、导入、导出、主从关系等功能点击看代码生成器文档 -![Home](https://github.com/cq-panda/Vue.NetCore/blob/master/imgs/coder.png) +![Home](/imgs/coder.png) 其他功能。。。。。 -- Gitee From 66bcd1bc61a35b0d5b12096b3ba179cbfffa2a5e Mon Sep 17 00:00:00 2001 From: zhs Date: Wed, 3 Jan 2024 21:40:58 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 68855934..8f3d50d4 100644 --- a/.gitignore +++ b/.gitignore @@ -81,3 +81,4 @@ /Net6.SqlSugar/VOL.System/bin /Net6.SqlSugar/VOL.WebApi/obj /Net6.SqlSugar/VOL.WebApi/bin +/Net6.SqlSugar/App.Workspace -- Gitee From 10970a7d7b087b541a7b978e582a1035dd71a6e2 Mon Sep 17 00:00:00 2001 From: zhs Date: Wed, 3 Jan 2024 21:41:37 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8f3d50d4..c94dd486 100644 --- a/.gitignore +++ b/.gitignore @@ -81,4 +81,5 @@ /Net6.SqlSugar/VOL.System/bin /Net6.SqlSugar/VOL.WebApi/obj /Net6.SqlSugar/VOL.WebApi/bin -/Net6.SqlSugar/App.Workspace +/Net6.SqlSugar/App.Workspace/obj +/Net6.SqlSugar/App.Workspace/bin -- Gitee From dcff58560cf891617df00913b062e53b78503f91 Mon Sep 17 00:00:00 2001 From: zhs Date: Thu, 4 Jan 2024 12:36:07 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BF=BD=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c94dd486..88c28553 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,5 @@ /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 -- Gitee From d5218d8ce2731c0e76f294fad31847015d34a0a3 Mon Sep 17 00:00:00 2001 From: zhs Date: Thu, 4 Jan 2024 15:58:50 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=B8=BB=E5=AD=90=E8=A1=A8=E5=88=AB?= =?UTF-8?q?=E5=90=8D=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/Partial/ISys_TableInfoService.cs | 2 +- .../Core/Partial/Sys_TableInfoService.cs | 181 +++++++++++------- .../VOL.Core/DBManager/DBServerProvider.cs | 11 +- .../Controllers/Builder/BuilderController.cs | 4 +- .../Template/Page/Vue3SearchPage.html | 2 +- .../Template/Page/VueSearchPage.html | 2 +- .../src/router/viewGird.js" | 16 ++ .../src/views/builder/builderData.js" | 7 +- .../src/views/builder/coder.vue" | 7 +- 9 files changed, 149 insertions(+), 83 deletions(-) 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 c77a18f5..8106af67 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 89c02db6..557cd97c 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 59a06865..f704f300 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 b61e9393..9e4aaf41 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 178cb77d..931b5904 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 bed17735..9a7c66f4 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 a047b901..d26be0aa 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 314c96ce..63f0c163 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" @@ -73,7 +73,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】就是一级目录' }], @@ -87,7 +88,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 9ade7828..cd0c890f 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 ) -- Gitee