From b00359b60d488d577f606cdd565b5bb8a4fa26b4 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 27 Jan 2020 14:39:16 +0800 Subject: [PATCH 1/3] =?UTF-8?q?style:=20=E5=A2=9E=E5=8A=A0=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Bootstrap.Admin/wwwroot/css/blazor.css | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/admin/Bootstrap.Admin/wwwroot/css/blazor.css b/src/admin/Bootstrap.Admin/wwwroot/css/blazor.css index b01f4f602..5f29c59b7 100644 --- a/src/admin/Bootstrap.Admin/wwwroot/css/blazor.css +++ b/src/admin/Bootstrap.Admin/wwwroot/css/blazor.css @@ -163,6 +163,24 @@ nav .dropdown .nav-link-close.dropdown-toggle:after { border-bottom: 1px solid #dee2e6; } +.bootstrap-table .sortable { + padding-right: 30px; + cursor: pointer; +} + + .bootstrap-table .sortable span { + display: inline-block; + width: 100%; + } + + .bootstrap-table .sortable i { + margin-left: 8px; + } + + .bootstrap-table .sortable .fa-sort { + color: #dee2e6; + } + .table-wrapper { border-radius: 4px; margin-bottom: 1rem; -- Gitee From c6203234616129bef28dd4a0e41a92a7b3a28d14 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 27 Jan 2020 15:05:28 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E5=AD=97=E5=85=B8=E8=A1=A8?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4=E5=A2=9E=E5=8A=A0=E8=A1=A8=E5=A4=B4=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/EditPageBase.cs | 8 +- .../Components/ITableHeader.cs | 25 ++++ .../Components/LgbTableHeader.cs | 52 ++++++--- .../Components/QueryPageOptions.cs | 33 ++++++ .../Bootstrap.Admin/Components/TableBase.cs | 27 ++++- .../Components/TableHeaderBase.cs | 34 ++++++ .../Components/TableHeaderContent.cs | 110 ++++++++++++++++++ .../Bootstrap.Admin/Pages/Admin/Dicts.razor | 8 +- .../Pages/Components/DictsBase.cs | 23 ++-- .../Pages/Components/GroupsBase.cs | 12 +- .../Pages/Components/MenusBase.cs | 14 +-- .../Pages/Components/QueryPageBase.cs | 10 +- .../Pages/Components/RolesBase.cs | 15 +-- .../Pages/Components/UsersBase.cs | 14 +-- src/admin/Bootstrap.Admin/Shared/Table.razor | 10 +- .../Bootstrap.Admin/Shared/TableHeader.razor | 5 + 16 files changed, 328 insertions(+), 72 deletions(-) create mode 100644 src/admin/Bootstrap.Admin/Components/ITableHeader.cs create mode 100644 src/admin/Bootstrap.Admin/Components/QueryPageOptions.cs create mode 100644 src/admin/Bootstrap.Admin/Components/TableHeaderBase.cs create mode 100644 src/admin/Bootstrap.Admin/Components/TableHeaderContent.cs create mode 100644 src/admin/Bootstrap.Admin/Shared/TableHeader.razor diff --git a/src/admin/Bootstrap.Admin/Components/EditPageBase.cs b/src/admin/Bootstrap.Admin/Components/EditPageBase.cs index 49ef57bd7..c2c38b904 100644 --- a/src/admin/Bootstrap.Admin/Components/EditPageBase.cs +++ b/src/admin/Bootstrap.Admin/Components/EditPageBase.cs @@ -34,7 +34,7 @@ namespace Bootstrap.Admin.Components /// 查询按钮回调方法 /// [Parameter] - public Func>? OnQuery { get; set; } + public Func>? OnQuery { get; set; } /// /// 获得/设置 TableHeader 实例 @@ -163,10 +163,8 @@ namespace Bootstrap.Admin.Components /// /// 分页查询方法 /// - /// - /// - /// + /// /// - protected QueryData QueryData(int pageIndex, int pageItems, string searchText) => OnQuery?.Invoke(pageIndex, pageItems, searchText) ?? new QueryData(); + protected QueryData QueryData(QueryPageOptions options) => OnQuery?.Invoke(options) ?? new QueryData(); } } diff --git a/src/admin/Bootstrap.Admin/Components/ITableHeader.cs b/src/admin/Bootstrap.Admin/Components/ITableHeader.cs new file mode 100644 index 000000000..0c08920d1 --- /dev/null +++ b/src/admin/Bootstrap.Admin/Components/ITableHeader.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Components.Forms; + +namespace Bootstrap.Admin.Components +{ + /// + /// ITableHeader 接口 + /// + public interface ITableHeader + { + /// + /// 获取绑定字段显示名称方法 + /// + string GetDisplayName(); + + /// + /// 获取绑定字段信息方法 + /// + string GetFieldName(); + + /// + /// 获得/设置 是否允许排序 默认为 false + /// + bool Sort { get; set; } + } +} diff --git a/src/admin/Bootstrap.Admin/Components/LgbTableHeader.cs b/src/admin/Bootstrap.Admin/Components/LgbTableHeader.cs index fe3a641b9..a0050a0e7 100644 --- a/src/admin/Bootstrap.Admin/Components/LgbTableHeader.cs +++ b/src/admin/Bootstrap.Admin/Components/LgbTableHeader.cs @@ -1,45 +1,69 @@ using Bootstrap.Admin.Extensions; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Forms; -using Microsoft.AspNetCore.Components.Rendering; using System; using System.Linq.Expressions; namespace Bootstrap.Admin.Components { /// - /// + /// 表头组件 /// - public class LgbTableHeader : ComponentBase + public class LgbTableHeader : ComponentBase, ITableHeader { #nullable disable /// - /// + /// 获得/设置 数据绑定 Value /// [Parameter] public TItem Value { get; set; } #nullable restore /// - /// + /// 获得/设置 ValueChanged 事件 /// [Parameter] public EventCallback ValueChanged { get; set; } /// - /// + /// 获得/设置 ValueExpression 表达式 /// [Parameter] public Expression>? ValueExpression { get; set; } /// - /// + /// 获得/设置 是否排序 默认 false /// - /// - protected override void BuildRenderTree(RenderTreeBuilder builder) + [Parameter] public bool Sort { get; set; } + + /// + /// 获得/设置 Table Header 实例 + /// + [CascadingParameter] + protected TableHeaderBase? Header { get; set; } + + /// + /// 组件初始化方法 + /// + protected override void OnInitialized() + { + Header?.AddHeaders(this); + } + + private FieldIdentifier? _fieldIdentifier; + /// + /// 获取绑定字段显示名称方法 + /// + public string GetDisplayName() + { + if (_fieldIdentifier == null) _fieldIdentifier = FieldIdentifier.Create(ValueExpression); + return _fieldIdentifier?.GetDisplayName() ?? ""; + } + + /// + /// 获取绑定字段信息方法 + /// + public string GetFieldName() { - var filed = FieldIdentifier.Create(ValueExpression); - var text = filed.GetDisplayName(); - builder.OpenElement(0, "th"); - builder.AddContent(1, text); - builder.CloseElement(); + if (_fieldIdentifier == null) _fieldIdentifier = FieldIdentifier.Create(ValueExpression); + return _fieldIdentifier?.FieldName ?? ""; } } } diff --git a/src/admin/Bootstrap.Admin/Components/QueryPageOptions.cs b/src/admin/Bootstrap.Admin/Components/QueryPageOptions.cs new file mode 100644 index 000000000..f5c54215d --- /dev/null +++ b/src/admin/Bootstrap.Admin/Components/QueryPageOptions.cs @@ -0,0 +1,33 @@ +namespace Bootstrap.Admin.Components +{ + /// + /// 查询条件实体类 + /// + public class QueryPageOptions + { + /// + /// 获得/设置 查询关键字 + /// + public string SearchText { get; set; } = ""; + + /// + /// 获得/设置 排序字段名称 + /// + public string SortName { get; set; } = ""; + + /// + /// 获得/设置 排序方式 + /// + public SortOrder SortOrder { get; set; } + + /// + /// 获得/设置 当前页码 首页为 第一页 + /// + public int PageIndex { get; set; } = 1; + + /// + /// 获得/设置 每页条目数量 + /// + public int PageItems { get; set; } = 20; + } +} diff --git a/src/admin/Bootstrap.Admin/Components/TableBase.cs b/src/admin/Bootstrap.Admin/Components/TableBase.cs index a26057432..cc71f394e 100644 --- a/src/admin/Bootstrap.Admin/Components/TableBase.cs +++ b/src/admin/Bootstrap.Admin/Components/TableBase.cs @@ -159,7 +159,7 @@ namespace Bootstrap.Admin.Components /// 点击翻页回调方法 /// [Parameter] - public Func>? OnQuery { get; set; } + public Func>? OnQuery { get; set; } /// /// 点击翻页回调方法 @@ -194,6 +194,12 @@ namespace Bootstrap.Admin.Components [Parameter] public Func? OnSave { get; set; } + /// + /// 表头排序时回调方法 + /// + [Parameter] + public Action OnSort { get; set; } = new Action((name, order) => { }); + /// /// 删除按钮回调方法 /// @@ -253,11 +259,26 @@ namespace Bootstrap.Admin.Components [Parameter] public string SubmitModalTitle { get; set; } = ""; + /// + /// 获得/设置 当前排序字段名称 + /// + protected string SortName { get; set; } = ""; + + /// + /// 获得/设置 当前排序规则 + /// + protected SortOrder SortOrder { get; set; } + /// /// OnInitialized 方法 /// protected override void OnInitialized() { + OnSort = new Action((sortName, sortOrder) => + { + (SortName, SortOrder) = (sortName, sortOrder); + Query(); + }); if (EditModel == null && OnAdd != null) EditModel = OnAdd.Invoke(); if (OnDataSourceQuery != null) { @@ -265,7 +286,7 @@ namespace Bootstrap.Admin.Components } if (OnQuery != null) { - var queryData = OnQuery(1, DefaultPageItems, SearchText); + var queryData = OnQuery(new QueryPageOptions() { PageItems = DefaultPageItems, SearchText = SearchText, SortName = SortName, SortOrder = SortOrder }); Items = queryData.Items; TotalCount = queryData.TotalCount; } @@ -399,7 +420,7 @@ namespace Bootstrap.Admin.Components /// protected void Query() { - if (OnQuery != null) Query(OnQuery(PageIndex, PageItems, SearchText)); + if (OnQuery != null) Query(OnQuery(new QueryPageOptions() { PageIndex = PageIndex, PageItems = PageItems, SearchText = SearchText, SortOrder = SortOrder, SortName = SortName })); } /// diff --git a/src/admin/Bootstrap.Admin/Components/TableHeaderBase.cs b/src/admin/Bootstrap.Admin/Components/TableHeaderBase.cs new file mode 100644 index 000000000..07abb7aef --- /dev/null +++ b/src/admin/Bootstrap.Admin/Components/TableHeaderBase.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Components; +using System; +using System.Collections.Generic; + +namespace Bootstrap.Admin.Components +{ + /// + /// Table Header 组件 + /// + public class TableHeaderBase : ComponentBase + { + /// + /// Specifies the content to be rendered inside this + /// + [Parameter] + public RenderFragment? ChildContent { get; set; } + + /// + /// 添加表头组件到集合方法 + /// + public void AddHeaders(ITableHeader header) => Headers.Add(header); + + /// + /// 获得 表头集合 + /// + public ICollection Headers { get; } = new HashSet(); + + /// + /// 点击表头排序是触发此回调函数 + /// + [Parameter] + public Action? OnSort { get; set; } + } +} diff --git a/src/admin/Bootstrap.Admin/Components/TableHeaderContent.cs b/src/admin/Bootstrap.Admin/Components/TableHeaderContent.cs new file mode 100644 index 000000000..b15e09390 --- /dev/null +++ b/src/admin/Bootstrap.Admin/Components/TableHeaderContent.cs @@ -0,0 +1,110 @@ +using System; +using Bootstrap.Admin.Extensions; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Rendering; + +namespace Bootstrap.Admin.Components +{ + /// + /// Table Header 表头组件 + /// + public class TableHeaderContent : ComponentBase + { + /// + /// 获得/设置 Table Header 实例 + /// + [CascadingParameter] + protected TableHeaderBase? Header { get; set; } + + /// + /// 获得/设置 升序图标 + /// + [Parameter] + public string SortIconAsc { get; set; } = "fa fa-sort-asc"; + + /// + /// 获得/设置 降序图标 + /// + [Parameter] + public string SortIconDesc { get; set; } = "fa fa-sort-desc"; + + /// + /// 获得/设置 默认图标 + /// + [Parameter] + public string SortDefault { get; set; } = "fa fa-sort"; + + private string sortName = ""; + private SortOrder sortOrder; + + /// + /// 渲染组件方法 + /// + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + // 渲染正常按钮 + if (Header != null) + { + var index = 0; + foreach (var header in Header.Headers) + { + var fieldName = header.GetFieldName(); + var displayName = header.GetDisplayName(); + builder.OpenElement(index++, "th"); + + // 如果允许排序 + if (header.Sort) + { + builder.AddAttribute(index++, "onclick", new Action(() => + { + if (sortName != fieldName) sortOrder = SortOrder.Asc; + else sortOrder = sortOrder == SortOrder.Asc ? SortOrder.Desc : SortOrder.Asc; + sortName = fieldName; + + // 通知 Table 组件刷新数据 + Header.OnSort?.Invoke(sortName, sortOrder); + StateHasChanged(); + })); + builder.AddAttribute(index++, "class", "sortable"); + } + builder.OpenElement(index++, "span"); + builder.AddContent(index++, displayName); + builder.CloseElement(); + if (header.Sort) + { + builder.OpenElement(index++, "i"); + var order = sortName == fieldName ? sortOrder : SortOrder.Unset; + var icon = order switch + { + SortOrder.Asc => SortIconAsc, + SortOrder.Desc => SortIconDesc, + _ => SortDefault + }; + builder.AddAttribute(index++, "class", icon); + builder.CloseElement(); + } + builder.CloseElement(); + } + } + } + } + + /// + /// 排序顺序枚举类型 + /// + public enum SortOrder + { + /// + /// 未设置 + /// + Unset, + /// + /// 升序 0-9 A-Z + /// + Asc, + /// + /// 降序 9-0 Z-A + /// + Desc, + } +} diff --git a/src/admin/Bootstrap.Admin/Pages/Admin/Dicts.razor b/src/admin/Bootstrap.Admin/Pages/Admin/Dicts.razor index 2ec1ddad4..ccd5085cd 100644 --- a/src/admin/Bootstrap.Admin/Pages/Admin/Dicts.razor +++ b/src/admin/Bootstrap.Admin/Pages/Admin/Dicts.razor @@ -14,10 +14,10 @@ - - - - + + + + @context.Category diff --git a/src/admin/Bootstrap.Admin/Pages/Components/DictsBase.cs b/src/admin/Bootstrap.Admin/Pages/Components/DictsBase.cs index 1178fb36b..141fa2daa 100644 --- a/src/admin/Bootstrap.Admin/Pages/Components/DictsBase.cs +++ b/src/admin/Bootstrap.Admin/Pages/Components/DictsBase.cs @@ -32,19 +32,28 @@ namespace Bootstrap.Pages.Admin.Components /// /// 查询方法 /// - /// 页码 - /// 每页显示数据条目数量 - /// - protected override QueryData Query(int pageIndex, int pageItems, string searchText) + /// + protected override QueryData Query(QueryPageOptions options) { var data = DataAccess.DictHelper.RetrieveDicts(); + // filter if (QueryModel.Define != -1) data = data.Where(d => d.Define == QueryModel.Define); if (!string.IsNullOrEmpty(QueryModel.Name)) data = data.Where(d => d.Name.Contains(QueryModel.Name, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(QueryModel.Category)) data = data.Where(d => d.Category.Contains(QueryModel.Category, StringComparison.OrdinalIgnoreCase)); - if (!string.IsNullOrEmpty(searchText)) data = data.Where(d => d.Category.Contains(searchText, StringComparison.OrdinalIgnoreCase) || d.Name.Contains(searchText, StringComparison.OrdinalIgnoreCase) || d.Code.Contains(searchText, StringComparison.OrdinalIgnoreCase)); + if (!string.IsNullOrEmpty(options.SearchText)) data = data.Where(d => d.Category.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || d.Name.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || d.Code.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase)); + + // sort + data = options.SortName switch + { + nameof(BootstrapDict.Category) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.Category) : data.OrderByDescending(d => d.Category), + nameof(BootstrapDict.Name) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.Name) : data.OrderByDescending(d => d.Name), + nameof(BootstrapDict.Code) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.Code) : data.OrderByDescending(d => d.Code), + nameof(BootstrapDict.Define) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.Define) : data.OrderByDescending(d => d.Define), + _ => data + }; var totalCount = data.Count(); - var items = data.Skip((pageIndex - 1) * pageItems).Take(pageItems); - return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = pageIndex, PageItems = pageItems }; + var items = data.Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems); + return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = options.PageIndex, PageItems = options.PageItems }; } /// diff --git a/src/admin/Bootstrap.Admin/Pages/Components/GroupsBase.cs b/src/admin/Bootstrap.Admin/Pages/Components/GroupsBase.cs index 6379c3af9..4c0218d13 100644 --- a/src/admin/Bootstrap.Admin/Pages/Components/GroupsBase.cs +++ b/src/admin/Bootstrap.Admin/Pages/Components/GroupsBase.cs @@ -14,18 +14,16 @@ namespace Bootstrap.Pages.Admin.Components /// /// 查询方法 /// - /// 页码 - /// 每页显示数据条目数量 - /// - protected override QueryData Query(int pageIndex, int pageItems, string searchText) + /// + protected override QueryData Query(QueryPageOptions options) { var data = GroupHelper.Retrieves(); if (!string.IsNullOrEmpty(QueryModel.GroupName)) data = data.Where(d => d.GroupName.Contains(QueryModel.GroupName, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(QueryModel.Description)) data = data.Where(d => d.Description != null && d.Description.Contains(QueryModel.Description, StringComparison.OrdinalIgnoreCase)); - if (!string.IsNullOrEmpty(searchText)) data = data.Where(d => d.GroupName.Contains(searchText, StringComparison.OrdinalIgnoreCase) || (d.Description ?? "").Contains(searchText, StringComparison.OrdinalIgnoreCase)); + if (!string.IsNullOrEmpty(options.SearchText)) data = data.Where(d => d.GroupName.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || (d.Description ?? "").Contains(options.SearchText, StringComparison.OrdinalIgnoreCase)); var totalCount = data.Count(); - var items = data.Skip((pageIndex - 1) * pageItems).Take(pageItems); - return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = pageIndex, PageItems = pageItems }; + var items = data.Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems); + return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = options.PageIndex, PageItems = options.PageItems }; } /// diff --git a/src/admin/Bootstrap.Admin/Pages/Components/MenusBase.cs b/src/admin/Bootstrap.Admin/Pages/Components/MenusBase.cs index 37cd2ff41..a6db0fc08 100644 --- a/src/admin/Bootstrap.Admin/Pages/Components/MenusBase.cs +++ b/src/admin/Bootstrap.Admin/Pages/Components/MenusBase.cs @@ -113,10 +113,8 @@ namespace Bootstrap.Pages.Admin.Components /// /// 查询方法 /// - /// 页码 - /// 每页显示数据条目数量 - /// - protected override QueryData Query(int pageIndex, int pageItems, string searchText) + /// + protected override QueryData Query(QueryPageOptions options) { var data = MenuHelper.RetrieveMenusByUserName(UserName); if (!string.IsNullOrEmpty(QueryModel.Name)) data = data.Where(d => d.Name.Contains(QueryModel.Name, StringComparison.OrdinalIgnoreCase)); @@ -124,10 +122,10 @@ namespace Bootstrap.Pages.Admin.Components if (!string.IsNullOrEmpty(QueryModel.Category)) data = data.Where(d => d.Category == QueryModel.Category); if (QueryModel.IsResource != -1) data = data.Where(d => d.IsResource == QueryModel.IsResource); if (!string.IsNullOrEmpty(QueryModel.Application)) data = data.Where(d => d.Application.Equals(QueryModel.Application, StringComparison.OrdinalIgnoreCase)); - if (!string.IsNullOrEmpty(searchText)) data = data.Where(d => d.Name.Contains(searchText, StringComparison.OrdinalIgnoreCase) || d.ParentName.Contains(searchText, StringComparison.OrdinalIgnoreCase) || d.Category.Contains(searchText, StringComparison.OrdinalIgnoreCase) || d.Application.Contains(searchText, StringComparison.OrdinalIgnoreCase)); + if (!string.IsNullOrEmpty(options.SearchText)) data = data.Where(d => d.Name.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || d.ParentName.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || d.Category.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || d.Application.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase)); var totalCount = data.Count(); - var items = data.Skip((pageIndex - 1) * pageItems).Take(pageItems); - return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = pageIndex, PageItems = pageItems }; + var items = data.Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems); + return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = options.PageIndex, PageItems = options.PageItems }; } /// @@ -155,7 +153,7 @@ namespace Bootstrap.Pages.Admin.Components /// 删除方法 /// protected override bool Delete(IEnumerable items) => MenuHelper.Delete(items.Select(item => item.Id ?? "")); - + /// /// 重置搜索方法 /// diff --git a/src/admin/Bootstrap.Admin/Pages/Components/QueryPageBase.cs b/src/admin/Bootstrap.Admin/Pages/Components/QueryPageBase.cs index 6981f52ca..6b8bd9c55 100644 --- a/src/admin/Bootstrap.Admin/Pages/Components/QueryPageBase.cs +++ b/src/admin/Bootstrap.Admin/Pages/Components/QueryPageBase.cs @@ -24,10 +24,8 @@ namespace Bootstrap.Pages.Admin.Components /// /// 查询方法 /// - /// 页码 - /// 每页显示数据条目数量 - /// - protected abstract QueryData Query(int pageIndex, int pageItems, string searchText); + /// + protected abstract QueryData Query(QueryPageOptions options); /// /// OnParametersSet 方法 @@ -46,11 +44,13 @@ namespace Bootstrap.Pages.Admin.Components /// /// 保存方法 /// - protected abstract bool Save(TItem dict); + /// + protected abstract bool Save(TItem item); /// /// 删除方法 /// + /// protected abstract bool Delete(IEnumerable items); } } diff --git a/src/admin/Bootstrap.Admin/Pages/Components/RolesBase.cs b/src/admin/Bootstrap.Admin/Pages/Components/RolesBase.cs index c26ebb162..cf8f54201 100644 --- a/src/admin/Bootstrap.Admin/Pages/Components/RolesBase.cs +++ b/src/admin/Bootstrap.Admin/Pages/Components/RolesBase.cs @@ -14,18 +14,16 @@ namespace Bootstrap.Pages.Admin.Components /// /// 查询方法 /// - /// 页码 - /// 每页显示数据条目数量 - /// - protected override QueryData Query(int pageIndex, int pageItems, string searchText) + /// + protected override QueryData Query(QueryPageOptions options) { var data = RoleHelper.Retrieves(); if (!string.IsNullOrEmpty(QueryModel.RoleName)) data = data.Where(d => d.RoleName.Contains(QueryModel.RoleName, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(QueryModel.Description)) data = data.Where(d => d.Description != null && d.Description.Contains(QueryModel.Description, StringComparison.OrdinalIgnoreCase)); - if (!string.IsNullOrEmpty(searchText)) data = data.Where(d => d.RoleName.Contains(searchText, StringComparison.OrdinalIgnoreCase) || d.Description.Contains(searchText, StringComparison.OrdinalIgnoreCase)); + if (!string.IsNullOrEmpty(options.SearchText)) data = data.Where(d => d.RoleName.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || d.Description.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase)); var totalCount = data.Count(); - var items = data.Skip((pageIndex - 1) * pageItems).Take(pageItems); - return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = pageIndex, PageItems = pageItems }; + var items = data.Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems); + return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = options.PageIndex, PageItems = options.PageItems }; } /// @@ -37,7 +35,7 @@ namespace Bootstrap.Pages.Admin.Components /// 删除方法 /// protected override bool Delete(IEnumerable items) => RoleHelper.Delete(items.Select(item => item.Id ?? "")); - + /// /// 重置搜索方法 /// @@ -78,6 +76,5 @@ namespace Bootstrap.Pages.Admin.Components { } - } } diff --git a/src/admin/Bootstrap.Admin/Pages/Components/UsersBase.cs b/src/admin/Bootstrap.Admin/Pages/Components/UsersBase.cs index 880ccee77..4d67f61d3 100644 --- a/src/admin/Bootstrap.Admin/Pages/Components/UsersBase.cs +++ b/src/admin/Bootstrap.Admin/Pages/Components/UsersBase.cs @@ -14,18 +14,16 @@ namespace Bootstrap.Pages.Admin.Components /// /// 查询方法 /// - /// 页码 - /// 每页显示数据条目数量 - /// - protected override QueryData Query(int pageIndex, int pageItems, string searchText) + /// + protected override QueryData Query(QueryPageOptions options) { var data = UserHelper.Retrieves(); if (!string.IsNullOrEmpty(QueryModel.UserName)) data = data.Where(d => d.UserName.Contains(QueryModel.UserName, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(QueryModel.DisplayName)) data = data.Where(d => d.DisplayName.Contains(QueryModel.DisplayName, StringComparison.OrdinalIgnoreCase)); - if (!string.IsNullOrEmpty(searchText)) data = data.Where(d => d.UserName.Contains(searchText, StringComparison.OrdinalIgnoreCase) || d.DisplayName.Contains(searchText, StringComparison.OrdinalIgnoreCase)); + if (!string.IsNullOrEmpty(options.SearchText)) data = data.Where(d => d.UserName.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || d.DisplayName.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase)); var totalCount = data.Count(); - var items = data.Skip((pageIndex - 1) * pageItems).Take(pageItems); - return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = pageIndex, PageItems = pageItems }; + var items = data.Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems); + return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = options.PageIndex, PageItems = options.PageItems }; } /// @@ -37,7 +35,7 @@ namespace Bootstrap.Pages.Admin.Components /// 删除方法 /// protected override bool Delete(IEnumerable users) => UserHelper.Delete(users.Select(item => item.Id ?? "")); - + /// /// 重置搜索方法 /// diff --git a/src/admin/Bootstrap.Admin/Shared/Table.razor b/src/admin/Bootstrap.Admin/Shared/Table.razor index becb2f031..c07fd0054 100644 --- a/src/admin/Bootstrap.Admin/Shared/Table.razor +++ b/src/admin/Bootstrap.Admin/Shared/Table.razor @@ -61,7 +61,10 @@ { 行号 } - @TableHeader?.Invoke(EditModel) + + + @TableHeader?.Invoke(EditModel) + @if (ShowExtendButtons) { @ButtonTemplateHeaderText @@ -82,7 +85,10 @@ { 行号 } - @TableHeader?.Invoke(EditModel) + + + @TableHeader?.Invoke(EditModel) + @if (ShowExtendButtons) { @ButtonTemplateHeaderText diff --git a/src/admin/Bootstrap.Admin/Shared/TableHeader.razor b/src/admin/Bootstrap.Admin/Shared/TableHeader.razor new file mode 100644 index 000000000..62297ea9f --- /dev/null +++ b/src/admin/Bootstrap.Admin/Shared/TableHeader.razor @@ -0,0 +1,5 @@ +@inherits TableHeaderBase + + + @ChildContent + -- Gitee From 91b174f2965f8f785887924e8997cf6d3a900a25 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Mon, 27 Jan 2020 15:15:22 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E6=9D=83=E9=99=90=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4=E9=A1=B5=E9=9D=A2=E5=A2=9E=E5=8A=A0=E8=A1=A8=E5=A4=B4?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/admin/Bootstrap.Admin/Pages/Admin/Groups.razor | 6 +++--- src/admin/Bootstrap.Admin/Pages/Admin/Roles.razor | 4 ++-- src/admin/Bootstrap.Admin/Pages/Admin/Users.razor | 12 ++++++------ .../Bootstrap.Admin/Pages/Components/GroupsBase.cs | 10 ++++++++++ .../Bootstrap.Admin/Pages/Components/RolesBase.cs | 9 +++++++++ .../Bootstrap.Admin/Pages/Components/UsersBase.cs | 13 +++++++++++++ 6 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/admin/Bootstrap.Admin/Pages/Admin/Groups.razor b/src/admin/Bootstrap.Admin/Pages/Admin/Groups.razor index ec9a2d74e..161e532ae 100644 --- a/src/admin/Bootstrap.Admin/Pages/Admin/Groups.razor +++ b/src/admin/Bootstrap.Admin/Pages/Admin/Groups.razor @@ -10,9 +10,9 @@ - - - + + + @context.GroupCode diff --git a/src/admin/Bootstrap.Admin/Pages/Admin/Roles.razor b/src/admin/Bootstrap.Admin/Pages/Admin/Roles.razor index 63082ba29..04c606c8b 100644 --- a/src/admin/Bootstrap.Admin/Pages/Admin/Roles.razor +++ b/src/admin/Bootstrap.Admin/Pages/Admin/Roles.razor @@ -17,8 +17,8 @@ - - + + @context.RoleName diff --git a/src/admin/Bootstrap.Admin/Pages/Admin/Users.razor b/src/admin/Bootstrap.Admin/Pages/Admin/Users.razor index 436ae2193..9524b4794 100644 --- a/src/admin/Bootstrap.Admin/Pages/Admin/Users.razor +++ b/src/admin/Bootstrap.Admin/Pages/Admin/Users.razor @@ -10,12 +10,12 @@ - - - - - - + + + + + + @context.UserName diff --git a/src/admin/Bootstrap.Admin/Pages/Components/GroupsBase.cs b/src/admin/Bootstrap.Admin/Pages/Components/GroupsBase.cs index 4c0218d13..56d3d1b26 100644 --- a/src/admin/Bootstrap.Admin/Pages/Components/GroupsBase.cs +++ b/src/admin/Bootstrap.Admin/Pages/Components/GroupsBase.cs @@ -21,6 +21,16 @@ namespace Bootstrap.Pages.Admin.Components if (!string.IsNullOrEmpty(QueryModel.GroupName)) data = data.Where(d => d.GroupName.Contains(QueryModel.GroupName, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(QueryModel.Description)) data = data.Where(d => d.Description != null && d.Description.Contains(QueryModel.Description, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(options.SearchText)) data = data.Where(d => d.GroupName.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || (d.Description ?? "").Contains(options.SearchText, StringComparison.OrdinalIgnoreCase)); + + // sort + data = options.SortName switch + { + nameof(Group.GroupName) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.GroupName) : data.OrderByDescending(d => d.GroupName), + nameof(Group.GroupCode) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.GroupCode) : data.OrderByDescending(d => d.GroupCode), + nameof(Group.Description) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.Description) : data.OrderByDescending(d => d.Description), + _ => data + }; + var totalCount = data.Count(); var items = data.Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems); return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = options.PageIndex, PageItems = options.PageItems }; diff --git a/src/admin/Bootstrap.Admin/Pages/Components/RolesBase.cs b/src/admin/Bootstrap.Admin/Pages/Components/RolesBase.cs index cf8f54201..f59a0af50 100644 --- a/src/admin/Bootstrap.Admin/Pages/Components/RolesBase.cs +++ b/src/admin/Bootstrap.Admin/Pages/Components/RolesBase.cs @@ -21,6 +21,15 @@ namespace Bootstrap.Pages.Admin.Components if (!string.IsNullOrEmpty(QueryModel.RoleName)) data = data.Where(d => d.RoleName.Contains(QueryModel.RoleName, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(QueryModel.Description)) data = data.Where(d => d.Description != null && d.Description.Contains(QueryModel.Description, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(options.SearchText)) data = data.Where(d => d.RoleName.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || d.Description.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase)); + + // sort + data = options.SortName switch + { + nameof(Role.RoleName) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.RoleName) : data.OrderByDescending(d => d.RoleName), + nameof(Role.Description) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.Description) : data.OrderByDescending(d => d.Description), + _ => data + }; + var totalCount = data.Count(); var items = data.Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems); return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = options.PageIndex, PageItems = options.PageItems }; diff --git a/src/admin/Bootstrap.Admin/Pages/Components/UsersBase.cs b/src/admin/Bootstrap.Admin/Pages/Components/UsersBase.cs index 4d67f61d3..6ac4d352b 100644 --- a/src/admin/Bootstrap.Admin/Pages/Components/UsersBase.cs +++ b/src/admin/Bootstrap.Admin/Pages/Components/UsersBase.cs @@ -21,6 +21,19 @@ namespace Bootstrap.Pages.Admin.Components if (!string.IsNullOrEmpty(QueryModel.UserName)) data = data.Where(d => d.UserName.Contains(QueryModel.UserName, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(QueryModel.DisplayName)) data = data.Where(d => d.DisplayName.Contains(QueryModel.DisplayName, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(options.SearchText)) data = data.Where(d => d.UserName.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase) || d.DisplayName.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase)); + + // sort + data = options.SortName switch + { + nameof(User.UserName) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.UserName) : data.OrderByDescending(d => d.UserName), + nameof(User.DisplayName) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.DisplayName) : data.OrderByDescending(d => d.DisplayName), + nameof(User.Description) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.Description) : data.OrderByDescending(d => d.Description), + nameof(User.ApprovedBy) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.ApprovedBy) : data.OrderByDescending(d => d.ApprovedBy), + nameof(User.ApprovedTime) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.ApprovedTime) : data.OrderByDescending(d => d.ApprovedTime), + nameof(User.RegisterTime) => options.SortOrder == SortOrder.Asc ? data.OrderBy(d => d.RegisterTime) : data.OrderByDescending(d => d.RegisterTime), + _ => data + }; + var totalCount = data.Count(); var items = data.Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems); return new QueryData() { Items = items, TotalCount = totalCount, PageIndex = options.PageIndex, PageItems = options.PageItems }; -- Gitee