diff --git a/Yi.Furion.Net6/Yi.Framework.Infrastructure/Sqlsugar/SqlSugarDbContext.cs b/Yi.Furion.Net6/Yi.Framework.Infrastructure/Sqlsugar/SqlSugarDbContext.cs index 702ca832..7bcd0a10 100644 --- a/Yi.Furion.Net6/Yi.Framework.Infrastructure/Sqlsugar/SqlSugarDbContext.cs +++ b/Yi.Furion.Net6/Yi.Framework.Infrastructure/Sqlsugar/SqlSugarDbContext.cs @@ -10,6 +10,8 @@ using System.Threading.Tasks; using Yi.Framework.Infrastructure.CurrentUsers; using Yi.Framework.Infrastructure.Data.Auditing; using Yi.Framework.Infrastructure.Data.Entities; +using Yi.Framework.Infrastructure.Ddd.Entities; +using Yi.Framework.Infrastructure.Helper; namespace Yi.Framework.Infrastructure.Sqlsugar { @@ -124,6 +126,15 @@ namespace Yi.Framework.Infrastructure.Sqlsugar } break; case DataFilterType.InsertByObject: + if (entityInfo.PropertyName.Equals(nameof(IEntity.Id))) + { + //主键为空或者为默认最小值 + if (oldValue is 0) + { + entityInfo.SetValue(SnowflakeHelper.NextId); + } + } + if (entityInfo.PropertyName.Equals(nameof(IAuditedObject.CreationTime))) { //为空或者为默认最小值 diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/DataSeed/FieldDataSeed.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/DataSeed/FieldDataSeed.cs index 3fea3340..0e05e1c9 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/DataSeed/FieldDataSeed.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/DataSeed/FieldDataSeed.cs @@ -14,14 +14,14 @@ namespace Yi.Framework.Module.WebFirstManager.DataSeed { public class FieldDataSeed : AbstractDataSeed, ITransient { - private TableEntity _tableEntity; + private TableAggregateRoot _tableEntity; public FieldDataSeed(IRepository repository) : base(repository) { } public override async Task IsInvoker() { - var tableRepository = App.GetRequiredService>(); + var tableRepository = App.GetRequiredService>(); _tableEntity = await tableRepository.GetFirstAsync(x => x.Name == "Test"); if (_tableEntity is null) { diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/DataSeed/TableDataSeed.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/DataSeed/TableDataSeed.cs index 61cc6258..ac10a53f 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/DataSeed/TableDataSeed.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/DataSeed/TableDataSeed.cs @@ -11,17 +11,17 @@ using Yi.Framework.Module.WebFirstManager.Entities; namespace Yi.Framework.Module.WebFirstManager.DataSeed { - public class TableDataSeed : AbstractDataSeed, ITransient + public class TableDataSeed : AbstractDataSeed, ITransient { - public TableDataSeed(IRepository repository) : base(repository) + public TableDataSeed(IRepository repository) : base(repository) { } - public override List GetSeedData() + public override List GetSeedData() { - var entities=new List(); + var entities=new List(); - entities.Add(new TableEntity + entities.Add(new TableAggregateRoot { Id=SnowflakeHelper.NextId, Name="Test", diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/TemplateManager.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/CodeFileManager.cs similarity index 84% rename from Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/TemplateManager.cs rename to Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/CodeFileManager.cs index 19ee6906..dd43466b 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/TemplateManager.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/CodeFileManager.cs @@ -6,20 +6,20 @@ using Yi.Framework.Module.WebFirstManager.Handler; namespace Yi.Framework.Module.WebFirstManager.Domain { /// - /// 模板领域服务 + /// 代码文件领域服务,与代码文件生成相关,web to code /// - public class TemplateManager : ITransient + public class CodeFileManager : ITransient { private IEnumerable _templateHandlers; private IRepository _repository; private IRepository _fieldRepository; - public TemplateManager(IEnumerable templateHandlers, IRepository fieldRepository, IRepository repository) + public CodeFileManager(IEnumerable templateHandlers, IRepository fieldRepository, IRepository repository) { _templateHandlers = templateHandlers; _repository = repository; _fieldRepository = fieldRepository; } - public async Task HandlerAsync(TableEntity tableEntity) + public async Task BuildWebToCodeAsync(TableAggregateRoot tableEntity) { var templates = await _repository.GetListAsync(); var fields = await _fieldRepository.GetListAsync(); @@ -29,7 +29,6 @@ namespace Yi.Framework.Module.WebFirstManager.Domain foreach (var templateHandler in _templateHandlers) { templateHandler.SetTable(tableEntity); - templateHandler.SetFields(fields); templateStr = templateHandler.Invoker(templateStr); } @@ -43,6 +42,8 @@ namespace Yi.Framework.Module.WebFirstManager.Domain //await File.WriteAllTextAsync(str, templateEntity.BuildPath); } + + } } diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/DataBaseManger.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/DataBaseManger.cs index 3aa0efda..801f055e 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/DataBaseManger.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/DataBaseManger.cs @@ -3,10 +3,14 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Furion.DependencyInjection; namespace Yi.Framework.Module.WebFirstManager.Domain { - internal class DataBaseManger + /// + /// 数据库领域服务,与数据库相关,同步到数据库,web to db ,code to db + /// + public class DataBaseManger : ITransient { } } diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/WebTemplateManager.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/WebTemplateManager.cs new file mode 100644 index 00000000..024a0b31 --- /dev/null +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Domain/WebTemplateManager.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using EasyTool; +using Furion; +using Furion.DatabaseAccessor; +using Furion.DependencyInjection; +using Mapster.Utils; +using Microsoft.AspNetCore.Components.Authorization; +using Newtonsoft.Json.Linq; +using Org.BouncyCastle.Asn1.Ntt; +using SqlSugar; +using Yi.Framework.Infrastructure.Ddd.Repositories; +using Yi.Framework.Infrastructure.Helper; +using Yi.Framework.Module.WebFirstManager.Entities; +using Yi.Framework.Module.WebFirstManager.Enums; +using DescriptionAttribute = System.ComponentModel.DescriptionAttribute; + +namespace Yi.Framework.Module.WebFirstManager.Domain +{ + /// + /// 与webfrist相关,同步到web,code to web + /// + public class WebTemplateManager : ITransient + { + private IRepository _repository; + public WebTemplateManager(IRepository repository) + { + _repository = repository; + } + /// + /// 通过当前的实体代码获取表存储 + /// + /// + + public Task> BuildCodeToWebAsync() + { + var entityTypes = new List(); + foreach (var assembly in App.Assemblies) + { + foreach (var t in assembly.GetTypes()) + { + if (t.GetCustomAttributes(false).Any(a => a.GetType().Equals(typeof(SugarTable)) + && !t.GetCustomAttributes(false).Any(a => a.GetType().Equals(typeof(SplitTableAttribute))))) + { + entityTypes.Add(t); + } + } + } + + var tableAggregateRoots = new List(); + foreach (var entityType in entityTypes) + { + tableAggregateRoots.Add(EntityTypeMapperToTable(entityType)); + } + + return Task.FromResult(tableAggregateRoots); + } + + private TableAggregateRoot EntityTypeMapperToTable(Type entityType) + { + var tableAggregateRoot = new TableAggregateRoot(); + tableAggregateRoot.Fields = new List(); + var table = entityType.GetCustomAttribute(); + + tableAggregateRoot.Name = table.TableName; + + foreach (var p in entityType.GetProperties()) + { + tableAggregateRoot.Fields.Add(PropertyMapperToFiled(p)); + } + tableAggregateRoot.Fields.ForEach(x => x.TableId = tableAggregateRoot.Id); + return tableAggregateRoot; + } + + + private FieldEntity PropertyMapperToFiled(PropertyInfo propertyInfo) + { + var fieldEntity = new FieldEntity(); + fieldEntity.Name = propertyInfo.Name; + var enumName = typeof(FieldTypeEnum).GetFields(BindingFlags.Static | BindingFlags.Public).Where(x => x.GetCustomAttribute()?.Description == propertyInfo.PropertyType.Name).FirstOrDefault()?.Name; + if (enumName is null) + { + fieldEntity.FieldType = FieldTypeEnum.String; + Console.Out.WriteLine($"字段类型:{propertyInfo.PropertyType.Name},未定义"); + //throw new ApplicationException($"字段类型:{propertyInfo.PropertyType.Name},未定义"); + } + else + { + fieldEntity.FieldType = EnumUtil.Parse(enumName); + } + + var colum = propertyInfo.GetCustomAttribute(); + if (colum is not null && colum.Length != 0) + { + fieldEntity.Length = colum.Length; + } + return fieldEntity; + } + } +} diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Entities/TableEntity.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Entities/TableAggregateRoot.cs similarity index 81% rename from Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Entities/TableEntity.cs rename to Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Entities/TableAggregateRoot.cs index 0cb29d27..25db66c1 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Entities/TableEntity.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Entities/TableAggregateRoot.cs @@ -5,14 +5,15 @@ using System.Text; using System.Threading.Tasks; using SqlSugar; using Yi.Framework.Infrastructure.Ddd.Entities; +using Yi.Framework.Infrastructure.Helper; namespace Yi.Framework.Module.WebFirstManager.Entities { [SugarTable("Table")] - public class TableEntity : IEntity + public class TableAggregateRoot : IAggregateRoot { [SugarColumn(IsPrimaryKey = true)] - public long Id { get; set; } + public long Id { get; set; } = SnowflakeHelper.NextId; /// /// 表名 /// diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Enums/FieldTypeEnum.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Enums/FieldTypeEnum.cs index 152cd191..b016c34a 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Enums/FieldTypeEnum.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Enums/FieldTypeEnum.cs @@ -1,21 +1,22 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; -using EasyTool; + namespace Yi.Framework.Module.WebFirstManager.Enums { public enum FieldTypeEnum { - [Description("string")] + [Description("String")] String, - [Description("int")] + [Description("Int32")] Int, - [Description("long")] - Long + [Description("Int64")] + Long, } } diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/FieldTemplateHandler.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/FieldTemplateHandler.cs index ffb33088..76fa33d6 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/FieldTemplateHandler.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/FieldTemplateHandler.cs @@ -21,7 +21,7 @@ namespace Yi.Framework.Module.WebFirstManager.Handler StringBuilder fieldStrs = new StringBuilder(); - foreach (var field in Fields) + foreach (var field in Table.Fields) { var typeStr = EnumUtil.GetDescriptionByValue(field.FieldType); var nameStr = field.Name; diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/ITemplateHandler.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/ITemplateHandler.cs index 40b17729..53e9e7ba 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/ITemplateHandler.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/ITemplateHandler.cs @@ -9,9 +9,7 @@ namespace Yi.Framework.Module.WebFirstManager.Handler { public interface ITemplateHandler { - void SetTable(TableEntity table); - void SetFields(List fields); - + void SetTable(TableAggregateRoot table); string Invoker(string str); } } diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/TemplateHandlerBase.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/TemplateHandlerBase.cs index 8f7fabee..6f591c19 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/TemplateHandlerBase.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Handler/TemplateHandlerBase.cs @@ -9,17 +9,11 @@ namespace Yi.Framework.Module.WebFirstManager.Handler { public class TemplateHandlerBase { - protected TableEntity Table { get; set; } - protected List Fields { get; set; } + protected TableAggregateRoot Table { get; set; } - public void SetTable(TableEntity table) + public void SetTable(TableAggregateRoot table) { Table = table; } - - public void SetFields(List fields) - { - Fields = fields; - } } } diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Impl/TableService.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Impl/TableService.cs index aef4afc6..d8e2c513 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Impl/TableService.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Impl/TableService.cs @@ -14,7 +14,7 @@ using Yi.Framework.Module.WebFirstManager.Entities; namespace Yi.Framework.Module.WebFirstManager.Impl { [ApiDescriptionSettings("WebFirstManager")] - public class TableService : CrudAppService ,ITableService, ITransient, IDynamicApiController + public class TableService : CrudAppService ,ITableService, ITransient, IDynamicApiController { } } diff --git a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Impl/WebFirstService.cs b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Impl/WebFirstService.cs index 9a19f395..d7b92b68 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Impl/WebFirstService.cs +++ b/Yi.Furion.Net6/Yi.Framework.Module/WebFirstManager/Impl/WebFirstService.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Furion.DatabaseAccessor; using Furion.DependencyInjection; using Furion.DynamicApiController; using Mapster; @@ -19,12 +20,14 @@ namespace Yi.Framework.Module.WebFirstManager.Impl [ApiDescriptionSettings("WebFirstManager")] public class WebFirstService : ApplicationService, IWebFirstService, IDynamicApiController, ITransient { - private IRepository _tableRepository; - private TemplateManager _templateManager; - public WebFirstService(IRepository tableRepository, TemplateManager templateManager) + private IRepository _tableRepository; + private CodeFileManager _codeFileManager; + private WebTemplateManager _webTemplateManager; + public WebFirstService(IRepository tableRepository, CodeFileManager codeFileManager, WebTemplateManager webTemplateManager) { _tableRepository = tableRepository; - _templateManager = templateManager; + _codeFileManager = codeFileManager; + _webTemplateManager= webTemplateManager; } /// @@ -37,7 +40,7 @@ namespace Yi.Framework.Module.WebFirstManager.Impl var tables = await _tableRepository.GetListAsync(); foreach (var table in tables) { - await _templateManager.HandlerAsync(table); + await _codeFileManager.BuildWebToCodeAsync(table); } } @@ -55,8 +58,18 @@ namespace Yi.Framework.Module.WebFirstManager.Impl /// Code To Web /// /// + [UnitOfWork] public async Task PostCodeBuildWebAsync() { + var tableAggregateRoots =await _webTemplateManager.BuildCodeToWebAsync(); + //覆盖数据库,将聚合根保存到数据库 + _tableRepository._Db.DbMaintenance.TruncateTable(); + _tableRepository._Db.DbMaintenance.TruncateTable(); + + //导航插入即可 + await _tableRepository._Db.InsertNav(tableAggregateRoots).Include(x => x.Fields).ExecuteCommandAsync(); + + } diff --git a/Yi.Furion.Net6/Yi.Framework.Module/Yi.Framework.Module.xml b/Yi.Furion.Net6/Yi.Framework.Module/Yi.Framework.Module.xml index 5815be68..07e69b23 100644 --- a/Yi.Furion.Net6/Yi.Framework.Module/Yi.Framework.Module.xml +++ b/Yi.Furion.Net6/Yi.Framework.Module/Yi.Framework.Module.xml @@ -386,11 +386,27 @@ - + - 模板领域服务 + 代码文件领域服务,与代码文件生成相关,web to code + + + 数据库领域服务,与数据库相关,同步到数据库,web to db ,code to db + + + + + 与webfrist相关,同步到web,code to web + + + + + 通过当前的实体代码获取表存储 + + + 字段名称 @@ -471,17 +487,17 @@ 是否公共 - + 表名 - + 备注 - + 一表多字段