using Infrastructure; using Infrastructure.Extensions; using JinianNet.JNTemplate; using SqlSugar; using SqlSugar.IOC; using System; using System.Collections.Generic; using System.IO; using System.Linq; using ARW.CodeGenerator.Model; using ARW.Model.System.Generate; namespace ARW.CodeGenerator { /// /// 代码生成器 /// /// public class CodeGeneratorTool { /// /// 代码生成器配置 /// private static CodeGenerateOption _option = new CodeGenerateOption(); #region 业务生成 /// /// 代码生成器入口方法 /// /// public static void Generate(GenerateDto dto) { _option.BaseNamespace = dto.GenTable.BaseNameSpace; _option.SubNamespace = dto.GenTable.ModuleName.FirstUpperCase(); _option.DtosNamespace = _option.BaseNamespace + "Model"; _option.ModelsNamespace = _option.BaseNamespace + "Model"; _option.RepositoriesNamespace = _option.BaseNamespace + "Repository"; _option.IRepositoriesNamespace = _option.BaseNamespace + "Repository"; _option.IServicsNamespace = _option.BaseNamespace + "Service"; _option.ServicesNamespace = _option.BaseNamespace + "Service"; _option.ApiControllerNamespace = _option.BaseNamespace + "WebApi"; if (dto.GenTable.ModuleName.Contains('/')) dto.GenTable.ModuleName = dto.GenTable.ModuleName.Replace('/', '.'); if (dto.GenType == "1") { var vuePath = AppSettings.GetConfig("gen:vuePath"); if (!vuePath.IsEmpty()) { dto.VueParentPath = vuePath; } } else { string fullName = Path.Combine(dto.GenCodePath, "vue"); dto.VueParentPath = fullName; } dto.GenOptions = _option; string PKName = "Id"; string PKType = "int"; ReplaceDto replaceDto = new() { ModelTypeName = dto.GenTable.ClassName,//表名对应C# 实体类名 PermissionPrefix = dto.GenTable?.Options?.PermissionPrefix, Author = dto.GenTable.FunctionAuthor, ShowBtnAdd = dto.GenTable.Options.CheckedBtn.Any(f => f == 1), ShowBtnEdit = dto.GenTable.Options.CheckedBtn.Any(f => f == 2), ShowBtnDelete = dto.GenTable.Options.CheckedBtn.Any(f => f == 3), ShowBtnExport = dto.GenTable.Options.CheckedBtn.Any(f => f == 4), ShowBtnView = dto.GenTable.Options.CheckedBtn.Any(f => f == 5), ShowBtnImport = dto.GenTable.Options.CheckedBtn.Any(f => f == 6), ShowBtnAudit = dto.GenTable.Options.CheckedBtn.Any(f => f == 7) }; //循环表字段信息 foreach (GenTableColumn dbFieldInfo in dto.GenTable.Columns.OrderBy(x => x.Sort)) { if (dbFieldInfo.IsPk || dbFieldInfo.IsIncrement) { PKName = dbFieldInfo.CsharpField; PKType = dbFieldInfo.CsharpType; } if (dbFieldInfo.HtmlType.Equals(GenConstants.HTML_IMAGE_UPLOAD) || dbFieldInfo.HtmlType.Equals(GenConstants.HTML_FILE_UPLOAD)) { replaceDto.UploadFile = 1; } dbFieldInfo.CsharpFieldFl = dbFieldInfo.CsharpField.FirstLowerCase(); } replaceDto.PKName = PKName; replaceDto.PKType = PKType; replaceDto.FistLowerPk = PKName.FirstLowerCase(); InitJntTemplate(dto, replaceDto); GenerateModels(replaceDto, dto); GenerateRepository(replaceDto, dto); GenerateService(replaceDto, dto); GenerateControllers(replaceDto, dto); GenerateVue3Views(replaceDto, dto); GenerateVueJs(replaceDto, dto); GenerateSql(replaceDto, dto); if (dto.IsPreview) return; foreach (var item in dto.GenCodes) { item.Path = Path.Combine(dto.GenCodePath, item.Path); FileHelper.WriteAndSave(item.Path, item.Content); } } #region 读取模板 /// /// 生成实体类Model /// /// /// 替换实体 private static void GenerateModels(ReplaceDto replaceDto, GenerateDto generateDto) { string fullPath = Path.Combine(_option.ModelsNamespace, "Models", "Business", _option.SubNamespace, replaceDto.ModelTypeName + ".cs"); string fullPathDto = Path.Combine(_option.ModelsNamespace, "Dto", "Business", _option.SubNamespace, $"{replaceDto.ModelTypeName}Dto.cs"); string fullPathVo = Path.Combine(_option.ModelsNamespace, "Vo", "Business", _option.SubNamespace, $"{replaceDto.ModelTypeName}Vo.cs"); var tpl = FileHelper.ReadJtTemplate("TplModel.txt"); var tplDto = FileHelper.ReadJtTemplate("TplDto.txt"); var tplVo = FileHelper.ReadJtTemplate("TplVo.txt"); generateDto.GenCodes.Add(new GenCode(1, "Model.cs", fullPath, tpl.Render())); generateDto.GenCodes.Add(new GenCode(2, "Dto.cs", fullPathDto, tplDto.Render())); generateDto.GenCodes.Add(new GenCode(3, "Vo.cs", fullPathVo, tplVo.Render())); } /// /// 生成Repository层代码文件 /// /// /// 替换实体 private static void GenerateRepository(ReplaceDto replaceDto, GenerateDto generateDto) { var tpl = FileHelper.ReadJtTemplate("TplRepository.txt"); var result = tpl.Render(); var fullPath = Path.Combine(_option.RepositoriesNamespace, "Business", _option.SubNamespace, $"{replaceDto.ModelTypeName}Repository.cs"); generateDto.GenCodes.Add(new GenCode(3, "Repository.cs", fullPath, result)); } /// /// 生成Service文件 /// private static void GenerateService(ReplaceDto replaceDto, GenerateDto generateDto) { var tpl = FileHelper.ReadJtTemplate("TplService.txt"); var tpl2 = FileHelper.ReadJtTemplate("TplIService.txt"); var result = tpl.Render(); var result2 = tpl2.Render(); var fullPath = Path.Combine(_option.ServicesNamespace, "Business", "BusinessService", _option.SubNamespace, $"{replaceDto.ModelTypeName}Service.cs"); var fullPath2 = Path.Combine(_option.IServicsNamespace, "Business", "IBusinessService", _option.SubNamespace, $"I{replaceDto.ModelTypeName}Service.cs"); generateDto.GenCodes.Add(new GenCode(4, "Service.cs", fullPath, result)); generateDto.GenCodes.Add(new GenCode(4, "IService.cs", fullPath2, result2)); } /// /// 生成控制器ApiControllers文件 /// private static void GenerateControllers(ReplaceDto replaceDto, GenerateDto generateDto) { var tpl = FileHelper.ReadJtTemplate("TplControllers.txt"); tpl.Set("QueryCondition", replaceDto.QueryCondition); var result = tpl.Render(); var fullPath = Path.Combine(_option.ApiControllerNamespace, "Controllers", "Business", _option.SubNamespace, $"{replaceDto.ModelTypeName}Controller.cs"); generateDto.GenCodes.Add(new GenCode(5, "Controller.cs", fullPath, result)); } /// /// 生成Vue页面 private static void GenerateVueViews(ReplaceDto replaceDto, GenerateDto generateDto) { string fileName = string.Empty; switch (generateDto.GenTable.TplCategory) { case "tree": fileName = "TplTreeVue.txt"; break; case "crud": fileName = "TplVue.txt"; break; case "subNav": fileName = "TplVue.txt"; break; case "subNavMore": fileName = "TplVue.txt"; break; case "select": fileName = "TplVueSelect.txt"; break; default: break; } var tpl = FileHelper.ReadJtTemplate(fileName); tpl.Set("vueQueryFormHtml", replaceDto.VueQueryFormHtml); tpl.Set("VueViewFormContent", replaceDto.VueViewFormHtml);//添加、修改表单 tpl.Set("VueViewListContent", replaceDto.VueViewListHtml);//查询 table列 var result = tpl.Render(); var fullPath = Path.Combine("src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{generateDto.GenTable.BusinessName.FirstUpperCase()}.vue"); generateDto.GenCodes.Add(new GenCode(6, "index.vue", fullPath, result)); } /// /// vue3 /// /// /// private static void GenerateVue3Views(ReplaceDto replaceDto, GenerateDto generateDto) { string fileName = generateDto.GenTable.TplCategory switch { "tree" => "TplVueIndex.txt", "crud" => "TplVueIndex.txt", //case "select": // fileName = "TplVueSelect.txt"; // break; _ => "Vue.txt", }; //fileName = Path.Combine("v3", fileName); var tpl = FileHelper.ReadJtTemplate(fileName); var tplAdd = FileHelper.ReadJtTemplate("Add.txt"); var tplEdit = FileHelper.ReadJtTemplate("Edit.txt"); var tplDetail = FileHelper.ReadJtTemplate("Detail.txt"); var tplUpload = FileHelper.ReadJtTemplate("Upload.txt"); //tpl.Set("treeCode", generateDto.GenTable?.Options?.TreeCode?.FirstLowerCase()); //tpl.Set("treeName", generateDto.GenTable?.Options?.TreeName?.FirstLowerCase()); //tpl.Set("treeParentCode", generateDto.GenTable?.Options?.TreeParentCode?.FirstLowerCase()); //tpl.Set("options", generateDto.GenTable?.Options); var result = tpl.Render(); var Addresult = tplAdd.Render(); var Editresult = tplEdit.Render(); var Detailresult = tplDetail.Render(); var Uploadresult = tplUpload.Render(); var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", "business", _option.SubNamespace, "index.vue"); var AddfullPath = Path.Combine(generateDto.VueParentPath, "src", "views", "business", _option.SubNamespace , "components", "AddDialog.vue"); var EditfullPath = Path.Combine(generateDto.VueParentPath, "src", "views", "business", _option.SubNamespace , "components", "EditDialog.vue"); var DetailfullPath = Path.Combine(generateDto.VueParentPath, "src", "views", "business", _option.SubNamespace , "components", "DetailDialog.vue"); if (replaceDto.ShowBtnImport) { var UploadfullPath = Path.Combine(generateDto.VueParentPath, "src", "views", "business", _option.SubNamespace , "components", "UploadDialog.vue"); generateDto.GenCodes.Add(new GenCode(16, "UploadDialog.vue", UploadfullPath, Uploadresult)); } generateDto.GenCodes.Add(new GenCode(16, "index.vue", fullPath, result)); generateDto.GenCodes.Add(new GenCode(16, "AddDialog.vue", AddfullPath, Addresult)); generateDto.GenCodes.Add(new GenCode(16, "EditDialog.vue", EditfullPath, Editresult)); generateDto.GenCodes.Add(new GenCode(16, "DetailDialog.vue", DetailfullPath, Detailresult)); } /// /// 生成vue页面api /// /// /// /// public static void GenerateVueJs(ReplaceDto replaceDto, GenerateDto generateDto) { var tpl = FileHelper.ReadJtTemplate("TplVueApi.txt"); var result = tpl.Render(); string fileName; if (generateDto.VueVersion == 3) { fileName = generateDto.GenTable.BusinessName.ToLower() + ".js"; } else { fileName = generateDto.GenTable.BusinessName.FirstLowerCase() + ".js"; } string fullPath = Path.Combine(generateDto.VueParentPath, "src", "api", "business", _option.SubNamespace, fileName); generateDto.GenCodes.Add(new GenCode(7, "api.js", fullPath, result)); } /// /// 生成SQL /// /// /// public static void GenerateSql(ReplaceDto replaceDto, GenerateDto generateDto) { var db = DbScoped.SugarScope; //new MySql.Data.MySqlClient.MySqlConnection("server=47.242.159.172;Database=demo;Uid=demo;Pwd=demo;SslMode=none;CharSet=utf8mb4;AllowLoadLocalInfile=true;AllowUserVariables=true;").Open(); var str = AppSettings.GetConfig("gen:conn"); SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = str, DbType = DbType.MySqlConnector, IsAutoCloseConnection = true }, db => { }); var tempName = ""; switch (generateDto.DbType) { case 8: tempName = "MySqlTemplate"; break; case 1: tempName = "SqlTemplate"; break; default: break; } var tpl = FileHelper.ReadJtTemplate($"{tempName}.txt"); tpl.Set("parentId", generateDto.GenTable?.Options?.ParentMenuId ?? 0); var result = tpl.Render(); if (generateDto.GenType == "1") { db.Ado.ExecuteCommand(result); } else { string fullPath = Path.Combine(generateDto.GenCodePath, "sql", generateDto.GenTable.BusinessName + ".sql"); generateDto.GenCodes.Add(new GenCode(8, "sql", fullPath, result)); } } /// /// 生成vue页面查询form /// /// public static string GenerateVueQueryForm() { var tpl = FileHelper.ReadJtTemplate("QueryForm.txt"); var result = tpl.Render(); return result; } /// /// 生成vue页面table /// /// public static string GenerateVueTableList() { var tpl = FileHelper.ReadJtTemplate("TableList.txt"); var result = tpl.Render(); return result; } /// /// 生成vue表单 /// /// public static string GenerateCurdForm() { var tpl = FileHelper.ReadJtTemplate("CurdForm.txt"); var result = tpl.Render(); return result; } #endregion #region 帮助方法 /// /// 如果有前缀替换将前缀替换成空,替换下划线"_"为空再将首字母大写 /// 表名转换成C#类名 /// /// /// public static string GetClassName(string tableName) { bool autoRemovePre = AppSettings.GetAppConfig(GenConstants.Gen_autoPre, false); string tablePrefix = AppSettings.GetAppConfig(GenConstants.Gen_tablePrefix); if (!string.IsNullOrEmpty(tablePrefix) && autoRemovePre) { string[] prefixList = tablePrefix.Split(",", StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < prefixList.Length; i++) { if (!string.IsNullOrEmpty(prefixList[i].ToString())) { tableName = tableName.Replace(prefixList[i], "", StringComparison.OrdinalIgnoreCase); } } } return tableName.UnderScoreToCamelCase(); } /// /// 获取前端标签名 /// /// /// /// public static string GetLabelName(string columnDescription, string columnName) { return string.IsNullOrEmpty(columnDescription) ? columnName : columnDescription; } /// /// 首字母转小写,模板使用(勿删) /// /// /// public static string FirstLowerCase(string str) { try { return string.IsNullOrEmpty(str) ? str : str.Substring(0, 1).ToLower() + str[1..]; } catch (Exception ex) { Console.WriteLine(ex.Message); return ""; } } /// /// 获取C# 类型 /// /// /// public static string GetCSharpDatatype(string sDatatype) { sDatatype = sDatatype.ToLower(); string sTempDatatype = sDatatype switch { "int" or "number" or "integer" or "smallint" => "int", "bigint" => "long", "tinyint" => "byte", "numeric" or "real" or "float" => "float", "decimal" or "numer(8,2)" or "numeric" => "decimal", "bit" => "bool", "date" or "datetime" or "datetime2" or "smalldatetime" or "timestamp" => "DateTime", "money" or "smallmoney" => "decimal", _ => "string", }; return sTempDatatype; } public static bool IsNumber(string tableDataType) { string[] arr = new string[] { "int", "long" }; return arr.Any(f => f.Contains(GetCSharpDatatype(tableDataType))); } #endregion #region 初始化信息 /// /// 初始化表信息 /// /// /// /// /// /// public static GenTable InitTable(string dbName, string userName, string tableName, string desc) { GenTable genTable = new() { DbName = dbName, BaseNameSpace = "ARW.",//导入默认命名空间前缀 ModuleName = GetClassName(tableName).FirstUpperCase() + "s",//导入默认模块名 ClassName = GetClassName(tableName).FirstUpperCase(), BusinessName = GetClassName(tableName).FirstUpperCase(), FunctionAuthor = AppSettings.GetConfig(GenConstants.Gen_author), TableName = tableName, TableComment = desc, FunctionName = desc, Create_by = userName, GenType = "1", GenPath = "", Options = new Options() { SortField = "Update_time", SortType = "Desc", CheckedBtn = new int[] { 1, 2, 3, 5 } } }; genTable.Options.PermissionPrefix = $"business:{genTable.ClassName.ToLower()}";//权限 return genTable; } /// /// 初始化列属性字段数据 /// /// /// public static List InitGenTableColumn(GenTable genTable, List dbColumnInfos) { List genTableColumns = new(); var index = 0; foreach (var column in dbColumnInfos) { index++; genTableColumns.Add(InitColumnField(genTable, column, index)); } return genTableColumns; } /// /// 初始化表字段数据 /// /// /// /// private static GenTableColumn InitColumnField(GenTable genTable, DbColumnInfo column, int index) { GenTableColumn genTableColumn = new() { ColumnName = column.DbColumnName.FirstLowerCase(), ColumnComment = column.ColumnDescription, IsPk = column.IsPrimarykey, ColumnType = column.DataType, TableId = genTable.TableId, TableName = genTable.TableName, CsharpType = GetCSharpDatatype(column.DataType), CsharpField = column.DbColumnName.ConvertToPascal("_"), IsRequired = !column.IsNullable, IsIncrement = column.IsIdentity, Create_by = genTable.Create_by, Create_time = DateTime.Now, IsInsert = !column.IsIdentity || GenConstants.inputDtoNoField.Any(f => f.Contains(column.DbColumnName, StringComparison.OrdinalIgnoreCase)),//非自增字段都需要插入 IsInit = GenConstants.inputDtoNoField.Any(f => column.DbColumnName.Contains(f)), IsGuid = column.DbColumnName.Contains("guid"), IsEdit = true, IsQuery = false, HtmlType = GenConstants.HTML_INPUT, Sort = index }; switch (genTableColumn.CsharpField) { case "CreateBy": genTableColumn.CsharpField = "Create_by"; break; case "CreateTime": genTableColumn.CsharpField = "Create_time"; break; case "UpdateBy": genTableColumn.CsharpField = "Update_by"; break; case "UpdateTime": genTableColumn.CsharpField = "Update_time"; break; default: break; } if (GenConstants.imageFiled.Any(f => column.DbColumnName.ToLower().Contains(f.ToLower()))) { genTableColumn.HtmlType = GenConstants.HTML_IMAGE_UPLOAD; } else if (GenConstants.COLUMNTYPE_TIME.Any(f => genTableColumn.CsharpType.ToLower().Contains(f.ToLower()))) { genTableColumn.HtmlType = GenConstants.HTML_DATETIME; } else if (GenConstants.radioFiled.Any(f => column.DbColumnName.EndsWith(f, StringComparison.OrdinalIgnoreCase)) || GenConstants.radioFiled.Any(f => column.DbColumnName.StartsWith(f, StringComparison.OrdinalIgnoreCase))) { genTableColumn.HtmlType = GenConstants.HTML_RADIO; } else if (GenConstants.selectFiled.Any(f => column.DbColumnName == f) || GenConstants.selectFiled.Any(f => column.DbColumnName.EndsWith(f, StringComparison.OrdinalIgnoreCase))) { genTableColumn.HtmlType = GenConstants.HTML_SELECT; } else if (column.Length > 500) { genTableColumn.HtmlType = GenConstants.HTML_TEXTAREA; } //编辑字段 if (column.IsIdentity || column.IsPrimarykey || GenConstants.COLUMNNAME_NOT_EDIT.Any(f => column.DbColumnName.Contains(f))) { genTableColumn.IsEdit = false; } //列表字段 if (!GenConstants.COLUMNNAME_NOT_ARWST.Any(f => column.DbColumnName.Contains(f) && !column.IsPrimarykey)) { genTableColumn.IsList = true; } //时间类型初始化between范围查询 if (genTableColumn.CsharpType == GenConstants.TYPE_DATE) { genTableColumn.QueryType = "BETWEEN"; } return genTableColumn; } #endregion /// /// 初始化Jnt模板 /// /// /// private static void InitJntTemplate(GenerateDto dto, ReplaceDto replaceDto) { Engine.Current.Clean(); dto.GenTable.Columns = dto.GenTable.Columns.OrderBy(x => x.Sort).ToList(); bool showCustomInput = dto.GenTable.Columns.Any(f => f.HtmlType.Equals(GenConstants.HTML_CUSTOM_INPUT, StringComparison.OrdinalIgnoreCase)); //jnt模板引擎全局变量 Engine.Configure((options) => { options.TagPrefix = "${"; options.TagSuffix = "}"; options.TagFlag = '$'; options.OutMode = OutMode.Auto; //options.DisableeLogogram = true;//禁用简写 options.Data.Set("refs", "$");//特殊标签替换 options.Data.Set("t", "$");//特殊标签替换 options.Data.Set("modal", "$");//特殊标签替换 options.Data.Set("index", "$");//特殊标签替换 options.Data.Set("confirm", "$");//特殊标签替换 options.Data.Set("nextTick", "$"); options.Data.Set("replaceDto", replaceDto); options.Data.Set("options", dto.GenOptions); options.Data.Set("genTable", dto.GenTable); options.Data.Set("btns", dto.CheckedBtn); options.Data.Set("showCustomInput", showCustomInput); options.Data.Set("tool", new CodeGeneratorTool()); options.Data.Set("codeTool", new CodeGenerateTemplate()); options.EnableCache = true; //...其它数据 }); } #region 模板用 /// /// 模板用 /// /// /// public static bool CheckInputDtoNoField(string str) { return GenConstants.inputDtoNoField.Any(f => f.Contains(str, StringComparison.OrdinalIgnoreCase)); } public static bool CheckTree(GenTable genTable, string csharpField) { return (genTable.TplCategory.Equals("tree", StringComparison.OrdinalIgnoreCase) && genTable?.Options?.TreeParentCode != null && csharpField.Equals(genTable?.Options?.TreeParentCode)); } #endregion #endregion #region Api接口生成 /// /// 代码生成器入口方法(Api) /// /// public static void GenerateApi(GenerateDto dto) { _option.BaseNamespace = dto.GenTable.BaseNameSpace; _option.SubNamespace = dto.GenTable.ModuleName.FirstUpperCase(); _option.DtosNamespace = _option.BaseNamespace + "Model"; _option.ModelsNamespace = _option.BaseNamespace + "Model"; _option.RepositoriesNamespace = _option.BaseNamespace + "Repository"; _option.IRepositoriesNamespace = _option.BaseNamespace + "Repository"; _option.IServicsNamespace = _option.BaseNamespace + "Service"; _option.ServicesNamespace = _option.BaseNamespace + "Service"; _option.ApiControllerNamespace = _option.BaseNamespace + "WebApi"; if (dto.GenTable.ModuleName.Contains('/')) dto.GenTable.ModuleName = dto.GenTable.ModuleName.Replace('/', '.'); if (dto.GenType == "1") { var vuePath = AppSettings.GetConfig("gen:vuePath"); if (!vuePath.IsEmpty()) { dto.VueParentPath = vuePath; } } else { string fullName = Path.Combine(dto.GenCodePath, "vue"); dto.VueParentPath = fullName; } dto.GenOptions = _option; string PKName = "Id"; string PKType = "int"; ReplaceDto replaceDto = new() { ModelTypeName = dto.GenTable.ClassName,//表名对应C# 实体类名 PermissionPrefix = dto.GenTable?.Options?.PermissionPrefix, Author = dto.GenTable.FunctionAuthor, ShowBtnAdd = dto.GenTable.Options.CheckedBtn.Any(f => f == 1), ShowBtnEdit = dto.GenTable.Options.CheckedBtn.Any(f => f == 2), ShowBtnDelete = dto.GenTable.Options.CheckedBtn.Any(f => f == 3), ShowBtnExport = dto.GenTable.Options.CheckedBtn.Any(f => f == 4), ShowBtnView = dto.GenTable.Options.CheckedBtn.Any(f => f == 5), ShowBtnImport = dto.GenTable.Options.CheckedBtn.Any(f => f == 6) }; //循环表字段信息 foreach (GenTableColumn dbFieldInfo in dto.GenTable.Columns.OrderBy(x => x.Sort)) { if (dbFieldInfo.IsPk || dbFieldInfo.IsIncrement) { PKName = dbFieldInfo.CsharpField; PKType = dbFieldInfo.CsharpType; } if (dbFieldInfo.HtmlType.Equals(GenConstants.HTML_IMAGE_UPLOAD) || dbFieldInfo.HtmlType.Equals(GenConstants.HTML_FILE_UPLOAD)) { replaceDto.UploadFile = 1; } dbFieldInfo.CsharpFieldFl = dbFieldInfo.CsharpField.FirstLowerCase(); } replaceDto.PKName = PKName; replaceDto.PKType = PKType; replaceDto.FistLowerPk = PKName.FirstLowerCase(); InitJntTemplate(dto, replaceDto); GenerateModelsApi(replaceDto, dto); GenerateServiceApi(replaceDto, dto); GenerateControllersApi(replaceDto, dto); if (dto.IsPreview) return; foreach (var item in dto.GenCodes) { item.Path = Path.Combine(dto.GenCodePath, item.Path); FileHelper.WriteAndSave(item.Path, item.Content); } } /// /// 生成实体类Model(Api) /// /// /// 替换实体 private static void GenerateModelsApi(ReplaceDto replaceDto, GenerateDto generateDto) { var tplDto = FileHelper.ReadJtTemplate("TplDtoApi.txt"); var tplVo = FileHelper.ReadJtTemplate("TplVoApi.txt"); string fullPathDto = Path.Combine(_option.ModelsNamespace, "Dto", "Api", _option.SubNamespace, $"{replaceDto.ModelTypeName}ApiDto.cs"); string fullPathVo = Path.Combine(_option.ModelsNamespace, "Vo", "Api", _option.SubNamespace, $"{replaceDto.ModelTypeName}ApiVo.cs"); generateDto.GenCodes.Add(new GenCode(2, "DtoApi.cs", fullPathDto, tplDto.Render())); generateDto.GenCodes.Add(new GenCode(3, "VoApi.cs", fullPathVo, tplVo.Render())); } /// /// 生成Service文件(Api) /// private static void GenerateServiceApi(ReplaceDto replaceDto, GenerateDto generateDto) { var tpl = FileHelper.ReadJtTemplate("TplServiceApi.txt"); var tpl2 = FileHelper.ReadJtTemplate("TplIServiceApi.txt"); var result = tpl.Render(); var result2 = tpl2.Render(); var fullPath = Path.Combine(_option.ServicesNamespace, "Api", "BusinessService", _option.SubNamespace, $"{replaceDto.ModelTypeName}ServiceApi.cs"); var fullPath2 = Path.Combine(_option.IServicsNamespace, "Api", "IBusinessService", _option.SubNamespace, $"I{replaceDto.ModelTypeName}ServiceApi.cs"); generateDto.GenCodes.Add(new GenCode(4, "ServiceApi.cs", fullPath, result)); generateDto.GenCodes.Add(new GenCode(4, "IServiceApi.cs", fullPath2, result2)); } /// /// 生成控制器ApiControllers文件(Api) /// private static void GenerateControllersApi(ReplaceDto replaceDto, GenerateDto generateDto) { var tpl = FileHelper.ReadJtTemplate("TplControllersApi.txt"); tpl.Set("QueryCondition", replaceDto.QueryCondition); var result = tpl.Render(); var fullPath = Path.Combine(_option.ApiControllerNamespace, "Controllers", "Api", _option.SubNamespace, $"{replaceDto.ModelTypeName}ApiController.cs"); generateDto.GenCodes.Add(new GenCode(5, "Controller.cs", fullPath, result)); } #endregion } }