优化代码生成器代码预览时可查看对应菜单种子数据

This commit is contained in:
轻风2016 2024-09-10 15:46:30 +08:00
parent 21f6d2fcad
commit e7c225acba
2 changed files with 184 additions and 111 deletions

View File

@ -374,7 +374,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
if (string.IsNullOrEmpty(input.GenerateType))
input.GenerateType = "200";
string outputPath = Path.Combine(App.WebHostEnvironment.WebRootPath, "CodeGen", input.TableName!);
string outputPath = Path.Combine(App.WebHostEnvironment.WebRootPath, "codeGen", input.TableName!);
if (Directory.Exists(outputPath))
Directory.Delete(outputPath, true);
@ -428,22 +428,50 @@ public class SysCodeGenService : IDynamicApiController, ITransient
};
// 模板
var templateAllList = GetTemplateList(input);
var templateList = templateAllList.Where(t => t.Type != CodeGenTypeEnum.SeedData).ToList();
var templateList = GetTemplateList(input);
var templatePath = Path.Combine(App.WebHostEnvironment.WebRootPath, "template");
// 获得菜单
var menuList = await GetMenus(input.TableName!, input.BusName!, input.MenuPid ?? 0, input.MenuIcon!, input.PagePath!, tableFieldList);
for (var i = 0; i < templateList.Count; i++)
{
string tResult = string.Empty;//模板生成结果
var templateFilePath = Path.Combine(templatePath, templateList[i].Name);
if (!File.Exists(templateFilePath)) continue;
var tContent = File.ReadAllText(templateFilePath);
var tResult = await _viewEngine.RunCompileFromCachedAsync(tContent, data, builderAction: builder =>
if (templateList[i].Type == CodeGenTypeEnum.SeedData)
{
builder.AddAssemblyReferenceByName("System.Linq");
builder.AddAssemblyReferenceByName("System.Collections");
builder.AddUsing("System.Collections.Generic");
builder.AddUsing("System.Linq");
});
//种子模板
var seedData = new
{
AuthorName = input.AuthorName!,//作者
BusName = input.BusName!,//业务名称
NameSpace = input.NameSpace!,//命名空间
ClassName = input.TableName!,//类名称
input.ConfigId,
MenuList = menuList,//菜单集合
};
tResult = await _viewEngine.RunCompileAsync(tContent, seedData, builderAction: builder =>
{
builder.AddAssemblyReferenceByName("System.Linq");
builder.AddAssemblyReferenceByName("System.Collections");
builder.AddUsing("System.Collections.Generic");
builder.AddUsing("System.Linq");
});
}
else
{
tResult = await _viewEngine.RunCompileFromCachedAsync(tContent, data, builderAction: builder =>
{
builder.AddAssemblyReferenceByName("System.Linq");
builder.AddAssemblyReferenceByName("System.Collections");
builder.AddUsing("System.Collections.Generic");
builder.AddUsing("System.Linq");
});
}
string targetFile = templateList[i].OutputFile
.Replace("{PagePath}", input.PagePath)
@ -471,54 +499,8 @@ public class SysCodeGenService : IDynamicApiController, ITransient
}
if (input.GenerateMenu)
{
var menus = await AddMenu(input.TableName!, input.BusName!, input.MenuPid ?? 0, input.MenuIcon!, input.PagePath!, tableFieldList);
//获得种子模板
var seedDataTemplates = templateAllList.Where(t => t.Type == CodeGenTypeEnum.SeedData).ToList();
for (var i = 0; i < seedDataTemplates.Count; i++)
{
var templateFilePath = Path.Combine(templatePath, seedDataTemplates[i].Name);
if (!File.Exists(templateFilePath)) continue;
var tContent = File.ReadAllText(templateFilePath);
var seedData = new
{
AuthorName = input.AuthorName!,//作者
BusName = input.BusName!,//业务名称
NameSpace = input.NameSpace!,//命名空间
ClassName = input.TableName!,//类名称
input.ConfigId,
MenuList = menus,//菜单集合
};
var tResult = await _viewEngine.RunCompileAsync(tContent, seedData, builderAction: builder =>
{
builder.AddAssemblyReferenceByName("System.Linq");
builder.AddAssemblyReferenceByName("System.Collections");
builder.AddUsing("System.Collections.Generic");
builder.AddUsing("System.Linq");
});
string targetFile = seedDataTemplates[i].OutputFile
.Replace("{PagePath}", input.PagePath)
.Replace("{TableName}", input.TableName)
.Replace("{TableNameLower}", ToFirstLetterLowerCase(input.TableName!));
string tmpPath;
if (!input.GenerateType.StartsWith('1'))
{
tmpPath = Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent!.FullName, input.NameSpace);
}
else
{
tmpPath = Path.Combine(outputPath, input!.NameSpace!);
}
targetFile = Path.Combine(tmpPath, targetFile);
var dirPath = new DirectoryInfo(targetFile).Parent!.FullName;
if (!Directory.Exists(dirPath))
Directory.CreateDirectory(dirPath);
File.WriteAllText(targetFile, tResult, Encoding.UTF8);
}
//添加菜单
await AddMenu(menuList, input.MenuPid ?? 0);
}
// 非ZIP压缩返回空
@ -531,7 +513,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
if (File.Exists(downloadPath))
File.Delete(downloadPath);
ZipFile.CreateFromDirectory(outputPath, downloadPath);
return new { url = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Host.Value}/CodeGen/{input.TableName}.zip" };
return new { url = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Host.Value}/codeGen/{input.TableName}.zip" };
}
}
@ -592,23 +574,51 @@ public class SysCodeGenService : IDynamicApiController, ITransient
};
// 获取模板文件并替换
var templateAllList = GetTemplateList(input);
var templateList = templateAllList.Where(t => t.Type != CodeGenTypeEnum.SeedData).ToList();
var templateList = GetTemplateList(input);
var templatePath = Path.Combine(App.WebHostEnvironment.WebRootPath, "template");
var result = new Dictionary<string, string>();
for (var i = 0; i < templateList.Count; i++)
{
string tResult = string.Empty;//模板生成结果
var templateFilePath = Path.Combine(templatePath, templateList[i].Name);
if (!File.Exists(templateFilePath)) continue;
var tContent = File.ReadAllText(templateFilePath);
var tResult = await _viewEngine.RunCompileFromCachedAsync(tContent, data, builderAction: builder =>
if (templateList[i].Type == CodeGenTypeEnum.SeedData)
{
builder.AddAssemblyReferenceByName("System.Linq");
builder.AddAssemblyReferenceByName("System.Collections");
builder.AddUsing("System.Collections.Generic");
builder.AddUsing("System.Linq");
});
// 种子模板
// 获得菜单
var menuList = await GetMenus(input.TableName!, input.BusName!, input.MenuPid ?? 0, input.MenuIcon!, input.PagePath!, tableFieldList);
var seedData = new
{
AuthorName = input.AuthorName!,//作者
BusName = input.BusName!,//业务名称
NameSpace = input.NameSpace!,//命名空间
ClassName = input.TableName!,//类名称
input.ConfigId,
MenuList = menuList,//菜单集合
};
tResult = await _viewEngine.RunCompileAsync(tContent, seedData, builderAction: builder =>
{
builder.AddAssemblyReferenceByName("System.Linq");
builder.AddAssemblyReferenceByName("System.Collections");
builder.AddUsing("System.Collections.Generic");
builder.AddUsing("System.Linq");
});
}
else
{
tResult = await _viewEngine.RunCompileFromCachedAsync(tContent, data, builderAction: builder =>
{
builder.AddAssemblyReferenceByName("System.Linq");
builder.AddAssemblyReferenceByName("System.Collections");
builder.AddUsing("System.Collections.Generic");
builder.AddUsing("System.Linq");
});
}
result.Add(templateList[i].Name?.TrimEnd(".vm")!, tResult);
}
@ -642,29 +652,18 @@ public class SysCodeGenService : IDynamicApiController, ITransient
/// <summary>
/// 增加菜单
/// </summary>
/// <param name="className"></param>
/// <param name="busName"></param>
/// <param name="menus"></param>
/// <param name="pid"></param>
/// <param name="menuIcon"></param>
/// <param name="pagePath"></param>
/// <param name="tableFieldList"></param>
/// <returns></returns>
private async Task<List<SysMenu>> AddMenu(string className, string busName, long pid, string menuIcon, string pagePath, List<CodeGenConfig> tableFieldList)
private async Task AddMenu(List<SysMenu> menus, long pid)
{
var pPath = string.Empty;
// 若 pid=0 为顶级则创建菜单目录
if (pid == 0)
{
// 目录
var menuType0 = new SysMenu
{
Pid = 0,
Title = busName + "管理",
Type = MenuTypeEnum.Dir,
Icon = "robot",
Path = "/" + className.ToLower(),
Component = "Layout",
};
// 顶级目录
var menuType0 = menus.Where(u => u.Type == MenuTypeEnum.Dir && u.Pid == 0).FirstOrDefault();
// 若先前存在则删除本级和下级
var menuList0 = await _db.Queryable<SysMenu>().Where(u => u.Title == menuType0.Title && u.Type == menuType0.Type).ToListAsync();
if (menuList0.Count > 0)
@ -680,25 +679,11 @@ public class SysCodeGenService : IDynamicApiController, ITransient
await _db.Deleteable<SysMenu>().Where(u => listIds.Contains(u.Id)).ExecuteCommandAsync();
await _db.Deleteable<SysRoleMenu>().Where(u => listIds.Contains(u.MenuId)).ExecuteCommandAsync();
}
pid = (await _db.Insertable(menuType0).ExecuteReturnEntityAsync()).Id;
}
else
{
var pMenu = await _db.Queryable<SysMenu>().SingleAsync(u => u.Id == pid) ?? throw Oops.Oh(ErrorCodeEnum.D1505);
pPath = pMenu.Path;
await _db.Insertable(menuType0).ExecuteReturnEntityAsync();
}
// 菜单
var menuType = new SysMenu
{
Pid = pid,
Title = busName + "管理",
Name = className[..1].ToLower() + className[1..],
Type = MenuTypeEnum.Menu,
Icon = menuIcon,
Path = pPath + "/" + className.ToLower(),
Component = "/" + pagePath + "/" + className[..1].ToLower() + className[1..] + "/index",
};
var menuType = menus.Where(u => u.Type == MenuTypeEnum.Menu).FirstOrDefault();
// 若先前存在则删除本级和下级
var menuListCurrent = await _db.Queryable<SysMenu>().Where(u => u.Title == menuType.Title && u.Type == menuType.Type).ToListAsync();
if (menuListCurrent.Count > 0)
@ -714,94 +699,168 @@ public class SysCodeGenService : IDynamicApiController, ITransient
await _db.Deleteable<SysMenu>().Where(u => listIds.Contains(u.Id)).ExecuteCommandAsync();
await _db.Deleteable<SysRoleMenu>().Where(u => listIds.Contains(u.MenuId)).ExecuteCommandAsync();
}
await _db.Insertable(menus).ExecuteCommandAsync();
}
var menuPid = (await _db.Insertable(menuType).ExecuteReturnEntityAsync()).Id;
/// <summary>
/// 获得菜单列表
/// </summary>
/// <param name="className"></param>
/// <param name="busName"></param>
/// <param name="pid"></param>
/// <param name="menuIcon"></param>
/// <param name="pagePath"></param>
/// <param name="tableFieldList"></param>
/// <returns></returns>
private async Task<List<SysMenu>> GetMenus(string className, string busName, long pid, string menuIcon, string pagePath, List<CodeGenConfig> tableFieldList)
{
var pPath = string.Empty;
// 若 pid=0 为顶级则创建菜单目录
SysMenu menuType0 = null;
long tempPid = pid;//暂存原始pid
if (pid == 0)
{
// 目录
menuType0 = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = 0,
Title = busName + "管理",
Type = MenuTypeEnum.Dir,
Icon = "robot",
Path = "/" + className.ToLower() + "/dir",
Name = className[..1].ToLower() + className[1..] + "Dir",
Component = "Layout",
OrderNo = 100,
CreateTime = DateTime.Now
};
pid = menuType0.Id;
}
else
{
var pMenu = await _db.Queryable<SysMenu>().FirstAsync(u => u.Id == pid) ?? throw Oops.Oh(ErrorCodeEnum.D1505);
pPath = pMenu.Path;
}
// 菜单
var menuType = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = pid,
Title = busName + "管理",
Name = className[..1].ToLower() + className[1..],
Type = MenuTypeEnum.Menu,
Icon = menuIcon,
Path = pPath + "/" + className.ToLower(),
Component = "/" + pagePath + "/" + className[..1].ToLower() + className[1..] + "/index",
CreateTime = DateTime.Now
};
var menuPid = menuType.Id;
int menuOrder = 100;
// 按钮-page
var menuTypePage = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "查询",
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/page",
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
// 按钮-detail
var menuTypeDetail = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "详情",
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/detail",
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
// 按钮-add
var menuTypeAdd = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "增加",
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/add",
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
// 按钮-delete
var menuTypeDelete = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "删除",
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/delete",
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
// 按钮-update
var menuTypeUpdate = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "编辑",
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/update",
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
// 按钮-print
var menuTypePrint = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "打印",
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/print",
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
// 按钮-import
var menuTypeImport = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "导入",
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/import",
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
// 按钮-export
var menuTypeExport = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "导出",
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/export",
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
@ -813,11 +872,13 @@ public class SysCodeGenService : IDynamicApiController, ITransient
{
var menuType1 = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "外键" + @column.ColumnName,
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/" + column.FkEntityName + column.ColumnName + "Dropdown",
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
menuList.Add(menuType1);
@ -827,11 +888,13 @@ public class SysCodeGenService : IDynamicApiController, ITransient
{
var menuType1 = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "树型" + @column.ColumnName,
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/" + column.FkEntityName + "Tree",
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
menuList.Add(menuType1);
@ -841,17 +904,23 @@ public class SysCodeGenService : IDynamicApiController, ITransient
{
var menuType1 = new SysMenu
{
Id = YitIdHelper.NextId(),
Pid = menuPid,
Title = "上传" + @column.ColumnName,
Type = MenuTypeEnum.Btn,
Permission = className[..1].ToLower() + className[1..] + "/Upload" + column.ColumnName,
OrderNo = menuOrder
OrderNo = menuOrder,
CreateTime = DateTime.Now
};
menuOrder += 10;
menuList.Add(menuType1);
}
await _db.Insertable(menuList).ExecuteCommandAsync();
menuList.Insert(0, menuType);
if (tempPid == 0)
{
//顶级目录需要添加目录本身
menuList.Insert(0, menuType0);
}
return menuList;
}

View File

@ -10,6 +10,7 @@ namespace @(@Model.NameSpace).SeedData;
/// <summary>
/// @(@Model.BusName)系统菜单表种子数据
/// </summary>
[IncreSeed]
public class @(@Model.ClassName)SeedData : ISqlSugarEntitySeedData<SysMenu>
{
/// <summary>
@ -23,6 +24,9 @@ public class @(@Model.ClassName)SeedData : ISqlSugarEntitySeedData<SysMenu>
#region @(@Model.BusName)
@foreach (var menu in Model.MenuList){
@if((int)menu.Type==1){
@:list.Add(new SysMenu { Id = @(menu.Id), Pid = @(menu.Pid), Title = "@(menu.Title)", Path = "@(menu.Path)", Name = "@(menu.Name)", Component = "Layout", Icon = "@(menu.Icon)", Type = MenuTypeEnum.Dir, CreateTime = DateTime.Parse("@(menu.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"))"), OrderNo = @(menu.OrderNo) });
}
@if((int)menu.Type==2){
@:list.Add(new SysMenu { Id = @(menu.Id), Pid = @(menu.Pid), Title = "@(menu.Title)", Path = "@(menu.Path)", Name = "@(menu.Name)", Component = "@(menu.Component)", Icon = "@(menu.Icon)", Type = MenuTypeEnum.Menu, CreateTime = DateTime.Parse("@(menu.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"))"), OrderNo = @(menu.OrderNo) });
}