core 框架代码整理优化

master
xiaochanghai 5 months ago
parent bfb4afa1ae
commit ec8548c70d
  1. 83
      Tiobon.Core.Api/Controllers/Base/BaseApiController.cs
  2. 5
      Tiobon.Core.Api/Controllers/Base/BaseController.cs
  3. 407
      Tiobon.Core.Api/Controllers/BlogController.cs
  4. 293
      Tiobon.Core.Api/Controllers/DbFirst/DbFirstController.cs
  5. 517
      Tiobon.Core.Api/Controllers/DbFirst/MigrateController.cs
  6. 6
      Tiobon.Core.Api/Controllers/FileController.cs
  7. 558
      Tiobon.Core.Api/Controllers/LoginController.cs
  8. 1
      Tiobon.Core.Api/Controllers/Systems/CacheManageController.cs
  9. 7
      Tiobon.Core.Api/Controllers/Systems/DataBaseController.cs
  10. 3
      Tiobon.Core.Api/Controllers/Systems/DynamicCodeFirstController.cs
  11. 779
      Tiobon.Core.Api/Controllers/TasksQzController.cs
  12. 33
      Tiobon.Core.Api/Controllers/v1/ApbController.cs
  13. 33
      Tiobon.Core.Api/Controllers/v2/ApbController.cs
  14. 41
      Tiobon.Core.Api/Dockerfile
  15. 22
      Tiobon.Core.Api/Filter/AutofacPropertityModuleReg.cs
  16. 51
      Tiobon.Core.Api/Filter/CustomRouteAttribute.cs
  17. 425
      Tiobon.Core.Api/Filter/GlobalActionFilter.cs
  18. 64
      Tiobon.Core.Api/Filter/GlobalAuthorizeFilter.cs
  19. 130
      Tiobon.Core.Api/Filter/GlobalExceptionFilter.cs
  20. 64
      Tiobon.Core.Api/Filter/GlobalRoutePrefixFilter.cs
  21. 45
      Tiobon.Core.Api/Filter/UseServiceDIAttribute.cs
  22. 96
      Tiobon.Core.Api/Filter/UserRegisterVo.cs
  23. 8
      Tiobon.Core.Api/StopContainerImg.sh
  24. 9
      Tiobon.Core.Api/Tiobon.Core.Api.csproj
  25. 482
      Tiobon.Core/Tiobon.Core.Model.xml
  26. 28
      Tiobon.Core/Tiobon.Core.xml

@ -1,51 +1,50 @@
namespace Tiobon.Core.Controllers
namespace Tiobon.Core.Controllers;
public class BaseApiController : Controller
{
public class BaseApiController : Controller
[NonAction]
public ServiceResult<T> Success<T>(T data, string msg = "成功")
{
[NonAction]
public ServiceResult<T> Success<T>(T data, string msg = "成功")
{
return new ServiceResult<T>() { Success = true, Message = msg, Data = data, };
}
return new ServiceResult<T>() { Success = true, Message = msg, Data = data, };
}
// [NonAction]
//public ServiceResult<T> Success<T>(T data, string msg = "成功",bool success = true)
//{
// return new ServiceResult<T>()
// {
// success = success,
// msg = msg,
// response = data,
// };
//}
[NonAction]
public ServiceResult Success(string msg = "成功")
{
return new ServiceResult() { Success = true, Message = msg, Data = null, };
}
// [NonAction]
//public ServiceResult<T> Success<T>(T data, string msg = "成功",bool success = true)
//{
// return new ServiceResult<T>()
// {
// success = success,
// msg = msg,
// response = data,
// };
//}
[NonAction]
public ServiceResult Success(string msg = "成功")
{
return new ServiceResult() { Success = true, Message = msg, Data = null, };
}
[NonAction]
public ServiceResult<string> Failed(string msg = "失败", int status = 500)
{
return new ServiceResult<string>() { Success = false, Status = status, Message = msg, Data = null, };
}
[NonAction]
public ServiceResult<string> Failed(string msg = "失败", int status = 500)
{
return new ServiceResult<string>() { Success = false, Status = status, Message = msg, Data = null, };
}
[NonAction]
public ServiceResult<T> Failed<T>(string msg = "失败", int status = 500)
{
return new ServiceResult<T>() { Success = false, Status = status, Message = msg, Data = default, };
}
[NonAction]
public ServiceResult<T> Failed<T>(string msg = "失败", int status = 500)
{
return new ServiceResult<T>() { Success = false, Status = status, Message = msg, Data = default, };
}
[NonAction]
public ServiceResult<PageModel<T>> SuccessPage<T>(int page, int dataCount, int pageSize, List<T> data, int pageCount, string msg = "获取成功")
{
return new ServiceResult<PageModel<T>>() { Success = true, Message = msg, Data = new PageModel<T>(page, dataCount, pageSize, data) };
}
[NonAction]
public ServiceResult<PageModel<T>> SuccessPage<T>(int page, int dataCount, int pageSize, List<T> data, int pageCount, string msg = "获取成功")
{
return new ServiceResult<PageModel<T>>() { Success = true, Message = msg, Data = new PageModel<T>(page, dataCount, pageSize, data) };
}
[NonAction]
public ServiceResult<PageModel<T>> SuccessPage<T>(PageModel<T> pageModel, string msg = "获取成功")
{
return new ServiceResult<PageModel<T>>() { Success = true, Message = msg, Data = pageModel };
}
[NonAction]
public ServiceResult<PageModel<T>> SuccessPage<T>(PageModel<T> pageModel, string msg = "获取成功")
{
return new ServiceResult<PageModel<T>>() { Success = true, Message = msg, Data = pageModel };
}
}

@ -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;

@ -2,267 +2,266 @@
using StackExchange.Profiling;
using static Tiobon.Core.Extensions.CustomApiVersion;
namespace Tiobon.Core.Controllers
namespace Tiobon.Core.Controllers;
/// <summary>
/// 博客管理
/// </summary>
[Produces("application/json")]
[Route("api/Tiobon"), ApiExplorerSettings(GroupName = Grouping.GroupName_Other)]
public class TiobonController : BaseApiController
{
public ITiobonArticleServices _TiobonArticleServices { get; set; }
private readonly ILogger<TiobonController> _logger;
/// <summary>
/// 博客管理
/// 构造函数
/// </summary>
[Produces("application/json")]
[Route("api/Tiobon"), ApiExplorerSettings(GroupName = Grouping.GroupName_Other)]
public class TiobonController : BaseApiController
/// <param name="logger"></param>
///
public TiobonController(ILogger<TiobonController> logger)
{
public ITiobonArticleServices _TiobonArticleServices { get; set; }
private readonly ILogger<TiobonController> _logger;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="logger"></param>
///
public TiobonController(ILogger<TiobonController> logger)
{
_logger = logger;
}
_logger = logger;
}
/// <summary>
/// 获取博客列表【无权限】
/// </summary>
/// <param name="id"></param>
/// <param name="page"></param>
/// <param name="bcategory"></param>
/// <param name="key"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<PageModel<TiobonArticle>>> Get(int id, int page = 1, string bcategory = "技术博文", string key = "")
/// <summary>
/// 获取博客列表【无权限】
/// </summary>
/// <param name="id"></param>
/// <param name="page"></param>
/// <param name="bcategory"></param>
/// <param name="key"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<PageModel<TiobonArticle>>> 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<Func<TiobonArticle, bool>> whereExpression = a => (a.bcategory == bcategory && a.IsDeleted == false) && ((a.btitle != null && a.btitle.Contains(key)) || (a.bcontent != null && a.bcontent.Contains(key)));
Expression<Func<TiobonArticle, bool>> 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);
}
/// <summary>
/// 获取博客详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
//[Authorize(Policy = "Scope_TiobonModule_Policy")]
[Authorize]
public async Task<ServiceResult<TiobonViewModels>> Get(long id)
{
return Success(await _TiobonArticleServices.GetTiobonDetails(id));
}
return SuccessPage(pageModelTiobon);
}
/// <summary>
/// 获取详情【无权限】
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[Route("DetailNuxtNoPer")]
public async Task<ServiceResult<TiobonViewModels>> DetailNuxtNoPer(long id)
{
_logger.LogInformation("xxxxxxxxxxxxxxxxxxx");
Log.Information("yyyyyyyyyyyyyyyyy");
return Success(await _TiobonArticleServices.GetTiobonDetails(id));
}
[HttpGet]
[Route("GoUrl")]
public async Task<IActionResult> 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);
}
/// <summary>
/// 获取博客详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
//[Authorize(Policy = "Scope_TiobonModule_Policy")]
[Authorize]
public async Task<ServiceResult<TiobonViewModels>> Get(long id)
{
return Success(await _TiobonArticleServices.GetTiobonDetails(id));
}
}
return Ok();
}
/// <summary>
/// 获取详情【无权限】
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
[Route("DetailNuxtNoPer")]
public async Task<ServiceResult<TiobonViewModels>> DetailNuxtNoPer(long id)
{
_logger.LogInformation("xxxxxxxxxxxxxxxxxxx");
Log.Information("yyyyyyyyyyyyyyyyy");
return Success(await _TiobonArticleServices.GetTiobonDetails(id));
}
[HttpGet]
[Route("GetTiobonsByTypesForMVP")]
public async Task<ServiceResult<List<TiobonArticle>>> GetTiobonsByTypesForMVP(string types = "", int id = 0)
[HttpGet]
[Route("GoUrl")]
public async Task<IActionResult> 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<TiobonArticle>() { });
}
[HttpGet]
[Route("GetTiobonByIdForMVP")]
public async Task<ServiceResult<TiobonArticle>> GetTiobonByIdForMVP(long id = 0)
{
if (id > 0)
{
return Success(await _TiobonArticleServices.QueryById(id));
}
return Success(new TiobonArticle());
}
/// <summary>
/// 获取博客测试信息 v2版本
/// </summary>
/// <returns></returns>
[HttpGet]
////MVC自带特性 对 api 进行组管理
//[ApiExplorerSettings(GroupName = "v2")]
////路径 如果以 / 开头,表示绝对路径,反之相对 controller 的想u地路径
//[Route("/api/v2/Tiobon/Tiobontest")]
//和上边的版本控制以及路由地址都是一样的
return Ok();
}
[CustomRoute(ApiVersions.V2, "Tiobontest")]
public ServiceResult<string> V2_Tiobontest()
[HttpGet]
[Route("GetTiobonsByTypesForMVP")]
public async Task<ServiceResult<List<TiobonArticle>>> GetTiobonsByTypesForMVP(string types = "", int id = 0)
{
if (types.IsNotEmptyOrNull())
{
return Success<string>("我是第二版的博客信息");
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<TiobonArticle>() { });
}
/// <summary>
/// 添加博客【无权限】
/// </summary>
/// <param name="TiobonArticle"></param>
/// <returns></returns>
[HttpPost]
//[Authorize(Policy = "Scope_TiobonModule_Policy")]
[Authorize]
public async Task<ServiceResult<string>> Post([FromBody] TiobonArticle TiobonArticle)
[HttpGet]
[Route("GetTiobonByIdForMVP")]
public async Task<ServiceResult<TiobonArticle>> 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<string>(id.ObjToString()) : Failed("添加失败");
}
else
{
return Failed("文章标题不能少于5个字符,内容不能少于50个字符!");
}
return Success(await _TiobonArticleServices.QueryById(id));
}
return Success(new TiobonArticle());
}
/// <summary>
/// 获取博客测试信息 v2版本
/// </summary>
/// <returns></returns>
[HttpGet]
////MVC自带特性 对 api 进行组管理
//[ApiExplorerSettings(GroupName = "v2")]
////路径 如果以 / 开头,表示绝对路径,反之相对 controller 的想u地路径
//[Route("/api/v2/Tiobon/Tiobontest")]
//和上边的版本控制以及路由地址都是一样的
[CustomRoute(ApiVersions.V2, "Tiobontest")]
public ServiceResult<string> V2_Tiobontest()
{
return Success<string>("我是第二版的博客信息");
}
/// <summary>
///
/// </summary>
/// <param name="TiobonArticle"></param>
/// <returns></returns>
[HttpPost]
[Route("AddForMVP")]
[Authorize(Permissions.Name)]
public async Task<ServiceResult<string>> AddForMVP([FromBody] TiobonArticle TiobonArticle)
/// <summary>
/// 添加博客【无权限】
/// </summary>
/// <param name="TiobonArticle"></param>
/// <returns></returns>
[HttpPost]
//[Authorize(Policy = "Scope_TiobonModule_Policy")]
[Authorize]
public async Task<ServiceResult<string>> 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<string>(id.ObjToString()) : Failed("添加失败");
}
/// <summary>
/// 更新博客信息
/// </summary>
/// <param name="TiobonArticle"></param>
/// <returns></returns>
// PUT: api/User/5
[HttpPut]
[Route("Update")]
[Authorize(Permissions.Name)]
public async Task<ServiceResult<string>> Put([FromBody] TiobonArticle TiobonArticle)
else
{
if (TiobonArticle != null && TiobonArticle.bID > 0)
return Failed("文章标题不能少于5个字符,内容不能少于50个字符!");
}
}
/// <summary>
///
/// </summary>
/// <param name="TiobonArticle"></param>
/// <returns></returns>
[HttpPost]
[Route("AddForMVP")]
[Authorize(Permissions.Name)]
public async Task<ServiceResult<string>> 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<string>(id.ObjToString()) : Failed("添加失败");
}
/// <summary>
/// 更新博客信息
/// </summary>
/// <param name="TiobonArticle"></param>
/// <returns></returns>
// PUT: api/User/5
[HttpPut]
[Route("Update")]
[Authorize(Permissions.Name)]
public async Task<ServiceResult<string>> 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<string>(TiobonArticle?.bID.ObjToString());
}
return Success<string>(TiobonArticle?.bID.ObjToString());
}
}
return Failed("更新失败");
}
return Failed("更新失败");
}
/// <summary>
/// 删除博客
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete]
[Authorize(Permissions.Name)]
[Route("Delete")]
public async Task<ServiceResult<string>> Delete(long id)
/// <summary>
/// 删除博客
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete]
[Authorize(Permissions.Name)]
[Route("Delete")]
public async Task<ServiceResult<string>> 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("入参无效");
}
/// <summary>
/// apache jemeter 压力测试
/// 更新接口
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("ApacheTestUpdate")]
public async Task<ServiceResult<bool>> 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("入参无效");
}
/// <summary>
/// apache jemeter 压力测试
/// 更新接口
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("ApacheTestUpdate")]
public async Task<ServiceResult<bool>> ApacheTestUpdate()
{
return Success(await _TiobonArticleServices.Update(new { bsubmitter = $"laozhang{DateTime.Now.Millisecond}", bID = 1 }), "更新成功");
}
}

