using JNPF.Common.Extension;
using JNPF.Common.Filter;
using JNPF.DatabaseAccessor;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.LinqBuilder;
using JNPF.Logging.Attributes;
using JNPF.Systems.Entitys.Dto.SysLog;
using JNPF.Systems.Entitys.System;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System.Reflection;
namespace JNPF.Systems;
///
/// 系统日志
/// 版 本:V3.2
/// 版 权:拓通智联科技有限公司(http://www.tuotong-tech.com)
/// 日 期:2021-06-01.
///
[ApiDescriptionSettings(Tag = "System", Name = "Log", Order = 211)]
[Route("api/system/[controller]")]
public class SysLogService : IDynamicApiController, ITransient
{
///
/// 服务基础仓储.
///
private readonly ISqlSugarRepository _repository;
///
/// 初始化一个类型的新实例.
///
public SysLogService(
ISqlSugarRepository repository)
{
_repository = repository;
}
#region GET
///
/// 获取系统日志列表-登录日志(带分页).
///
/// 请求参数.
/// 分类.
///
[HttpGet("{Type}")]
public async Task GetList([FromQuery] LogListQuery input, int Type)
{
var whereLambda = LinqExpression.And();
whereLambda = whereLambda.And(x => x.Category == Type);
var start = new DateTime();
var end = new DateTime();
if (input.endTime != null && input.startTime != null)
{
start = Convert.ToDateTime(string.Format("{0:yyyy-MM-dd 00:00:00}", input.startTime?.TimeStampToDateTime()));
end = Convert.ToDateTime(string.Format("{0:yyyy-MM-dd 23:59:59}", input.endTime?.TimeStampToDateTime()));
whereLambda = whereLambda.And(x => SqlFunc.Between(x.CreatorTime, start, end));
}
// 关键字(用户、IP地址、功能名称)
if (!string.IsNullOrEmpty(input.keyword))
whereLambda = whereLambda.And(m => m.UserName.Contains(input.keyword) || m.IPAddress.Contains(input.keyword) || m.ModuleName.Contains(input.keyword));
if (input.ipaddress.IsNotEmptyOrNull())
whereLambda = whereLambda.And(m => m.IPAddress.Contains(input.ipaddress));
if (input.userName.IsNotEmptyOrNull())
whereLambda = whereLambda.And(m => m.UserName.Contains(input.userName));
if (input.moduleName.IsNotEmptyOrNull())
whereLambda = whereLambda.And(m => m.ModuleName == input.moduleName);
if (input.requestMethod.IsNotEmptyOrNull())
whereLambda = whereLambda.And(m => m.RequestMethod == input.requestMethod);
var list = await _repository.AsQueryable().Where(whereLambda).OrderBy(x => x.CreatorTime, OrderByType.Desc).ToPagedListAsync(input.currentPage, input.pageSize);
object output = null;
switch (Type)
{
case 1:
{
var pageList = new SqlSugarPagedList()
{
list = list.list.Adapt>(),
pagination = list.pagination
};
return PageResult.SqlSugarPageResult(pageList);
}
case 3:
{
var pageList = new SqlSugarPagedList()
{
list = list.list.Adapt>(),
pagination = list.pagination
};
return PageResult.SqlSugarPageResult(pageList);
}
case 4:
{
var pageList = new SqlSugarPagedList()
{
list = list.list.Adapt>(),
pagination = list.pagination
};
return PageResult.SqlSugarPageResult(pageList);
}
case 5:
{
var pageList = new SqlSugarPagedList()
{
list = list.list.Adapt>(),
pagination = list.pagination
};
return PageResult.SqlSugarPageResult(pageList);
}
}
return output;
}
///
/// 操作模块.
///
///
[HttpGet("ModuleName")]
public async Task ModuleNameSelector()
{
return App.EffectiveTypes
.Where(u => u.IsClass && !u.IsInterface && !u.IsAbstract && typeof(IDynamicApiController).IsAssignableFrom(u))
.SelectMany(u => u.GetMethods(BindingFlags.Public | BindingFlags.Instance))
.Where(x => x.IsDefined(typeof(OperateLogAttribute), false))
.Select(x => new { moduleName = x.GetCustomAttribute().ModuleName }).Distinct();
}
#endregion
#region POST
///
/// 批量删除.
///
/// 请求参数.
///
[HttpDelete]
[UnitOfWork]
public async Task Delete([FromBody] LogDelInput input)
{
await _repository.AsDeleteable().In(it => it.Id, input.ids).ExecuteCommandAsync();
}
///
/// 一键删除.
///
/// 请求参数.
///
[HttpDelete("{type}")]
[UnitOfWork]
public async Task Delete(int type)
{
await _repository.DeleteAsync(x => x.Category == type);
}
#endregion
}