diff --git a/Tiobon.Core.Api/Controllers/Base/BaseApiController.cs b/Tiobon.Core.Api/Controllers/Base/BaseApiController.cs index ebd0975a..76d9514c 100644 --- a/Tiobon.Core.Api/Controllers/Base/BaseApiController.cs +++ b/Tiobon.Core.Api/Controllers/Base/BaseApiController.cs @@ -1,51 +1,50 @@ -namespace Tiobon.Core.Controllers +namespace Tiobon.Core.Controllers; + +public class BaseApiController : Controller { - public class BaseApiController : Controller + [NonAction] + public ServiceResult Success(T data, string msg = "成功") { - [NonAction] - public ServiceResult Success(T data, string msg = "成功") - { - return new ServiceResult() { Success = true, Message = msg, Data = data, }; - } + return new ServiceResult() { Success = true, Message = msg, Data = data, }; + } - // [NonAction] - //public ServiceResult Success(T data, string msg = "成功",bool success = true) - //{ - // return new ServiceResult() - // { - // success = success, - // msg = msg, - // response = data, - // }; - //} - [NonAction] - public ServiceResult Success(string msg = "成功") - { - return new ServiceResult() { Success = true, Message = msg, Data = null, }; - } + // [NonAction] + //public ServiceResult Success(T data, string msg = "成功",bool success = true) + //{ + // return new ServiceResult() + // { + // success = success, + // msg = msg, + // response = data, + // }; + //} + [NonAction] + public ServiceResult Success(string msg = "成功") + { + return new ServiceResult() { Success = true, Message = msg, Data = null, }; + } - [NonAction] - public ServiceResult Failed(string msg = "失败", int status = 500) - { - return new ServiceResult() { Success = false, Status = status, Message = msg, Data = null, }; - } + [NonAction] + public ServiceResult Failed(string msg = "失败", int status = 500) + { + return new ServiceResult() { Success = false, Status = status, Message = msg, Data = null, }; + } - [NonAction] - public ServiceResult Failed(string msg = "失败", int status = 500) - { - return new ServiceResult() { Success = false, Status = status, Message = msg, Data = default, }; - } + [NonAction] + public ServiceResult Failed(string msg = "失败", int status = 500) + { + return new ServiceResult() { Success = false, Status = status, Message = msg, Data = default, }; + } - [NonAction] - public ServiceResult> SuccessPage(int page, int dataCount, int pageSize, List data, int pageCount, string msg = "获取成功") - { - return new ServiceResult>() { Success = true, Message = msg, Data = new PageModel(page, dataCount, pageSize, data) }; - } + [NonAction] + public ServiceResult> SuccessPage(int page, int dataCount, int pageSize, List data, int pageCount, string msg = "获取成功") + { + return new ServiceResult>() { Success = true, Message = msg, Data = new PageModel(page, dataCount, pageSize, data) }; + } - [NonAction] - public ServiceResult> SuccessPage(PageModel pageModel, string msg = "获取成功") - { - return new ServiceResult>() { Success = true, Message = msg, Data = pageModel }; - } + [NonAction] + public ServiceResult> SuccessPage(PageModel pageModel, string msg = "获取成功") + { + return new ServiceResult>() { Success = true, Message = msg, Data = pageModel }; } } \ No newline at end of file diff --git a/Tiobon.Core.Api/Controllers/Base/BaseController.cs b/Tiobon.Core.Api/Controllers/Base/BaseController.cs index 2b56f0f5..ca34753b 100644 --- a/Tiobon.Core.Api/Controllers/Base/BaseController.cs +++ b/Tiobon.Core.Api/Controllers/Base/BaseController.cs @@ -1,8 +1,7 @@ -using System.Collections; +using SqlSugar; +using System.Collections; using System.Data; using System.Reflection; -using SqlSugar; -using Tiobon.Core.Common.DB.Dapper; namespace Tiobon.Core.Controllers; diff --git a/Tiobon.Core.Api/Controllers/BlogController.cs b/Tiobon.Core.Api/Controllers/BlogController.cs index 3d12275a..5f9515d0 100644 --- a/Tiobon.Core.Api/Controllers/BlogController.cs +++ b/Tiobon.Core.Api/Controllers/BlogController.cs @@ -2,267 +2,266 @@ using StackExchange.Profiling; using static Tiobon.Core.Extensions.CustomApiVersion; -namespace Tiobon.Core.Controllers +namespace Tiobon.Core.Controllers; + +/// +/// 博客管理 +/// +[Produces("application/json")] +[Route("api/Tiobon"), ApiExplorerSettings(GroupName = Grouping.GroupName_Other)] +public class TiobonController : BaseApiController { + public ITiobonArticleServices _TiobonArticleServices { get; set; } + private readonly ILogger _logger; + /// - /// 博客管理 + /// 构造函数 /// - [Produces("application/json")] - [Route("api/Tiobon"), ApiExplorerSettings(GroupName = Grouping.GroupName_Other)] - public class TiobonController : BaseApiController + /// + /// + public TiobonController(ILogger logger) { - public ITiobonArticleServices _TiobonArticleServices { get; set; } - private readonly ILogger _logger; - - /// - /// 构造函数 - /// - /// - /// - public TiobonController(ILogger logger) - { - _logger = logger; - } + _logger = logger; + } - /// - /// 获取博客列表【无权限】 - /// - /// - /// - /// - /// - /// - [HttpGet] - public async Task>> Get(int id, int page = 1, string bcategory = "技术博文", string key = "") + /// + /// 获取博客列表【无权限】 + /// + /// + /// + /// + /// + /// + [HttpGet] + public async Task>> Get(int id, int page = 1, string bcategory = "技术博文", string key = "") + { + int intPageSize = 6; + if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) { - int intPageSize = 6; - if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) - { - key = ""; - } + key = ""; + } - Expression> whereExpression = a => (a.bcategory == bcategory && a.IsDeleted == false) && ((a.btitle != null && a.btitle.Contains(key)) || (a.bcontent != null && a.bcontent.Contains(key))); + Expression> whereExpression = a => (a.bcategory == bcategory && a.IsDeleted == false) && ((a.btitle != null && a.btitle.Contains(key)) || (a.bcontent != null && a.bcontent.Contains(key))); - var pageModelTiobon = await _TiobonArticleServices.QueryPage(whereExpression, page, intPageSize, " bID desc "); + var pageModelTiobon = await _TiobonArticleServices.QueryPage(whereExpression, page, intPageSize, " bID desc "); - using (MiniProfiler.Current.Step("获取成功后,开始处理最终数据")) + using (MiniProfiler.Current.Step("获取成功后,开始处理最终数据")) + { + foreach (var item in pageModelTiobon.data) { - foreach (var item in pageModelTiobon.data) + if (!string.IsNullOrEmpty(item.bcontent)) { - if (!string.IsNullOrEmpty(item.bcontent)) + item.bRemark = (HtmlHelper.ReplaceHtmlTag(item.bcontent)).Length >= 200 ? (HtmlHelper.ReplaceHtmlTag(item.bcontent)).Substring(0, 200) : (HtmlHelper.ReplaceHtmlTag(item.bcontent)); + int totalLength = 500; + if (item.bcontent.Length > totalLength) { - item.bRemark = (HtmlHelper.ReplaceHtmlTag(item.bcontent)).Length >= 200 ? (HtmlHelper.ReplaceHtmlTag(item.bcontent)).Substring(0, 200) : (HtmlHelper.ReplaceHtmlTag(item.bcontent)); - int totalLength = 500; - if (item.bcontent.Length > totalLength) - { - item.bcontent = item.bcontent.Substring(0, totalLength); - } + item.bcontent = item.bcontent.Substring(0, totalLength); } } } - - return SuccessPage(pageModelTiobon); } - - /// - /// 获取博客详情 - /// - /// - /// - [HttpGet("{id}")] - //[Authorize(Policy = "Scope_TiobonModule_Policy")] - [Authorize] - public async Task> Get(long id) - { - return Success(await _TiobonArticleServices.GetTiobonDetails(id)); - } + return SuccessPage(pageModelTiobon); + } - /// - /// 获取详情【无权限】 - /// - /// - /// - [HttpGet] - [Route("DetailNuxtNoPer")] - public async Task> DetailNuxtNoPer(long id) - { - _logger.LogInformation("xxxxxxxxxxxxxxxxxxx"); - Log.Information("yyyyyyyyyyyyyyyyy"); - return Success(await _TiobonArticleServices.GetTiobonDetails(id)); - } - - [HttpGet] - [Route("GoUrl")] - public async Task GoUrl(long id = 0) - { - var response = await _TiobonArticleServices.QueryById(id); - if (response != null && response.bsubmitter.IsNotEmptyOrNull()) - { - string Url = @"^http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?$"; - if (Regex.IsMatch(response.bsubmitter, Url)) - { - response.btraffic += 1; - await _TiobonArticleServices.Update(response); - return Redirect(response.bsubmitter); - } + /// + /// 获取博客详情 + /// + /// + /// + [HttpGet("{id}")] + //[Authorize(Policy = "Scope_TiobonModule_Policy")] + [Authorize] + public async Task> Get(long id) + { + return Success(await _TiobonArticleServices.GetTiobonDetails(id)); + } - } - return Ok(); - } + /// + /// 获取详情【无权限】 + /// + /// + /// + [HttpGet] + [Route("DetailNuxtNoPer")] + public async Task> DetailNuxtNoPer(long id) + { + _logger.LogInformation("xxxxxxxxxxxxxxxxxxx"); + Log.Information("yyyyyyyyyyyyyyyyy"); + return Success(await _TiobonArticleServices.GetTiobonDetails(id)); + } - [HttpGet] - [Route("GetTiobonsByTypesForMVP")] - public async Task>> GetTiobonsByTypesForMVP(string types = "", int id = 0) + [HttpGet] + [Route("GoUrl")] + public async Task GoUrl(long id = 0) + { + var response = await _TiobonArticleServices.QueryById(id); + if (response != null && response.bsubmitter.IsNotEmptyOrNull()) { - if (types.IsNotEmptyOrNull()) + string Url = @"^http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?$"; + if (Regex.IsMatch(response.bsubmitter, Url)) { - var Tiobons = await _TiobonArticleServices.Query(d => d.bcategory != null && types.Contains(d.bcategory) && d.IsDeleted == false, d => d.bID, false); - return Success(Tiobons); + response.btraffic += 1; + await _TiobonArticleServices.Update(response); + return Redirect(response.bsubmitter); } - return Success(new List() { }); - } - [HttpGet] - [Route("GetTiobonByIdForMVP")] - public async Task> GetTiobonByIdForMVP(long id = 0) - { - if (id > 0) - { - return Success(await _TiobonArticleServices.QueryById(id)); - } - return Success(new TiobonArticle()); } - /// - /// 获取博客测试信息 v2版本 - /// - /// - [HttpGet] - ////MVC自带特性 对 api 进行组管理 - //[ApiExplorerSettings(GroupName = "v2")] - ////路径 如果以 / 开头,表示绝对路径,反之相对 controller 的想u地路径 - //[Route("/api/v2/Tiobon/Tiobontest")] - //和上边的版本控制以及路由地址都是一样的 + return Ok(); + } - [CustomRoute(ApiVersions.V2, "Tiobontest")] - public ServiceResult V2_Tiobontest() + [HttpGet] + [Route("GetTiobonsByTypesForMVP")] + public async Task>> GetTiobonsByTypesForMVP(string types = "", int id = 0) + { + if (types.IsNotEmptyOrNull()) { - return Success("我是第二版的博客信息"); + var Tiobons = await _TiobonArticleServices.Query(d => d.bcategory != null && types.Contains(d.bcategory) && d.IsDeleted == false, d => d.bID, false); + return Success(Tiobons); } + return Success(new List() { }); + } - /// - /// 添加博客【无权限】 - /// - /// - /// - [HttpPost] - //[Authorize(Policy = "Scope_TiobonModule_Policy")] - [Authorize] - public async Task> Post([FromBody] TiobonArticle TiobonArticle) + [HttpGet] + [Route("GetTiobonByIdForMVP")] + public async Task> GetTiobonByIdForMVP(long id = 0) + { + if (id > 0) { - if (TiobonArticle.btitle.Length > 5 && TiobonArticle.bcontent.Length > 50) - { - - TiobonArticle.bCreateTime = DateTime.Now; - TiobonArticle.bUpdateTime = DateTime.Now; - TiobonArticle.IsDeleted = false; - TiobonArticle.bcategory = "技术博文"; - var id = (await _TiobonArticleServices.Add(TiobonArticle)); - return id > 0 ? Success(id.ObjToString()) : Failed("添加失败"); - } - else - { - return Failed("文章标题不能少于5个字符,内容不能少于50个字符!"); - } + return Success(await _TiobonArticleServices.QueryById(id)); } + return Success(new TiobonArticle()); + } + /// + /// 获取博客测试信息 v2版本 + /// + /// + [HttpGet] + ////MVC自带特性 对 api 进行组管理 + //[ApiExplorerSettings(GroupName = "v2")] + ////路径 如果以 / 开头,表示绝对路径,反之相对 controller 的想u地路径 + //[Route("/api/v2/Tiobon/Tiobontest")] + //和上边的版本控制以及路由地址都是一样的 + + [CustomRoute(ApiVersions.V2, "Tiobontest")] + public ServiceResult V2_Tiobontest() + { + return Success("我是第二版的博客信息"); + } - /// - /// - /// - /// - /// - [HttpPost] - [Route("AddForMVP")] - [Authorize(Permissions.Name)] - public async Task> AddForMVP([FromBody] TiobonArticle TiobonArticle) + /// + /// 添加博客【无权限】 + /// + /// + /// + [HttpPost] + //[Authorize(Policy = "Scope_TiobonModule_Policy")] + [Authorize] + public async Task> Post([FromBody] TiobonArticle TiobonArticle) + { + if (TiobonArticle.btitle.Length > 5 && TiobonArticle.bcontent.Length > 50) { + TiobonArticle.bCreateTime = DateTime.Now; TiobonArticle.bUpdateTime = DateTime.Now; TiobonArticle.IsDeleted = false; + TiobonArticle.bcategory = "技术博文"; var id = (await _TiobonArticleServices.Add(TiobonArticle)); return id > 0 ? Success(id.ObjToString()) : Failed("添加失败"); } - /// - /// 更新博客信息 - /// - /// - /// - // PUT: api/User/5 - [HttpPut] - [Route("Update")] - [Authorize(Permissions.Name)] - public async Task> Put([FromBody] TiobonArticle TiobonArticle) + else { - if (TiobonArticle != null && TiobonArticle.bID > 0) + return Failed("文章标题不能少于5个字符,内容不能少于50个字符!"); + } + } + + + /// + /// + /// + /// + /// + [HttpPost] + [Route("AddForMVP")] + [Authorize(Permissions.Name)] + public async Task> AddForMVP([FromBody] TiobonArticle TiobonArticle) + { + TiobonArticle.bCreateTime = DateTime.Now; + TiobonArticle.bUpdateTime = DateTime.Now; + TiobonArticle.IsDeleted = false; + var id = (await _TiobonArticleServices.Add(TiobonArticle)); + return id > 0 ? Success(id.ObjToString()) : Failed("添加失败"); + } + /// + /// 更新博客信息 + /// + /// + /// + // PUT: api/User/5 + [HttpPut] + [Route("Update")] + [Authorize(Permissions.Name)] + public async Task> Put([FromBody] TiobonArticle TiobonArticle) + { + if (TiobonArticle != null && TiobonArticle.bID > 0) + { + var model = await _TiobonArticleServices.QueryById(TiobonArticle.bID); + + if (model != null) { - var model = await _TiobonArticleServices.QueryById(TiobonArticle.bID); + model.btitle = TiobonArticle.btitle; + model.bcategory = TiobonArticle.bcategory; + model.bsubmitter = TiobonArticle.bsubmitter; + model.bcontent = TiobonArticle.bcontent; + model.btraffic = TiobonArticle.btraffic; - if (model != null) + if (await _TiobonArticleServices.Update(model)) { - model.btitle = TiobonArticle.btitle; - model.bcategory = TiobonArticle.bcategory; - model.bsubmitter = TiobonArticle.bsubmitter; - model.bcontent = TiobonArticle.bcontent; - model.btraffic = TiobonArticle.btraffic; - - if (await _TiobonArticleServices.Update(model)) - { - return Success(TiobonArticle?.bID.ObjToString()); - } + return Success(TiobonArticle?.bID.ObjToString()); } } - return Failed("更新失败"); } + return Failed("更新失败"); + } - /// - /// 删除博客 - /// - /// - /// - [HttpDelete] - [Authorize(Permissions.Name)] - [Route("Delete")] - public async Task> Delete(long id) + /// + /// 删除博客 + /// + /// + /// + [HttpDelete] + [Authorize(Permissions.Name)] + [Route("Delete")] + public async Task> Delete(long id) + { + if (id > 0) { - if (id > 0) + var TiobonArticle = await _TiobonArticleServices.QueryById(id); + if (TiobonArticle == null) { - var TiobonArticle = await _TiobonArticleServices.QueryById(id); - if (TiobonArticle == null) - { - return Failed("查询无数据"); - } - TiobonArticle.IsDeleted = true; - return await _TiobonArticleServices.Update(TiobonArticle) ? Success(TiobonArticle?.bID.ObjToString(), "删除成功") : Failed("删除失败"); + return Failed("查询无数据"); } - return Failed("入参无效"); - } - /// - /// apache jemeter 压力测试 - /// 更新接口 - /// - /// - [HttpGet] - [Route("ApacheTestUpdate")] - public async Task> ApacheTestUpdate() - { - return Success(await _TiobonArticleServices.Update(new { bsubmitter = $"laozhang{DateTime.Now.Millisecond}", bID = 1 }), "更新成功"); + TiobonArticle.IsDeleted = true; + return await _TiobonArticleServices.Update(TiobonArticle) ? Success(TiobonArticle?.bID.ObjToString(), "删除成功") : Failed("删除失败"); } + return Failed("入参无效"); + } + /// + /// apache jemeter 压力测试 + /// 更新接口 + /// + /// + [HttpGet] + [Route("ApacheTestUpdate")] + public async Task> ApacheTestUpdate() + { + return Success(await _TiobonArticleServices.Update(new { bsubmitter = $"laozhang{DateTime.Now.Millisecond}", bID = 1 }), "更新成功"); } } \ No newline at end of file diff --git a/Tiobon.Core.Api/Controllers/DbFirst/DbFirstController.cs b/Tiobon.Core.Api/Controllers/DbFirst/DbFirstController.cs index e6578c50..d7ea0ba4 100644 --- a/Tiobon.Core.Api/Controllers/DbFirst/DbFirstController.cs +++ b/Tiobon.Core.Api/Controllers/DbFirst/DbFirstController.cs @@ -2,174 +2,173 @@ using Tiobon.Core.Common.Seed; using SqlSugar; -namespace Tiobon.Core.Controllers +namespace Tiobon.Core.Controllers; + +[Route("api/[controller]/[action]")] +[ApiController, ApiExplorerSettings(GroupName = Grouping.GroupName_Assistant)] +//[Authorize(Permissions.Name)] +public class DbFirstController : ControllerBase { - [Route("api/[controller]/[action]")] - [ApiController, ApiExplorerSettings(GroupName = Grouping.GroupName_Assistant)] - //[Authorize(Permissions.Name)] - public class DbFirstController : ControllerBase + private readonly SqlSugarScope _sqlSugarClient; + private readonly IWebHostEnvironment Env; + + /// + /// 构造函数 + /// + public DbFirstController(ISqlSugarClient sqlSugarClient, IWebHostEnvironment env) { - private readonly SqlSugarScope _sqlSugarClient; - private readonly IWebHostEnvironment Env; + _sqlSugarClient = sqlSugarClient as SqlSugarScope; + Env = env; + } - /// - /// 构造函数 - /// - public DbFirstController(ISqlSugarClient sqlSugarClient, IWebHostEnvironment env) + /// + /// 获取 整体框架 文件(主库)(一般可用第一次生成) + /// + /// + [HttpGet] + public ServiceResult GetFrameFiles() + { + var data = new ServiceResult() { Success = true, Message = "" }; + data.Data += @"file path is:C:\my-file\}"; + var isMuti = BaseDBConfig.IsMulti; + if (Env.IsDevelopment()) { - _sqlSugarClient = sqlSugarClient as SqlSugarScope; - Env = env; - } + data.Data += $"Controller层生成:{FrameSeed.CreateControllers(_sqlSugarClient)} || "; - /// - /// 获取 整体框架 文件(主库)(一般可用第一次生成) - /// - /// - [HttpGet] - public ServiceResult GetFrameFiles() - { - var data = new ServiceResult() { Success = true, Message = "" }; - data.Data += @"file path is:C:\my-file\}"; - var isMuti = BaseDBConfig.IsMulti; - if (Env.IsDevelopment()) + BaseDBConfig.ValidConfig.ForEach(m => { - data.Data += $"Controller层生成:{FrameSeed.CreateControllers(_sqlSugarClient)} || "; - - BaseDBConfig.ValidConfig.ForEach(m => - { - _sqlSugarClient.ChangeDatabase(m.ConfigId.ToLower()); - data.Data += $"库{m.ConfigId}-Model层生成:{FrameSeed.CreateModels(_sqlSugarClient, m.ConfigId, isMuti)} || "; - data.Data += $"库{m.ConfigId}-IRepositorys层生成:{FrameSeed.CreateIRepositorys(_sqlSugarClient, m.ConfigId, isMuti)} || "; - data.Data += $"库{m.ConfigId}-IServices层生成:{FrameSeed.CreateIServices(_sqlSugarClient, m.ConfigId, isMuti)} || "; - data.Data += $"库{m.ConfigId}-Repository层生成:{FrameSeed.CreateRepository(_sqlSugarClient, m.ConfigId, isMuti)} || "; - data.Data += $"库{m.ConfigId}-Services层生成:{FrameSeed.CreateServices(_sqlSugarClient, m.ConfigId, isMuti)} || "; - }); - - // 切回主库 - _sqlSugarClient.ChangeDatabase(MainDb.CurrentDbConnId.ToLower()); - } - else - { - data.Success = false; - data.Message = "当前不处于开发模式,代码生成不可用!"; - } - - return data; + _sqlSugarClient.ChangeDatabase(m.ConfigId.ToLower()); + data.Data += $"库{m.ConfigId}-Model层生成:{FrameSeed.CreateModels(_sqlSugarClient, m.ConfigId, isMuti)} || "; + data.Data += $"库{m.ConfigId}-IRepositorys层生成:{FrameSeed.CreateIRepositorys(_sqlSugarClient, m.ConfigId, isMuti)} || "; + data.Data += $"库{m.ConfigId}-IServices层生成:{FrameSeed.CreateIServices(_sqlSugarClient, m.ConfigId, isMuti)} || "; + data.Data += $"库{m.ConfigId}-Repository层生成:{FrameSeed.CreateRepository(_sqlSugarClient, m.ConfigId, isMuti)} || "; + data.Data += $"库{m.ConfigId}-Services层生成:{FrameSeed.CreateServices(_sqlSugarClient, m.ConfigId, isMuti)} || "; + }); + + // 切回主库 + _sqlSugarClient.ChangeDatabase(MainDb.CurrentDbConnId.ToLower()); } - - /// - /// 获取仓储层和服务层(需指定表名和数据库) - /// - /// 数据库链接名称 - /// 需要生成的表名 - /// - [HttpPost] - public ServiceResult GetFrameFilesByTableNames([FromBody] string[] tableNames, [FromQuery] string ConnID = null) + else { - ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID; + data.Success = false; + data.Message = "当前不处于开发模式,代码生成不可用!"; + } - var isMuti = BaseDBConfig.IsMulti; - var data = new ServiceResult() { Success = true, Message = "" }; - if (Env.IsDevelopment()) - { - data.Data += $"库{ConnID}-IRepositorys层生成:{FrameSeed.CreateIRepositorys(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; - data.Data += $"库{ConnID}-IServices层生成:{FrameSeed.CreateIServices(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; - data.Data += $"库{ConnID}-Repository层生成:{FrameSeed.CreateRepository(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; - data.Data += $"库{ConnID}-Services层生成:{FrameSeed.CreateServices(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; - } - else - { - data.Success = false; - data.Message = "当前不处于开发模式,代码生成不可用!"; - } + return data; + } - return data; + /// + /// 获取仓储层和服务层(需指定表名和数据库) + /// + /// 数据库链接名称 + /// 需要生成的表名 + /// + [HttpPost] + public ServiceResult GetFrameFilesByTableNames([FromBody] string[] tableNames, [FromQuery] string ConnID = null) + { + ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID; + + var isMuti = BaseDBConfig.IsMulti; + var data = new ServiceResult() { Success = true, Message = "" }; + if (Env.IsDevelopment()) + { + data.Data += $"库{ConnID}-IRepositorys层生成:{FrameSeed.CreateIRepositorys(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; + data.Data += $"库{ConnID}-IServices层生成:{FrameSeed.CreateIServices(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; + data.Data += $"库{ConnID}-Repository层生成:{FrameSeed.CreateRepository(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; + data.Data += $"库{ConnID}-Services层生成:{FrameSeed.CreateServices(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; } - /// - /// 获取实体(需指定表名和数据库) - /// - /// 数据库链接名称 - /// 需要生成的表名 - /// - [HttpPost] - public ServiceResult GetFrameFilesByTableNamesForEntity([FromBody] string[] tableNames, [FromQuery] string ConnID = null) + else { - ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID; + data.Success = false; + data.Message = "当前不处于开发模式,代码生成不可用!"; + } - var isMuti = BaseDBConfig.IsMulti; - var data = new ServiceResult() { Success = true, Message = "" }; - if (Env.IsDevelopment()) - { - data.Data += $"库{ConnID}-Models层生成:{FrameSeed.CreateModels(_sqlSugarClient, ConnID, isMuti, tableNames)}"; - } - else - { - data.Success = false; - data.Message = "当前不处于开发模式,代码生成不可用!"; - } - return data; + return data; + } + /// + /// 获取实体(需指定表名和数据库) + /// + /// 数据库链接名称 + /// 需要生成的表名 + /// + [HttpPost] + public ServiceResult GetFrameFilesByTableNamesForEntity([FromBody] string[] tableNames, [FromQuery] string ConnID = null) + { + ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID; + + var isMuti = BaseDBConfig.IsMulti; + var data = new ServiceResult() { Success = true, Message = "" }; + if (Env.IsDevelopment()) + { + data.Data += $"库{ConnID}-Models层生成:{FrameSeed.CreateModels(_sqlSugarClient, ConnID, isMuti, tableNames)}"; } - /// - /// 获取控制器(需指定表名和数据库) - /// - /// 数据库链接名称 - /// 需要生成的表名 - /// - [HttpPost] - public ServiceResult GetFrameFilesByTableNamesForController([FromBody] string[] tableNames, [FromQuery] string ConnID = null) + else { - ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID; - - var isMuti = BaseDBConfig.IsMulti; - var data = new ServiceResult() { Success = true, Message = "" }; - if (Env.IsDevelopment()) - { - data.Data += $"库{ConnID}-Controllers层生成:{FrameSeed.CreateControllers(_sqlSugarClient, ConnID, isMuti, tableNames)}"; - } - else - { - data.Success = false; - data.Message = "当前不处于开发模式,代码生成不可用!"; - } - return data; + data.Success = false; + data.Message = "当前不处于开发模式,代码生成不可用!"; } + return data; + } + /// + /// 获取控制器(需指定表名和数据库) + /// + /// 数据库链接名称 + /// 需要生成的表名 + /// + [HttpPost] + public ServiceResult GetFrameFilesByTableNamesForController([FromBody] string[] tableNames, [FromQuery] string ConnID = null) + { + ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID; - /// - /// DbFrist 根据数据库表名 生成整体框架,包含Model层(一般可用第一次生成) - /// - /// 数据库链接名称 - /// 需要生成的表名 - /// - [HttpPost] - public ServiceResult GetAllFrameFilesByTableNames([FromQuery] string tableName, [FromQuery] string ConnID = null) + var isMuti = BaseDBConfig.IsMulti; + var data = new ServiceResult() { Success = true, Message = "" }; + if (Env.IsDevelopment()) { - string[] tableNames = new string[1]; - tableNames[0] = tableName; - ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID; + data.Data += $"库{ConnID}-Controllers层生成:{FrameSeed.CreateControllers(_sqlSugarClient, ConnID, isMuti, tableNames)}"; + } + else + { + data.Success = false; + data.Message = "当前不处于开发模式,代码生成不可用!"; + } + return data; + } - var isMuti = BaseDBConfig.IsMulti; - var data = new ServiceResult() { Success = true, Message = "" }; - if (Env.IsDevelopment()) - { - _sqlSugarClient.ChangeDatabase(ConnID.ToLower()); - data.Data += $"Controller层生成:{FrameSeed.CreateControllers(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; - data.Data += $"库{ConnID}-Model层生成:{FrameSeed.CreateModels(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; - //data.response += $"库{ConnID}-IRepositorys层生成:{FrameSeed.CreateIRepositorys(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; - data.Data += $"库{ConnID}-IServices层生成:{FrameSeed.CreateIServices(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; - //data.response += $"库{ConnID}-Repository层生成:{FrameSeed.CreateRepository(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; - data.Data += $"库{ConnID}-Services层生成:{FrameSeed.CreateServices(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; - // 切回主库 - _sqlSugarClient.ChangeDatabase(MainDb.CurrentDbConnId.ToLower()); - } - else - { - data.Success = false; - data.Message = "当前不处于开发模式,代码生成不可用!"; - } + /// + /// DbFrist 根据数据库表名 生成整体框架,包含Model层(一般可用第一次生成) + /// + /// 数据库链接名称 + /// 需要生成的表名 + /// + [HttpPost] + public ServiceResult GetAllFrameFilesByTableNames([FromQuery] string tableName, [FromQuery] string ConnID = null) + { + string[] tableNames = new string[1]; + tableNames[0] = tableName; + ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID; - return data; + var isMuti = BaseDBConfig.IsMulti; + var data = new ServiceResult() { Success = true, Message = "" }; + if (Env.IsDevelopment()) + { + _sqlSugarClient.ChangeDatabase(ConnID.ToLower()); + data.Data += $"Controller层生成:{FrameSeed.CreateControllers(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; + data.Data += $"库{ConnID}-Model层生成:{FrameSeed.CreateModels(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; + //data.response += $"库{ConnID}-IRepositorys层生成:{FrameSeed.CreateIRepositorys(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; + data.Data += $"库{ConnID}-IServices层生成:{FrameSeed.CreateIServices(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; + //data.response += $"库{ConnID}-Repository层生成:{FrameSeed.CreateRepository(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; + data.Data += $"库{ConnID}-Services层生成:{FrameSeed.CreateServices(_sqlSugarClient, ConnID, isMuti, tableNames)} || "; + // 切回主库 + _sqlSugarClient.ChangeDatabase(MainDb.CurrentDbConnId.ToLower()); + } + else + { + data.Success = false; + data.Message = "当前不处于开发模式,代码生成不可用!"; } - + return data; } + + } \ No newline at end of file diff --git a/Tiobon.Core.Api/Controllers/DbFirst/MigrateController.cs b/Tiobon.Core.Api/Controllers/DbFirst/MigrateController.cs index 0587622a..04f43024 100644 --- a/Tiobon.Core.Api/Controllers/DbFirst/MigrateController.cs +++ b/Tiobon.Core.Api/Controllers/DbFirst/MigrateController.cs @@ -1,344 +1,343 @@ //using Magicodes.ExporterAndImporter.Core; //using Magicodes.ExporterAndImporter.Excel; -namespace Tiobon.Core.Controllers +namespace Tiobon.Core.Controllers; + +[Route("api/[controller]/[action]")] +[ApiController, ApiExplorerSettings(GroupName = Grouping.GroupName_Assistant)] +//[Authorize(Permissions.Name)] +public class MigrateController : ControllerBase { - [Route("api/[controller]/[action]")] - [ApiController, ApiExplorerSettings(GroupName = Grouping.GroupName_Assistant)] - //[Authorize(Permissions.Name)] - public class MigrateController : ControllerBase + private readonly IUnitOfWorkManage _unitOfWorkManage; + private readonly IRoleModulePermissionServices _roleModulePermissionServices; + private readonly IUserRoleServices _userRoleServices; + private readonly IRoleServices _roleServices; + private readonly IPermissionServices _permissionServices; + private readonly IModuleServices _moduleServices; + private readonly IDepartmentServices _departmentServices; + private readonly ISysUserInfoServices _sysUserInfoServices; + private readonly IWebHostEnvironment _env; + + public MigrateController(IUnitOfWorkManage unitOfWorkManage, + IRoleModulePermissionServices roleModulePermissionServices, + IUserRoleServices userRoleServices, + IRoleServices roleServices, + IPermissionServices permissionServices, + IModuleServices moduleServices, + IDepartmentServices departmentServices, + ISysUserInfoServices sysUserInfoServices, + IWebHostEnvironment env) { - private readonly IUnitOfWorkManage _unitOfWorkManage; - private readonly IRoleModulePermissionServices _roleModulePermissionServices; - private readonly IUserRoleServices _userRoleServices; - private readonly IRoleServices _roleServices; - private readonly IPermissionServices _permissionServices; - private readonly IModuleServices _moduleServices; - private readonly IDepartmentServices _departmentServices; - private readonly ISysUserInfoServices _sysUserInfoServices; - private readonly IWebHostEnvironment _env; - - public MigrateController(IUnitOfWorkManage unitOfWorkManage, - IRoleModulePermissionServices roleModulePermissionServices, - IUserRoleServices userRoleServices, - IRoleServices roleServices, - IPermissionServices permissionServices, - IModuleServices moduleServices, - IDepartmentServices departmentServices, - ISysUserInfoServices sysUserInfoServices, - IWebHostEnvironment env) - { - _unitOfWorkManage = unitOfWorkManage; - _roleModulePermissionServices = roleModulePermissionServices; - _userRoleServices = userRoleServices; - _roleServices = roleServices; - _permissionServices = permissionServices; - _moduleServices = moduleServices; - _departmentServices = departmentServices; - _sysUserInfoServices = sysUserInfoServices; - _env = env; - } + _unitOfWorkManage = unitOfWorkManage; + _roleModulePermissionServices = roleModulePermissionServices; + _userRoleServices = userRoleServices; + _roleServices = roleServices; + _permissionServices = permissionServices; + _moduleServices = moduleServices; + _departmentServices = departmentServices; + _sysUserInfoServices = sysUserInfoServices; + _env = env; + } - /// - /// 获取权限部分Map数据(从库) - /// 迁移到新库(主库) - /// - /// - [HttpGet] - public async Task> DataMigrateFromOld2New() + /// + /// 获取权限部分Map数据(从库) + /// 迁移到新库(主库) + /// + /// + [HttpGet] + public async Task> DataMigrateFromOld2New() + { + var data = new ServiceResult() { Success = true, Message = "" }; + var filterPermissionId = 122; + if (_env.IsDevelopment()) { - var data = new ServiceResult() { Success = true, Message = "" }; - var filterPermissionId = 122; - if (_env.IsDevelopment()) + try { - try - { - var apiList = await _moduleServices.Query(d => d.IsDeleted == false); - var permissionsAllList = await _permissionServices.Query(d => d.IsDeleted == false); - var permissions = permissionsAllList.Where(d => d.Pid == 0).ToList(); - var rmps = await _roleModulePermissionServices.GetRMPMaps(); - List pms = new(); + var apiList = await _moduleServices.Query(d => d.IsDeleted == false); + var permissionsAllList = await _permissionServices.Query(d => d.IsDeleted == false); + var permissions = permissionsAllList.Where(d => d.Pid == 0).ToList(); + var rmps = await _roleModulePermissionServices.GetRMPMaps(); + List pms = new(); - // 当然,你可以做个where查询 - rmps = rmps.Where(d => d.PermissionId >= filterPermissionId).ToList(); + // 当然,你可以做个where查询 + rmps = rmps.Where(d => d.PermissionId >= filterPermissionId).ToList(); - InitPermissionTree(permissions, permissionsAllList, apiList); + InitPermissionTree(permissions, permissionsAllList, apiList); - var actionPermissionIds = permissionsAllList.Where(d => d.Id >= filterPermissionId).Select(d => d.Id).ToList(); - List filterPermissionIds = new(); - FilterPermissionTree(permissionsAllList, actionPermissionIds, filterPermissionIds); - permissions = permissions.Where(d => filterPermissionIds.Contains(d.Id)).ToList(); + var actionPermissionIds = permissionsAllList.Where(d => d.Id >= filterPermissionId).Select(d => d.Id).ToList(); + List filterPermissionIds = new(); + FilterPermissionTree(permissionsAllList, actionPermissionIds, filterPermissionIds); + permissions = permissions.Where(d => filterPermissionIds.Contains(d.Id)).ToList(); - // 开启事务,保证数据一致性 - _unitOfWorkManage.BeginTran(); + // 开启事务,保证数据一致性 + _unitOfWorkManage.BeginTran(); - // 注意信息的完整性,不要重复添加,确保主库没有要添加的数据 + // 注意信息的完整性,不要重复添加,确保主库没有要添加的数据 - // 1、保持菜单和接口 - await SavePermissionTreeAsync(permissions, pms); + // 1、保持菜单和接口 + await SavePermissionTreeAsync(permissions, pms); - long rid = 0; - long pid = 0; - long mid = 0; - long rpmid = 0; + long rid = 0; + long pid = 0; + long mid = 0; + long rpmid = 0; - // 2、保存关系表 - foreach (var item in rmps) + // 2、保存关系表 + foreach (var item in rmps) + { + // 角色信息,防止重复添加,做了判断 + if (item.Role != null) { - // 角色信息,防止重复添加,做了判断 - if (item.Role != null) + var isExit = (await _roleServices.Query(d => d.Name == item.Role.Name && d.IsDeleted == false)).FirstOrDefault(); + if (isExit == null) { - var isExit = (await _roleServices.Query(d => d.Name == item.Role.Name && d.IsDeleted == false)).FirstOrDefault(); - if (isExit == null) - { - rid = await _roleServices.Add(item.Role); - Console.WriteLine($"Role Added:{item.Role.Name}"); - } - else - { - rid = isExit.Id; - } + rid = await _roleServices.Add(item.Role); + Console.WriteLine($"Role Added:{item.Role.Name}"); } - - pid = (pms.FirstOrDefault(d => d.PidOld == item.PermissionId)?.PidNew).ObjToLong(); - mid = (pms.FirstOrDefault(d => d.MidOld == item.ModuleId)?.MidNew).ObjToLong(); - // 关系 - if (rid > 0 && pid > 0) + else { - rpmid = await _roleModulePermissionServices.Add(new RoleModulePermission() - { - IsDeleted = false, - CreateTime = DateTime.Now, - ModifyTime = DateTime.Now, - ModuleId = mid, - PermissionId = pid, - RoleId = rid, - }); - Console.WriteLine($"RMP Added:{rpmid}"); + rid = isExit.Id; } + } + pid = (pms.FirstOrDefault(d => d.PidOld == item.PermissionId)?.PidNew).ObjToLong(); + mid = (pms.FirstOrDefault(d => d.MidOld == item.ModuleId)?.MidNew).ObjToLong(); + // 关系 + if (rid > 0 && pid > 0) + { + rpmid = await _roleModulePermissionServices.Add(new RoleModulePermission() + { + IsDeleted = false, + CreateTime = DateTime.Now, + ModifyTime = DateTime.Now, + ModuleId = mid, + PermissionId = pid, + RoleId = rid, + }); + Console.WriteLine($"RMP Added:{rpmid}"); } + } - _unitOfWorkManage.CommitTran(); - data.Success = true; - data.Message = "导入成功!"; - } - catch (Exception) - { - _unitOfWorkManage.RollbackTran(); + _unitOfWorkManage.CommitTran(); - } + data.Success = true; + data.Message = "导入成功!"; } - else + catch (Exception) { - data.Success = false; - data.Message = "当前不处于开发模式,代码生成不可用!"; - } + _unitOfWorkManage.RollbackTran(); - return data; + } + } + else + { + data.Success = false; + data.Message = "当前不处于开发模式,代码生成不可用!"; } + return data; + } - /// - /// 权限数据库导出tsv - /// - /// - [HttpGet] - public async Task> SaveData2TsvAsync() - { - var data = new ServiceResult() { Success = true, Message = "" }; - if (_env.IsDevelopment()) - { - JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings - { - DateFormatHandling = DateFormatHandling.MicrosoftDateFormat - }; + /// + /// 权限数据库导出tsv + /// + /// + [HttpGet] + public async Task> SaveData2TsvAsync() + { + var data = new ServiceResult() { Success = true, Message = "" }; + if (_env.IsDevelopment()) + { - // 取出数据,序列化,自己可以处理判空 - var SysUserInfoJson = JsonConvert.SerializeObject(await _sysUserInfoServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); - FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "SysUserInfo.tsv"), SysUserInfoJson, Encoding.UTF8); + JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings + { + DateFormatHandling = DateFormatHandling.MicrosoftDateFormat + }; - var DepartmentJson = JsonConvert.SerializeObject(await _departmentServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); - FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "Department.tsv"), DepartmentJson, Encoding.UTF8); + // 取出数据,序列化,自己可以处理判空 + var SysUserInfoJson = JsonConvert.SerializeObject(await _sysUserInfoServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); + FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "SysUserInfo.tsv"), SysUserInfoJson, Encoding.UTF8); - var rolesJson = JsonConvert.SerializeObject(await _roleServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); - FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "Role.tsv"), rolesJson, Encoding.UTF8); + var DepartmentJson = JsonConvert.SerializeObject(await _departmentServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); + FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "Department.tsv"), DepartmentJson, Encoding.UTF8); - var UserRoleJson = JsonConvert.SerializeObject(await _userRoleServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); - FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "UserRole.tsv"), UserRoleJson, Encoding.UTF8); + var rolesJson = JsonConvert.SerializeObject(await _roleServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); + FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "Role.tsv"), rolesJson, Encoding.UTF8); + var UserRoleJson = JsonConvert.SerializeObject(await _userRoleServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); + FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "UserRole.tsv"), UserRoleJson, Encoding.UTF8); - var permissionsJson = JsonConvert.SerializeObject(await _permissionServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); - FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "Permission.tsv"), permissionsJson, Encoding.UTF8); + var permissionsJson = JsonConvert.SerializeObject(await _permissionServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); + FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "Permission.tsv"), permissionsJson, Encoding.UTF8); - var modulesJson = JsonConvert.SerializeObject(await _moduleServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); - FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "Modules.tsv"), modulesJson, Encoding.UTF8); + var modulesJson = JsonConvert.SerializeObject(await _moduleServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); + FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "Modules.tsv"), modulesJson, Encoding.UTF8); - var rmpsJson = JsonConvert.SerializeObject(await _roleModulePermissionServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); - FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "RoleModulePermission.tsv"), rmpsJson, Encoding.UTF8); + var rmpsJson = JsonConvert.SerializeObject(await _roleModulePermissionServices.Query(d => d.IsDeleted == false), microsoftDateFormatSettings); + FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.json", "RoleModulePermission.tsv"), rmpsJson, Encoding.UTF8); - data.Success = true; - data.Message = "生成成功!"; - } - else - { - data.Success = false; - data.Message = "当前不处于开发模式,代码生成不可用!"; - } - return data; + data.Success = true; + data.Message = "生成成功!"; + } + else + { + data.Success = false; + data.Message = "当前不处于开发模式,代码生成不可用!"; } + return data; + } - /// - /// 权限数据库导出excel - /// - /// - [HttpGet] - public async Task> SaveData2ExcelAsync() + + /// + /// 权限数据库导出excel + /// + /// + [HttpGet] + public async Task> SaveData2ExcelAsync() + { + var data = new ServiceResult() { Success = true, Message = "" }; + if (_env.IsDevelopment()) { - var data = new ServiceResult() { Success = true, Message = "" }; - if (_env.IsDevelopment()) + + JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings { + DateFormatHandling = DateFormatHandling.MicrosoftDateFormat + }; - JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings - { - DateFormatHandling = DateFormatHandling.MicrosoftDateFormat - }; + // 取出数据,序列化,自己可以处理判空 + //IExporter exporter = new ExcelExporter(); + //var SysUserInfoList = await _sysUserInfoServices.Query(d => d.IsDeleted == false); + //var result = await exporter.ExportAsByteArray(SysUserInfoList); + //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "SysUserInfo.xlsx"), result); - // 取出数据,序列化,自己可以处理判空 - //IExporter exporter = new ExcelExporter(); - //var SysUserInfoList = await _sysUserInfoServices.Query(d => d.IsDeleted == false); - //var result = await exporter.ExportAsByteArray(SysUserInfoList); - //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "SysUserInfo.xlsx"), result); + //var DepartmentList = await _departmentServices.Query(d => d.IsDeleted == false); + //var DepartmentResult = await exporter.ExportAsByteArray(DepartmentList); + //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "Department.xlsx"), DepartmentResult); - //var DepartmentList = await _departmentServices.Query(d => d.IsDeleted == false); - //var DepartmentResult = await exporter.ExportAsByteArray(DepartmentList); - //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "Department.xlsx"), DepartmentResult); + //var RoleList = await _roleServices.Query(d => d.IsDeleted == false); + //var RoleResult = await exporter.ExportAsByteArray(RoleList); + //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "Role.xlsx"), RoleResult); - //var RoleList = await _roleServices.Query(d => d.IsDeleted == false); - //var RoleResult = await exporter.ExportAsByteArray(RoleList); - //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "Role.xlsx"), RoleResult); + //var UserRoleList = await _userRoleServices.Query(d => d.IsDeleted == false); + //var UserRoleResult = await exporter.ExportAsByteArray(UserRoleList); + //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "UserRole.xlsx"), UserRoleResult); - //var UserRoleList = await _userRoleServices.Query(d => d.IsDeleted == false); - //var UserRoleResult = await exporter.ExportAsByteArray(UserRoleList); - //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "UserRole.xlsx"), UserRoleResult); + //var PermissionList = await _permissionServices.Query(d => d.IsDeleted == false); + //var PermissionResult = await exporter.ExportAsByteArray(PermissionList); + //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "Permission.xlsx"), PermissionResult); - //var PermissionList = await _permissionServices.Query(d => d.IsDeleted == false); - //var PermissionResult = await exporter.ExportAsByteArray(PermissionList); - //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "Permission.xlsx"), PermissionResult); + //var ModulesList = await _moduleServices.Query(d => d.IsDeleted == false); + //var ModulesResult = await exporter.ExportAsByteArray(ModulesList); + //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "Modules.xlsx"), ModulesResult); - //var ModulesList = await _moduleServices.Query(d => d.IsDeleted == false); - //var ModulesResult = await exporter.ExportAsByteArray(ModulesList); - //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "Modules.xlsx"), ModulesResult); + //var RoleModulePermissionList = await _roleModulePermissionServices.Query(d => d.IsDeleted == false); + //var RoleModulePermissionResult = await exporter.ExportAsByteArray(RoleModulePermissionList); + //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "RoleModulePermission.xlsx"), RoleModulePermissionResult); - //var RoleModulePermissionList = await _roleModulePermissionServices.Query(d => d.IsDeleted == false); - //var RoleModulePermissionResult = await exporter.ExportAsByteArray(RoleModulePermissionList); - //FileHelper.WriteFile(Path.Combine(_env.WebRootPath, "TiobonCore.Data.excel", "RoleModulePermission.xlsx"), RoleModulePermissionResult); + data.Success = true; + data.Message = "生成成功!"; + } + else + { + data.Success = false; + data.Message = "当前不处于开发模式,代码生成不可用!"; + } - data.Success = true; - data.Message = "生成成功!"; - } - else - { - data.Success = false; - data.Message = "当前不处于开发模式,代码生成不可用!"; - } + return data; + } - return data; + private void InitPermissionTree(List permissionsTree, List all, List apis) + { + foreach (var item in permissionsTree) + { + item.Children = all.Where(d => d.Pid == item.Id).ToList(); + item.Module = apis.FirstOrDefault(d => d.Id == item.Mid); + InitPermissionTree(item.Children, all, apis); } + } - private void InitPermissionTree(List permissionsTree, List all, List apis) + private void FilterPermissionTree(List permissionsAll, List actionPermissionId, List filterPermissionIds) + { + actionPermissionId = actionPermissionId.Distinct().ToList(); + var doneIds = permissionsAll.Where(d => actionPermissionId.Contains(d.Id) && d.Pid == 0).Select(d => d.Id).ToList(); + filterPermissionIds.AddRange(doneIds); + + var hasDoIds = permissionsAll.Where(d => actionPermissionId.Contains(d.Id) && d.Pid != 0).Select(d => d.Pid).ToList(); + if (hasDoIds.Any()) { - foreach (var item in permissionsTree) - { - item.Children = all.Where(d => d.Pid == item.Id).ToList(); - item.Module = apis.FirstOrDefault(d => d.Id == item.Mid); - InitPermissionTree(item.Children, all, apis); - } + FilterPermissionTree(permissionsAll, hasDoIds, filterPermissionIds); } + } - private void FilterPermissionTree(List permissionsAll, List actionPermissionId, List filterPermissionIds) - { - actionPermissionId = actionPermissionId.Distinct().ToList(); - var doneIds = permissionsAll.Where(d => actionPermissionId.Contains(d.Id) && d.Pid == 0).Select(d => d.Id).ToList(); - filterPermissionIds.AddRange(doneIds); + private async Task SavePermissionTreeAsync(List permissionsTree, List pms, long permissionId = 0) + { + var parendId = permissionId; - var hasDoIds = permissionsAll.Where(d => actionPermissionId.Contains(d.Id) && d.Pid != 0).Select(d => d.Pid).ToList(); - if (hasDoIds.Any()) + foreach (var item in permissionsTree) + { + PM pm = new PM(); + // 保留原始主键id + pm.PidOld = item.Id; + pm.MidOld = (item.Module?.Id).ObjToLong(); + + long mid = 0; + // 接口 + if (item.Module != null) { - FilterPermissionTree(permissionsAll, hasDoIds, filterPermissionIds); + var moduleModel = (await _moduleServices.Query(d => d.LinkUrl == item.Module.LinkUrl)).FirstOrDefault(); + if (moduleModel != null) + { + mid = moduleModel.Id; + } + else + { + mid = await _moduleServices.Add(item.Module); + } + pm.MidNew = mid; + Console.WriteLine($"Moudle Added:{item.Module.Name}"); } - } - - private async Task SavePermissionTreeAsync(List permissionsTree, List pms, long permissionId = 0) - { - var parendId = permissionId; - - foreach (var item in permissionsTree) + // 菜单 + if (item != null) { - PM pm = new PM(); - // 保留原始主键id - pm.PidOld = item.Id; - pm.MidOld = (item.Module?.Id).ObjToLong(); - - long mid = 0; - // 接口 - if (item.Module != null) + var permissionModel = (await _permissionServices.Query(d => d.Name == item.Name && d.Pid == item.Pid && d.Mid == item.Mid)).FirstOrDefault(); + item.Pid = parendId; + item.Mid = mid; + if (permissionModel != null) { - var moduleModel = (await _moduleServices.Query(d => d.LinkUrl == item.Module.LinkUrl)).FirstOrDefault(); - if (moduleModel != null) - { - mid = moduleModel.Id; - } - else - { - mid = await _moduleServices.Add(item.Module); - } - pm.MidNew = mid; - Console.WriteLine($"Moudle Added:{item.Module.Name}"); + permissionId = permissionModel.Id; } - // 菜单 - if (item != null) + else { - var permissionModel = (await _permissionServices.Query(d => d.Name == item.Name && d.Pid == item.Pid && d.Mid == item.Mid)).FirstOrDefault(); - item.Pid = parendId; - item.Mid = mid; - if (permissionModel != null) - { - permissionId = permissionModel.Id; - } - else - { - permissionId = await _permissionServices.Add(item); - } - - pm.PidNew = permissionId; - Console.WriteLine($"Permission Added:{item.Name}"); + permissionId = await _permissionServices.Add(item); } - pms.Add(pm); - await SavePermissionTreeAsync(item.Children, pms, permissionId); + pm.PidNew = permissionId; + Console.WriteLine($"Permission Added:{item.Name}"); } + pms.Add(pm); + + await SavePermissionTreeAsync(item.Children, pms, permissionId); } + } - } +} - public class PM - { - public long PidOld { get; set; } - public long MidOld { get; set; } - public long PidNew { get; set; } - public long MidNew { get; set; } - } +public class PM +{ + public long PidOld { get; set; } + public long MidOld { get; set; } + public long PidNew { get; set; } + public long MidNew { get; set; } } diff --git a/Tiobon.Core.Api/Controllers/FileController.cs b/Tiobon.Core.Api/Controllers/FileController.cs index cadb119a..f61c7d1b 100644 --- a/Tiobon.Core.Api/Controllers/FileController.cs +++ b/Tiobon.Core.Api/Controllers/FileController.cs @@ -1,7 +1,5 @@ -using System.Net; -using SharpCompress.Common; -using SkyWalking.NetworkProtocol.V3; -using SqlSugar; +using SqlSugar; +using System.Net; using Tiobon.Core.DataAccess; namespace Tiobon.Core.Controllers; diff --git a/Tiobon.Core.Api/Controllers/LoginController.cs b/Tiobon.Core.Api/Controllers/LoginController.cs index 925eae52..61ef2745 100644 --- a/Tiobon.Core.Api/Controllers/LoginController.cs +++ b/Tiobon.Core.Api/Controllers/LoginController.cs @@ -1,336 +1,334 @@ -using Tiobon.Core.AuthHelper; -using Tiobon.Core.AuthHelper.OverWrite; -using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authentication.JwtBearer; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; +using Tiobon.Core.AuthHelper; +using Tiobon.Core.AuthHelper.OverWrite; using Tiobon.Core.Common.Swagger; -using Tiobon.Core.Services; -namespace Tiobon.Core.Controllers +namespace Tiobon.Core.Controllers; + +/// +/// 登录管理【无权限】 +/// +[Produces("application/json")] +[Route("api/Login"), ApiExplorerSettings(GroupName = Grouping.GroupName_Other)] +[AllowAnonymous] +public class LoginController : BaseApiController { + readonly IGhrs_UserServices _ghrs_UserServices; + readonly IUserRoleServices _userRoleServices; + readonly IRoleServices _roleServices; + readonly PermissionRequirement _requirement; + private readonly IRoleModulePermissionServices _roleModulePermissionServices; + private readonly ILogger _logger; + /// - /// 登录管理【无权限】 + /// 构造函数注入 /// - [Produces("application/json")] - [Route("api/Login"), ApiExplorerSettings(GroupName = Grouping.GroupName_Other)] - [AllowAnonymous] - public class LoginController : BaseApiController + /// + /// + /// + /// + /// + /// + public LoginController(IGhrs_UserServices ghrs_UserServices, IUserRoleServices userRoleServices, IRoleServices roleServices, PermissionRequirement requirement, IRoleModulePermissionServices roleModulePermissionServices, ILogger logger) { - readonly IGhrs_UserServices _ghrs_UserServices; - readonly IUserRoleServices _userRoleServices; - readonly IRoleServices _roleServices; - readonly PermissionRequirement _requirement; - private readonly IRoleModulePermissionServices _roleModulePermissionServices; - private readonly ILogger _logger; - - /// - /// 构造函数注入 - /// - /// - /// - /// - /// - /// - /// - public LoginController(IGhrs_UserServices ghrs_UserServices, IUserRoleServices userRoleServices, IRoleServices roleServices, PermissionRequirement requirement, IRoleModulePermissionServices roleModulePermissionServices, ILogger logger) - { - this._ghrs_UserServices = ghrs_UserServices; - this._userRoleServices = userRoleServices; - this._roleServices = roleServices; - _requirement = requirement; - _roleModulePermissionServices = roleModulePermissionServices; - _logger = logger; - } + this._ghrs_UserServices = ghrs_UserServices; + this._userRoleServices = userRoleServices; + this._roleServices = roleServices; + _requirement = requirement; + _roleModulePermissionServices = roleModulePermissionServices; + _logger = logger; + } - #region 获取token的第1种方法 + #region 获取token的第1种方法 - /// - /// 获取JWT的方法1 - /// - /// - /// - /// - [HttpGet] - [Route("Token")] - public async Task> GetJwtStr(string name, string pass) + /// + /// 获取JWT的方法1 + /// + /// + /// + /// + [HttpGet] + [Route("Token")] + public async Task> GetJwtStr(string name, string pass) + { + string jwtStr = string.Empty; + bool suc = false; + //这里就是用户登陆以后,通过数据库去调取数据,分配权限的操作 + + //var user = await _sysUserInfoServices.GetUserRoleNameStr(name, MD5Helper.MD5Encrypt32(pass)); + //if (user != null) + //{ + // TokenModelJwt tokenModel = new TokenModelJwt { Uid = 1, Role = user }; + + // jwtStr = JwtHelper.IssueJwt(tokenModel); + // suc = true; + //} + //else + // jwtStr = "login fail!!!"; + + return new ServiceResult() { - string jwtStr = string.Empty; - bool suc = false; - //这里就是用户登陆以后,通过数据库去调取数据,分配权限的操作 - - //var user = await _sysUserInfoServices.GetUserRoleNameStr(name, MD5Helper.MD5Encrypt32(pass)); - //if (user != null) - //{ - // TokenModelJwt tokenModel = new TokenModelJwt { Uid = 1, Role = user }; - - // jwtStr = JwtHelper.IssueJwt(tokenModel); - // suc = true; - //} - //else - // jwtStr = "login fail!!!"; - - return new ServiceResult() - { - Success = suc, - Message = suc ? "获取成功" : "获取失败", - Data = jwtStr - }; - } + Success = suc, + Message = suc ? "获取成功" : "获取失败", + Data = jwtStr + }; + } - /// - /// 获取JWT的方法2:给Nuxt提供 - /// - /// - /// - /// - [HttpGet] - [Route("GetTokenNuxt")] - public ServiceResult GetJwtStrForNuxt(string name, string pass) + /// + /// 获取JWT的方法2:给Nuxt提供 + /// + /// + /// + /// + [HttpGet] + [Route("GetTokenNuxt")] + public ServiceResult GetJwtStrForNuxt(string name, string pass) + { + string jwtStr = string.Empty; + bool suc = false; + //这里就是用户登陆以后,通过数据库去调取数据,分配权限的操作 + //这里直接写死了 + if (name == "admins" && pass == "admins") { - string jwtStr = string.Empty; - bool suc = false; - //这里就是用户登陆以后,通过数据库去调取数据,分配权限的操作 - //这里直接写死了 - if (name == "admins" && pass == "admins") - { - TokenModelJwt tokenModel = new TokenModelJwt - { - Uid = 1, - Role = "Admin" - }; - - jwtStr = JwtHelper.IssueJwt(tokenModel); - suc = true; - } - else - jwtStr = "login fail!!!"; - - //var result = new - //{ - // data = new { success = suc, token = jwtStr } - //}; - - return new ServiceResult() + TokenModelJwt tokenModel = new TokenModelJwt { - Success = suc, - Message = suc ? "获取成功" : "获取失败", - Data = jwtStr + Uid = 1, + Role = "Admin" }; - } - #endregion + jwtStr = JwtHelper.IssueJwt(tokenModel); + suc = true; + } + else + jwtStr = "login fail!!!"; + //var result = new + //{ + // data = new { success = suc, token = jwtStr } + //}; - /// - /// 获取JWT的方法3:整个系统主要方法 - /// - /// - /// - /// - [HttpGet] - [Route("JWTToken3.0")] - public async Task> GetJwtToken3(string name = "", string pass = "") + return new ServiceResult() { - string jwtStr = string.Empty; + Success = suc, + Message = suc ? "获取成功" : "获取失败", + Data = jwtStr + }; + } - if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(pass)) - return Failed("用户名或密码不能为空"); - if (name != "Tiobonadmin" || pass != "Tiobonadmin") - return Failed("用户名或密码不能为空"); + #endregion - pass = MD5Helper.MD5Encrypt32(pass); - name = "A1314"; - var user = await _ghrs_UserServices.Query(d => d.UserNo == name && d.IsEnable == 1); - if (user.Count > 0) - { - //var userRoles = await _sysUserInfoServices.GetUserRoleNameStr(name, pass); - //如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色 - var claims = new List - { - new Claim(ClaimTypes.Name, user.FirstOrDefault().UserId.ToString()), - new Claim(JwtRegisteredClaimNames.Jti, user.FirstOrDefault().UserId.ToString()), - new Claim("TenantId", "0"), - new Claim(JwtRegisteredClaimNames.Iat, DateTime.Now.DateToTimeStamp()), - new Claim(ClaimTypes.Expiration, - DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) - }; - //claims.AddRange(userRoles.Split(',').Select(s => new Claim(ClaimTypes.Role, s))); + /// + /// 获取JWT的方法3:整个系统主要方法 + /// + /// + /// + /// + [HttpGet] + [Route("JWTToken3.0")] + public async Task> GetJwtToken3(string name = "", string pass = "") + { + string jwtStr = string.Empty; - // ids4和jwt切换 - // jwt - if (!Permissions.IsUseIds4) - { - //var data = await _roleModulePermissionServices.RoleModuleMaps(); - //var list = (from item in data - // where item.IsDeleted == false - // orderby item.Id - // select new PermissionItem - // { - // Url = item.Module?.LinkUrl, - // Role = item.Role?.Name.ObjToString(), - // }).ToList(); - - //_requirement.Permissions = list; - } - - var token = JwtToken.BuildJwtToken(claims.ToArray(), _requirement); - return Success(token, "获取成功"); - } - else - return Failed("认证失败"); - } + if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(pass)) + return Failed("用户名或密码不能为空"); + if (name != "Tiobonadmin" || pass != "Tiobonadmin") + return Failed("用户名或密码不能为空"); - [HttpGet] - [Route("GetJwtTokenSecret")] - public async Task> GetJwtTokenSecret(string name = "", string pass = "") + pass = MD5Helper.MD5Encrypt32(pass); + name = "A1314"; + var user = await _ghrs_UserServices.Query(d => d.UserNo == name && d.IsEnable == 1); + if (user.Count > 0) { - var rlt = await GetJwtToken3(name, pass); - return rlt; - } + //var userRoles = await _sysUserInfoServices.GetUserRoleNameStr(name, pass); + //如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色 + var claims = new List + { + new Claim(ClaimTypes.Name, user.FirstOrDefault().UserId.ToString()), + new Claim(JwtRegisteredClaimNames.Jti, user.FirstOrDefault().UserId.ToString()), + new Claim("TenantId", "0"), + new Claim(JwtRegisteredClaimNames.Iat, DateTime.Now.DateToTimeStamp()), + new Claim(ClaimTypes.Expiration, + DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) + }; + //claims.AddRange(userRoles.Split(',').Select(s => new Claim(ClaimTypes.Role, s))); - /// - /// 请求刷新Token(以旧换新) - /// - /// - /// - [HttpGet] - [Route("RefreshToken")] - public async Task> RefreshToken(string token = "") - { - string jwtStr = string.Empty; - if (string.IsNullOrEmpty(token)) - return Failed("token无效,请重新登录!"); - var tokenModel = JwtHelper.SerializeJwt(token); - if (tokenModel != null && JwtHelper.customSafeVerify(token) && tokenModel.Uid > 0) + // ids4和jwt切换 + // jwt + if (!Permissions.IsUseIds4) { - var user = await _ghrs_UserServices.QueryById(tokenModel.Uid); - var value = User.Claims.SingleOrDefault(s => s.Type == JwtRegisteredClaimNames.Iat)?.Value; - //if (value != null && user.CriticalModifyTime > value.ObjToDate()) - // return Failed("很抱歉,授权已失效,请重新授权!"); - - //if (user != null && !(value != null && user.CriticalModifyTime > value.ObjToDate())) - if (user != null) - { - //var userRoles = await _ghrs_UserServices.GetUserRoleNameStr(user.LoginName, user.LoginPWD); - //如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色 - //var claims = new List - //{ - // new Claim(ClaimTypes.Name, user.LoginName), - // new Claim(JwtRegisteredClaimNames.Jti, tokenModel.Uid.ObjToString()), - // new Claim(JwtRegisteredClaimNames.Iat, DateTime.Now.DateToTimeStamp()), - // new Claim(ClaimTypes.Expiration, - // DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) - //}; - var claims = new List{ - new Claim(ClaimTypes.Name, user.UserId.ToString()), - new Claim(JwtRegisteredClaimNames.Jti, user.UserId.ToString()), - new Claim("TenantId", "0"), - new Claim(JwtRegisteredClaimNames.Iat, DateTime.Now.DateToTimeStamp()), - new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) - }; - //claims.AddRange(userRoles.Split(',').Select(s => new Claim(ClaimTypes.Role, s))); - - //用户标识 - var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); - identity.AddClaims(claims); - - var refreshToken = JwtToken.BuildJwtToken(claims.ToArray(), _requirement); - return Success(refreshToken, "获取成功"); - } + //var data = await _roleModulePermissionServices.RoleModuleMaps(); + //var list = (from item in data + // where item.IsDeleted == false + // orderby item.Id + // select new PermissionItem + // { + // Url = item.Module?.LinkUrl, + // Role = item.Role?.Name.ObjToString(), + // }).ToList(); + + //_requirement.Permissions = list; } - return Failed("认证失败!"); + var token = JwtToken.BuildJwtToken(claims.ToArray(), _requirement); + return Success(token, "获取成功"); } + else + return Failed("认证失败"); + } + + [HttpGet] + [Route("GetJwtTokenSecret")] + public async Task> GetJwtTokenSecret(string name = "", string pass = "") + { + var rlt = await GetJwtToken3(name, pass); + return rlt; + } + + /// + /// 请求刷新Token(以旧换新) + /// + /// + /// + [HttpGet] + [Route("RefreshToken")] + public async Task> RefreshToken(string token = "") + { + string jwtStr = string.Empty; - /// - /// 获取JWT的方法4:给 JSONP 测试 - /// - /// - /// - /// - /// - /// - /// - [HttpGet] - [Route("jsonp")] - public void Getjsonp(string callBack, long id = 1, string sub = "Admin", int expiresSliding = 30, int expiresAbsoulute = 30) + if (string.IsNullOrEmpty(token)) + return Failed("token无效,请重新登录!"); + var tokenModel = JwtHelper.SerializeJwt(token); + if (tokenModel != null && JwtHelper.customSafeVerify(token) && tokenModel.Uid > 0) { - TokenModelJwt tokenModel = new TokenModelJwt + var user = await _ghrs_UserServices.QueryById(tokenModel.Uid); + var value = User.Claims.SingleOrDefault(s => s.Type == JwtRegisteredClaimNames.Iat)?.Value; + //if (value != null && user.CriticalModifyTime > value.ObjToDate()) + // return Failed("很抱歉,授权已失效,请重新授权!"); + + //if (user != null && !(value != null && user.CriticalModifyTime > value.ObjToDate())) + if (user != null) { - Uid = id, - Role = sub + //var userRoles = await _ghrs_UserServices.GetUserRoleNameStr(user.LoginName, user.LoginPWD); + //如果是基于用户的授权策略,这里要添加用户;如果是基于角色的授权策略,这里要添加角色 + //var claims = new List + //{ + // new Claim(ClaimTypes.Name, user.LoginName), + // new Claim(JwtRegisteredClaimNames.Jti, tokenModel.Uid.ObjToString()), + // new Claim(JwtRegisteredClaimNames.Iat, DateTime.Now.DateToTimeStamp()), + // new Claim(ClaimTypes.Expiration, + // DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) + //}; + var claims = new List{ + new Claim(ClaimTypes.Name, user.UserId.ToString()), + new Claim(JwtRegisteredClaimNames.Jti, user.UserId.ToString()), + new Claim("TenantId", "0"), + new Claim(JwtRegisteredClaimNames.Iat, DateTime.Now.DateToTimeStamp()), + new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_requirement.Expiration.TotalSeconds).ToString()) }; + //claims.AddRange(userRoles.Split(',').Select(s => new Claim(ClaimTypes.Role, s))); - string jwtStr = JwtHelper.IssueJwt(tokenModel); + //用户标识 + var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); + identity.AddClaims(claims); - string response = string.Format("\"value\":\"{0}\"", jwtStr); - string call = callBack + "({" + response + "})"; - Response.WriteAsync(call); + var refreshToken = JwtToken.BuildJwtToken(claims.ToArray(), _requirement); + return Success(refreshToken, "获取成功"); + } } + return Failed("认证失败!"); + } - /// - /// 测试 MD5 加密字符串 - /// - /// - /// - [HttpGet] - [Route("Md5Password")] - public string Md5Password(string password = "") + /// + /// 获取JWT的方法4:给 JSONP 测试 + /// + /// + /// + /// + /// + /// + /// + [HttpGet] + [Route("jsonp")] + public void Getjsonp(string callBack, long id = 1, string sub = "Admin", int expiresSliding = 30, int expiresAbsoulute = 30) + { + TokenModelJwt tokenModel = new TokenModelJwt { - return MD5Helper.MD5Encrypt32(password); - } + Uid = id, + Role = sub + }; - /// - /// swagger登录 - /// - /// - /// - [HttpPost] - [Route("/api/Login/swgLogin")] - public async Task SwgLogin([FromBody] SwaggerLoginRequest loginRequest) - { - if (loginRequest is null) - return new { result = false }; + string jwtStr = JwtHelper.IssueJwt(tokenModel); - try - { - var result = await GetJwtToken3(loginRequest.name, loginRequest.pwd); - if (result.Success) - { - HttpContext.SuccessSwagger(); - HttpContext.SuccessSwaggerJwt(result.Data.token); - return new { result = true }; - } - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Swagger登录异常"); - } + string response = string.Format("\"value\":\"{0}\"", jwtStr); + string call = callBack + "({" + response + "})"; + Response.WriteAsync(call); + } + + + /// + /// 测试 MD5 加密字符串 + /// + /// + /// + [HttpGet] + [Route("Md5Password")] + public string Md5Password(string password = "") + { + return MD5Helper.MD5Encrypt32(password); + } + /// + /// swagger登录 + /// + /// + /// + [HttpPost] + [Route("/api/Login/swgLogin")] + public async Task SwgLogin([FromBody] SwaggerLoginRequest loginRequest) + { + if (loginRequest is null) return new { result = false }; - } - /// - /// weixin登录 - /// - /// - [HttpGet] - [Route("wxLogin")] - public dynamic WxLogin(string g = "", string token = "") + try + { + var result = await GetJwtToken3(loginRequest.name, loginRequest.pwd); + if (result.Success) + { + HttpContext.SuccessSwagger(); + HttpContext.SuccessSwaggerJwt(result.Data.token); + return new { result = true }; + } + } + catch (Exception ex) { - return new { g, token }; + _logger.LogWarning(ex, "Swagger登录异常"); } + + return new { result = false }; } - public class SwaggerLoginRequest + /// + /// weixin登录 + /// + /// + [HttpGet] + [Route("wxLogin")] + public dynamic WxLogin(string g = "", string token = "") { - public string name { get; set; } - public string pwd { get; set; } + return new { g, token }; } +} + +public class SwaggerLoginRequest +{ + public string name { get; set; } + public string pwd { get; set; } } \ No newline at end of file diff --git a/Tiobon.Core.Api/Controllers/Systems/CacheManageController.cs b/Tiobon.Core.Api/Controllers/Systems/CacheManageController.cs index 76ab9848..c5c0dd1d 100644 --- a/Tiobon.Core.Api/Controllers/Systems/CacheManageController.cs +++ b/Tiobon.Core.Api/Controllers/Systems/CacheManageController.cs @@ -1,5 +1,4 @@ using Tiobon.Core.Common.Caches; -using Tiobon.Core.Model; namespace Tiobon.Core.Api.Controllers.Systems; /// diff --git a/Tiobon.Core.Api/Controllers/Systems/DataBaseController.cs b/Tiobon.Core.Api/Controllers/Systems/DataBaseController.cs index 5323e65e..08fb8dd5 100644 --- a/Tiobon.Core.Api/Controllers/Systems/DataBaseController.cs +++ b/Tiobon.Core.Api/Controllers/Systems/DataBaseController.cs @@ -1,10 +1,9 @@ -using System.Diagnostics.CodeAnalysis; +using Mapster; +using SqlSugar; +using System.Diagnostics.CodeAnalysis; using Tiobon.Core.Common.DB; using Tiobon.Core.Model.Systems.DataBase; using Tiobon.Core.Model.Tenants; -using Mapster; -using SqlSugar; -using Tiobon.Core.Model; namespace Tiobon.Core.Api.Controllers.Systems; diff --git a/Tiobon.Core.Api/Controllers/Systems/DynamicCodeFirstController.cs b/Tiobon.Core.Api/Controllers/Systems/DynamicCodeFirstController.cs index b4e58c77..0b687812 100644 --- a/Tiobon.Core.Api/Controllers/Systems/DynamicCodeFirstController.cs +++ b/Tiobon.Core.Api/Controllers/Systems/DynamicCodeFirstController.cs @@ -1,7 +1,6 @@ +using SqlSugar; using Tiobon.Core.Common.DB.Extension; using Tiobon.Core.Model.Models.RootTkey; -using SqlSugar; -using Tiobon.Core.Model; namespace Tiobon.Core.Api.Controllers.Systems; diff --git a/Tiobon.Core.Api/Controllers/TasksQzController.cs b/Tiobon.Core.Api/Controllers/TasksQzController.cs index 8502a0f9..02bf0bb2 100644 --- a/Tiobon.Core.Api/Controllers/TasksQzController.cs +++ b/Tiobon.Core.Api/Controllers/TasksQzController.cs @@ -2,93 +2,146 @@ using Tiobon.Core.Tasks; using Quartz; -namespace Tiobon.Core.Controllers +namespace Tiobon.Core.Controllers; + +[Route("api/[controller]/[action]")] +[ApiController] +[Authorize(Permissions.Name), ApiExplorerSettings(GroupName = Grouping.GroupName_System)] +public class TasksQzController : ControllerBase { - [Route("api/[controller]/[action]")] - [ApiController] - [Authorize(Permissions.Name), ApiExplorerSettings(GroupName = Grouping.GroupName_System)] - public class TasksQzController : ControllerBase + private readonly ITasksQzServices _tasksQzServices; + private readonly ITasksLogServices _tasksLogServices; + private readonly ISchedulerCenter _schedulerCenter; + private readonly IUnitOfWorkManage _unitOfWorkManage; + + public TasksQzController(ITasksQzServices tasksQzServices, ISchedulerCenter schedulerCenter, IUnitOfWorkManage unitOfWorkManage, ITasksLogServices tasksLogServices) { - private readonly ITasksQzServices _tasksQzServices; - private readonly ITasksLogServices _tasksLogServices; - private readonly ISchedulerCenter _schedulerCenter; - private readonly IUnitOfWorkManage _unitOfWorkManage; + _unitOfWorkManage = unitOfWorkManage; + _tasksQzServices = tasksQzServices; + _schedulerCenter = schedulerCenter; + _tasksLogServices = tasksLogServices; + } - public TasksQzController(ITasksQzServices tasksQzServices, ISchedulerCenter schedulerCenter, IUnitOfWorkManage unitOfWorkManage, ITasksLogServices tasksLogServices) + /// + /// 分页获取 + /// + /// + /// + /// + // GET: api/Buttons/5 + [HttpGet] + public async Task>> Get(int page = 1, string key = "") + { + if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) { - _unitOfWorkManage = unitOfWorkManage; - _tasksQzServices = tasksQzServices; - _schedulerCenter = schedulerCenter; - _tasksLogServices = tasksLogServices; + key = ""; } + int intPageSize = 50; - /// - /// 分页获取 - /// - /// - /// - /// - // GET: api/Buttons/5 - [HttpGet] - public async Task>> Get(int page = 1, string key = "") + Expression> whereExpression = a => a.IsEnable == 1 && (a.Name != null && a.Name.Contains(key)); + + var data = await _tasksQzServices.QueryPage(whereExpression, page, intPageSize, " Id desc "); + if (data.dataCount > 0) { - if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) + foreach (var item in data.data) { - key = ""; + item.Triggers = await _schedulerCenter.GetTaskStaus(item); } - int intPageSize = 50; - - Expression> whereExpression = a => a.IsEnable == 1 && (a.Name != null && a.Name.Contains(key)); + } + return ServiceResult>.OprateSuccess(data.dataCount >= 0, "获取成功", data); + } - var data = await _tasksQzServices.QueryPage(whereExpression, page, intPageSize, " Id desc "); - if (data.dataCount > 0) + /// + /// 添加计划任务 + /// + /// + /// + [HttpPost] + public async Task> Post([FromBody] Ghre_TasksQz tasksQz) + { + var data = new ServiceResult(); + _unitOfWorkManage.BeginTran(); + var id = (await _tasksQzServices.Add(tasksQz)); + data.Success = id > 0; + try + { + if (data.Success) { - foreach (var item in data.data) + tasksQz.Id = id; + data.Data = id.ObjToString(); + data.Message = "添加成功"; + if (tasksQz.IsStart) { - item.Triggers = await _schedulerCenter.GetTaskStaus(item); + //如果是启动自动 + var ResuleModel = await _schedulerCenter.AddScheduleJobAsync(tasksQz); + data.Success = ResuleModel.Success; + if (ResuleModel.Success) + { + data.Message = $"{data.Message}=>启动成功=>{ResuleModel.Message}"; + } + else + { + data.Message = $"{data.Message}=>启动失败=>{ResuleModel.Message}"; + } } } - return ServiceResult>.OprateSuccess(data.dataCount >= 0, "获取成功", data); + else + { + data.Message = "添加失败"; + + } } + catch (Exception) + { + throw; + } + finally + { + if (data.Success) + _unitOfWorkManage.CommitTran(); + else + _unitOfWorkManage.RollbackTran(); + } + return data; + } + - /// - /// 添加计划任务 - /// - /// - /// - [HttpPost] - public async Task> Post([FromBody] Ghre_TasksQz tasksQz) + /// + /// 修改计划任务 + /// + /// + /// + [HttpPut] + public async Task> Put([FromBody] Ghre_TasksQz tasksQz) + { + var data = new ServiceResult(); + if (tasksQz != null && tasksQz.Id > 0) { - var data = new ServiceResult(); _unitOfWorkManage.BeginTran(); - var id = (await _tasksQzServices.Add(tasksQz)); - data.Success = id > 0; + data.Success = await _tasksQzServices.Update(tasksQz); try { if (data.Success) { - tasksQz.Id = id; - data.Data = id.ObjToString(); - data.Message = "添加成功"; + data.Message = "修改成功"; + data.Data = tasksQz?.Id.ObjToString(); if (tasksQz.IsStart) { - //如果是启动自动 - var ResuleModel = await _schedulerCenter.AddScheduleJobAsync(tasksQz); - data.Success = ResuleModel.Success; - if (ResuleModel.Success) - { - data.Message = $"{data.Message}=>启动成功=>{ResuleModel.Message}"; - } - else - { - data.Message = $"{data.Message}=>启动失败=>{ResuleModel.Message}"; - } + var ResuleModelStop = await _schedulerCenter.StopScheduleJobAsync(tasksQz); + data.Message = $"{data.Message}=>停止:{ResuleModelStop.Message}"; + var ResuleModelStar = await _schedulerCenter.AddScheduleJobAsync(tasksQz); + data.Success = ResuleModelStar.Success; + data.Message = $"{data.Message}=>启动:{ResuleModelStar.Message}"; + } + else + { + var ResuleModelStop = await _schedulerCenter.StopScheduleJobAsync(tasksQz); + data.Message = $"{data.Message}=>停止:{ResuleModelStop.Message}"; } } else { - data.Message = "添加失败"; - + data.Message = "修改失败"; } } catch (Exception) @@ -102,438 +155,384 @@ namespace Tiobon.Core.Controllers else _unitOfWorkManage.RollbackTran(); } - return data; } + return data; + } + /// + /// 删除一个任务 + /// + /// + /// + [HttpDelete] + public async Task> Delete(long jobId) + { + var data = new ServiceResult(); - - /// - /// 修改计划任务 - /// - /// - /// - [HttpPut] - public async Task> Put([FromBody] Ghre_TasksQz tasksQz) + var model = await _tasksQzServices.QueryById(jobId); + if (model != null) { - var data = new ServiceResult(); - if (tasksQz != null && tasksQz.Id > 0) + _unitOfWorkManage.BeginTran(); + data.Success = await _tasksQzServices.Delete(model); + try { - _unitOfWorkManage.BeginTran(); - data.Success = await _tasksQzServices.Update(tasksQz); - try - { - if (data.Success) - { - data.Message = "修改成功"; - data.Data = tasksQz?.Id.ObjToString(); - if (tasksQz.IsStart) - { - var ResuleModelStop = await _schedulerCenter.StopScheduleJobAsync(tasksQz); - data.Message = $"{data.Message}=>停止:{ResuleModelStop.Message}"; - var ResuleModelStar = await _schedulerCenter.AddScheduleJobAsync(tasksQz); - data.Success = ResuleModelStar.Success; - data.Message = $"{data.Message}=>启动:{ResuleModelStar.Message}"; - } - else - { - var ResuleModelStop = await _schedulerCenter.StopScheduleJobAsync(tasksQz); - data.Message = $"{data.Message}=>停止:{ResuleModelStop.Message}"; - } - } - else - { - data.Message = "修改失败"; - } - } - catch (Exception) + data.Data = jobId.ObjToString(); + if (data.Success) { - throw; + data.Message = "删除成功"; + var ResuleModel = await _schedulerCenter.StopScheduleJobAsync(model); + data.Message = $"{data.Message}=>任务状态=>{ResuleModel.Message}"; } - finally + else { - if (data.Success) - _unitOfWorkManage.CommitTran(); - else - _unitOfWorkManage.RollbackTran(); + data.Message = "删除失败"; } + + } + catch (Exception) + { + throw; + } + finally + { + if (data.Success) + _unitOfWorkManage.CommitTran(); + else + _unitOfWorkManage.RollbackTran(); } - return data; } - /// - /// 删除一个任务 - /// - /// - /// - [HttpDelete] - public async Task> Delete(long jobId) + else { - var data = new ServiceResult(); + data.Message = "任务不存在"; + } + return data; - var model = await _tasksQzServices.QueryById(jobId); - if (model != null) + } + /// + /// 启动计划任务 + /// + /// + /// + [HttpGet] + public async Task> StartJob(long jobId) + { + var data = new ServiceResult(); + + var model = await _tasksQzServices.QueryById(jobId); + if (model != null) + { + _unitOfWorkManage.BeginTran(); + try { - _unitOfWorkManage.BeginTran(); - data.Success = await _tasksQzServices.Delete(model); - try + model.IsStart = true; + data.Success = await _tasksQzServices.Update(model); + data.Data = jobId.ObjToString(); + if (data.Success) { - data.Data = jobId.ObjToString(); - if (data.Success) + data.Message = "更新成功"; + var ResuleModel = await _schedulerCenter.AddScheduleJobAsync(model); + data.Success = ResuleModel.Success; + if (ResuleModel.Success) { - data.Message = "删除成功"; - var ResuleModel = await _schedulerCenter.StopScheduleJobAsync(model); - data.Message = $"{data.Message}=>任务状态=>{ResuleModel.Message}"; + data.Message = $"{data.Message}=>启动成功=>{ResuleModel.Message}"; + } else { - data.Message = "删除失败"; + data.Message = $"{data.Message}=>启动失败=>{ResuleModel.Message}"; } - - } - catch (Exception) - { - throw; } - finally + else { - if (data.Success) - _unitOfWorkManage.CommitTran(); - else - _unitOfWorkManage.RollbackTran(); + data.Message = "更新失败"; } } - else + catch (Exception) { - data.Message = "任务不存在"; + throw; + } + finally + { + if (data.Success) + _unitOfWorkManage.CommitTran(); + else + _unitOfWorkManage.RollbackTran(); } - return data; - } - /// - /// 启动计划任务 - /// - /// - /// - [HttpGet] - public async Task> StartJob(long jobId) + else { - var data = new ServiceResult(); + data.Message = "任务不存在"; + } + return data; + } + /// + /// 停止一个计划任务 + /// + /// + /// + [HttpGet] + public async Task> StopJob(long jobId) + { + var data = new ServiceResult(); - var model = await _tasksQzServices.QueryById(jobId); - if (model != null) + var model = await _tasksQzServices.QueryById(jobId); + if (model != null) + { + model.IsStart = false; + data.Success = await _tasksQzServices.Update(model); + data.Data = jobId.ObjToString(); + if (data.Success) { - _unitOfWorkManage.BeginTran(); - try + data.Message = "更新成功"; + var ResuleModel = await _schedulerCenter.StopScheduleJobAsync(model); + if (ResuleModel.Success) { - model.IsStart = true; - data.Success = await _tasksQzServices.Update(model); - data.Data = jobId.ObjToString(); - if (data.Success) - { - data.Message = "更新成功"; - var ResuleModel = await _schedulerCenter.AddScheduleJobAsync(model); - data.Success = ResuleModel.Success; - if (ResuleModel.Success) - { - data.Message = $"{data.Message}=>启动成功=>{ResuleModel.Message}"; - - } - else - { - data.Message = $"{data.Message}=>启动失败=>{ResuleModel.Message}"; - } - } - else - { - data.Message = "更新失败"; - } - } - catch (Exception) - { - throw; + data.Message = $"{data.Message}=>停止成功=>{ResuleModel.Message}"; } - finally + else { - if (data.Success) - _unitOfWorkManage.CommitTran(); - else - _unitOfWorkManage.RollbackTran(); + data.Message = $"{data.Message}=>停止失败=>{ResuleModel.Message}"; } } else { - data.Message = "任务不存在"; + data.Message = "更新失败"; } - return data; } - /// - /// 停止一个计划任务 - /// - /// - /// - [HttpGet] - public async Task> StopJob(long jobId) + else { - var data = new ServiceResult(); - - var model = await _tasksQzServices.QueryById(jobId); - if (model != null) + data.Message = "任务不存在"; + } + return data; + } + /// + /// 暂停一个计划任务 + /// + /// + /// + [HttpGet] + public async Task> PauseJob(long jobId) + { + var data = new ServiceResult(); + var model = await _tasksQzServices.QueryById(jobId); + if (model != null) + { + _unitOfWorkManage.BeginTran(); + try { - model.IsStart = false; data.Success = await _tasksQzServices.Update(model); data.Data = jobId.ObjToString(); if (data.Success) { data.Message = "更新成功"; - var ResuleModel = await _schedulerCenter.StopScheduleJobAsync(model); + var ResuleModel = await _schedulerCenter.PauseJob(model); if (ResuleModel.Success) { - data.Message = $"{data.Message}=>停止成功=>{ResuleModel.Message}"; + data.Message = $"{data.Message}=>暂停成功=>{ResuleModel.Message}"; } else { - data.Message = $"{data.Message}=>停止失败=>{ResuleModel.Message}"; + data.Message = $"{data.Message}=>暂停失败=>{ResuleModel.Message}"; } + data.Success = ResuleModel.Success; } else { data.Message = "更新失败"; } } - else - { - data.Message = "任务不存在"; - } - return data; - } - /// - /// 暂停一个计划任务 - /// - /// - /// - [HttpGet] - public async Task> PauseJob(long jobId) - { - var data = new ServiceResult(); - var model = await _tasksQzServices.QueryById(jobId); - if (model != null) + catch (Exception) { - _unitOfWorkManage.BeginTran(); - try - { - data.Success = await _tasksQzServices.Update(model); - data.Data = jobId.ObjToString(); - if (data.Success) - { - data.Message = "更新成功"; - var ResuleModel = await _schedulerCenter.PauseJob(model); - if (ResuleModel.Success) - { - data.Message = $"{data.Message}=>暂停成功=>{ResuleModel.Message}"; - } - else - { - data.Message = $"{data.Message}=>暂停失败=>{ResuleModel.Message}"; - } - data.Success = ResuleModel.Success; - } - else - { - data.Message = "更新失败"; - } - } - catch (Exception) - { - throw; - } - finally - { - if (data.Success) - _unitOfWorkManage.CommitTran(); - else - _unitOfWorkManage.RollbackTran(); - } + throw; } - else + finally { - data.Message = "任务不存在"; + if (data.Success) + _unitOfWorkManage.CommitTran(); + else + _unitOfWorkManage.RollbackTran(); } - return data; } - /// - /// 恢复一个计划任务 - /// - /// - /// - [HttpGet] - public async Task> ResumeJob(long jobId) + else { - var data = new ServiceResult(); + data.Message = "任务不存在"; + } + return data; + } + /// + /// 恢复一个计划任务 + /// + /// + /// + [HttpGet] + public async Task> ResumeJob(long jobId) + { + var data = new ServiceResult(); - var model = await _tasksQzServices.QueryById(jobId); - if (model != null) + var model = await _tasksQzServices.QueryById(jobId); + if (model != null) + { + _unitOfWorkManage.BeginTran(); + try { - _unitOfWorkManage.BeginTran(); - try + model.IsStart = true; + data.Success = await _tasksQzServices.Update(model); + data.Data = jobId.ObjToString(); + if (data.Success) { - model.IsStart = true; - data.Success = await _tasksQzServices.Update(model); - data.Data = jobId.ObjToString(); - if (data.Success) + data.Message = "更新成功"; + var ResuleModel = await _schedulerCenter.ResumeJob(model); + if (ResuleModel.Success) { - data.Message = "更新成功"; - var ResuleModel = await _schedulerCenter.ResumeJob(model); - if (ResuleModel.Success) - { - data.Message = $"{data.Message}=>恢复成功=>{ResuleModel.Message}"; - } - else - { - data.Message = $"{data.Message}=>恢复失败=>{ResuleModel.Message}"; - } - data.Success = ResuleModel.Success; + data.Message = $"{data.Message}=>恢复成功=>{ResuleModel.Message}"; } else { - data.Message = "更新失败"; + data.Message = $"{data.Message}=>恢复失败=>{ResuleModel.Message}"; } + data.Success = ResuleModel.Success; } - catch (Exception) - { - throw; - } - finally + else { - if (data.Success) - _unitOfWorkManage.CommitTran(); - else - _unitOfWorkManage.RollbackTran(); + data.Message = "更新失败"; } } - else + catch (Exception) + { + throw; + } + finally { - data.Message = "任务不存在"; + if (data.Success) + _unitOfWorkManage.CommitTran(); + else + _unitOfWorkManage.RollbackTran(); } - return data; } - /// - /// 重启一个计划任务 - /// - /// - /// - [HttpGet] - public async Task> ReCovery(long jobId) + else + { + data.Message = "任务不存在"; + } + return data; + } + /// + /// 重启一个计划任务 + /// + /// + /// + [HttpGet] + public async Task> ReCovery(long jobId) + { + var data = new ServiceResult(); + var model = await _tasksQzServices.QueryById(jobId); + if (model != null) { - var data = new ServiceResult(); - var model = await _tasksQzServices.QueryById(jobId); - if (model != null) - { - _unitOfWorkManage.BeginTran(); - try + _unitOfWorkManage.BeginTran(); + try + { + model.IsStart = true; + data.Success = await _tasksQzServices.Update(model); + data.Data = jobId.ObjToString(); + if (data.Success) { - model.IsStart = true; - data.Success = await _tasksQzServices.Update(model); - data.Data = jobId.ObjToString(); - if (data.Success) + data.Message = "更新成功"; + var ResuleModelStop = await _schedulerCenter.StopScheduleJobAsync(model); + var ResuleModelStar = await _schedulerCenter.AddScheduleJobAsync(model); + if (ResuleModelStar.Success) { - data.Message = "更新成功"; - var ResuleModelStop = await _schedulerCenter.StopScheduleJobAsync(model); - var ResuleModelStar = await _schedulerCenter.AddScheduleJobAsync(model); - if (ResuleModelStar.Success) - { - data.Message = $"{data.Message}=>停止:{ResuleModelStop.Message}=>启动:{ResuleModelStar.Message}"; - data.Data = jobId.ObjToString(); + data.Message = $"{data.Message}=>停止:{ResuleModelStop.Message}=>启动:{ResuleModelStar.Message}"; + data.Data = jobId.ObjToString(); - } - else - { - data.Message = $"{data.Message}=>停止:{ResuleModelStop.Message}=>启动:{ResuleModelStar.Message}"; - data.Data = jobId.ObjToString(); - } - data.Success = ResuleModelStar.Success; } else { - data.Message = "更新失败"; + data.Message = $"{data.Message}=>停止:{ResuleModelStop.Message}=>启动:{ResuleModelStar.Message}"; + data.Data = jobId.ObjToString(); } + data.Success = ResuleModelStar.Success; } - catch (Exception) - { - throw; - } - finally + else { - if (data.Success) - _unitOfWorkManage.CommitTran(); - else - _unitOfWorkManage.RollbackTran(); + data.Message = "更新失败"; } } - else + catch (Exception) { - data.Message = "任务不存在"; + throw; + } + finally + { + if (data.Success) + _unitOfWorkManage.CommitTran(); + else + _unitOfWorkManage.RollbackTran(); } - return data; - } - /// - /// 获取任务命名空间 - /// - /// - [HttpGet] - public ServiceResult> GetTaskNameSpace() + else { - var baseType = typeof(IJob); - var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; - var referencedAssemblies = System.IO.Directory.GetFiles(path, "Tiobon.Core.Tasks.dll").Select(Assembly.LoadFrom).ToArray(); - var types = referencedAssemblies - .SelectMany(a => a.DefinedTypes) - .Select(type => type.AsType()) - .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray(); - var implementTypes = types.Where(x => x.IsClass).Select(item => new QuartzReflectionViewModel { nameSpace = item.Namespace, nameClass = item.Name, remark = "" }).ToList(); - return ServiceResult>.OprateSuccess("获取成功", implementTypes); + data.Message = "任务不存在"; } + return data; - /// - /// 立即执行任务 - /// - /// - /// - [HttpGet] - public async Task> ExecuteJob(long jobId) - { - var data = new ServiceResult(); + } + /// + /// 获取任务命名空间 + /// + /// + [HttpGet] + public ServiceResult> GetTaskNameSpace() + { + var baseType = typeof(IJob); + var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; + var referencedAssemblies = System.IO.Directory.GetFiles(path, "Tiobon.Core.Tasks.dll").Select(Assembly.LoadFrom).ToArray(); + var types = referencedAssemblies + .SelectMany(a => a.DefinedTypes) + .Select(type => type.AsType()) + .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray(); + var implementTypes = types.Where(x => x.IsClass).Select(item => new QuartzReflectionViewModel { nameSpace = item.Namespace, nameClass = item.Name, remark = "" }).ToList(); + return ServiceResult>.OprateSuccess("获取成功", implementTypes); + } - var model = await _tasksQzServices.QueryById(jobId); - if (model != null) - { - return await _schedulerCenter.ExecuteJobAsync(model); - } - else - { - data.Message = "任务不存在"; - } - return data; - } - /// - /// 获取任务运行日志 - /// - /// - [HttpGet] - public async Task>> GetTaskLogs(long jobId, int page = 1, int pageSize = 10, DateTime? runTimeStart = null, DateTime? runTimeEnd = null) + /// + /// 立即执行任务 + /// + /// + /// + [HttpGet] + public async Task> ExecuteJob(long jobId) + { + var data = new ServiceResult(); + + var model = await _tasksQzServices.QueryById(jobId); + if (model != null) { - var model = await _tasksLogServices.GetTaskLogs(jobId, page, pageSize, runTimeStart, runTimeEnd); - return ServiceResult>.OprateSuccess(model.dataCount >= 0, "获取成功", model); + return await _schedulerCenter.ExecuteJobAsync(model); } - /// - /// 任务概况 - /// - /// - [HttpGet] - public async Task> GetTaskOverview(long jobId, int page = 1, int pageSize = 10, DateTime? runTimeStart = null, DateTime? runTimeEnd = null, string type = "month") + else { - var model = await _tasksLogServices.GetTaskOverview(jobId, runTimeStart, runTimeEnd, type); - return ServiceResult.OprateSuccess(true, "获取成功", model); + data.Message = "任务不存在"; } - + return data; + } + /// + /// 获取任务运行日志 + /// + /// + [HttpGet] + public async Task>> GetTaskLogs(long jobId, int page = 1, int pageSize = 10, DateTime? runTimeStart = null, DateTime? runTimeEnd = null) + { + var model = await _tasksLogServices.GetTaskLogs(jobId, page, pageSize, runTimeStart, runTimeEnd); + return ServiceResult>.OprateSuccess(model.dataCount >= 0, "获取成功", model); } + /// + /// 任务概况 + /// + /// + [HttpGet] + public async Task> GetTaskOverview(long jobId, int page = 1, int pageSize = 10, DateTime? runTimeStart = null, DateTime? runTimeEnd = null, string type = "month") + { + var model = await _tasksLogServices.GetTaskOverview(jobId, runTimeStart, runTimeEnd, type); + return ServiceResult.OprateSuccess(true, "获取成功", model); + } + } diff --git a/Tiobon.Core.Api/Controllers/v1/ApbController.cs b/Tiobon.Core.Api/Controllers/v1/ApbController.cs index 62e8b852..b33dcf1b 100644 --- a/Tiobon.Core.Api/Controllers/v1/ApbController.cs +++ b/Tiobon.Core.Api/Controllers/v1/ApbController.cs @@ -1,26 +1,25 @@ using static Tiobon.Core.Extensions.CustomApiVersion; -namespace Tiobon.Core.Controllers.v1 -{ - [Route("api/[controller]")] - [ApiController, ApiExplorerSettings(GroupName = Grouping.GroupName_Other)] - public class ApbController : ControllerBase - { +namespace Tiobon.Core.Controllers.v1; +[Route("api/[controller]")] +[ApiController, ApiExplorerSettings(GroupName = Grouping.GroupName_Other)] +public class ApbController : ControllerBase +{ - /************************************************/ - // 如果不需要使用Http协议带名称的,比如这种 [HttpGet] - // 就可以按照下边的写法去写,在方法上直接加特性 [CustomRoute(ApiVersions.v1, "apbs")] - // 反之,如果你需要http协议带名称,请看 V2 文件夹的方法 - /************************************************/ - [HttpGet] - [CustomRoute(ApiVersions.V1, "apbs")] - public IEnumerable Get() - { - return new string[] { "第一版的 apbs" }; - } + /************************************************/ + // 如果不需要使用Http协议带名称的,比如这种 [HttpGet] + // 就可以按照下边的写法去写,在方法上直接加特性 [CustomRoute(ApiVersions.v1, "apbs")] + // 反之,如果你需要http协议带名称,请看 V2 文件夹的方法 + /************************************************/ - + [HttpGet] + [CustomRoute(ApiVersions.V1, "apbs")] + public IEnumerable Get() + { + return new string[] { "第一版的 apbs" }; } + + } diff --git a/Tiobon.Core.Api/Controllers/v2/ApbController.cs b/Tiobon.Core.Api/Controllers/v2/ApbController.cs index 498879e2..b33804b1 100644 --- a/Tiobon.Core.Api/Controllers/v2/ApbController.cs +++ b/Tiobon.Core.Api/Controllers/v2/ApbController.cs @@ -1,25 +1,24 @@ -namespace Tiobon.Core.Controllers.v2 +namespace Tiobon.Core.Controllers.v2; + +//[Route("api/[controller]")] +[ApiController] +[Authorize(Permissions.Name), ApiExplorerSettings(GroupName = Grouping.GroupName_Other)] +public class ApbController : ControllerBase { - //[Route("api/[controller]")] - [ApiController] - [Authorize(Permissions.Name), ApiExplorerSettings(GroupName = Grouping.GroupName_Other)] - public class ApbController : ControllerBase - { - /************************************************/ - // 如果需要使用Http协议带名称的,比如这种 [HttpGet("apbs")] - // 目前只能把[CustomRoute(ApiVersions.v2)] 提到 controller 的上边,做controller的特性 - // 并且去掉//[Route("api/[controller]")]路由特性,否则会有两个接口 - /************************************************/ + /************************************************/ + // 如果需要使用Http协议带名称的,比如这种 [HttpGet("apbs")] + // 目前只能把[CustomRoute(ApiVersions.v2)] 提到 controller 的上边,做controller的特性 + // 并且去掉//[Route("api/[controller]")]路由特性,否则会有两个接口 + /************************************************/ - [HttpGet("apbs")] - public IEnumerable Get() - { - return new string[] { "第二版的 apbs" }; - } + [HttpGet("apbs")] + public IEnumerable Get() + { + return new string[] { "第二版的 apbs" }; + } - } } diff --git a/Tiobon.Core.Api/Dockerfile b/Tiobon.Core.Api/Dockerfile deleted file mode 100644 index 347f80fe..00000000 --- a/Tiobon.Core.Api/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -#这种模式是先dotnet build后,然后再把dll进行构建镜像。 -#如果你想把这两步合在一起,可以看.sln根目录下的那个dockerfile。 - -#FROM swr.cn-south-1.myhuaweicloud.com/mcr/aspnet:5.0-alpine -#FROM mcr.microsoft.com/dotnet/core/aspnet:5.0-buster-slim -FROM mcr.microsoft.com/dotnet/aspnet:6.0-bullseye-slim -RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime -RUN echo 'Asia/Shanghai' >/etc/timezone - -#RUN apk add --no-cache ca-certificates python3 bash openssh git openssl-dev uwsgi uwsgi-python3 -#RUN apk add --no-cache --virtual .build-deps python3-dev gcc musl-dev libffi-dev make \ - #&& pip3 install --no-cache-dir --trusted-host mirrors.aliyun.com -i http://mirrors.aliyun.com/pypi/simple/ \ - #pymysql==0.8.1 \ - #Flask==1.0.2 \ - #Flask-RESTful==0.3.6 \ - #Flask-Script==2.0.6 \ - #Flask-SQLAlchemy==2.3.2 \ - #Flask-WTF==0.14.2 \ - #SQLAlchemy==1.2.7 \ - #simplejson==5.06.0 \ - #six==1.11.0 \ - #celery==4.2.1 \ - #xlrd==1.1.0 \ - #xlwt==1.3.0 \ - #msgpack==0.5.0 \ - #&& apk del .build-deps -# -#RUN git clone https://github.com/Supervisor/supervisor.git \ - #&& cd supervisor \ - #&& python3 setup.py install \ - #&& cd .. \ - #&& rm -rf supervisor \ - #&& cd /etc/ \ - #&& echo_supervisord_conf > supervisord.conf \ - #&& echo '[include]' >> supervisord.conf \ - #&& echo 'files = /code/supervisor/*.ini' >> supervisord.conf \ - #&& supervisord -c /etc/supervisord.conf -WORKDIR /app -COPY . . -EXPOSE 9291 -ENTRYPOINT ["dotnet", "Tiobon.Core.Api.dll","-b","0.0.0.0"] \ No newline at end of file diff --git a/Tiobon.Core.Api/Filter/AutofacPropertityModuleReg.cs b/Tiobon.Core.Api/Filter/AutofacPropertityModuleReg.cs index efc00228..39232484 100644 --- a/Tiobon.Core.Api/Filter/AutofacPropertityModuleReg.cs +++ b/Tiobon.Core.Api/Filter/AutofacPropertityModuleReg.cs @@ -1,19 +1,17 @@ using Autofac; -using Microsoft.AspNetCore.Mvc; -namespace Tiobon.Core.Filter +namespace Tiobon.Core.Filter; + +public class AutofacPropertityModuleReg : Autofac.Module { - public class AutofacPropertityModuleReg : Autofac.Module + protected override void Load(ContainerBuilder builder) { - protected override void Load(ContainerBuilder builder) - { - // 记得要启动服务注册 - // builder.Services.Replace(ServiceDescriptor.Transient()); - var controllerBaseType = typeof(ControllerBase); - builder.RegisterAssemblyTypes(typeof(Program).Assembly) - .Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType) - .PropertiesAutowired(); + // 记得要启动服务注册 + // builder.Services.Replace(ServiceDescriptor.Transient()); + var controllerBaseType = typeof(ControllerBase); + builder.RegisterAssemblyTypes(typeof(Program).Assembly) + .Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType) + .PropertiesAutowired(); - } } } diff --git a/Tiobon.Core.Api/Filter/CustomRouteAttribute.cs b/Tiobon.Core.Api/Filter/CustomRouteAttribute.cs index ad55d008..8db47bfd 100644 --- a/Tiobon.Core.Api/Filter/CustomRouteAttribute.cs +++ b/Tiobon.Core.Api/Filter/CustomRouteAttribute.cs @@ -1,35 +1,34 @@ using Microsoft.AspNetCore.Mvc.ApiExplorer; using static Tiobon.Core.Extensions.CustomApiVersion; -namespace Tiobon.Core.SwaggerHelper +namespace Tiobon.Core.SwaggerHelper; + +/// +/// 自定义路由 /api/{version}/[controler]/[action] +/// +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] +public class CustomRouteAttribute : RouteAttribute, IApiDescriptionGroupNameProvider { + /// - /// 自定义路由 /api/{version}/[controler]/[action] + /// 分组名称,是来实现接口 IApiDescriptionGroupNameProvider /// - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] - public class CustomRouteAttribute : RouteAttribute, IApiDescriptionGroupNameProvider - { + public string GroupName { get; set; } - /// - /// 分组名称,是来实现接口 IApiDescriptionGroupNameProvider - /// - public string GroupName { get; set; } - - /// - /// 自定义路由构造函数,继承基类路由 - /// - /// - public CustomRouteAttribute(string actionName = "[action]") : base("/api/{version}/[controller]/" + actionName) - { - } - /// - /// 自定义版本+路由构造函数,继承基类路由 - /// - /// - /// - public CustomRouteAttribute(ApiVersions version, string actionName = "") : base($"/api/{version.ToString()}/[controller]/{actionName}") - { - GroupName = version.ToString(); - } + /// + /// 自定义路由构造函数,继承基类路由 + /// + /// + public CustomRouteAttribute(string actionName = "[action]") : base("/api/{version}/[controller]/" + actionName) + { + } + /// + /// 自定义版本+路由构造函数,继承基类路由 + /// + /// + /// + public CustomRouteAttribute(ApiVersions version, string actionName = "") : base($"/api/{version.ToString()}/[controller]/{actionName}") + { + GroupName = version.ToString(); } } diff --git a/Tiobon.Core.Api/Filter/GlobalActionFilter.cs b/Tiobon.Core.Api/Filter/GlobalActionFilter.cs index b0298c3d..8e1c0874 100644 --- a/Tiobon.Core.Api/Filter/GlobalActionFilter.cs +++ b/Tiobon.Core.Api/Filter/GlobalActionFilter.cs @@ -1,259 +1,258 @@ using Microsoft.AspNetCore.Mvc.Filters; -namespace Tiobon.Core.Api.Filter +namespace Tiobon.Core.Api.Filter; + +/// +/// 全局请求验证 +/// +public class GlobalActionFilter : ActionFilterAttribute { /// - /// 全局请求验证 + /// + /// + public string Message { get; set; } + /// + /// /// - public class GlobalActionFilter : ActionFilterAttribute + /// + public override void OnActionExecuting(ActionExecutingContext filterContext) { - /// - /// - /// - public string Message { get; set; } - /// - /// - /// - /// - public override void OnActionExecuting(ActionExecutingContext filterContext) + //检查实体合法性 + if (!filterContext.ModelState.IsValid) { - //检查实体合法性 - if (!filterContext.ModelState.IsValid) + StringBuilder msg = new StringBuilder(); + foreach (var value in filterContext.ModelState.Values) { - StringBuilder msg = new StringBuilder(); - foreach (var value in filterContext.ModelState.Values) + if (value.Errors.Count > 0) { - if (value.Errors.Count > 0) + foreach (var error in value.Errors) { - foreach (var error in value.Errors) - { - msg.AppendLine(error.ErrorMessage); - } + msg.AppendLine(error.ErrorMessage); } } - filterContext.Result = new JsonResult(ServiceResult.OprateFailed($"参数验证失败:{msg}")); - return; } + filterContext.Result = new JsonResult(ServiceResult.OprateFailed($"参数验证失败:{msg}")); + return; + } - ////检查用户信息 - //var tenantId = filterContext.HttpContext.User?.Claims?.Where(o => o.Type == CustomClaimTypes.TenantId).FirstOrDefault()?.Value; - //var issuer = filterContext.HttpContext.User?.Claims?.Where(o => o.Type == CustomClaimTypes.Issuer).FirstOrDefault()?.Value; - //var userId = filterContext.HttpContext.User?.Claims?.Where(o => o.Type == CustomClaimTypes.UserId).FirstOrDefault()?.Value; - //var userName = filterContext.HttpContext.User?.Claims?.Where(o => o.Type == CustomClaimTypes.UserName).FirstOrDefault()?.Value; - //var sessionId = filterContext.HttpContext.User?.Claims?.Where(o => o.Type == CustomClaimTypes.SessionId).FirstOrDefault()?.Value; - //var sids = RedisHelper.Get>(string.Format(RedisConsts.SYSTEM_LOGIN_USERID, issuer, userId)) ?? new List(); - //if (string.IsNullOrEmpty(sessionId) || !sids.Any(o => o.ToString() == sessionId)) - //{ - // filterContext.Result = new JsonResult(MessageModel.OprateFailed(ResponseText.LOGIN_USER_QUIT, MessageModelCode.LoginFailed)); - // return; - //} + ////检查用户信息 + //var tenantId = filterContext.HttpContext.User?.Claims?.Where(o => o.Type == CustomClaimTypes.TenantId).FirstOrDefault()?.Value; + //var issuer = filterContext.HttpContext.User?.Claims?.Where(o => o.Type == CustomClaimTypes.Issuer).FirstOrDefault()?.Value; + //var userId = filterContext.HttpContext.User?.Claims?.Where(o => o.Type == CustomClaimTypes.UserId).FirstOrDefault()?.Value; + //var userName = filterContext.HttpContext.User?.Claims?.Where(o => o.Type == CustomClaimTypes.UserName).FirstOrDefault()?.Value; + //var sessionId = filterContext.HttpContext.User?.Claims?.Where(o => o.Type == CustomClaimTypes.SessionId).FirstOrDefault()?.Value; + //var sids = RedisHelper.Get>(string.Format(RedisConsts.SYSTEM_LOGIN_USERID, issuer, userId)) ?? new List(); + //if (string.IsNullOrEmpty(sessionId) || !sids.Any(o => o.ToString() == sessionId)) + //{ + // filterContext.Result = new JsonResult(MessageModel.OprateFailed(ResponseText.LOGIN_USER_QUIT, MessageModelCode.LoginFailed)); + // return; + //} - ////记录ip - //var ip = filterContext.HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault(); - //if (string.IsNullOrEmpty(ip)) - //{ - // ip = filterContext.HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString(); - //} - //var claims = new Claim[] { - // new Claim(CustomClaimTypes.RequestIp, ip),//添加IP - // }; - //filterContext.HttpContext.User.AddIdentity(new ClaimsIdentity(claims)); + ////记录ip + //var ip = filterContext.HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault(); + //if (string.IsNullOrEmpty(ip)) + //{ + // ip = filterContext.HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString(); + //} + //var claims = new Claim[] { + // new Claim(CustomClaimTypes.RequestIp, ip),//添加IP + // }; + //filterContext.HttpContext.User.AddIdentity(new ClaimsIdentity(claims)); - ////记录日志(GET请求不记录) - //if (filterContext.HttpContext.Request.Method != "GET") - //{ - // LoggerOperator.PushLogger(new Domain.Model.System.SystemLogger(Guid.NewGuid()) - // { - // Module = GetModel(filterContext.HttpContext.Request.Path), - // Type = GetType(filterContext.HttpContext.Request.Method, filterContext.HttpContext.Request.Path), - // Level = $"INFO", - // Content = $"{filterContext.HttpContext.User.Claims.FirstOrDefault(o => o.Type == CustomClaimTypes.Issuer)?.Value} {filterContext.HttpContext.Request.Path} {Dic2String(filterContext.ActionArguments)}", - // Creator = string.IsNullOrEmpty(userName) ? "sys" : userName, - // CreatorId = string.IsNullOrEmpty(userId) ? new Guid?() : Guid.Parse(userId), - // CreationTime = DateTimeHelper.Now(), - // TenantId = string.IsNullOrEmpty(tenantId) ? new Guid?() : Guid.Parse(tenantId) - // }); - // LoggerOperator.PushModelLogger(new Domain.Model.System.SystemModelLogger(Guid.NewGuid()) - // { - // Module = GetModel(filterContext.HttpContext.Request.Path), - // Oprate = filterContext.HttpContext.Request.Method, - // ApiUrl = GetPath(filterContext.HttpContext.Request.Path), - // Creator = string.IsNullOrEmpty(userName) ? "sys" : userName, - // CreatorId = string.IsNullOrEmpty(userId) ? new Guid?() : Guid.Parse(userId), - // CreationTime = DateTimeHelper.Now(), - // TenantId = string.IsNullOrEmpty(tenantId) ? new Guid?() : Guid.Parse(tenantId) - // }); - //} + ////记录日志(GET请求不记录) + //if (filterContext.HttpContext.Request.Method != "GET") + //{ + // LoggerOperator.PushLogger(new Domain.Model.System.SystemLogger(Guid.NewGuid()) + // { + // Module = GetModel(filterContext.HttpContext.Request.Path), + // Type = GetType(filterContext.HttpContext.Request.Method, filterContext.HttpContext.Request.Path), + // Level = $"INFO", + // Content = $"{filterContext.HttpContext.User.Claims.FirstOrDefault(o => o.Type == CustomClaimTypes.Issuer)?.Value} {filterContext.HttpContext.Request.Path} {Dic2String(filterContext.ActionArguments)}", + // Creator = string.IsNullOrEmpty(userName) ? "sys" : userName, + // CreatorId = string.IsNullOrEmpty(userId) ? new Guid?() : Guid.Parse(userId), + // CreationTime = DateTimeHelper.Now(), + // TenantId = string.IsNullOrEmpty(tenantId) ? new Guid?() : Guid.Parse(tenantId) + // }); + // LoggerOperator.PushModelLogger(new Domain.Model.System.SystemModelLogger(Guid.NewGuid()) + // { + // Module = GetModel(filterContext.HttpContext.Request.Path), + // Oprate = filterContext.HttpContext.Request.Method, + // ApiUrl = GetPath(filterContext.HttpContext.Request.Path), + // Creator = string.IsNullOrEmpty(userName) ? "sys" : userName, + // CreatorId = string.IsNullOrEmpty(userId) ? new Guid?() : Guid.Parse(userId), + // CreationTime = DateTimeHelper.Now(), + // TenantId = string.IsNullOrEmpty(tenantId) ? new Guid?() : Guid.Parse(tenantId) + // }); + //} - //LoggerOperator.PushTerminalLogger(filterContext.HttpContext.User.Claims.FirstOrDefault(o => o.Type == CustomClaimTypes.TerminalId)?.Value); - base.OnActionExecuting(filterContext); - } - private static string GetPath(string rpath) + //LoggerOperator.PushTerminalLogger(filterContext.HttpContext.User.Claims.FirstOrDefault(o => o.Type == CustomClaimTypes.TerminalId)?.Value); + base.OnActionExecuting(filterContext); + } + private static string GetPath(string rpath) + { + string res = rpath; + try { - string res = rpath; - try + StringBuilder sb = new StringBuilder(); + string[] empties = res.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < empties.Length; ++i) { - StringBuilder sb = new StringBuilder(); - string[] empties = res.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries); - for (int i = 0; i < empties.Length; ++i) + //36位长度,并且全为小写是ID + if (empties[i].Length == 36 && empties[i] == empties[i].ToLower()) { - //36位长度,并且全为小写是ID - if (empties[i].Length == 36 && empties[i] == empties[i].ToLower()) - { - continue; - } - sb.Append(empties[i]); - if (i != empties.Length - 1) - sb.Append("/"); - if (empties[i].ToLower().StartsWith("by")) - { - i++; - } + continue; + } + sb.Append(empties[i]); + if (i != empties.Length - 1) + sb.Append("/"); + if (empties[i].ToLower().StartsWith("by")) + { + i++; } - if (sb.Length > 0) - res = sb.ToString(); } - catch { } - return res; + if (sb.Length > 0) + res = sb.ToString(); } + catch { } + return res; + } - private static string Dic2String(IDictionary dic) + private static string Dic2String(IDictionary dic) + { + if (dic == null || dic.Keys.Count <= 0) + return string.Empty; + StringBuilder sb = new StringBuilder(); + try { - if (dic == null || dic.Keys.Count <= 0) - return string.Empty; - StringBuilder sb = new StringBuilder(); - try + foreach (KeyValuePair item in dic) { - foreach (KeyValuePair item in dic) - { - if (item.Value == null) - continue; - sb.Append($"{item.Key}:{(item.Value.ToString().StartsWith("{") ? item.Value.ToString() : Newtonsoft.Json.JsonConvert.SerializeObject(item.Value))};"); - } + if (item.Value == null) + continue; + sb.Append($"{item.Key}:{(item.Value.ToString().StartsWith("{") ? item.Value.ToString() : Newtonsoft.Json.JsonConvert.SerializeObject(item.Value))};"); } - catch { } - return sb.ToString(); } + catch { } + return sb.ToString(); + } - //private static string GetModel(string path) - //{ - // string model = SystemSetting.SYS_LOG_MODEL_SYS; - // if (path.StartsWith("/api/Dialysis")) - // { - // model = SystemSetting.SYS_LOG_MODEL_DIALYSIS; - // } - // else if (path.StartsWith("/api/Emr")) - // { - // model = SystemSetting.SYS_LOG_MODEL_PATIENT; - // } - // else if (path.StartsWith("/api/Dept")) - // { - // model = SystemSetting.SYS_LOG_MODEL_DEPT; - // } - // else if (path.StartsWith("/api/System")) - // { - // model = SystemSetting.SYS_LOG_MODEL_SYS; - // } - // else if (path.StartsWith("/api/Authorize")) - // { - // model = SystemSetting.SYS_LOG_MODEL_LOGIN; - // } - // else if (path.StartsWith("/api/Tmpl")) - // { - // model = SystemSetting.SYS_LOG_MODEL_TMPL; - // } - // else if (path.StartsWith("/api/Schedule")) - // { - // model = SystemSetting.SYS_LOG_MODEL_SCHEDULE; - // } + //private static string GetModel(string path) + //{ + // string model = SystemSetting.SYS_LOG_MODEL_SYS; + // if (path.StartsWith("/api/Dialysis")) + // { + // model = SystemSetting.SYS_LOG_MODEL_DIALYSIS; + // } + // else if (path.StartsWith("/api/Emr")) + // { + // model = SystemSetting.SYS_LOG_MODEL_PATIENT; + // } + // else if (path.StartsWith("/api/Dept")) + // { + // model = SystemSetting.SYS_LOG_MODEL_DEPT; + // } + // else if (path.StartsWith("/api/System")) + // { + // model = SystemSetting.SYS_LOG_MODEL_SYS; + // } + // else if (path.StartsWith("/api/Authorize")) + // { + // model = SystemSetting.SYS_LOG_MODEL_LOGIN; + // } + // else if (path.StartsWith("/api/Tmpl")) + // { + // model = SystemSetting.SYS_LOG_MODEL_TMPL; + // } + // else if (path.StartsWith("/api/Schedule")) + // { + // model = SystemSetting.SYS_LOG_MODEL_SCHEDULE; + // } - // return model; - //} - //private static string GetType(string method, string path) - //{ - // string type = SystemSetting.SYS_LOG_TYPE_OTHER; - // switch (method) - // { - // case "GET": - // type = SystemSetting.SYS_LOG_TYPE_QUERY; - // break; - // case "PUT": - // type = SystemSetting.SYS_LOG_TYPE_EDIT; - // break; - // case "POST": - // type = SystemSetting.SYS_LOG_TYPE_INSERTY; - // break; - // case "DELETE": - // type = SystemSetting.SYS_LOG_TYPE_DELETE; - // break; - // default: - // break; - // } - // if (path.StartsWith("/api/Token")) - // { - // type = SystemSetting.SYS_LOG_TYPE_LOGIN; - // } - // return type; - //} - /// - /// - /// - /// - public override void OnActionExecuted(ActionExecutedContext filterContext) - { - base.OnActionExecuted(filterContext); - } - /// - /// - /// - /// - public override void OnResultExecuting(ResultExecutingContext filterContext) + // return model; + //} + //private static string GetType(string method, string path) + //{ + // string type = SystemSetting.SYS_LOG_TYPE_OTHER; + // switch (method) + // { + // case "GET": + // type = SystemSetting.SYS_LOG_TYPE_QUERY; + // break; + // case "PUT": + // type = SystemSetting.SYS_LOG_TYPE_EDIT; + // break; + // case "POST": + // type = SystemSetting.SYS_LOG_TYPE_INSERTY; + // break; + // case "DELETE": + // type = SystemSetting.SYS_LOG_TYPE_DELETE; + // break; + // default: + // break; + // } + // if (path.StartsWith("/api/Token")) + // { + // type = SystemSetting.SYS_LOG_TYPE_LOGIN; + // } + // return type; + //} + /// + /// + /// + /// + public override void OnActionExecuted(ActionExecutedContext filterContext) + { + base.OnActionExecuted(filterContext); + } + /// + /// + /// + /// + public override void OnResultExecuting(ResultExecutingContext filterContext) + { + //400错误,统一处理 + if (filterContext.Result is BadRequestObjectResult badResult && badResult.StatusCode == 400) { - //400错误,统一处理 - if (filterContext.Result is BadRequestObjectResult badResult && badResult.StatusCode == 400) + var error = $"{filterContext.HttpContext.Request.Method} {filterContext.HttpContext.Request.Path} 请求的数据类型不正确"; + if (badResult.Value is Microsoft.AspNetCore.Mvc.ValidationProblemDetails values) { - var error = $"{filterContext.HttpContext.Request.Method} {filterContext.HttpContext.Request.Path} 请求的数据类型不正确"; - if (badResult.Value is Microsoft.AspNetCore.Mvc.ValidationProblemDetails values) + StringBuilder sb = new StringBuilder(); + foreach (var value in values.Errors) { - StringBuilder sb = new StringBuilder(); - foreach (var value in values.Errors) + if (value.Value is string[] empties && empties.Length > 0) { - if (value.Value is string[] empties && empties.Length > 0) + if (empties[0].Contains(". Path")) + { + sb.AppendLine($"{value.Key.ToString()}:{empties[0].Split(". Path")[0]}"); + } + else { - if (empties[0].Contains(". Path")) - { - sb.AppendLine($"{value.Key.ToString()}:{empties[0].Split(". Path")[0]}"); - } - else - { - sb.Append($"{value.Key.ToString()}:{empties[0]}"); - } + sb.Append($"{value.Key.ToString()}:{empties[0]}"); } } - error += $":{sb.ToString()}"; - filterContext.Result = new JsonResult(ServiceResult.OprateFailed($"请求的数据类型不正确:{error}")); } - else - { - filterContext.Result = new JsonResult(ServiceResult.OprateFailed(error)); - } - //LoggerHelper.SendLog(error); - return; + error += $":{sb.ToString()}"; + filterContext.Result = new JsonResult(ServiceResult.OprateFailed($"请求的数据类型不正确:{error}")); } - if (filterContext.Result is ObjectResult objectResult && objectResult.Value == null) + else { - filterContext.Result = new JsonResult(ServiceResult.OprateSuccess("查询成功")); + filterContext.Result = new JsonResult(ServiceResult.OprateFailed(error)); } - - base.OnResultExecuting(filterContext); + //LoggerHelper.SendLog(error); + return; } - /// - /// - /// - /// - public override void OnResultExecuted(ResultExecutedContext filterContext) + if (filterContext.Result is ObjectResult objectResult && objectResult.Value == null) { - base.OnResultExecuted(filterContext); + filterContext.Result = new JsonResult(ServiceResult.OprateSuccess("查询成功")); } + + base.OnResultExecuting(filterContext); + } + /// + /// + /// + /// + public override void OnResultExecuted(ResultExecutedContext filterContext) + { + base.OnResultExecuted(filterContext); } } diff --git a/Tiobon.Core.Api/Filter/GlobalAuthorizeFilter.cs b/Tiobon.Core.Api/Filter/GlobalAuthorizeFilter.cs index 30cb7cdd..38144bd9 100644 --- a/Tiobon.Core.Api/Filter/GlobalAuthorizeFilter.cs +++ b/Tiobon.Core.Api/Filter/GlobalAuthorizeFilter.cs @@ -2,53 +2,49 @@ using Microsoft.AspNetCore.Mvc.Authorization; using Microsoft.AspNetCore.Mvc.Filters; -namespace Tiobon.Core.Filter +namespace Tiobon.Core.Filter; + +/// +/// Summary:全局路由权限公约 +/// Remarks:目的是针对不同的路由,采用不同的授权过滤器 +/// 如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略 +/// 否则,如果想特例其他授权机制的话,需要在 controller 上带上 [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")] +/// +public class GlobalRouteAuthorizeConvention : IApplicationModelConvention { - /// - /// Summary:全局路由权限公约 - /// Remarks:目的是针对不同的路由,采用不同的授权过滤器 - /// 如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略 - /// 否则,如果想特例其他授权机制的话,需要在 controller 上带上 [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")] - /// - public class GlobalRouteAuthorizeConvention : IApplicationModelConvention + public void Apply(ApplicationModel application) { - public void Apply(ApplicationModel application) + foreach (var c in application.Controllers) { - foreach (var c in application.Controllers) + if (!c.Filters.Any(e => e is AuthorizeFilter)) { - if (!c.Filters.Any(e => e is AuthorizeFilter)) - { - // 没有写特性,就用全局的 Permission 授权 - c.Filters.Add(new AuthorizeFilter(Permissions.Name)); - } - else { - // 写了特性,[Authorize] 或 [AllowAnonymous] ,根据情况进行权限认证 - } - + // 没有写特性,就用全局的 Permission 授权 + c.Filters.Add(new AuthorizeFilter(Permissions.Name)); + } + else { + // 写了特性,[Authorize] 或 [AllowAnonymous] ,根据情况进行权限认证 } + } } +} - /// - /// 全局权限过滤器【无效】 - /// - public class GlobalAuthorizeFilter : AuthorizeFilter - { +/// +/// 全局权限过滤器【无效】 +/// +public class GlobalAuthorizeFilter : AuthorizeFilter +{ - public override Task OnAuthorizationAsync(AuthorizationFilterContext context) + public override Task OnAuthorizationAsync(AuthorizationFilterContext context) + { + if (context.Filters.Any(item => item is IAsyncAuthorizationFilter && item != this)) { - if (context.Filters.Any(item => item is IAsyncAuthorizationFilter && item != this)) - { - return Task.FromResult(0); - } - - - return base.OnAuthorizationAsync(context); - - + return Task.FromResult(0); } - } + return base.OnAuthorizationAsync(context); + + } } diff --git a/Tiobon.Core.Api/Filter/GlobalExceptionFilter.cs b/Tiobon.Core.Api/Filter/GlobalExceptionFilter.cs index e2c1971b..5d40b5f1 100644 --- a/Tiobon.Core.Api/Filter/GlobalExceptionFilter.cs +++ b/Tiobon.Core.Api/Filter/GlobalExceptionFilter.cs @@ -3,89 +3,87 @@ using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.SignalR; using StackExchange.Profiling; -namespace Tiobon.Core.Filter +namespace Tiobon.Core.Filter; + +/// +/// 全局异常错误日志 +/// +public class GlobalExceptionsFilter : IExceptionFilter { - /// - /// 全局异常错误日志 - /// - public class GlobalExceptionsFilter : IExceptionFilter + private readonly IWebHostEnvironment _env; + private readonly IHubContext _hubContext; + private readonly ILogger _loggerHelper; + + public GlobalExceptionsFilter(IWebHostEnvironment env, ILogger loggerHelper, IHubContext hubContext) { - private readonly IWebHostEnvironment _env; - private readonly IHubContext _hubContext; - private readonly ILogger _loggerHelper; + _env = env; + _loggerHelper = loggerHelper; + _hubContext = hubContext; + } + + public void OnException(ExceptionContext context) + { + var json = new ServiceResult(); - public GlobalExceptionsFilter(IWebHostEnvironment env, ILogger loggerHelper, IHubContext hubContext) + json.Message = context.Exception.Message;//错误信息 + json.Status = 500;//500异常 + var errorAudit = "Unable to resolve service for"; + if (!string.IsNullOrEmpty(json.Message) && json.Message.Contains(errorAudit)) { - _env = env; - _loggerHelper = loggerHelper; - _hubContext = hubContext; + json.Message = json.Message.Replace(errorAudit, $"(若新添加服务,需要重新编译项目){errorAudit}"); } - public void OnException(ExceptionContext context) + if (_env.EnvironmentName.ObjToString().Equals("Development")) { - var json = new ServiceResult(); - - json.Message = context.Exception.Message;//错误信息 - json.Status = 500;//500异常 - var errorAudit = "Unable to resolve service for"; - if (!string.IsNullOrEmpty(json.Message) && json.Message.Contains(errorAudit)) - { - json.Message = json.Message.Replace(errorAudit, $"(若新添加服务,需要重新编译项目){errorAudit}"); - } - - if (_env.EnvironmentName.ObjToString().Equals("Development")) - { - json.MessageDev = context.Exception.StackTrace;//堆栈信息 - } - var res = new ContentResult(); - res.Content = JsonHelper.GetJSON>(json); - - context.Result = res; - - MiniProfiler.Current.CustomTiming("Errors:", json.Message); - + json.MessageDev = context.Exception.StackTrace;//堆栈信息 + } + var res = new ContentResult(); + res.Content = JsonHelper.GetJSON>(json); - //进行错误日志记录 - _loggerHelper.LogError(json.Message + WriteLog(json.Message, context.Exception)); - if (AppSettings.app(new string[] { "Middleware", "SignalRSendLog", "Enabled" }).ObjToBool()) - { - _hubContext.Clients.All.SendAsync("ReceiveUpdate", LogLock.GetLogData()).Wait(); - } + context.Result = res; + MiniProfiler.Current.CustomTiming("Errors:", json.Message); - } - /// - /// 自定义返回格式 - /// - /// - /// - /// - public string WriteLog(string throwMsg, Exception ex) + //进行错误日志记录 + _loggerHelper.LogError(json.Message + WriteLog(json.Message, context.Exception)); + if (AppSettings.app(new string[] { "Middleware", "SignalRSendLog", "Enabled" }).ObjToBool()) { - return string.Format("\r\n【自定义错误】:{0} \r\n【异常类型】:{1} \r\n【异常信息】:{2} \r\n【堆栈调用】:{3}", new object[] { throwMsg, - ex.GetType().Name, ex.Message, ex.StackTrace }); + _hubContext.Clients.All.SendAsync("ReceiveUpdate", LogLock.GetLogData()).Wait(); } + } - public class InternalServerErrorObjectResult : ObjectResult + + /// + /// 自定义返回格式 + /// + /// + /// + /// + public string WriteLog(string throwMsg, Exception ex) { - public InternalServerErrorObjectResult(object value) : base(value) - { - StatusCode = StatusCodes.Status500InternalServerError; - } + return string.Format("\r\n【自定义错误】:{0} \r\n【异常类型】:{1} \r\n【异常信息】:{2} \r\n【堆栈调用】:{3}", new object[] { throwMsg, + ex.GetType().Name, ex.Message, ex.StackTrace }); } - //返回错误信息 - public class JsonErrorResponse + +} +public class InternalServerErrorObjectResult : ObjectResult +{ + public InternalServerErrorObjectResult(object value) : base(value) { - /// - /// 生产环境的消息 - /// - public string Message { get; set; } - /// - /// 开发环境的消息 - /// - public string DevelopmentMessage { get; set; } + StatusCode = StatusCodes.Status500InternalServerError; } - +} +//返回错误信息 +public class JsonErrorResponse +{ + /// + /// 生产环境的消息 + /// + public string Message { get; set; } + /// + /// 开发环境的消息 + /// + public string DevelopmentMessage { get; set; } } diff --git a/Tiobon.Core.Api/Filter/GlobalRoutePrefixFilter.cs b/Tiobon.Core.Api/Filter/GlobalRoutePrefixFilter.cs index a9a5bb59..264cfd74 100644 --- a/Tiobon.Core.Api/Filter/GlobalRoutePrefixFilter.cs +++ b/Tiobon.Core.Api/Filter/GlobalRoutePrefixFilter.cs @@ -1,50 +1,48 @@ using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Mvc.Routing; -namespace Tiobon.Core.Filter +namespace Tiobon.Core.Filter; + +/// +/// 全局路由前缀公约 +/// +public class GlobalRoutePrefixFilter : IApplicationModelConvention { - /// - /// 全局路由前缀公约 - /// - public class GlobalRoutePrefixFilter : IApplicationModelConvention - { - private readonly AttributeRouteModel _centralPrefix; + private readonly AttributeRouteModel _centralPrefix; - public GlobalRoutePrefixFilter(IRouteTemplateProvider routeTemplateProvider) - { - _centralPrefix = new AttributeRouteModel(routeTemplateProvider); - } + public GlobalRoutePrefixFilter(IRouteTemplateProvider routeTemplateProvider) + { + _centralPrefix = new AttributeRouteModel(routeTemplateProvider); + } - //接口的Apply方法 - public void Apply(ApplicationModel application) + //接口的Apply方法 + public void Apply(ApplicationModel application) + { + //遍历所有的 Controller + foreach (var controller in application.Controllers) { - //遍历所有的 Controller - foreach (var controller in application.Controllers) + // 已经标记了 RouteAttribute 的 Controller + var matchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel != null).ToList(); + if (matchedSelectors.Any()) { - // 已经标记了 RouteAttribute 的 Controller - var matchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel != null).ToList(); - if (matchedSelectors.Any()) + foreach (var selectorModel in matchedSelectors) { - foreach (var selectorModel in matchedSelectors) - { - // 在 当前路由上 再 添加一个 路由前缀 - selectorModel.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_centralPrefix, - selectorModel.AttributeRouteModel); - } + // 在 当前路由上 再 添加一个 路由前缀 + selectorModel.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_centralPrefix, + selectorModel.AttributeRouteModel); } + } - // 没有标记 RouteAttribute 的 Controller - var unmatchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel == null).ToList(); - if (unmatchedSelectors.Any()) + // 没有标记 RouteAttribute 的 Controller + var unmatchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel == null).ToList(); + if (unmatchedSelectors.Any()) + { + foreach (var selectorModel in unmatchedSelectors) { - foreach (var selectorModel in unmatchedSelectors) - { - // 添加一个 路由前缀 - selectorModel.AttributeRouteModel = _centralPrefix; - } + // 添加一个 路由前缀 + selectorModel.AttributeRouteModel = _centralPrefix; } } } } - } diff --git a/Tiobon.Core.Api/Filter/UseServiceDIAttribute.cs b/Tiobon.Core.Api/Filter/UseServiceDIAttribute.cs index d213225f..ff57d734 100644 --- a/Tiobon.Core.Api/Filter/UseServiceDIAttribute.cs +++ b/Tiobon.Core.Api/Filter/UseServiceDIAttribute.cs @@ -1,34 +1,33 @@ using Microsoft.AspNetCore.Mvc.Filters; -namespace Tiobon.Core.Filter +namespace Tiobon.Core.Filter; + +public class UseServiceDIAttribute : ActionFilterAttribute { - public class UseServiceDIAttribute : ActionFilterAttribute - { - protected readonly ILogger _logger; - private readonly ITiobonArticleServices _TiobonArticleServices; - private readonly string _name; + protected readonly ILogger _logger; + private readonly ITiobonArticleServices _TiobonArticleServices; + private readonly string _name; - public UseServiceDIAttribute(ILogger logger, ITiobonArticleServices TiobonArticleServices, string Name = "") - { - _logger = logger; - _TiobonArticleServices = TiobonArticleServices; - _name = Name; - } + public UseServiceDIAttribute(ILogger logger, ITiobonArticleServices TiobonArticleServices, string Name = "") + { + _logger = logger; + _TiobonArticleServices = TiobonArticleServices; + _name = Name; + } - public override void OnActionExecuted(ActionExecutedContext context) - { - var dd = _TiobonArticleServices.Query().Result; - _logger.LogInformation("测试自定义服务特性"); - Console.WriteLine(_name); - base.OnActionExecuted(context); - DeleteSubscriptionFiles(); - } + public override void OnActionExecuted(ActionExecutedContext context) + { + var dd = _TiobonArticleServices.Query().Result; + _logger.LogInformation("测试自定义服务特性"); + Console.WriteLine(_name); + base.OnActionExecuted(context); + DeleteSubscriptionFiles(); + } - private void DeleteSubscriptionFiles() - { + private void DeleteSubscriptionFiles() + { - } } } diff --git a/Tiobon.Core.Api/Filter/UserRegisterVo.cs b/Tiobon.Core.Api/Filter/UserRegisterVo.cs index d48f9c69..5d6da6f0 100644 --- a/Tiobon.Core.Api/Filter/UserRegisterVo.cs +++ b/Tiobon.Core.Api/Filter/UserRegisterVo.cs @@ -1,66 +1,64 @@ using FluentValidation; -namespace Tiobon.Core.Filter +namespace Tiobon.Core.Filter; + +public class UserRegisterVo { - public class UserRegisterVo - { - public string WxUid { get; set; } + public string WxUid { get; set; } - public string Telphone { get; set; } + public string Telphone { get; set; } - public string NickName { get; set; } + public string NickName { get; set; } - public string SourceType { get; set; } - public IEnumerable Cars { get; set; } + public string SourceType { get; set; } + public IEnumerable Cars { get; set; } - } +} - public class CarInfo - { - public int CarCount { get; set; } - public int CarSize { get; set; } - } +public class CarInfo +{ + public int CarCount { get; set; } + public int CarSize { get; set; } +} - public class UserRegisterVoValidator : AbstractValidator +public class UserRegisterVoValidator : AbstractValidator +{ + public UserRegisterVoValidator() { - public UserRegisterVoValidator() + When(x => !string.IsNullOrEmpty(x.NickName) || !string.IsNullOrEmpty(x.Telphone), () => { - When(x => !string.IsNullOrEmpty(x.NickName) || !string.IsNullOrEmpty(x.Telphone), () => - { - RuleFor(x => x.NickName) - .Must(e => IsLegalName(e)).WithMessage("请填写合法的姓名,必须是汉字和字母"); - RuleFor(x => x.Telphone) - .Must(e => IsLegalPhone(e)).WithMessage("请填写正确的手机号码"); - RuleFor(x => x.Cars) - .NotNull().NotEmpty().WithMessage("车辆信息不正确"); - RuleForEach(x => x.Cars).SetValidator(new CarInfoValidator()); - }); + RuleFor(x => x.NickName) + .Must(e => IsLegalName(e)).WithMessage("请填写合法的姓名,必须是汉字和字母"); + RuleFor(x => x.Telphone) + .Must(e => IsLegalPhone(e)).WithMessage("请填写正确的手机号码"); + RuleFor(x => x.Cars) + .NotNull().NotEmpty().WithMessage("车辆信息不正确"); + RuleForEach(x => x.Cars).SetValidator(new CarInfoValidator()); + }); - } + } - public static bool IsLegalName(string username) - { - //判断用户名是否合法 - const string pattern = "(^([A-Za-z]|[\u4E00-\u9FA5]){1,10}$)"; - return (!string.IsNullOrEmpty(username) && Regex.IsMatch(username, pattern)); - } - public static bool IsLegalPhone(string phone) - { - //判断手机号 - const string pattern = "(^1\\d{10}$)"; - return (!string.IsNullOrEmpty(phone) && Regex.IsMatch(phone, pattern)); - } + public static bool IsLegalName(string username) + { + //判断用户名是否合法 + const string pattern = "(^([A-Za-z]|[\u4E00-\u9FA5]){1,10}$)"; + return (!string.IsNullOrEmpty(username) && Regex.IsMatch(username, pattern)); } - public class CarInfoValidator : AbstractValidator + public static bool IsLegalPhone(string phone) { - public CarInfoValidator() - { - RuleFor(x => x.CarCount) - .GreaterThanOrEqualTo(0).WithMessage("车辆数量必须大于等于0") - .LessThanOrEqualTo(500).WithMessage($"存在车型数量已达上限"); - RuleFor(x => x.CarSize) - .IsInEnum().WithMessage("车型不正确"); - } + //判断手机号 + const string pattern = "(^1\\d{10}$)"; + return (!string.IsNullOrEmpty(phone) && Regex.IsMatch(phone, pattern)); + } +} +public class CarInfoValidator : AbstractValidator +{ + public CarInfoValidator() + { + RuleFor(x => x.CarCount) + .GreaterThanOrEqualTo(0).WithMessage("车辆数量必须大于等于0") + .LessThanOrEqualTo(500).WithMessage($"存在车型数量已达上限"); + RuleFor(x => x.CarSize) + .IsInEnum().WithMessage("车型不正确"); } - } \ No newline at end of file diff --git a/Tiobon.Core.Api/StopContainerImg.sh b/Tiobon.Core.Api/StopContainerImg.sh deleted file mode 100644 index 0bffe029..00000000 --- a/Tiobon.Core.Api/StopContainerImg.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -docker ps|grep ${1}|while read i;do i; -echo "容器已启动,详细信息:${i}"; -docker stop ${1}; -docker rm ${1}; -docker rmi ${2}; -echo "已关闭容器,${1}" ; -done; \ No newline at end of file diff --git a/Tiobon.Core.Api/Tiobon.Core.Api.csproj b/Tiobon.Core.Api/Tiobon.Core.Api.csproj index 3a83b4f5..4cb6815c 100644 --- a/Tiobon.Core.Api/Tiobon.Core.Api.csproj +++ b/Tiobon.Core.Api/Tiobon.Core.Api.csproj @@ -121,15 +121,6 @@ - - - Always - - - Always - - - diff --git a/Tiobon.Core/Tiobon.Core.Model.xml b/Tiobon.Core/Tiobon.Core.Model.xml index dfdba8fc..6ba3f32b 100644 --- a/Tiobon.Core/Tiobon.Core.Model.xml +++ b/Tiobon.Core/Tiobon.Core.Model.xml @@ -13812,26 +13812,6 @@ Ghrz_Shihua_OA_Employment (Dto.InsertInput) - - - 用户访问趋势日志 - - - - - 用户 - - - - - 次数 - - - - - 更新时间 - - 博客文章 @@ -30192,36 +30172,6 @@ 已逾期 - - - 无任何权限 - - - - - 自定义权限 - - - - - 本部门 - - - - - 本部门及以下 - - - - - 仅自己 - - - - - 所有 - - 真实表名(数据库表名,若没有填写默认实体为表名) @@ -30432,8 +30382,8 @@ 所需分页参数 - 作者:胡丁文 - 时间:2020-4-3 20:31:26 + 作者:SimonHsiao + 时间:2024-5-3 20:31:26 @@ -30456,21 +30406,6 @@ 查询条件( 例如:id = 1 and name = 小明) - - - 无权限 - - - - - 找不到指定资源 - - - - - 找不到指定资源 - - 服务层响应实体(泛型) @@ -30605,31 +30540,6 @@ 数据库读取类型 - - - 表格数据,支持分页 - - - - - 返回编码 - - - - - 返回信息 - - - - - 记录总数 - - - - - 返回数据集 - - 租户模型接口 @@ -31052,394 +30962,6 @@ - - - 商户号 - - - - - 柜台号 - - - - - 分行号 - - - - - 集团商户信息 - - - - - 交易码 - - - - - 商户类型 - - - - - 终端编号 1 - - - - - 终端编号 2 - - - - - 订单号 - - - - - 码信息(一维码、二维码) - - - - - 订单金额,单位:元 - - - - - 商品名称 - - - - - 备注 1 - - - - - 备注 2 - - - - - 分账信息一 - - - - - 分账信息二 - - - - - 子商户公众账号 ID - - - - - 返回信息位图 - - - - - 实名支付 - - - - - 商品详情 - - - - - 订单优惠标记 - - - - - 公钥 - - - - - 请求地址 - - - - - 是否删除空值 - - - - - 退款参数 - - - - - 订单ID - - - - - 商品名称 - - - - - 支付金额(小数点最多两位) - - - - - 二维码/条码信息 - - - - - 备注信息1 - - - - - 备注信息2 - - - - - 订单参数 - - - - - 订单号 - - - - - 退款金额 - - - - - 退款流水号(可选) - - - - - 退款返回消息 - - - - - 序列号 - - - - - 商户号 - - - - - 交易码 - - - - - 返回码 - - - - - 返回码说明 - - - - - 语言 - - - - - 订单信息 - - - - - 订单信息 - - - - - 订单号 - - - - - 支付金额 - - - - - 退款金额 - - - - - 备注1 - - - - - 备注2 - - - - - 退款返回结果消息 - - - - - 订单号 - - - - - 支付金额 - - - - - 退款金额 - - - - - 序列号 - - - - - 商户号 - - - - - 交易码 - - - - - 返回码 - - - - - 返回码说明 - - - - - 语言 - - - - - 支付结果dto - - - - - 支付结果 - Y:成功 - N:失败 - U:不确定 - Q:待轮询 - - - - - 订单ID - - - - - 支付金额 - - - - - 二维码类型 - 1:龙支付 - 2:微信 - 3:支付宝 - 4:银联 - - - - - 等待时间-轮询等待时间 - - - - - 全局事件跟踪号-建行交易流水号 - - - - - 错误码 - - - - - 错误信息 - - - - - 验证签名-防止伪造攻击 - - - - - 返回支付结果 - - - - - 发起的订单ID - - - - - 返回支付的金额 - - - - - 返回支付的类型 1:龙支付 2:微信 3:支付宝 4:银联 - - - - - 返回建行的流水号 - - - - - 错误代码 - - - - - 错误信息 - - 实现IJob的类 diff --git a/Tiobon.Core/Tiobon.Core.xml b/Tiobon.Core/Tiobon.Core.xml index dce1eeee..7c38ced3 100644 --- a/Tiobon.Core/Tiobon.Core.xml +++ b/Tiobon.Core/Tiobon.Core.xml @@ -597,6 +597,34 @@ langId + + + 面试官-简历筛选通过率 + + langId + + + + + HR推荐-简历筛选通过率 + + langId + + + + + 面试官-简历筛选通过率 + + langId + + + + + HR推荐-简历筛选通过率 + + langId + + 分页获取