@ -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;
/// <summary>
/// 构造函数
/// </summary>
public DbFirstController(ISqlSugarClient sqlSugarClient, IWebHostEnvironment env)
{
private readonly SqlSugarScope _sqlSugarClient;
private readonly IWebHostEnvironment Env;
_sqlSugarClient = sqlSugarClient as SqlSugarScope;
Env = env;
}
/// <summary>
/// 构造函数
/// </summary>
public DbFirstController(ISqlSugarClient sqlSugarClient, IWebHostEnvironment env)
/// <summary>
/// 获取 整体框架 文件(主库)(一般可用第一次生成)
/// </summary>
/// <returns></returns>
[HttpGet]
public ServiceResult<string> GetFrameFiles()
{
var data = new ServiceResult<string>() { 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)} || ";
/// <summary>
/// 获取 整体框架 文件(主库)(一般可用第一次生成)
/// </summary>
/// <returns></returns>
[HttpGet]
public ServiceResult<string> GetFrameFiles()
{
var data = new ServiceResult<string>() { 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());
}
/// <summary>
/// 获取仓储层和服务层(需指定表名和数据库)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableNames">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public ServiceResult<string> 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<string>() { 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;
/// <summary>
/// 获取仓储层和服务层(需指定表名和数据库)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableNames">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public ServiceResult<string> GetFrameFilesByTableNames([FromBody] string[] tableNames, [FromQuery] string ConnID = null)
{
ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID;
var isMuti = BaseDBConfig.IsMulti;
var data = new ServiceResult<string>() { 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)} || ";
}
/// <summary>
/// 获取实体(需指定表名和数据库)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableNames">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public ServiceResult<string> 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<string>() { 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;
}
/// <summary>
/// 获取实体(需指定表名和数据库)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableNames">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public ServiceResult<string> GetFrameFilesByTableNamesForEntity([FromBody] string[] tableNames, [FromQuery] string ConnID = null)
{
ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID;
var isMuti = BaseDBConfig.IsMulti;
var data = new ServiceResult<string>() { Success = true, Message = "" };
if (Env.IsDevelopment())
{
data.Data += $"库{ConnID}-Models层生成:{FrameSeed.CreateModels(_sqlSugarClient, ConnID, isMuti, tableNames)}";
}
/// <summary>
/// 获取控制器(需指定表名和数据库)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableNames">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public ServiceResult<string> GetFrameFilesByTableNamesForController([FromBody] string[] tableNames, [FromQuery] string ConnID = null)
else
{
ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID;
var isMuti = BaseDBConfig.IsMulti;
var data = new ServiceResult<string>() { 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;
}
/// <summary>
/// 获取控制器(需指定表名和数据库)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableNames">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public ServiceResult<string> GetFrameFilesByTableNamesForController([FromBody] string[] tableNames, [FromQuery] string ConnID = null)
{
ConnID = ConnID == null ? MainDb.CurrentDbConnId.ToLower() : ConnID;
/// <summary>
/// DbFrist 根据数据库表名 生成整体框架,包含Model层(一般可用第一次生成)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableName">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public ServiceResult<string> GetAllFrameFilesByTableNames([FromQuery] string tableName, [FromQuery] string ConnID = null)
var isMuti = BaseDBConfig.IsMulti;
var data = new ServiceResult<string>() { 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<string>() { 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 = "当前不处于开发模式,代码生成不可用!";
}
/// <summary>
/// DbFrist 根据数据库表名 生成整体框架,包含Model层(一般可用第一次生成)
/// </summary>
/// <param name="ConnID">数据库链接名称</param>
/// <param name="tableName">需要生成的表名</param>
/// <returns></returns>
[HttpPost]
public ServiceResult<string> 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<string>() { 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;
}
}

@ -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;
}
/// <summary>
/// 获取权限部分Map数据(从库)
/// 迁移到新库(主库)
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> DataMigrateFromOld2New()
/// <summary>
/// 获取权限部分Map数据(从库)
/// 迁移到新库(主库)
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> DataMigrateFromOld2New()
{
var data = new ServiceResult<string>() { Success = true, Message = "" };
var filterPermissionId = 122;
if (_env.IsDevelopment())
{
var data = new ServiceResult<string>() { 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<PM> 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<PM> 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<long> 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<long> 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;
}
/// <summary>
/// 权限数据库导出tsv
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> SaveData2TsvAsync()
{
var data = new ServiceResult<string>() { Success = true, Message = "" };
if (_env.IsDevelopment())
{
JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
/// <summary>
/// 权限数据库导出tsv
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> SaveData2TsvAsync()
{
var data = new ServiceResult<string>() { 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;
}
/// <summary>
/// 权限数据库导出excel
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> SaveData2ExcelAsync()
/// <summary>
/// 权限数据库导出excel
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> SaveData2ExcelAsync()
{
var data = new ServiceResult<string>() { Success = true, Message = "" };
if (_env.IsDevelopment())
{
var data = new ServiceResult<string>() { 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<Permission> permissionsTree, List<Permission> all, List<Modules> 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<Permission> permissionsTree, List<Permission> all, List<Modules> apis)
private void FilterPermissionTree(List<Permission> permissionsAll, List<long> actionPermissionId, List<long> 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<Permission> permissionsAll, List<long> actionPermissionId, List<long> 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<Permission> permissionsTree, List<PM> 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<Permission> permissionsTree, List<PM> 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; }
}

@ -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;

@ -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;
/// <summary>
/// 登录管理【无权限】
/// </summary>
[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<LoginController> _logger;
/// <summary>
/// 登录管理【无权限】
/// 构造函数注入
/// </summary>
[Produces("application/json")]
[Route("api/Login"), ApiExplorerSettings(GroupName = Grouping.GroupName_Other)]
[AllowAnonymous]
public class LoginController : BaseApiController
/// <param name="ghrs_UserServices"></param>
/// <param name="userRoleServices"></param>
/// <param name="roleServices"></param>
/// <param name="requirement"></param>
/// <param name="roleModulePermissionServices"></param>
/// <param name="logger"></param>
public LoginController(IGhrs_UserServices ghrs_UserServices, IUserRoleServices userRoleServices, IRoleServices roleServices, PermissionRequirement requirement, IRoleModulePermissionServices roleModulePermissionServices, ILogger<LoginController> logger)
{
readonly IGhrs_UserServices _ghrs_UserServices;
readonly IUserRoleServices _userRoleServices;
readonly IRoleServices _roleServices;
readonly PermissionRequirement _requirement;
private readonly IRoleModulePermissionServices _roleModulePermissionServices;
private readonly ILogger<LoginController> _logger;
/// <summary>
/// 构造函数注入
/// </summary>
/// <param name="ghrs_UserServices"></param>
/// <param name="userRoleServices"></param>
/// <param name="roleServices"></param>
/// <param name="requirement"></param>
/// <param name="roleModulePermissionServices"></param>
/// <param name="logger"></param>
public LoginController(IGhrs_UserServices ghrs_UserServices, IUserRoleServices userRoleServices, IRoleServices roleServices, PermissionRequirement requirement, IRoleModulePermissionServices roleModulePermissionServices, ILogger<LoginController> 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种方法
/// <summary>
/// 获取JWT的方法1
/// </summary>
/// <param name="name"></param>
/// <param name="pass"></param>
/// <returns></returns>
[HttpGet]
[Route("Token")]
public async Task<ServiceResult<string>> GetJwtStr(string name, string pass)
/// <summary>
/// 获取JWT的方法1
/// </summary>
/// <param name="name"></param>
/// <param name="pass"></param>
/// <returns></returns>
[HttpGet]
[Route("Token")]
public async Task<ServiceResult<string>> 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>()
{
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>()
{
Success = suc,
Message = suc ? "获取成功" : "获取失败",
Data = jwtStr
};
}
Success = suc,
Message = suc ? "获取成功" : "获取失败",
Data = jwtStr
};
}
/// <summary>
/// 获取JWT的方法2:给Nuxt提供
/// </summary>
/// <param name="name"></param>
/// <param name="pass"></param>
/// <returns></returns>
[HttpGet]
[Route("GetTokenNuxt")]
public ServiceResult<string> GetJwtStrForNuxt(string name, string pass)
/// <summary>
/// 获取JWT的方法2:给Nuxt提供
/// </summary>
/// <param name="name"></param>
/// <param name="pass"></param>
/// <returns></returns>
[HttpGet]
[Route("GetTokenNuxt")]
public ServiceResult<string> 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<string>()
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 }
//};
/// <summary>
/// 获取JWT的方法3:整个系统主要方法
/// </summary>
/// <param name="name"></param>
/// <param name="pass"></param>
/// <returns></returns>
[HttpGet]
[Route("JWTToken3.0")]
public async Task<ServiceResult<TokenInfoViewModel>> GetJwtToken3(string name = "", string pass = "")
return new ServiceResult<string>()
{
string jwtStr = string.Empty;
Success = suc,
Message = suc ? "获取成功" : "获取失败",
Data = jwtStr
};
}
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(pass))
return Failed<TokenInfoViewModel>("用户名或密码不能为空");
if (name != "Tiobonadmin" || pass != "Tiobonadmin")
return Failed<TokenInfoViewModel>("用户名或密码不能为空");
#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<Claim>
{
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)));
/// <summary>
/// 获取JWT的方法3:整个系统主要方法
/// </summary>
/// <param name="name"></param>
/// <param name="pass"></param>
/// <returns></returns>
[HttpGet]
[Route("JWTToken3.0")]
public async Task<ServiceResult<TokenInfoViewModel>> 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<TokenInfoViewModel>("认证失败");
}
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(pass))
return Failed<TokenInfoViewModel>("用户名或密码不能为空");
if (name != "Tiobonadmin" || pass != "Tiobonadmin")
return Failed<TokenInfoViewModel>("用户名或密码不能为空");
[HttpGet]
[Route("GetJwtTokenSecret")]
public async Task<ServiceResult<TokenInfoViewModel>> 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<Claim>
{
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)));
/// <summary>
/// 请求刷新Token(以旧换新)
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
[HttpGet]
[Route("RefreshToken")]
public async Task<ServiceResult<TokenInfoViewModel>> RefreshToken(string token = "")
{
string jwtStr = string.Empty;
if (string.IsNullOrEmpty(token))
return Failed<TokenInfoViewModel>("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<TokenInfoViewModel>("很抱歉,授权已失效,请重新授权!");
//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<Claim>
//{
// 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<Claim>{
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<TokenInfoViewModel>("认证失败!");
var token = JwtToken.BuildJwtToken(claims.ToArray(), _requirement);
return Success(token, "获取成功");
}
else
return Failed<TokenInfoViewModel>("认证失败");
}
[HttpGet]
[Route("GetJwtTokenSecret")]
public async Task<ServiceResult<TokenInfoViewModel>> GetJwtTokenSecret(string name = "", string pass = "")
{
var rlt = await GetJwtToken3(name, pass);
return rlt;
}
/// <summary>
/// 获取JWT的方法4:给 JSONP 测试
/// </summary>
/// <param name="callBack"></param>
/// <param name="id"></param>
/// <param name="sub"></param>
/// <param name="expiresSliding"></param>
/// <param name="expiresAbsoulute"></param>
/// <returns></returns>
[HttpGet]
[Route("jsonp")]
public void Getjsonp(string callBack, long id = 1, string sub = "Admin", int expiresSliding = 30, int expiresAbsoulute = 30)
/// <summary>
/// 请求刷新Token(以旧换新)
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
[HttpGet]
[Route("RefreshToken")]
public async Task<ServiceResult<TokenInfoViewModel>> RefreshToken(string token = "")
{
string jwtStr = string.Empty;
if (string.IsNullOrEmpty(token))
return Failed<TokenInfoViewModel>("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<TokenInfoViewModel>("很抱歉,授权已失效,请重新授权!");
//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<Claim>
//{
// 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<Claim>{
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<TokenInfoViewModel>("认证失败!");
}
/// <summary>
/// 测试 MD5 加密字符串
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
[HttpGet]
[Route("Md5Password")]
public string Md5Password(string password = "")
/// <summary>
/// 获取JWT的方法4:给 JSONP 测试
/// </summary>
/// <param name="callBack"></param>
/// <param name="id"></param>
/// <param name="sub"></param>
/// <param name="expiresSliding"></param>
/// <param name="expiresAbsoulute"></param>
/// <returns></returns>
[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
};
/// <summary>
/// swagger登录
/// </summary>
/// <param name="loginRequest"></param>
/// <returns></returns>
[HttpPost]
[Route("/api/Login/swgLogin")]
public async Task<dynamic> 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);
}
/// <summary>
/// 测试 MD5 加密字符串
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
[HttpGet]
[Route("Md5Password")]
public string Md5Password(string password = "")
{
return MD5Helper.MD5Encrypt32(password);
}
/// <summary>
/// swagger登录
/// </summary>
/// <param name="loginRequest"></param>
/// <returns></returns>
[HttpPost]
[Route("/api/Login/swgLogin")]
public async Task<dynamic> SwgLogin([FromBody] SwaggerLoginRequest loginRequest)
{
if (loginRequest is null)
return new { result = false };
}
/// <summary>
/// weixin登录
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("wxLogin")]
public dynamic WxLogin(string g = "", string token = "")
try
{
return new { g, token };
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登录异常");
}
return new { result = false };
}
public class SwaggerLoginRequest
/// <summary>
/// weixin登录
/// </summary>
/// <returns></returns>
[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; }
}

