feat: 程序异常增加高级搜索功能
This commit is contained in:
parent
6bd7303d82
commit
86522a81a4
|
@ -19,15 +19,32 @@ class ExceptionService : BaseDatabase, IException
|
|||
return true;
|
||||
}
|
||||
|
||||
public (IEnumerable<Error> Items, int ItemsCount) GetAll(string? searchText, int pageIndex, int pageItems, string? sortName, string sortOrder)
|
||||
public (IEnumerable<Error> Items, int ItemsCount) GetAll(string? searchText, ExceptionFilter filter, int pageIndex, int pageItems, string? sortName, string sortOrder)
|
||||
{
|
||||
var sql = new Sql();
|
||||
|
||||
if (!string.IsNullOrEmpty(searchText))
|
||||
{
|
||||
sql.Append("WHERE ErrorPage Like @0 or Message Like @0 or StackTrace Like @0", $"%{searchText}%");
|
||||
sql.Where("ErrorPage Like @0 or Message Like @0 or StackTrace Like @0", $"%{searchText}%");
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(filter.Category))
|
||||
{
|
||||
sql.Where("Category = @0", filter.Category);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(filter.UserId))
|
||||
{
|
||||
sql.Where("UserId Like @0", $"%{filter.UserId}%");
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(filter.ErrorPage))
|
||||
{
|
||||
sql.Where("ErrorPage Like @0", $"%{filter.ErrorPage}%");
|
||||
}
|
||||
|
||||
sql.Where("LogTime >= @0 and LogTime <= @1", filter.Star, filter.End);
|
||||
|
||||
if (sortOrder == "Unset")
|
||||
{
|
||||
sortOrder = "desc";
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
namespace BootstrapAdmin.Web.Core;
|
||||
|
||||
public class ExceptionFilter
|
||||
{
|
||||
public DateTime Star { get; set; }
|
||||
|
||||
public DateTime End { get; set; }
|
||||
|
||||
public string? UserId { get; set; }
|
||||
|
||||
public string? ErrorPage { get; set; }
|
||||
|
||||
public string? Category { get; set; }
|
||||
}
|
|
@ -6,5 +6,5 @@ public interface IException
|
|||
{
|
||||
bool Log(Error exception);
|
||||
|
||||
(IEnumerable<Error> Items, int ItemsCount) GetAll(string? searchText, int pageIndex, int pageItems, string?sortName, string sortOrder);
|
||||
(IEnumerable<Error> Items, int ItemsCount) GetAll(string? searchText, ExceptionFilter filter, int pageIndex, int pageItems, string? sortName, string sortOrder);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
<div class="row g-3 form-inline">
|
||||
<div class="col-sm-6 col-md-6">
|
||||
<DateTimeRange @bind-Value="Value.LogTime" ShowLabel="true" AllowNull="false" />
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-6">
|
||||
<BootstrapInput @bind-Value="Value.ErrorPage" ShowLabel="true" />
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-6">
|
||||
<BootstrapInput @bind-Value="Value.UserId" ShowLabel="true" />
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-6">
|
||||
<Select Items="@Items" @bind-Value="Value.Category" ShowLabel="true" />
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,38 @@
|
|||
using BootstrapAdmin.DataAccess.Models;
|
||||
using BootstrapAdmin.Web.Models;
|
||||
using BootstrapAdmin.Web.Utils;
|
||||
|
||||
namespace BootstrapAdmin.Web.Components
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public partial class ErrorSearch
|
||||
{
|
||||
private List<SelectedItem>? Items { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
[NotNull]
|
||||
public ErrorSearchModel? Value { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public EventCallback<ErrorSearchModel> ValueChanged { get; set; }
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
base.OnInitialized();
|
||||
|
||||
Items = new List<SelectedItem>
|
||||
{
|
||||
new SelectedItem("", "全部")
|
||||
};
|
||||
Items.AddRange(LookupHelper.GetExceptionCategory());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
using BootstrapAdmin.DataAccess.Models;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace BootstrapAdmin.Web.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// 字典维护自定义高级搜索模型
|
||||
/// </summary>
|
||||
public class ErrorSearchModel : ITableSearchModel
|
||||
{
|
||||
/// <summary>
|
||||
/// 获得/设置 字典标签
|
||||
/// </summary>
|
||||
[Display(Name = "异常类型")]
|
||||
public string? Category { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 字典名称
|
||||
/// </summary>
|
||||
[Display(Name = "用户名")]
|
||||
public string? UserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 字典代码
|
||||
/// </summary>
|
||||
[Display(Name = "请求网址")]
|
||||
public string? ErrorPage { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获得/设置 字典类型
|
||||
/// </summary>
|
||||
[Display(Name = "记录时间")]
|
||||
[NotNull]
|
||||
public DateTimeRangeValue? LogTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public ErrorSearchModel()
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<IFilterAction> GetSearchs()
|
||||
{
|
||||
var ret = new List<IFilterAction>();
|
||||
|
||||
if (!string.IsNullOrEmpty(Category))
|
||||
{
|
||||
ret.Add(new SearchFilterAction(nameof(Error.Category), Category));
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(ErrorPage))
|
||||
{
|
||||
ret.Add(new SearchFilterAction(nameof(Error.ErrorPage), ErrorPage));
|
||||
}
|
||||
|
||||
if (LogTime != null)
|
||||
{
|
||||
ret.Add(new SearchFilterAction(nameof(Error.LogTime), LogTime.Start, FilterAction.GreaterThanOrEqual));
|
||||
ret.Add(new SearchFilterAction(nameof(Error.LogTime), LogTime.End, FilterAction.LessThanOrEqual));
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(UserId))
|
||||
{
|
||||
ret.Add(new SearchFilterAction(nameof(Error.UserId), UserId));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <exception cref="NotImplementedException"></exception>
|
||||
public void Reset()
|
||||
{
|
||||
Category = null;
|
||||
UserId = null;
|
||||
ErrorPage = null;
|
||||
LogTime = new DateTimeRangeValue
|
||||
{
|
||||
Start = DateTime.Now.AddDays(-7),
|
||||
End = DateTime.Now
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
<AdminTable TItem="DataAccess.Models.Error"
|
||||
IsPagination="true" PageItemsSource="PageItemsSource"
|
||||
ShowDefaultButtons="false" ShowExtendButtons="false" ShowAdvancedSearch="false"
|
||||
ShowDefaultButtons="false" ShowExtendButtons="false" TableSearchModel="ErrorSearchModel"
|
||||
OnQueryAsync="OnQueryAsync">
|
||||
<ColumnsTemplete>
|
||||
<TableColumn @bind-Field="context.LogTime" Filterable="true" Searchable="true" Sortable="true"></TableColumn>
|
||||
|
@ -11,5 +11,12 @@
|
|||
<TableColumn @bind-Field="context.UserIp" Filterable="true" Searchable="true" Sortable="true"></TableColumn>
|
||||
<TableColumn @bind-Field="context.ExceptionType" Filterable="true" Searchable="true" Sortable="true"></TableColumn>
|
||||
<TableColumn @bind-Field="context.Message" Filterable="true" Searchable="true" Sortable="true"></TableColumn>
|
||||
<TableColumn @bind-Field="context.Category" Lookup="CategroyLookup" Filterable="true" Searchable="true" Sortable="true"></TableColumn>
|
||||
</ColumnsTemplete>
|
||||
<CustomerSearchTemplate>
|
||||
@if (context is ErrorSearchModel searchModel)
|
||||
{
|
||||
<ErrorSearch @bind-Value="@searchModel"></ErrorSearch>
|
||||
}
|
||||
</CustomerSearchTemplate>
|
||||
</AdminTable>
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
using BootstrapAdmin.DataAccess.Models;
|
||||
using BootstrapAdmin.Web.Core;
|
||||
using BootstrapAdmin.Web.Models;
|
||||
using BootstrapAdmin.Web.Utils;
|
||||
|
||||
namespace BootstrapAdmin.Web.Pages.Admin;
|
||||
|
||||
|
@ -7,10 +9,22 @@ public partial class Exceptions
|
|||
{
|
||||
private List<int> PageItemsSource { get; } = new List<int> { 5, 20, 40, 80, 100, 200 };
|
||||
|
||||
private ErrorSearchModel ErrorSearchModel { get; set; } = new ErrorSearchModel();
|
||||
|
||||
[Inject]
|
||||
[NotNull]
|
||||
private IException? ExceptionService { get; set; }
|
||||
|
||||
[NotNull]
|
||||
private List<SelectedItem>? CategroyLookup { get; set; }
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
base.OnInitialized();
|
||||
|
||||
CategroyLookup = LookupHelper.GetExceptionCategory();
|
||||
}
|
||||
|
||||
private Task<QueryData<Error>> OnQueryAsync(QueryPageOptions options)
|
||||
{
|
||||
var ret = new QueryData<Error>()
|
||||
|
@ -20,10 +34,20 @@ public partial class Exceptions
|
|||
IsSearch = true
|
||||
};
|
||||
|
||||
var items = ExceptionService.GetAll(options.SearchText, options.PageIndex, options.PageItems, options.SortName, options.SortOrder.ToString());
|
||||
var filter = new ExceptionFilter
|
||||
{
|
||||
Category = ErrorSearchModel.Category,
|
||||
UserId = ErrorSearchModel.UserId,
|
||||
ErrorPage = ErrorSearchModel.ErrorPage,
|
||||
Star = ErrorSearchModel.LogTime.Start,
|
||||
End = ErrorSearchModel.LogTime.End,
|
||||
};
|
||||
|
||||
ret.TotalCount = items.ItemsCount;
|
||||
ret.Items = items.Items;
|
||||
var (Items, ItemsCount) = ExceptionService.GetAll(options.SearchText, filter, options.PageIndex, options.PageItems, options.SortName, options.SortOrder.ToString());
|
||||
|
||||
ret.TotalCount = ItemsCount;
|
||||
ret.Items = Items;
|
||||
ret.IsAdvanceSearch = true;
|
||||
return Task.FromResult(ret);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,11 +2,17 @@
|
|||
|
||||
static class LookupHelper
|
||||
{
|
||||
public static List<SelectedItem> GetTargets() => new List<SelectedItem>
|
||||
public static List<SelectedItem> GetTargets() => new()
|
||||
{
|
||||
new SelectedItem("_self", "本窗口"),
|
||||
new SelectedItem("_blank", "新窗口"),
|
||||
new SelectedItem("_parent", "父级窗口"),
|
||||
new SelectedItem("_top", "顶级窗口"),
|
||||
};
|
||||
|
||||
public static List<SelectedItem> GetExceptionCategory() => new()
|
||||
{
|
||||
new SelectedItem("App", "应用程序"),
|
||||
new SelectedItem("DB", "数据库")
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue