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.CurrentUsers;
using Yi.Framework.Infrastructure.Data.Auditing; using Yi.Framework.Infrastructure.Data.Auditing;
using Yi.Framework.Infrastructure.Data.Entities; using Yi.Framework.Infrastructure.Data.Entities;
using Yi.Framework.Infrastructure.Ddd.Entities;
using Yi.Framework.Infrastructure.Helper;
namespace Yi.Framework.Infrastructure.Sqlsugar namespace Yi.Framework.Infrastructure.Sqlsugar
{ {
@@ -124,6 +126,15 @@ namespace Yi.Framework.Infrastructure.Sqlsugar
} }
break; break;
case DataFilterType.InsertByObject: 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))) 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 public class FieldDataSeed : AbstractDataSeed<FieldEntity>, ITransient
{ {
private TableEntity _tableEntity; private TableAggregateRoot _tableEntity;
public FieldDataSeed(IRepository<FieldEntity> repository) : base(repository) public FieldDataSeed(IRepository<FieldEntity> repository) : base(repository)
{ {
} }
public override async Task<bool> IsInvoker() 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"); _tableEntity = await tableRepository.GetFirstAsync(x => x.Name == "Test");
if (_tableEntity is null) if (_tableEntity is null)
{ {

View File

@@ -11,17 +11,17 @@ using Yi.Framework.Module.WebFirstManager.Entities;
namespace Yi.Framework.Module.WebFirstManager.DataSeed 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, Id=SnowflakeHelper.NextId,
Name="Test", Name="Test",

View File

@@ -6,20 +6,20 @@ using Yi.Framework.Module.WebFirstManager.Handler;
namespace Yi.Framework.Module.WebFirstManager.Domain namespace Yi.Framework.Module.WebFirstManager.Domain
{ {
/// <summary> /// <summary>
/// 模板领域服务 /// 代码文件领域服务,与代码文件生成相关web to code
/// </summary> /// </summary>
public class TemplateManager : ITransient public class CodeFileManager : ITransient
{ {
private IEnumerable<ITemplateHandler> _templateHandlers; private IEnumerable<ITemplateHandler> _templateHandlers;
private IRepository<TemplateEntity> _repository; private IRepository<TemplateEntity> _repository;
private IRepository<FieldEntity> _fieldRepository; 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; _templateHandlers = templateHandlers;
_repository = repository; _repository = repository;
_fieldRepository = fieldRepository; _fieldRepository = fieldRepository;
} }
public async Task HandlerAsync(TableEntity tableEntity) public async Task BuildWebToCodeAsync(TableAggregateRoot tableEntity)
{ {
var templates = await _repository.GetListAsync(); var templates = await _repository.GetListAsync();
var fields = await _fieldRepository.GetListAsync(); var fields = await _fieldRepository.GetListAsync();
@@ -29,7 +29,6 @@ namespace Yi.Framework.Module.WebFirstManager.Domain
foreach (var templateHandler in _templateHandlers) foreach (var templateHandler in _templateHandlers)
{ {
templateHandler.SetTable(tableEntity); templateHandler.SetTable(tableEntity);
templateHandler.SetFields(fields);
templateStr = templateHandler.Invoker(templateStr); templateStr = templateHandler.Invoker(templateStr);
} }
@@ -43,6 +42,8 @@ namespace Yi.Framework.Module.WebFirstManager.Domain
//await File.WriteAllTextAsync(str, templateEntity.BuildPath); //await File.WriteAllTextAsync(str, templateEntity.BuildPath);
} }
} }
} }

View File

@@ -3,10 +3,14 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Furion.DependencyInjection;
namespace Yi.Framework.Module.WebFirstManager.Domain 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 System.Threading.Tasks;
using SqlSugar; using SqlSugar;
using Yi.Framework.Infrastructure.Ddd.Entities; using Yi.Framework.Infrastructure.Ddd.Entities;
using Yi.Framework.Infrastructure.Helper;
namespace Yi.Framework.Module.WebFirstManager.Entities namespace Yi.Framework.Module.WebFirstManager.Entities
{ {
[SugarTable("Table")] [SugarTable("Table")]
public class TableEntity : IEntity<long> public class TableAggregateRoot : IAggregateRoot<long>
{ {
[SugarColumn(IsPrimaryKey = true)] [SugarColumn(IsPrimaryKey = true)]
public long Id { get; set; } public long Id { get; set; } = SnowflakeHelper.NextId;
/// <summary> /// <summary>
/// 表名 /// 表名
/// </summary> /// </summary>

View File

@@ -1,21 +1,22 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using EasyTool;
namespace Yi.Framework.Module.WebFirstManager.Enums namespace Yi.Framework.Module.WebFirstManager.Enums
{ {
public enum FieldTypeEnum public enum FieldTypeEnum
{ {
[Description("string")] [Description("String")]
String, String,
[Description("int")] [Description("Int32")]
Int, Int,
[Description("long")] [Description("Int64")]
Long Long,
} }
} }

View File

@@ -21,7 +21,7 @@ namespace Yi.Framework.Module.WebFirstManager.Handler
StringBuilder fieldStrs = new StringBuilder(); StringBuilder fieldStrs = new StringBuilder();
foreach (var field in Fields) foreach (var field in Table.Fields)
{ {
var typeStr = EnumUtil.GetDescriptionByValue(field.FieldType); var typeStr = EnumUtil.GetDescriptionByValue(field.FieldType);
var nameStr = field.Name; var nameStr = field.Name;

View File

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

View File

@@ -9,17 +9,11 @@ namespace Yi.Framework.Module.WebFirstManager.Handler
{ {
public class TemplateHandlerBase public class TemplateHandlerBase
{ {
protected TableEntity Table { get; set; } protected TableAggregateRoot Table { get; set; }
protected List<FieldEntity> Fields { get; set; }
public void SetTable(TableEntity table) public void SetTable(TableAggregateRoot table)
{ {
Table = 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 namespace Yi.Framework.Module.WebFirstManager.Impl
{ {
[ApiDescriptionSettings("WebFirstManager")] [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.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Furion.DatabaseAccessor;
using Furion.DependencyInjection; using Furion.DependencyInjection;
using Furion.DynamicApiController; using Furion.DynamicApiController;
using Mapster; using Mapster;
@@ -19,12 +20,14 @@ namespace Yi.Framework.Module.WebFirstManager.Impl
[ApiDescriptionSettings("WebFirstManager")] [ApiDescriptionSettings("WebFirstManager")]
public class WebFirstService : ApplicationService, IWebFirstService, IDynamicApiController, ITransient public class WebFirstService : ApplicationService, IWebFirstService, IDynamicApiController, ITransient
{ {
private IRepository<TableEntity> _tableRepository; private IRepository<TableAggregateRoot> _tableRepository;
private TemplateManager _templateManager; private CodeFileManager _codeFileManager;
public WebFirstService(IRepository<TableEntity> tableRepository, TemplateManager templateManager) private WebTemplateManager _webTemplateManager;
public WebFirstService(IRepository<TableAggregateRoot> tableRepository, CodeFileManager codeFileManager, WebTemplateManager webTemplateManager)
{ {
_tableRepository = tableRepository; _tableRepository = tableRepository;
_templateManager = templateManager; _codeFileManager = codeFileManager;
_webTemplateManager= webTemplateManager;
} }
/// <summary> /// <summary>
@@ -37,7 +40,7 @@ namespace Yi.Framework.Module.WebFirstManager.Impl
var tables = await _tableRepository.GetListAsync(); var tables = await _tableRepository.GetListAsync();
foreach (var table in tables) 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 /// Code To Web
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[UnitOfWork]
public async Task PostCodeBuildWebAsync() 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> <param name="code"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:Yi.Framework.Module.WebFirstManager.Domain.TemplateManager"> <member name="T:Yi.Framework.Module.WebFirstManager.Domain.CodeFileManager">
<summary> <summary>
模板领域服务 代码文件领域服务,与代码文件生成相关web to code
</summary> </summary>
</member> </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"> <member name="P:Yi.Framework.Module.WebFirstManager.Dtos.Field.FieldDto.Name">
<summary> <summary>
字段名称 字段名称
@@ -471,17 +487,17 @@
是否公共 是否公共
</summary> </summary>
</member> </member>
<member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableEntity.Name"> <member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableAggregateRoot.Name">
<summary> <summary>
表名 表名
</summary> </summary>
</member> </member>
<member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableEntity.Description"> <member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableAggregateRoot.Description">
<summary> <summary>
备注 备注
</summary> </summary>
</member> </member>
<member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableEntity.Fields"> <member name="P:Yi.Framework.Module.WebFirstManager.Entities.TableAggregateRoot.Fields">
<summary> <summary>
一表多字段 一表多字段
</summary> </summary>