using SqlSugar; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace Admin.Core.Common { public class FrameSeed { /// <summary> /// 生成Controller层 /// </summary> /// <param name="sqlSugarClient">sqlsugar实例</param> /// <param name="ConnId">数据库链接ID</param> /// <param name="tableNames">数据库表名数组,默认空,生成所有表</param> /// <param name="isMuti"></param> /// <returns></returns> public static bool CreateControllers(SqlSugarClient sqlSugarClient, string ConnId = null, bool isMuti = false, string[] tableNames = null) { Create_Controller_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"D:\document\my-file\Admin.Core.Api.Controllers", "Admin.Core.Api", tableNames, "", isMuti); return true; } /// <summary> /// 生成Model层 /// </summary> /// <param name="sqlSugarClient">sqlsugar实例</param> /// <param name="ConnId">数据库链接ID</param> /// <param name="tableNames">数据库表名数组,默认空,生成所有表</param> /// <param name="isMuti"></param> /// <returns></returns> public static bool CreateModels(SqlSugarClient sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null) { Create_Model_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"D:\document\my-file\Admin.Core.Model", "Admin.Core.Model", tableNames, "", isMuti); return true; } /// <summary> /// 生成IRepository层 /// </summary> /// <param name="sqlSugarClient">sqlsugar实例</param> /// <param name="ConnId">数据库链接ID</param> /// <param name="isMuti"></param> /// <param name="tableNames">数据库表名数组,默认空,生成所有表</param> /// <returns></returns> public static bool CreateIRepositorys(SqlSugarClient sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null) { Create_IRepository_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"D:\document\my-file\Admin.Core.IRepository", "Admin.Core.IRepository", tableNames, "", isMuti); return true; } /// <summary> /// 生成 IService 层 /// </summary> /// <param name="sqlSugarClient">sqlsugar实例</param> /// <param name="ConnId">数据库链接ID</param> /// <param name="isMuti"></param> /// <param name="tableNames">数据库表名数组,默认空,生成所有表</param> /// <returns></returns> public static bool CreateIServices(SqlSugarClient sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null) { Create_IServices_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"D:\document\my-file\Admin.Core.IService", "Admin.Core.IService", tableNames, "", isMuti); return true; } /// <summary> /// 生成 Repository 层 /// </summary> /// <param name="sqlSugarClient">sqlsugar实例</param> /// <param name="ConnId">数据库链接ID</param> /// <param name="isMuti"></param> /// <param name="tableNames">数据库表名数组,默认空,生成所有表</param> /// <returns></returns> public static bool CreateRepository(SqlSugarClient sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null) { Create_Repository_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"D:\document\my-file\Admin.Core.Repository", "Admin.Core.Repository", tableNames, "", isMuti); return true; } /// <summary> /// 生成 Service 层 /// </summary> /// <param name="sqlSugarClient">sqlsugar实例</param> /// <param name="ConnId">数据库链接ID</param> /// <param name="isMuti"></param> /// <param name="tableNames">数据库表名数组,默认空,生成所有表</param> /// <returns></returns> public static bool CreateServices(SqlSugarClient sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null) { Create_Services_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"D:\document\my-file\Admin.Core.Servic", "Admin.Core.Service", tableNames, "", isMuti); return true; } #region 根据数据库表生产Controller层 /// <summary> /// 功能描述:根据数据库表生产Controller层 /// 作 者:Admin.Core /// </summary> /// <param name="sqlSugarClient"></param> /// <param name="ConnId">数据库链接ID</param> /// <param name="strPath">实体类存放路径</param> /// <param name="strNameSpace">命名空间</param> /// <param name="lstTableNames">生产指定的表</param> /// <param name="strInterface">实现接口</param> /// <param name="isMuti"></param> /// <param name="blnSerializable">是否序列化</param> private static void Create_Controller_ClassFileByDBTalbe( SqlSugarClient 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 = @"using Admin.Core.IService; using Admin.Core.Service; using Admin.Core.IService.ISys; using Admin.Core.Model; using Admin.Core.Common.Resource; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Threading.Tasks; using Admin.Core.Common; namespace " + strNameSpace + @" { /// <summary> /// {ClassName}Controller /// </summary> [Route(""api/[controller]/[action]"")] [ApiController] [Authorize(Permissions.Name)] public class {ClassName}Controller : BaseApiUserController { /// <summary> /// _{ClassName}Service /// </summary> private readonly I{ClassName}Services _{ClassName}Service; /// <summary> /// 构造方法 /// </summary> /// <param name=""{ClassName}Service""></param> public {ClassName}Controller(I{ClassName}Services {ClassName}Services,ISysUserService sysUserService) : base(sysUserService) { _sysUserService = sysUserService; _{ClassName}Service = {ClassName}Services; } /// <summary> /// 分页查询 /// </summary> /// <param name=""page"">第几页</param> /// <param name=""key""></param> /// <param name=""intPageSize"">每页大小</param> /// <returns></returns> [HttpGet] public MessageModel<PageModel<{ClassName}>> GetByPage(int page = 1, string key = """",int intPageSize = 50) { if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) { key = """"; } Expression<Func<{ClassName}, bool>> whereExpression = a => true; var data = _{ClassName}Service.QueryPageAsync(whereExpression, page, intPageSize, ""UpdateTime"").Result; return SuccessPage(data); } /// <summary> /// 根据ID查询 /// </summary> /// <param name=""id"">主键</param> /// <returns></returns> [HttpGet] public async Task<MessageModel<{ClassName}>> GetByID(int id) { return Success(await _{ClassName}Service.QueryByIdAsync(id)); } /// <summary> /// 新增一条数据 /// </summary> /// <param name=""request"">{ClassName}</param> /// <returns></returns> [HttpPost] public MessageModel<int> Add([FromBody] {ClassName} request) { var data = new MessageModel<int>(); var RData = _{ClassName}Service.AddAsync(request).Result; data.success = RData > 0; if (data.success) { data.data = RData; data.msg = Resource_SysBase.OprateSuccess; } else data.msg = Resource_SysBase.OprateFail; return data; } /// <summary> /// 更新一条数据 /// </summary> /// <param name=""request"">{ClassName}</param> /// <returns></returns> [HttpPost] public MessageModel<bool> Update([FromBody] {ClassName} request) { var data = new MessageModel<bool>(); var RData = _{ClassName}Service.UpdateAsync(request).Result; data.success = RData; if (data.success) { data.data = RData; data.msg = Resource_SysBase.OprateSuccess; } else data.msg = Resource_SysBase.OprateFail; return data; } /// <summary> /// 删除一条数据 /// </summary> /// <param name=""id"">主键</param> /// <returns></returns> [HttpPost] public MessageModel<bool> Del(int id) { var data = new MessageModel<bool>(); var RData = _{ClassName}Service.DeleteByIdAsync(id).Result; data.success = RData; if (data.success) { data.data = RData; data.msg = Resource_SysBase.OprateSuccess; } else data.msg = Resource_SysBase.OprateFail; return data; } } }") .ToClassStringList(strNameSpace); Dictionary<string, string> newdic = new Dictionary<string, string>(); //循环处理 首字母小写 并插入新的 Dictionary foreach (KeyValuePair<string, string> 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层 /// <summary> /// 功能描述:根据数据库表生产Model层 /// 作 者:Admin.Core /// </summary> /// <param name="sqlSugarClient"></param> /// <param name="ConnId">数据库链接ID</param> /// <param name="strPath">实体类存放路径</param> /// <param name="strNameSpace">命名空间</param> /// <param name="lstTableNames">生产指定的表</param> /// <param name="strInterface">实现接口</param> /// <param name="isMuti"></param> /// <param name="blnSerializable">是否序列化</param> private static void Create_Model_ClassFileByDBTalbe( SqlSugarClient 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层 /// <summary> /// 功能描述:根据数据库表生产IRepository层 /// 作 者:Admin.Core /// </summary> /// <param name="sqlSugarClient"></param> /// <param name="ConnId">数据库链接ID</param> /// <param name="strPath">实体类存放路径</param> /// <param name="strNameSpace">命名空间</param> /// <param name="lstTableNames">生产指定的表</param> /// <param name="strInterface">实现接口</param> /// <param name="isMuti"></param> private static void Create_IRepository_ClassFileByDBTalbe( SqlSugarClient 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 Admin.Core.Model" + (isMuti ? "." + ConnId + "" : "") + @"; namespace " + strNameSpace + @" { /// <summary> /// I{ClassName}Repository /// </summary> public interface I{ClassName}Repository : IBaseRepository<{ClassName}>" + (string.IsNullOrEmpty(strInterface) ? "" : (" , " + strInterface)) + @" { } }") .ToClassStringList(strNameSpace); CreateFilesByClassStringList(ls, strPath, "I{0}Repository"); } #endregion #region 根据数据库表生产IService层 /// <summary> /// 功能描述:根据数据库表生产IService层 /// 作 者:Admin.Core /// </summary> /// <param name="sqlSugarClient"></param> /// <param name="ConnId">数据库链接ID</param> /// <param name="strPath">实体类存放路径</param> /// <param name="strNameSpace">命名空间</param> /// <param name="lstTableNames">生产指定的表</param> /// <param name="strInterface">实现接口</param> /// <param name="isMuti"></param> private static void Create_IServices_ClassFileByDBTalbe( SqlSugarClient 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 Admin.Core.IService; using Admin.Core.Model" + (isMuti ? "." + ConnId + "" : "") + @"; namespace " + strNameSpace + @" { /// <summary> /// I{ClassName}Services /// </summary> public interface I{ClassName}Services :IBaseServices<{ClassName}>" + (string.IsNullOrEmpty(strInterface) ? "" : (" , " + strInterface)) + @" { } }") .ToClassStringList(strNameSpace); CreateFilesByClassStringList(ls, strPath, "I{0}Services"); } #endregion #region 根据数据库表生产 Repository 层 /// <summary> /// 功能描述:根据数据库表生产 Repository 层 /// 作 者:Admin.Core /// </summary> /// <param name="sqlSugarClient"></param> /// <param name="ConnId">数据库链接ID</param> /// <param name="strPath">实体类存放路径</param> /// <param name="strNameSpace">命名空间</param> /// <param name="lstTableNames">生产指定的表</param> /// <param name="strInterface">实现接口</param> /// <param name="isMuti"></param> private static void Create_Repository_ClassFileByDBTalbe( SqlSugarClient 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 Admin.Core.IRepository" + (isMuti ? "." + ConnId + "" : "") + @"; using Admin.Core.Model" + (isMuti ? "." + ConnId + "" : "") + @"; namespace " + strNameSpace + @" { /// <summary> /// {ClassName}Repository /// </summary> 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 根据数据库表生产 Service 层 /// <summary> /// 功能描述:根据数据库表生产 Service 层 /// 作 者:Admin.Core /// </summary> /// <param name="sqlSugarClient"></param> /// <param name="ConnId">数据库链接ID</param> /// <param name="strPath">实体类存放路径</param> /// <param name="strNameSpace">命名空间</param> /// <param name="lstTableNames">生产指定的表</param> /// <param name="strInterface">实现接口</param> /// <param name="isMuti"></param> private static void Create_Services_ClassFileByDBTalbe( SqlSugarClient 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 Admin.Core.IRepository; using Admin.Core.Service; using Admin.Core.IService" + (isMuti ? "." + ConnId + "" : "") + @"; using Admin.Core.Model" + (isMuti ? "." + ConnId + "" : "") + @"; 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 根据模板内容批量生成文件 /// <summary> /// 根据模板内容批量生成文件 /// </summary> /// <param name="ls">类文件字符串list</param> /// <param name="strPath">生成路径</param> /// <param name="fileNameTp">文件名格式模板</param> private static void CreateFilesByClassStringList(Dictionary<string, string> 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 } }