@ -1,5 +1,4 @@
using Tiobon.Core.Common.Caches;
using Tiobon.Core.Model;
namespace Tiobon.Core.Api.Controllers.Systems;
/// <summary>

@ -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;

@ -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;

@ -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)
/// <summary>
/// 分页获取
/// </summary>
/// <param name="page"></param>
/// <param name="key"></param>
/// <returns></returns>
// GET: api/Buttons/5
[HttpGet]
public async Task<ServiceResult<PageModel<Ghre_TasksQz>>> 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;
/// <summary>
/// 分页获取
/// </summary>
/// <param name="page"></param>
/// <param name="key"></param>
/// <returns></returns>
// GET: api/Buttons/5
[HttpGet]
public async Task<ServiceResult<PageModel<Ghre_TasksQz>>> Get(int page = 1, string key = "")
Expression<Func<Ghre_TasksQz, bool>> 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<Func<Ghre_TasksQz, bool>> whereExpression = a => a.IsEnable == 1 && (a.Name != null && a.Name.Contains(key));
}
return ServiceResult<PageModel<Ghre_TasksQz>>.OprateSuccess(data.dataCount >= 0, "获取成功", data);
}
var data = await _tasksQzServices.QueryPage(whereExpression, page, intPageSize, " Id desc ");
if (data.dataCount > 0)
/// <summary>
/// 添加计划任务
/// </summary>
/// <param name="tasksQz"></param>
/// <returns></returns>
[HttpPost]
public async Task<ServiceResult<string>> Post([FromBody] Ghre_TasksQz tasksQz)
{
var data = new ServiceResult<string>();
_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<PageModel<Ghre_TasksQz>>.OprateSuccess(data.dataCount >= 0, "获取成功", data);
else
{
data.Message = "添加失败";
}
}
catch (Exception)
{
throw;
}
finally
{
if (data.Success)
_unitOfWorkManage.CommitTran();
else
_unitOfWorkManage.RollbackTran();
}
return data;
}
/// <summary>
/// 添加计划任务
/// </summary>
/// <param name="tasksQz"></param>
/// <returns></returns>
[HttpPost]
public async Task<ServiceResult<string>> Post([FromBody] Ghre_TasksQz tasksQz)
/// <summary>
/// 修改计划任务
/// </summary>
/// <param name="tasksQz"></param>
/// <returns></returns>
[HttpPut]
public async Task<ServiceResult<string>> Put([FromBody] Ghre_TasksQz tasksQz)
{
var data = new ServiceResult<string>();
if (tasksQz != null && tasksQz.Id > 0)
{
var data = new ServiceResult<string>();
_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;
}
/// <summary>
/// 删除一个任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpDelete]
public async Task<ServiceResult<string>> Delete(long jobId)
{
var data = new ServiceResult<string>();
/// <summary>
/// 修改计划任务
/// </summary>
/// <param name="tasksQz"></param>
/// <returns></returns>
[HttpPut]
public async Task<ServiceResult<string>> Put([FromBody] Ghre_TasksQz tasksQz)
var model = await _tasksQzServices.QueryById(jobId);
if (model != null)
{
var data = new ServiceResult<string>();
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;
}
/// <summary>
/// 删除一个任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpDelete]
public async Task<ServiceResult<string>> Delete(long jobId)
else
{
var data = new ServiceResult<string>();
data.Message = "任务不存在";
}
return data;
var model = await _tasksQzServices.QueryById(jobId);
if (model != null)
}
/// <summary>
/// 启动计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> StartJob(long jobId)
{
var data = new ServiceResult<string>();
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;
}
/// <summary>
/// 启动计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> StartJob(long jobId)
else
{
var data = new ServiceResult<string>();
data.Message = "任务不存在";
}
return data;
}
/// <summary>
/// 停止一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> StopJob(long jobId)
{
var data = new ServiceResult<string>();
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;
}
/// <summary>
/// 停止一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> StopJob(long jobId)
else
{
var data = new ServiceResult<string>();
var model = await _tasksQzServices.QueryById(jobId);
if (model != null)
data.Message = "任务不存在";
}
return data;
}
/// <summary>
/// 暂停一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> PauseJob(long jobId)
{
var data = new ServiceResult<string>();
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;
}
/// <summary>
/// 暂停一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> PauseJob(long jobId)
{
var data = new ServiceResult<string>();
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;
}
/// <summary>
/// 恢复一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> ResumeJob(long jobId)
else
{
var data = new ServiceResult<string>();
data.Message = "任务不存在";
}
return data;
}
/// <summary>
/// 恢复一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> ResumeJob(long jobId)
{
var data = new ServiceResult<string>();
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;
}
/// <summary>
/// 重启一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> ReCovery(long jobId)
else
{
data.Message = "任务不存在";
}
return data;
}
/// <summary>
/// 重启一个计划任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> ReCovery(long jobId)
{
var data = new ServiceResult<string>();
var model = await _tasksQzServices.QueryById(jobId);
if (model != null)
{
var data = new ServiceResult<string>();
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;
}
/// <summary>
/// 获取任务命名空间
/// </summary>
/// <returns></returns>
[HttpGet]
public ServiceResult<List<QuartzReflectionViewModel>> 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<List<QuartzReflectionViewModel>>.OprateSuccess("获取成功", implementTypes);
data.Message = "任务不存在";
}
return data;
/// <summary>
/// 立即执行任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> ExecuteJob(long jobId)
{
var data = new ServiceResult<string>();
}
/// <summary>
/// 获取任务命名空间
/// </summary>
/// <returns></returns>
[HttpGet]
public ServiceResult<List<QuartzReflectionViewModel>> 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<List<QuartzReflectionViewModel>>.OprateSuccess("获取成功", implementTypes);
}
var model = await _tasksQzServices.QueryById(jobId);
if (model != null)
{
return await _schedulerCenter.ExecuteJobAsync(model);
}
else
{
data.Message = "任务不存在";
}
return data;
}
/// <summary>
/// 获取任务运行日志
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<PageModel<Ghre_TasksLog>>> GetTaskLogs(long jobId, int page = 1, int pageSize = 10, DateTime? runTimeStart = null, DateTime? runTimeEnd = null)
/// <summary>
/// 立即执行任务
/// </summary>
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<string>> ExecuteJob(long jobId)
{
var data = new ServiceResult<string>();
var model = await _tasksQzServices.QueryById(jobId);
if (model != null)
{
var model = await _tasksLogServices.GetTaskLogs(jobId, page, pageSize, runTimeStart, runTimeEnd);
return ServiceResult<PageModel<Ghre_TasksLog>>.OprateSuccess(model.dataCount >= 0, "获取成功", model);
return await _schedulerCenter.ExecuteJobAsync(model);
}
/// <summary>
/// 任务概况
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<object>> 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<object>.OprateSuccess(true, "获取成功", model);
data.Message = "任务不存在";
}
return data;
}
/// <summary>
/// 获取任务运行日志
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<PageModel<Ghre_TasksLog>>> 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<PageModel<Ghre_TasksLog>>.OprateSuccess(model.dataCount >= 0, "获取成功", model);
}
/// <summary>
/// 任务概况
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<ServiceResult<object>> 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<object>.OprateSuccess(true, "获取成功", model);
}
}

@ -1,26 +1,25 @@
using static Tiobon.Core.Extensions.CustomApiVersion;
namespace Tiobon.Core.Controllers.v1
namespace Tiobon.Core.Controllers.v1;
[Route("api/[controller]")]
[ApiController, ApiExplorerSettings(GroupName = Grouping.GroupName_Other)]
public class ApbController : ControllerBase
{
[Route("api/[controller]")]
[ApiController, ApiExplorerSettings(GroupName = Grouping.GroupName_Other)]
public class ApbController : ControllerBase
{
/************************************************/
// 如果不需要使用Http协议带名称的,比如这种 [HttpGet]
// 就可以按照下边的写法去写,在方法上直接加特性 [CustomRoute(ApiVersions.v1, "apbs")]
// 反之,如果你需要http协议带名称,请看 V2 文件夹的方法
/************************************************/
/************************************************/
// 如果不需要使用Http协议带名称的,比如这种 [HttpGet]
// 就可以按照下边的写法去写,在方法上直接加特性 [CustomRoute(ApiVersions.v1, "apbs")]
// 反之,如果你需要http协议带名称,请看 V2 文件夹的方法
/************************************************/
[HttpGet]
[CustomRoute(ApiVersions.V1, "apbs")]
public IEnumerable<string> Get()
{
return new string[] { "第一版的 apbs" };
}
[HttpGet]
[CustomRoute(ApiVersions.V1, "apbs")]
public IEnumerable<string> Get()
{
return new string[] { "第一版的 apbs" };
}
}
}

