使用razor模板生成实体文件

This commit is contained in:
2023-05-18 15:38:25 +08:00
parent 709c9f6598
commit 31db0d5667
8 changed files with 296 additions and 175 deletions

View File

@@ -21,6 +21,7 @@ using JNPF.Systems.Entitys.Dto.Database;
using JNPF.Systems.Entitys.Model.DataBase;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.ViewEngine;
using Mapster;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
@@ -51,6 +52,12 @@ public class DataBaseService : IDynamicApiController, ITransient
/// </summary>
private readonly IDbLinkService _dbLinkService;
/// <summary>
/// 视图引擎.
/// </summary>
private readonly IViewEngine _viewEngine;
/// <summary>
/// 文件服务.
/// </summary>
@@ -74,13 +81,15 @@ public class DataBaseService : IDynamicApiController, ITransient
IDbLinkService dbLinkService,
IFileManager fileManager,
IDataBaseManager dataBaseManager,
IUserManager userManager)
IUserManager userManager,
IViewEngine viewEngine)
{
_repository = repository;
_dbLinkService = dbLinkService;
_fileManager = fileManager;
_dataBaseManager = dataBaseManager;
_userManager = userManager;
_viewEngine = viewEngine;
}
#region GET
@@ -386,17 +395,47 @@ public class DataBaseService : IDynamicApiController, ITransient
var link = await _dbLinkService.GetInfo(linkId);
sugarClient = _dataBaseManager.ChangeDataBase(link);
}
foreach (var item in sugarClient.DbMaintenance.GetTableInfoList().Where(t => t.Name == input.TableName))
{
var entityName = string.Join("", input.TableName.Split('_').Select(a => a.ToPascalCase()));
sugarClient.MappingTables.Add(entityName, item.Name);
//foreach (var col in sugarClient.DbMaintenance.GetColumnInfosByTableName(item.Name))
//{
// //var colName = CustomFormatName(col.DbColumnName);
// sugarClient.MappingColumns.Add(col.DbColumnName /*类的属性首字母大写*/, col.DbColumnName, entityName);
//}
}
List<DbEntityInfo> entities = new();
Dictionary<string, string> nsMapper = GetNsMapper();
foreach (var tbl in sugarClient.DbMaintenance.GetTableInfoList().Where(t => t.Name == input.TableName))
{
var entityName = string.Join("", tbl.Name.Split('_').Select(a => a.ToPascalCase()));
sugarClient.MappingTables.Add(entityName, tbl.Name);
DbEntityInfo model = new() { tableName = tbl.Name, descrip = tbl.Description, clsName = entityName };
var key = tbl.Name.Split('_')[0] + "_";
if (nsMapper.ContainsKey(key)) model.nsName = nsMapper[key];
foreach (var field in sugarClient.DbMaintenance.GetColumnInfosByTableName(tbl.Name))
{
DbEntityPropInfo col = field.Adapt<DbEntityPropInfo>();
col.csType = sugarClient.Ado.DbBind.GetPropertyTypeName(field.DataType);
col.propName = field.DbColumnName;
model.columns.Add(col);
}
var primaryKey = model.columns.FirstOrDefault(a => a.primaryKey);
if (primaryKey != null)
{
model.pkType = primaryKey.csType;
model.pkName = primaryKey.propName;
}
if (model.pkName == "id") model.ignoreCols.Add(model.pkName);
entities.Add(model);
}
var templatePath = Path.Combine(App.WebHostEnvironment.WebRootPath, "Template", "Entity.vue.vm");
string tContent = File.ReadAllText(templatePath);
foreach (var item in entities)
{
var tResult = _viewEngine.RunCompileFromCached(tContent, item, builderAction: builder =>
{
builder.AddUsing("System.Collections.Generic");
builder.AddAssemblyReferenceByName("System.Collections");
});
var dir = Path.Combine(FileVariable.GenerateCodePath, item.nsName);
Directory.CreateDirectory(dir);
File.WriteAllText(Path.Combine(dir, item.clsName + ".cs"), tResult);
return tResult;
}
var prefix = input.TableName.Split('_')[0];
var nsName = nsMapper.ContainsKey(prefix) ? nsMapper[prefix] : "Tnb.Entities";
var dict = GenerateEntityConfig(sugarClient.DbFirst.Where(input.TableName)).ToClassStringList(nsName);
@@ -664,8 +703,8 @@ public class DataBaseService : IDynamicApiController, ITransient
var txt = tpl.Replace("{PropertyType}", type).Replace("{PropertyName}", col.DbColumnName).Replace("{SugarColumn}", sugarColumnStr);
if (col.DbColumnName == "id")
{
if(type == "string") txt = txt.TrimEnd('\n', '\r') + " = SnowflakeIdHelper.NextId();\r\n";
else if(type == "long") txt = txt.TrimEnd('\n', '\r') + " = YitIdHelper.NextId();\r\n";
if (type == "string") txt = txt.TrimEnd('\n', '\r') + " = SnowflakeIdHelper.NextId();\r\n";
else if (type == "long") txt = txt.TrimEnd('\n', '\r') + " = YitIdHelper.NextId();\r\n";
}
else if (type == "string") txt = txt.TrimEnd('\n', '\r') + " = string.Empty;\r\n";
return txt;