feat: 完成code to web模块
This commit is contained in:
@@ -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)))
|
||||
{
|
||||
//为空或者为默认最小值
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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相关,同步到web,code 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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相关,同步到web,code 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>
|
||||
|
||||
Reference in New Issue
Block a user