@ -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<string> Get()
{
return new string[] { "第二版的 apbs" };
}
[HttpGet("apbs")]
public IEnumerable<string> Get()
{
return new string[] { "第二版的 apbs" };
}
}
}

@ -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"]

@ -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<IControllerActivator, ServiceBasedControllerActivator>());
var controllerBaseType = typeof(ControllerBase);
builder.RegisterAssemblyTypes(typeof(Program).Assembly)
.Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
.PropertiesAutowired();
// 记得要启动服务注册
// builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
var controllerBaseType = typeof(ControllerBase);
builder.RegisterAssemblyTypes(typeof(Program).Assembly)
.Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
.PropertiesAutowired();
}
}
}

@ -1,35 +1,34 @@
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using static Tiobon.Core.Extensions.CustomApiVersion;
namespace Tiobon.Core.SwaggerHelper
namespace Tiobon.Core.SwaggerHelper;
/// <summary>
/// 自定义路由 /api/{version}/[controler]/[action]
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomRouteAttribute : RouteAttribute, IApiDescriptionGroupNameProvider
{
/// <summary>
/// 自定义路由 /api/{version}/[controler]/[action]
/// 分组名称,是来实现接口 IApiDescriptionGroupNameProvider
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomRouteAttribute : RouteAttribute, IApiDescriptionGroupNameProvider
{
public string GroupName { get; set; }
/// <summary>
/// 分组名称,是来实现接口 IApiDescriptionGroupNameProvider
/// </summary>
public string GroupName { get; set; }
/// <summary>
/// 自定义路由构造函数,继承基类路由
/// </summary>
/// <param name="actionName"></param>
public CustomRouteAttribute(string actionName = "[action]") : base("/api/{version}/[controller]/" + actionName)
{
}
/// <summary>
/// 自定义版本+路由构造函数,继承基类路由
/// </summary>
/// <param name="actionName"></param>
/// <param name="version"></param>
public CustomRouteAttribute(ApiVersions version, string actionName = "") : base($"/api/{version.ToString()}/[controller]/{actionName}")
{
GroupName = version.ToString();
}
/// <summary>
/// 自定义路由构造函数,继承基类路由
/// </summary>
/// <param name="actionName"></param>
public CustomRouteAttribute(string actionName = "[action]") : base("/api/{version}/[controller]/" + actionName)
{
}
/// <summary>
/// 自定义版本+路由构造函数,继承基类路由
/// </summary>
/// <param name="actionName"></param>
/// <param name="version"></param>
public CustomRouteAttribute(ApiVersions version, string actionName = "") : base($"/api/{version.ToString()}/[controller]/{actionName}")
{
GroupName = version.ToString();
}
}

@ -1,259 +1,258 @@
using Microsoft.AspNetCore.Mvc.Filters;
namespace Tiobon.Core.Api.Filter
namespace Tiobon.Core.Api.Filter;
/// <summary>
/// 全局请求验证
/// </summary>
public class GlobalActionFilter : ActionFilterAttribute
{
/// <summary>
/// 全局请求验证
///
/// </summary>
public string Message { get; set; }
/// <summary>
///
/// </summary>
public class GlobalActionFilter : ActionFilterAttribute
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
/// <summary>
///
/// </summary>
public string Message { get; set; }
/// <summary>
///
/// </summary>
/// <param name="filterContext"></param>
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<List<Guid>>(string.Format(RedisConsts.SYSTEM_LOGIN_USERID, issuer, userId)) ?? new List<Guid>();
//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<List<Guid>>(string.Format(RedisConsts.SYSTEM_LOGIN_USERID, issuer, userId)) ?? new List<Guid>();
//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<string, object> dic)
private static string Dic2String(IDictionary<string, object> 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<string, object> item in dic)
{
foreach (KeyValuePair<string, object> 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;
//}
/// <summary>
///
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
/// <summary>
///
/// </summary>
/// <param name="filterContext"></param>
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;
//}
/// <summary>
///
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
/// <summary>
///
/// </summary>
/// <param name="filterContext"></param>
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;
}
/// <summary>
///
/// </summary>
/// <param name="filterContext"></param>
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);
}
/// <summary>
///
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
}
}

@ -2,53 +2,49 @@
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Tiobon.Core.Filter
namespace Tiobon.Core.Filter;
/// <summary>
/// Summary:全局路由权限公约
/// Remarks:目的是针对不同的路由,采用不同的授权过滤器
/// 如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略
/// 否则,如果想特例其他授权机制的话,需要在 controller 上带上 [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")]
/// </summary>
public class GlobalRouteAuthorizeConvention : IApplicationModelConvention
{
/// <summary>
/// Summary:全局路由权限公约
/// Remarks:目的是针对不同的路由,采用不同的授权过滤器
/// 如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略
/// 否则,如果想特例其他授权机制的话,需要在 controller 上带上 [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")]
/// </summary>
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] ,根据情况进行权限认证
}
}
}
}
/// <summary>
/// 全局权限过滤器【无效】
/// </summary>
public class GlobalAuthorizeFilter : AuthorizeFilter
{
/// <summary>
/// 全局权限过滤器【无效】
/// </summary>
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 Task.FromResult(0);
}
return base.OnAuthorizationAsync(context);
return base.OnAuthorizationAsync(context);
}
}
}

@ -3,89 +3,87 @@ using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.SignalR;
using StackExchange.Profiling;
namespace Tiobon.Core.Filter
namespace Tiobon.Core.Filter;
/// <summary>
/// 全局异常错误日志
/// </summary>
public class GlobalExceptionsFilter : IExceptionFilter
{
/// <summary>
/// 全局异常错误日志
/// </summary>
public class GlobalExceptionsFilter : IExceptionFilter
private readonly IWebHostEnvironment _env;
private readonly IHubContext<ChatHub> _hubContext;
private readonly ILogger<GlobalExceptionsFilter> _loggerHelper;
public GlobalExceptionsFilter(IWebHostEnvironment env, ILogger<GlobalExceptionsFilter> loggerHelper, IHubContext<ChatHub> hubContext)
{
private readonly IWebHostEnvironment _env;
private readonly IHubContext<ChatHub> _hubContext;
private readonly ILogger<GlobalExceptionsFilter> _loggerHelper;
_env = env;
_loggerHelper = loggerHelper;
_hubContext = hubContext;
}
public void OnException(ExceptionContext context)
{
var json = new ServiceResult<string>();
public GlobalExceptionsFilter(IWebHostEnvironment env, ILogger<GlobalExceptionsFilter> loggerHelper, IHubContext<ChatHub> 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<string>();
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<ServiceResult<string>>(json);
context.Result = res;
MiniProfiler.Current.CustomTiming("Errors:", json.Message);
json.MessageDev = context.Exception.StackTrace;//堆栈信息
}
var res = new ContentResult();
res.Content = JsonHelper.GetJSON<ServiceResult<string>>(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);
}
/// <summary>
/// 自定义返回格式
/// </summary>
/// <param name="throwMsg"></param>
/// <param name="ex"></param>
/// <returns></returns>
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
/// <summary>
/// 自定义返回格式
/// </summary>
/// <param name="throwMsg"></param>
/// <param name="ex"></param>
/// <returns></returns>
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)
{
/// <summary>
/// 生产环境的消息
/// </summary>
public string Message { get; set; }
/// <summary>
/// 开发环境的消息
/// </summary>
public string DevelopmentMessage { get; set; }
StatusCode = StatusCodes.Status500InternalServerError;
}
}
//返回错误信息
public class JsonErrorResponse
{
/// <summary>
/// 生产环境的消息
/// </summary>
public string Message { get; set; }
/// <summary>
/// 开发环境的消息
/// </summary>
public string DevelopmentMessage { get; set; }
}

@ -1,50 +1,48 @@
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Routing;
namespace Tiobon.Core.Filter
namespace Tiobon.Core.Filter;
/// <summary>
/// 全局路由前缀公约
/// </summary>
public class GlobalRoutePrefixFilter : IApplicationModelConvention
{
/// <summary>
/// 全局路由前缀公约
/// </summary>
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;
}
}
}
}
}

@ -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<UseServiceDIAttribute> _logger;
private readonly ITiobonArticleServices _TiobonArticleServices;
private readonly string _name;
protected readonly ILogger<UseServiceDIAttribute> _logger;
private readonly ITiobonArticleServices _TiobonArticleServices;
private readonly string _name;
public UseServiceDIAttribute(ILogger<UseServiceDIAttribute> logger, ITiobonArticleServices TiobonArticleServices, string Name = "")
{
_logger = logger;
_TiobonArticleServices = TiobonArticleServices;
_name = Name;
}
public UseServiceDIAttribute(ILogger<UseServiceDIAttribute> 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()
{
}
}
}

@ -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<CarInfo> Cars { get; set; }
public string SourceType { get; set; }
public IEnumerable<CarInfo> 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<UserRegisterVo>
public class UserRegisterVoValidator : AbstractValidator<UserRegisterVo>
{
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<CarInfo>
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<CarInfo>
{
public CarInfoValidator()
{
RuleFor(x => x.CarCount)
.GreaterThanOrEqualTo(0).WithMessage("车辆数量必须大于等于0")
.LessThanOrEqualTo(500).WithMessage($"存在车型数量已达上限");
RuleFor(x => x.CarSize)
.IsInEnum().WithMessage("车型不正确");
}
}

@ -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;

@ -121,15 +121,6 @@
</Content>
</ItemGroup>
<ItemGroup>
<None Update="Dockerfile">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="StopContainerImg.sh">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="wwwroot\TiobonCore.Data.excel\" />
</ItemGroup>

@ -13812,26 +13812,6 @@
Ghrz_Shihua_OA_Employment (Dto.InsertInput)
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.AccessTrendLog">
<summary>
用户访问趋势日志
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.AccessTrendLog.UserInfo">
<summary>
用户
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.AccessTrendLog.Count">
<summary>
次数
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.AccessTrendLog.UpdateTime">
<summary>
更新时间
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.TiobonArticle">
<summary>
博客文章
@ -30192,36 +30172,6 @@
已逾期
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.NONE">
<summary>
无任何权限
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.Custom">
<summary>
自定义权限
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.MyDepart">
<summary>
本部门
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.MyDepartAndDown">
<summary>
本部门及以下
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.OnlySelf">
<summary>
仅自己
</summary>
</member>
<member name="F:Tiobon.Core.Model.AuthorityScopeEnum.ALL">
<summary>
所有
</summary>
</member>
<member name="P:Tiobon.Core.Model.EntityAttribute.TableName">
<summary>
真实表名(数据库表名,若没有填写默认实体为表名)
@ -30432,8 +30382,8 @@
<member name="T:Tiobon.Core.Model.PaginationModel">
<summary>
所需分页参数
作者:胡丁文
时间:2020-4-3 20:31:26
作者:SimonHsiao
时间:2024-5-3 20:31:26
</summary>
</member>
<member name="P:Tiobon.Core.Model.PaginationModel.PageIndex">
@ -30456,21 +30406,6 @@
查询条件( 例如:id = 1 and name = 小明)
</summary>
</member>
<member name="F:Tiobon.Core.Model.ResponseEnum.NoPermissions">
<summary>
无权限
</summary>
</member>
<member name="F:Tiobon.Core.Model.ResponseEnum.NoFound">
<summary>
找不到指定资源
</summary>
</member>
<member name="F:Tiobon.Core.Model.ResponseEnum.ServerError">
<summary>
找不到指定资源
</summary>
</member>
<member name="T:Tiobon.Core.Model.ServiceResult`1">
<summary>
服务层响应实体(泛型)
@ -30605,31 +30540,6 @@
数据库读取类型
</summary>
</member>
<member name="T:Tiobon.Core.Model.TableModel`1">
<summary>
表格数据,支持分页
</summary>
</member>
<member name="P:Tiobon.Core.Model.TableModel`1.Code">
<summary>
返回编码
</summary>
</member>
<member name="P:Tiobon.Core.Model.TableModel`1.Msg">
<summary>
返回信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.TableModel`1.Count">
<summary>
记录总数
</summary>
</member>
<member name="P:Tiobon.Core.Model.TableModel`1.Data">
<summary>
返回数据集
</summary>
</member>
<member name="T:Tiobon.Core.Model.Tenants.ITenantEntity">
<summary>
租户模型接口
@ -31052,394 +30962,6 @@
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.MERCHANTID">
<summary>
商户号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.POSID">
<summary>
柜台号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.BRANCHID">
<summary>
分行号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.GROUPMCH">
<summary>
集团商户信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.TXCODE">
<summary>
交易码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.MERFLAG">
<summary>
商户类型
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.TERMNO1">
<summary>
终端编号 1
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.TERMNO2">
<summary>
终端编号 2
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.ORDERID">
<summary>
订单号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.QRCODE">
<summary>
码信息(一维码、二维码)
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.AMOUNT">
<summary>
订单金额,单位:元
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.PROINFO">
<summary>
商品名称
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.REMARK1">
<summary>
备注 1
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.REMARK2">
<summary>
备注 2
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.FZINFO1">
<summary>
分账信息一
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.FZINFO2">
<summary>
分账信息二
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.SUB_APPID">
<summary>
子商户公众账号 ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.RETURN_FIELD">
<summary>
返回信息位图
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.USERPARAM">
<summary>
实名支付
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.detail">
<summary>
商品详情
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.goods_tag">
<summary>
订单优惠标记
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.pubKey">
<summary>
公钥
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.url">
<summary>
请求地址
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayModel.deleteEmpty">
<summary>
是否删除空值
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayNeedModel">
<summary>
退款参数
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.ORDERID">
<summary>
订单ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.PROINFO">
<summary>
商品名称
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.AMOUNT">
<summary>
支付金额(小数点最多两位)
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.QRCODE">
<summary>
二维码/条码信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.REMARK1">
<summary>
备注信息1
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayNeedModel.REMARK2">
<summary>
备注信息2
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayRefundNeedModel">
<summary>
订单参数
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundNeedModel.ORDER">
<summary>
订单号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundNeedModel.MONEY">
<summary>
退款金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundNeedModel.REFUND_CODE">
<summary>
退款流水号(可选)
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayRefundReturnModel">
<summary>
退款返回消息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.REQUEST_SN">
<summary>
序列号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.CUST_ID">
<summary>
商户号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.TX_CODE">
<summary>
交易码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.RETURN_CODE">
<summary>
返回码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.RETURN_MSG">
<summary>
返回码说明
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.LANGUAGE">
<summary>
语言
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnModel.TX_INFO">
<summary>
订单信息
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel">
<summary>
订单信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel.ORDER_NUM">
<summary>
订单号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel.PAY_AMOUNT">
<summary>
支付金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel.AMOUNT">
<summary>
退款金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel.REM1">
<summary>
备注1
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnOrderInfoModel.REM2">
<summary>
备注2
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel">
<summary>
退款返回结果消息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.ORDER_NUM">
<summary>
订单号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.PAY_AMOUNT">
<summary>
支付金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.AMOUNT">
<summary>
退款金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.REQUEST_SN">
<summary>
序列号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.CUST_ID">
<summary>
商户号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.TX_CODE">
<summary>
交易码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.RETURN_CODE">
<summary>
返回码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.RETURN_MSG">
<summary>
返回码说明
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayRefundReturnResultModel.LANGUAGE">
<summary>
语言
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayResultModel">
<summary>
支付结果dto
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.RESULT">
<summary>
支付结果
Y:成功
N:失败
U:不确定
Q:待轮询
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.ORDERID">
<summary>
订单ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.AMOUNT">
<summary>
支付金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.QRCODETYPE">
<summary>
二维码类型
1:龙支付
2:微信
3:支付宝
4:银联
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.WAITTIME">
<summary>
等待时间-轮询等待时间
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.TRACEID">
<summary>
全局事件跟踪号-建行交易流水号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.ERRCODE">
<summary>
错误码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.ERRMSG">
<summary>
错误信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayResultModel.SIGN">
<summary>
验证签名-防止伪造攻击
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.PayReturnResultModel">
<summary>
返回支付结果
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.ORDERID">
<summary>
发起的订单ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.AMOUNT">
<summary>
返回支付的金额
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.QRCODETYPE">
<summary>
返回支付的类型 1:龙支付 2:微信 3:支付宝 4:银联
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.TRACEID">
<summary>
返回建行的流水号
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.ERRCODE">
<summary>
错误代码
</summary>
</member>
<member name="P:Tiobon.Core.Model.ViewModels.PayReturnResultModel.ERRMSG">
<summary>
错误信息
</summary>
</member>
<member name="T:Tiobon.Core.Model.ViewModels.QuartzReflectionViewModel">
<summary>
实现IJob的类

@ -597,6 +597,34 @@
<param name="langId">langId</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Controllers.ReportController.QueryESSInterviewPassRate(System.Int32)">
<summary>
面试官-简历筛选通过率
</summary>
<param name="langId">langId</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Controllers.ReportController.QueryInterviewPassRate(System.Int32)">
<summary>
HR推荐-简历筛选通过率
</summary>
<param name="langId">langId</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Controllers.ReportController.QueryESSSendOfferRate(System.Int32)">
<summary>
面试官-简历筛选通过率
</summary>
<param name="langId">langId</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Controllers.ReportController.QuerySendOfferRate(System.Int32)">
<summary>
HR推荐-简历筛选通过率
</summary>
<param name="langId">langId</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Controllers.TasksQzController.Get(System.Int32,System.String)">
<summary>
分页获取

Loading…
Cancel
Save