feat: 完成code to web模块

This commit is contained in:
橙子
2023-09-24 00:42:09 +08:00
parent 58bf5062bf
commit 349a041d71
14 changed files with 187 additions and 43 deletions

View File

@@ -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<long>.Id)))
{
//主键为空或者为默认最小值
if (oldValue is 0)
{
entityInfo.SetValue(SnowflakeHelper.NextId);
}
}
if (entityInfo.PropertyName.Equals(nameof(IAuditedObject.CreationTime)))
{
//为空或者为默认最小值

View File

@@ -14,14 +14,14 @@ namespace Yi.Framework.Module.WebFirstManager.DataSeed
{
public class FieldDataSeed : AbstractDataSeed<FieldEntity>, ITransient
{
private TableEntity _tableEntity;
private TableAggregateRoot _tableEntity;
public FieldDataSeed(IRepository<FieldEntity> repository) : base(repository)
{
}
public override async Task<bool> IsInvoker()
{
var tableRepository = App.GetRequiredService<IRepository<TableEntity>>();
var tableRepository = App.GetRequiredService<IRepository<TableAggregateRoot>>();
_tableEntity = await tableRepository.GetFirstAsync(x => x.Name == "Test");
if (_tableEntity is null)
{

View File

@@ -11,17 +11,17 @@ using Yi.Framework.Module.WebFirstManager.Entities;
namespace Yi.Framework.Module.WebFirstManager.DataSeed
{
public class TableDataSeed : AbstractDataSeed<TableEntity>, ITransient
public class TableDataSeed : AbstractDataSeed<TableAggregateRoot>, ITransient
{
public TableDataSeed(IRepository<TableEntity> repository) : base(repository)
public TableDataSeed(IRepository<TableAggregateRoot> repository) : base(repository)
{
}
public override List<TableEntity> GetSeedData()
public override List<TableAggregateRoot> GetSeedData()
{
var entities=new List<TableEntity>();
var entities=new List<TableAggregateRoot>();
entities.Add(new TableEntity
entities.Add(new TableAggregateRoot
{
Id=SnowflakeHelper.NextId,
Name="Test",

View File

@@ -6,20 +6,20 @@ using Yi.Framework.Module.WebFirstManager.Handler;
namespace Yi.Framework.Module.WebFirstManager.Domain
{
/// <summary>
/// 模板领域服务
/// 代码文件领域服务,与代码文件生成相关web to code
/// </summary>
public class TemplateManager : ITransient
public class CodeFileManager : ITransient
{
private IEnumerable<ITemplateHandler> _templateHandlers;
private IRepository<TemplateEntity> _repository;
private IRepository<FieldEntity> _fieldRepository;
public TemplateManager(IEnumerable<ITemplateHandler> templateHandlers, IRepository<FieldEntity> fieldRepository, IRepository<TemplateEntity> repository)
public CodeFileManager(IEnumerable<ITemplateHandler> templateHandlers, IRepository<FieldEntity> fieldRepository, IRepository<TemplateEntity> 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);
}
}
}

View File

@@ -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
/// <summary>
/// 数据库领域服务与数据库相关同步到数据库web to db code to db
/// </summary>
public class DataBaseManger : ITransient
{
}
}

View File

@@ -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
{
/// <summary>
/// 与webfrist相关同步到webcode to web
/// </summary>
public class WebTemplateManager : ITransient
{
private IRepository<TableAggregateRoot> _repository;
public WebTemplateManager(IRepository<TableAggregateRoot> repository)
{
_repository = repository;
}
/// <summary>
/// 通过当前的实体代码获取表存储
/// </summary>
/// <returns></returns>
public Task<List<TableAggregateRoot>> BuildCodeToWebAsync()
{
var entityTypes = new List<Type>();
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<TableAggregateRoot>();
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<FieldEntity>();
var table = entityType.GetCustomAttribute<SugarTable>();
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<DescriptionAttribute>()?.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<FieldTypeEnum>(enumName);
}
var colum = propertyInfo.GetCustomAttribute<SugarColumn>();
if (colum is not null && colum.Length != 0)
{
fieldEntity.Length = colum.Length;
}
return fieldEntity;
}
}
}

View File

@@ -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<long>
public class TableAggregateRoot : IAggregateRoot<long>
{
[SugarColumn(IsPrimaryKey = true)]
public long Id { get; set; }
public long Id { get; set; } = SnowflakeHelper.NextId;
/// <summary>
/// 表名
/// </summary>

View File

@@ -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,
}
}

View File

@@ -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;

View File

@@ -9,9 +9,7 @@ namespace Yi.Framework.Module.WebFirstManager.Handler
{
public interface ITemplateHandler
{
void SetTable(TableEntity table);
void SetFields(List<FieldEntity> fields);
void SetTable(TableAggregateRoot table);
string Invoker(string str);
}
}

View File

@@ -9,17 +9,11 @@ namespace Yi.Framework.Module.WebFirstManager.Handler
{
public class TemplateHandlerBase
{
protected TableEntity Table { get; set; }
protected List<FieldEntity> Fields { get; set; }
protected TableAggregateRoot Table { get; set; }
public void SetTable(TableEntity table)
public void SetTable(TableAggregateRoot table)
{
Table = table;
}
public void SetFields(List<FieldEntity> fields)
{
Fields = fields;
}
}
}

View File

@@ -14,7 +14,7 @@ using Yi.Framework.Module.WebFirstManager.Entities;
namespace Yi.Framework.Module.WebFirstManager.Impl
{
[ApiDescriptionSettings("WebFirstManager")]
public class TableService : CrudAppService<TableEntity, TableDto, long, TableGetListInput> ,ITableService, ITransient, IDynamicApiController
public class TableService : CrudAppService<TableAggregateRoot, TableDto, long, TableGetListInput> ,ITableService, ITransient, IDynamicApiController
{
}
}

View File

@@ -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<TableEntity> _tableRepository;
private TemplateManager _templateManager;
public WebFirstService(IRepository<TableEntity> tableRepository, TemplateManager templateManager)
private IRepository<TableAggregateRoot> _tableRepository;
private CodeFileManager _codeFileManager;
private WebTemplateManager _webTemplateManager;
public WebFirstService(IRepository<TableAggregateRoot> tableRepository, CodeFileManager codeFileManager, WebTemplateManager webTemplateManager)
{
_tableRepository = tableRepository;
_templateManager = templateManager;
_codeFileManager = codeFileManager;
_webTemplateManager= webTemplateManager;
}
/// <summary>
@@ -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
/// </summary>
/// <returns></returns>
[UnitOfWork]
public async Task PostCodeBuildWebAsync()
{
var tableAggregateRoots =await _webTemplateManager.BuildCodeToWebAsync();
//覆盖数据库,将聚合根保存到数据库
_tableRepository._Db.DbMaintenance.TruncateTable<TableAggregateRoot>();
_tableRepository._Db.DbMaintenance.TruncateTable<FieldEntity>();
//导航插入即可
await _tableRepository._Db.InsertNav(tableAggregateRoots).Include(x => x.Fields).ExecuteCommandAsync();
}

View File

@@ -386,11 +386,27 @@
<param name="code"></param>
<returns></returns>
</member>
<member name="T:Yi.Framework.Module.WebFirstManager.Domain.TemplateManager">
<member name="T:Yi.Framework.Module.WebFirstManager.Domain.CodeFileManager">
<summary>
模板领域服务
代码文件领域服务,与代码文件生成相关web to code
</summary>
</member>
<member name="T:Yi.Framework.Module.WebFirstManager.Domain.DataBaseManger">
<summary>
数据库领域服务与数据库相关同步到数据库web to db code to db
</summary>
</member>
<member name="T:Yi.Framework.Module.WebFirstManager.Domain.WebTemplateManager">
<summary>
与webfrist相关同步到webcode to web
</summary>
</member>
<member name="M:Yi.Framework.Module.WebFirstManager.Domain.WebTemplateManager.BuildCodeToWebAsync">
<summary>
通过当前的实体代码获取表存储
</summary>
<returns></returns>
</member>
<member name="P:Yi.Framework.Module.WebFirstManager.Dtos.Field.FieldDto.Name">
<summary>
字段名称
@@ -471,17 +487,17 @@
是否公共
</summary>
</member>
<member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableEntity.Name">
<member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableAggregateRoot.Name">
<summary>
表名
</summary>
</member>
<member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableEntity.Description">
<member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableAggregateRoot.Description">
<summary>
备注
</summary>
</member>
<member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableEntity.Fields">
<member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableAggregateRoot.Fields">
<summary>
一表多字段
</summary>