using SqlSugar; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace Tiobon.Core.Common.Seed { public class FrameSeed { public static string path = AppDomain.CurrentDomain.BaseDirectory.Replace("Tiobon.Core.Api\\bin\\Debug\\net8.0\\", null); /// /// 生成Controller层 /// /// sqlsugar实例 /// 数据库链接ID /// 数据库表名数组,默认空,生成所有表 /// /// public static bool CreateControllers(SqlSugarScope sqlSugarClient, string ConnId = null, bool isMuti = false, string[] tableNames = null) { Create_Controller_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.Api\Controllers", "Tiobon.Core.Api.Controllers", tableNames, "", isMuti); return true; } /// /// 生成Model层 /// /// sqlsugar实例 /// 数据库链接ID /// 数据库表名数组,默认空,生成所有表 /// /// public static bool CreateModels(SqlSugarScope sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null) { Create_Model_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.Model", "Tiobon.Core.Model.Models", tableNames, "", isMuti); return true; } /// /// 生成IRepository层 /// /// sqlsugar实例 /// 数据库链接ID /// /// 数据库表名数组,默认空,生成所有表 /// public static bool CreateIRepositorys(SqlSugarScope sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null) { Create_IRepository_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.IRepository", "Tiobon.Core.IRepository", tableNames, "", isMuti); return true; } /// /// 生成 IService 层 /// /// sqlsugar实例 /// 数据库链接ID /// /// 数据库表名数组,默认空,生成所有表 /// public static bool CreateIServices(SqlSugarScope sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null) { Create_IServices_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.IServices", "Tiobon.Core.IServices", tableNames, "", isMuti); return true; } /// /// 生成 Repository 层 /// /// sqlsugar实例 /// 数据库链接ID /// /// 数据库表名数组,默认空,生成所有表 /// public static bool CreateRepository(SqlSugarScope sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null) { Create_Repository_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.Repository", "Tiobon.Core.Repository", tableNames, "", isMuti); return true; } /// /// 生成 Service 层 /// /// sqlsugar实例 /// 数据库链接ID /// /// 数据库表名数组,默认空,生成所有表 /// public static bool CreateServices(SqlSugarScope sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null) { Create_Services_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.Services", "Tiobon.Core.Services", tableNames, "", isMuti); return true; } #region 根据数据库表生产Controller层 /// /// 功能描述:根据数据库表生产Controller层 /// 作  者:Tiobon.Core /// /// /// 数据库链接ID /// 实体类存放路径 /// 命名空间 /// 生产指定的表 /// 实现接口 /// /// 是否序列化 private static void Create_Controller_ClassFileByDBTalbe( SqlSugarScope sqlSugarClient, string ConnId, string strPath, string strNameSpace, string[] lstTableNames, string strInterface, bool isMuti = false, bool blnSerializable = false) { var IDbFirst = sqlSugarClient.DbFirst; if (lstTableNames != null && lstTableNames.Length > 0) { IDbFirst = IDbFirst.Where(lstTableNames); } var ls = IDbFirst.IsCreateDefaultValue().IsCreateAttribute() .SettingClassTemplate(p => p = @"namespace " + strNameSpace + @" { [Route(""api/[controller]/[action]"")] [ApiController] [Authorize(Permissions.Name)] public class {ClassName}Controller : ControllerBase { #region 初始化 /// /// 服务器接口,因为是模板生成,所以首字母是大写的,自己可以重构下 /// private readonly I{ClassName}Services _{ClassName}Services; public {ClassName}Controller(I{ClassName}Services {ClassName}Services) { _{ClassName}Services = {ClassName}Services; } #endregion #region 基础接口 #region 查询 [HttpGet] public async Task>> Get(int page = 1, string key = """",int pageSize = 50) { if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) key = """"; Expression> whereExpression = a => true; return new MessageModel>() { msg = ""获取成功"", success = true, response = await _{ClassName}Services.QueryPage(whereExpression, page, pageSize) }; } [HttpGet(""{id}"")] public async Task> Get(string id) { return new MessageModel<{ClassName}>() { msg = ""获取成功"", success = true, response = await _{ClassName}Services.QueryById(id) }; } #endregion #region 新增 [HttpPost] public async Task> Post([FromBody] {ClassName} request) { var data = new MessageModel(); var id = await _{ClassName}Services.Add(request); data.success = id > 0; if (data.success) { data.response = id.ObjToString(); data.msg = ""添加成功""; } return data; } #endregion #region 新增 [HttpPut] public async Task> Put([FromBody] {ClassName} request) { var data = new MessageModel(); data.success = await _{ClassName}Services.Update(request); if (data.success) { data.msg = ""更新成功""; data.response = request?.Id.ObjToString(); } return data; } #endregion #region 删除 [HttpDelete] public async Task> Delete(int id) { var data = new MessageModel(); var model = await _{ClassName}Services.QueryById(id); model.IsEnable = 1; // data.success = await _departmentServices.Update(model); if (data.success) { data.msg = ""删除成功""; data.response = model?.Id.ObjToString(); } return data; } #endregion #endregion } }") .ToClassStringList(strNameSpace); Dictionary newdic = new Dictionary(); //循环处理 首字母小写 并插入新的 Dictionary foreach (KeyValuePair item in ls) { string newkey = "_" + item.Key.First().ToString().ToLower() + item.Key.Substring(1); string newvalue = item.Value.Replace("_" + item.Key, newkey); newdic.Add(item.Key, newvalue); } CreateFilesByClassStringList(newdic, strPath, "{0}Controller"); } #endregion #region 根据数据库表生产Model层 /// /// 功能描述:根据数据库表生产Model层 /// 作  者:Tiobon.Core /// /// /// 数据库链接ID /// 实体类存放路径 /// 命名空间 /// 生产指定的表 /// 实现接口 /// /// 是否序列化 private static void Create_Model_ClassFileByDBTalbe( SqlSugarScope sqlSugarClient, string ConnId, string strPath, string strNameSpace, string[] lstTableNames, string strInterface, bool isMuti = false, bool blnSerializable = false) { //多库文件分离 if (isMuti) { strPath = strPath + @"\Models\" + ConnId; strNameSpace = strNameSpace + "." + ConnId; } var IDbFirst = sqlSugarClient.DbFirst; if (lstTableNames != null && lstTableNames.Length > 0) { IDbFirst = IDbFirst.Where(lstTableNames); } var ls = IDbFirst.IsCreateDefaultValue().IsCreateAttribute() .SettingClassTemplate(p => p = @"{using} namespace " + strNameSpace + @" { {ClassDescription} [SugarTable( ""{ClassName}"", """ + ConnId + @""")]" + (blnSerializable ? "\n [Serializable]" : "") + @" public class {ClassName}" + (string.IsNullOrEmpty(strInterface) ? "" : (" : " + strInterface)) + @" { public {ClassName}() { } {PropertyName} } }") //.SettingPropertyDescriptionTemplate(p => p = string.Empty) .SettingPropertyTemplate(p => p = @"{SugarColumn} public {PropertyType} {PropertyName} { get; set; }") //.SettingConstructorTemplate(p => p = " this._{PropertyName} ={DefaultValue};") .ToClassStringList(strNameSpace); CreateFilesByClassStringList(ls, strPath, "{0}"); } #endregion #region 根据数据库表生产IRepository层 /// /// 功能描述:根据数据库表生产IRepository层 /// 作  者:Tiobon.Core /// /// /// 数据库链接ID /// 实体类存放路径 /// 命名空间 /// 生产指定的表 /// 实现接口 /// private static void Create_IRepository_ClassFileByDBTalbe( SqlSugarScope sqlSugarClient, string ConnId, string strPath, string strNameSpace, string[] lstTableNames, string strInterface, bool isMuti = false ) { //多库文件分离 if (isMuti) { strPath = strPath + @"\" + ConnId; strNameSpace = strNameSpace + "." + ConnId; } var IDbFirst = sqlSugarClient.DbFirst; if (lstTableNames != null && lstTableNames.Length > 0) { IDbFirst = IDbFirst.Where(lstTableNames); } var ls = IDbFirst.IsCreateDefaultValue().IsCreateAttribute() .SettingClassTemplate(p => p = @"using Tiobon.Core.IRepository.Base; using Tiobon.Core.Model.Models" + (isMuti ? "." + ConnId + "" : "") + @"; namespace " + strNameSpace + @" { /// /// I{ClassName}Repository /// public interface I{ClassName}Repository : IBaseRepository<{ClassName}>" + (string.IsNullOrEmpty(strInterface) ? "" : (" , " + strInterface)) + @" { } }") .ToClassStringList(strNameSpace); CreateFilesByClassStringList(ls, strPath, "I{0}Repository"); } #endregion #region 根据数据库表生产IServices层 /// /// 功能描述:根据数据库表生产IServices层 /// 作  者:Tiobon.Core /// /// /// 数据库链接ID /// 实体类存放路径 /// 命名空间 /// 生产指定的表 /// 实现接口 /// private static void Create_IServices_ClassFileByDBTalbe( SqlSugarScope sqlSugarClient, string ConnId, string strPath, string strNameSpace, string[] lstTableNames, string strInterface, bool isMuti = false) { //多库文件分离 if (isMuti) { strPath = strPath + @"\" + ConnId; strNameSpace = strNameSpace + "." + ConnId; } var IDbFirst = sqlSugarClient.DbFirst; if (lstTableNames != null && lstTableNames.Length > 0) { IDbFirst = IDbFirst.Where(lstTableNames); } var ls = IDbFirst.IsCreateDefaultValue().IsCreateAttribute() .SettingClassTemplate(p => p = @"using Tiobon.Core.IServices.BASE; using Tiobon.Core.Model.Models" + (isMuti ? "." + ConnId + "" : "") + @"; namespace " + strNameSpace + @" { /// /// I{ClassName}Services /// public interface I{ClassName}Services :IBaseServices<{ClassName}>" + (string.IsNullOrEmpty(strInterface) ? "" : (" , " + strInterface)) + @" { } }") .ToClassStringList(strNameSpace); CreateFilesByClassStringList(ls, strPath, "I{0}Services"); } #endregion #region 根据数据库表生产 Repository 层 /// /// 功能描述:根据数据库表生产 Repository 层 /// 作  者:Tiobon.Core /// /// /// 数据库链接ID /// 实体类存放路径 /// 命名空间 /// 生产指定的表 /// 实现接口 /// private static void Create_Repository_ClassFileByDBTalbe( SqlSugarScope sqlSugarClient, string ConnId, string strPath, string strNameSpace, string[] lstTableNames, string strInterface, bool isMuti = false) { //多库文件分离 if (isMuti) { strPath = strPath + @"\" + ConnId; strNameSpace = strNameSpace + "." + ConnId; } var IDbFirst = sqlSugarClient.DbFirst; if (lstTableNames != null && lstTableNames.Length > 0) { IDbFirst = IDbFirst.Where(lstTableNames); } var ls = IDbFirst.IsCreateDefaultValue().IsCreateAttribute() .SettingClassTemplate(p => p = @"using Tiobon.Core.IRepository" + (isMuti ? "." + ConnId + "" : "") + @"; using Tiobon.Core.IRepository.UnitOfWork; using Tiobon.Core.Model.Models" + (isMuti ? "." + ConnId + "" : "") + @"; using Tiobon.Core.Repository.Base; namespace " + strNameSpace + @" { /// /// {ClassName}Repository /// public class {ClassName}Repository : BaseRepository<{ClassName}>, I{ClassName}Repository" + (string.IsNullOrEmpty(strInterface) ? "" : (" , " + strInterface)) + @" { public {ClassName}Repository(IUnitOfWork unitOfWork) : base(unitOfWork) { } } }") .ToClassStringList(strNameSpace); CreateFilesByClassStringList(ls, strPath, "{0}Repository"); } #endregion #region 根据数据库表生产 Services 层 /// /// 功能描述:根据数据库表生产 Services 层 /// 作  者:Tiobon.Core /// /// /// 数据库链接ID /// 实体类存放路径 /// 命名空间 /// 生产指定的表 /// 实现接口 /// private static void Create_Services_ClassFileByDBTalbe( SqlSugarScope sqlSugarClient, string ConnId, string strPath, string strNameSpace, string[] lstTableNames, string strInterface, bool isMuti = false) { //多库文件分离 if (isMuti) { strPath = strPath + @"\" + ConnId; strNameSpace = strNameSpace + "." + ConnId; } var IDbFirst = sqlSugarClient.DbFirst; if (lstTableNames != null && lstTableNames.Length > 0) { IDbFirst = IDbFirst.Where(lstTableNames); } var ls = IDbFirst.IsCreateDefaultValue().IsCreateAttribute() .SettingClassTemplate(p => p = @" using Tiobon.Core.IServices" + (isMuti ? "." + ConnId + "" : "") + @"; using Tiobon.Core.Model.Models" + (isMuti ? "." + ConnId + "" : "") + @"; using Tiobon.Core.Services.BASE; using Tiobon.Core.IRepository.Base; namespace " + strNameSpace + @" { public class {ClassName}Services : BaseServices<{ClassName}>, I{ClassName}Services" + (string.IsNullOrEmpty(strInterface) ? "" : (" , " + strInterface)) + @" { private readonly IBaseRepository<{ClassName}> _dal; public {ClassName}Services(IBaseRepository<{ClassName}> dal) { this._dal = dal; base.BaseDal = dal; } } }") .ToClassStringList(strNameSpace); CreateFilesByClassStringList(ls, strPath, "{0}Services"); } #endregion #region 根据模板内容批量生成文件 /// /// 根据模板内容批量生成文件 /// /// 类文件字符串list /// 生成路径 /// 文件名格式模板 private static void CreateFilesByClassStringList(Dictionary ls, string strPath, string fileNameTp) { foreach (var item in ls) { var fileName = $"{string.Format(fileNameTp, item.Key)}.cs"; var fileFullPath = Path.Combine(strPath, fileName); if (!Directory.Exists(strPath)) { Directory.CreateDirectory(strPath); } File.WriteAllText(fileFullPath, item.Value, Encoding.UTF8); } } #endregion } }