diff --git a/OpenAuth.App/BuilderTable/BuilderTableApp.cs b/OpenAuth.App/BuilderTable/BuilderTableApp.cs index 6d612a38..fdf263da 100644 --- a/OpenAuth.App/BuilderTable/BuilderTableApp.cs +++ b/OpenAuth.App/BuilderTable/BuilderTableApp.cs @@ -273,31 +273,61 @@ namespace OpenAuth.App CheckExistsModule(sysTableInfo.ModuleCode); string domainContent = string.Empty; - if (sysTableInfo.IsDynamicHeader) //使用动态头部的模版 - { - domainContent = FileHelper.ReadFile(@"Template\\SingleTable\\BuildAppWithDynamicHeader.html"); - } - else - { - domainContent = FileHelper.ReadFile(@"Template\\SingleTable\\BuildApp.html"); - } - domainContent = domainContent - .Replace("{TableName}", sysTableInfo.TableName) - .Replace("{ModuleCode}", sysTableInfo.ModuleCode) - .Replace("{ModuleName}", sysTableInfo.ModuleName) - .Replace("{ClassName}", sysTableInfo.ClassName) - .Replace("{StartName}", StratName); + //查找是否存在子表的情况 + var subTable = Repository.FirstOrDefault(u => u.ParentTableId == sysTableInfo.Id); + + if (subTable == null) //如果子表不存在,则用单模版生成 + { + if (sysTableInfo.IsDynamicHeader) //使用动态头部的模版 + { + domainContent = FileHelper.ReadFile(@"Template\\SingleTable\\BuildAppWithDynamicHeader.html"); + } + else + { + domainContent = FileHelper.ReadFile(@"Template\\SingleTable\\BuildApp.html"); + } - if (!string.IsNullOrEmpty(sysTableInfo.ForeignKey)) - { //替换外键模版 - var foreignTemplate = $"objs = objs.Where(u => u.{sysTableInfo.ForeignKey} == request.{sysTableInfo.ForeignKey});"; domainContent = domainContent - .Replace("{ForeignKeyTemplate}", foreignTemplate); + .Replace("{TableName}", sysTableInfo.TableName) + .Replace("{ModuleCode}", sysTableInfo.ModuleCode) + .Replace("{ModuleName}", sysTableInfo.ModuleName) + .Replace("{ClassName}", sysTableInfo.ClassName) + .Replace("{StartName}", StratName); + + //如果有外键(是一个子表) + if (!string.IsNullOrEmpty(sysTableInfo.ForeignKey)) + { //替换外键模版 + var foreignTemplate = $"objs = objs.Where(u => u.{sysTableInfo.ForeignKey} == request.{sysTableInfo.ForeignKey});"; + domainContent = domainContent + .Replace("{ForeignKeyTemplate}", foreignTemplate); + } + else + { + domainContent = domainContent + .Replace("{ForeignKeyTemplate}", ""); + } } else { + if (sysTableInfo.IsDynamicHeader) //使用动态头部的模版 + { + domainContent = FileHelper.ReadFile(@"Template\\MultiTable\\BuildAppWithDynamicHeader.html"); + } + else + { + domainContent = FileHelper.ReadFile(@"Template\\MultiTable\\BuildApp.html"); + } + domainContent = domainContent - .Replace("{ForeignKeyTemplate}", ""); + .Replace("{TableName}", sysTableInfo.TableName) + .Replace("{ModuleCode}", sysTableInfo.ModuleCode) + .Replace("{ModuleName}", sysTableInfo.ModuleName) + .Replace("{ClassName}", sysTableInfo.ClassName) + .Replace("{SubForeignKey}", subTable.ForeignKey) + .Replace("{SubClassName}", subTable.ClassName) + .Replace("{SubModuleCode}", subTable.ModuleCode) + .Replace("{StartName}", StratName); + } var primarykey = sysColumns.FirstOrDefault(u => u.IsKey); @@ -537,9 +567,6 @@ namespace OpenAuth.App mapPath + $"\\OpenAuth.Repository\\Domain\\", tableInfo.ClassName + ".cs", domainContent); - - string openAuthDBContextPath = mapPath + "\\OpenAuth.Repository\\OpenAuthDBContext.cs"; - FileHelper.RegxAddContentByParenthesis(openAuthDBContextPath, "public virtual DbSet<" + tableInfo.ClassName + "> " + tableInfo.TableName + "s { get; set; }"); } Dictionary PrimitiveTypes = new Dictionary() @@ -569,7 +596,8 @@ namespace OpenAuth.App { return "DateTime.Now"; } - else if (type == "bool"){ + else if (type == "bool") + { return "false"; } return Activator.CreateInstance(t).ToString(); diff --git a/OpenAuth.WebApi/Template/MultiTable/BuildApp.html b/OpenAuth.WebApi/Template/MultiTable/BuildApp.html new file mode 100644 index 00000000..31b24924 --- /dev/null +++ b/OpenAuth.WebApi/Template/MultiTable/BuildApp.html @@ -0,0 +1,108 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Infrastructure; +using OpenAuth.App.Interface; +using OpenAuth.App.Request; +using OpenAuth.App.Response; +using OpenAuth.Repository.Domain; +using SqlSugar; +namespace OpenAuth.App +{ + public class {ModuleCode} : SqlSugarBaseApp<{ClassName}> + { + private {SubModuleCode} _{SubClassName}App; + /// + /// 加载列表 + /// + public async Task Load(Query{ClassName}ListReq request) + { + var loginContext = _auth.GetCurrentUser(); + if (loginContext == null) + { + throw new CommonException("登录已过期", Define.INVALID_TOKEN); + } + + var result = new TableData(); + var objs = GetDataPrivilege("u"); + if (!string.IsNullOrEmpty(request.key)) + { + objs = objs.Where(u => u.Id.Contains(request.key)); + } + if (!string.IsNullOrEmpty(request.sqlWhere)) + { + objs = objs.Where(request.sqlWhere); + } + + result.data = objs.OrderBy(u => u.Id) + .Skip((request.page - 1) * request.limit) + .Take(request.limit).ToList(); + result.count = await objs.CountAsync(); + return result; + } + public void Add(AddOrUpdate{ClassName}Req request) + { + var obj = request.MapTo<{ClassName}>(); + //todo:补充或调整自己需要的字段 + obj.CreateTime = DateTime.Now; + var user = _auth.GetCurrentUser().User; + obj.CreateUserId = user.Id; + obj.CreateUserName = user.Name; + if(obj.KeyIsNull()) //如果主键为空,则生成默认值 + { + obj.GenerateDefaultKeyVal(); + } + + SugarClient.Ado.BeginTran(); + SugarClient.Insertable(obj).ExecuteCommand(); + if (request.{SubClassName}Reqs != null && request.{SubClassName}Reqs.Any()) + { + foreach (var detail in request.{SubClassName}Reqs) + { + detail.{SubForeignKey} = obj.Id; + _{SubClassName}App.Add(detail); + } + } + SugarClient.Ado.CommitTran(); + } + public void Update(AddOrUpdate{ClassName}Req request) + { + var user = _auth.GetCurrentUser().User; + SugarClient.Ado.BeginTran(); + if (request.{SubClassName}Reqs != null && request.{SubClassName}Reqs.Any()) + { + //请求的id不在数据库的记录,需要删除 + var containids = request.{SubClassName}Reqs.Select(u => u.Id) + .Where(u => !string.IsNullOrEmpty(u)).ToList(); + if (containids.Any()) + { + SugarClient.Deleteable<{SubClassName}>(u => (!containids.Contains(u.Id)) && u.{SubForeignKey} == request.Id).ExecuteCommand(); + } + //id为空的添加 + foreach (var detail in request.{SubClassName}Reqs.Where(u => string.IsNullOrEmpty(u.Id))) + { + detail.{SubForeignKey} = request.Id; + _{SubClassName}App.Add(detail); + } + //更新id相同的 + foreach (var detail in request.{SubClassName}Reqs.Where(u => !string.IsNullOrEmpty(u.Id))) + { + _{SubClassName}App.Update(detail); + } + } + Repository.Update(u => new {ClassName} + { + UpdateTime = DateTime.Now, + UpdateUserId = user.Id, + UpdateUserName = user.Name + //todo:补充或调整自己需要的字段 + }, u => u.Id == request.Id); + SugarClient.Ado.CommitTran(); + } + public {ModuleCode}(ISqlSugarClient client, IAuth auth, + {SubModuleCode} {SubClassName}App) : base(client, auth) + { + _{SubClassName}App = {SubClassName}App; + } + } +} \ No newline at end of file diff --git a/OpenAuth.WebApi/Template/MultiTable/BuildAppWithDynamicHeader.html b/OpenAuth.WebApi/Template/MultiTable/BuildAppWithDynamicHeader.html new file mode 100644 index 00000000..df0a7440 --- /dev/null +++ b/OpenAuth.WebApi/Template/MultiTable/BuildAppWithDynamicHeader.html @@ -0,0 +1,113 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Infrastructure; +using OpenAuth.App.Interface; +using OpenAuth.App.Request; +using OpenAuth.App.Response; +using OpenAuth.Repository.Domain; +using SqlSugar; +namespace OpenAuth.App +{ + public class {ModuleCode} : SqlSugarBaseApp<{ClassName}> + { + private {SubModuleCode} _{SubClassName}App; + /// + /// 加载列表 + /// + public async Task Load(Query{ClassName}ListReq request) + { + var loginContext = _auth.GetCurrentUser(); + if (loginContext == null) + { + throw new CommonException("登录已过期", Define.INVALID_TOKEN); + } + var columns = loginContext.GetTableColumns("{ClassName}"); + if (columns == null || columns.Count == 0) + { + throw new Exception("请在代码生成界面配置{ClassName}表的字段属性"); + } + var result = new TableData(); + result.columnFields = columns; + var objs = GetDataPrivilege("u"); + if (!string.IsNullOrEmpty(request.key)) + { + objs = objs.Where(u => u.Id.Contains(request.key)); + } + if (!string.IsNullOrEmpty(request.sqlWhere)) + { + objs = objs.Where(request.sqlWhere); + } + var propertyStr = string.Join(',', columns.Select(u => u.ColumnName)); + result.data = objs.OrderBy(u => u.Id) + .Skip((request.page - 1) * request.limit) + .Take(request.limit).Select($"{propertyStr}").ToList(); + result.count = await objs.CountAsync(); + return result; + } + public void Add(AddOrUpdate{ClassName}Req request) + { + var obj = request.MapTo<{ClassName}>(); + //todo:补充或调整自己需要的字段 + obj.CreateTime = DateTime.Now; + var user = _auth.GetCurrentUser().User; + obj.CreateUserId = user.Id; + obj.CreateUserName = user.Name; + if(obj.KeyIsNull()) //如果主键为空,则生成默认值 + { + obj.GenerateDefaultKeyVal(); + } + + SugarClient.Ado.BeginTran(); + SugarClient.Insertable(obj).ExecuteCommand(); + if (request.{SubClassName}Reqs != null && request.{SubClassName}Reqs.Any()) + { + foreach (var detail in request.{SubClassName}Reqs) + { + detail.{SubForeignKey} = obj.Id; + _{SubClassName}App.Add(detail); + } + } + SugarClient.Ado.CommitTran(); + } + public void Update(AddOrUpdate{ClassName}Req request) + { + var user = _auth.GetCurrentUser().User; + SugarClient.Ado.BeginTran(); + if (request.{SubClassName}Reqs != null && request.{SubClassName}Reqs.Any()) + { + //请求的id不在数据库的记录,需要删除 + var containids = request.{SubClassName}Reqs.Select(u => u.Id) + .Where(u => !string.IsNullOrEmpty(u)).ToList(); + if (containids.Any()) + { + SugarClient.Deleteable<{SubClassName}>(u => (!containids.Contains(u.Id)) && u.{SubForeignKey} == request.Id).ExecuteCommand(); + } + //id为空的添加 + foreach (var detail in request.{SubClassName}Reqs.Where(u => string.IsNullOrEmpty(u.Id))) + { + detail.{SubForeignKey} = request.Id; + _{SubClassName}App.Add(detail); + } + //更新id相同的 + foreach (var detail in request.{SubClassName}Reqs.Where(u => !string.IsNullOrEmpty(u.Id))) + { + _{SubClassName}App.Update(detail); + } + } + Repository.Update(u => new {ClassName} + { + UpdateTime = DateTime.Now, + UpdateUserId = user.Id, + UpdateUserName = user.Name + //todo:补充或调整自己需要的字段 + }, u => u.Id == request.Id); + SugarClient.Ado.CommitTran(); + } + public {ModuleCode}(ISqlSugarClient client, IAuth auth, + {SubModuleCode} {SubClassName}App) : base(client, auth) + { + _{SubClassName}App = {SubClassName}App; + } + } +} \ No newline at end of file diff --git a/newdocs/docs/notes/pro/devnew.md b/newdocs/docs/notes/pro/devnew.md index 624f01e6..f63780bc 100644 --- a/newdocs/docs/notes/pro/devnew.md +++ b/newdocs/docs/notes/pro/devnew.md @@ -129,7 +129,7 @@ create table stock 选中刚刚添加的`Stock`表,依次点击【生成实体】【生成业务代码】【生成vue页面】; -如果存在子表,也进行相同的操作。即选中刚刚添加的`StockDetail`表,依次点击【生成实体】【生成业务代码】【生成vue页面】; +如果存在子表,也进行相同的操作。即选中刚刚添加的`StockDetail`表,依次点击【生成实体】【生成业务代码】,子表不需要生成vue页面; 成功后生成的后端.Net代码位置如下: