接上篇: B08. BootstrapBlazor實戰 Menu 導航選單使用(1)
實戰BootstrapBlazorMenu 導航選單的使用, 以及整合Freesql orm快速製作選單項資料庫後臺維護頁面
demo演示的是Sqlite驅動,FreeSql支援多種資料庫,MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/達夢/神通/人大金倉/翰高/華為GaussDB/MsAccess
3.專案模板
節省時間,直接使用 Bootstrap Blazor App 模板快速搭建專案
傳送門: https://www.blazor.zone/template
3.1. 安裝專案模板
dotnet new -i Bootstrap.Blazor.Templates
3.2. 建立工程
dotnet new bbapp
4. 本次演示使用工程名字 b08Menu ,命令如下
dotnet new bbapp -o b08Menu
dotnet add b08Menu/BootstrapBlazorApp.Shared package FreeSql.Provider.Sqlite
dotnet add b08Menu/BootstrapBlazorApp.Shared package Densen.FreeSql.Extensions.BootstrapBlazor
dotnet sln add b08Menu/BootstrapBlazorApp.Server/BootstrapBlazorApp.Server.csproj
dotnet sln add b08Menu/BootstrapBlazorApp.Shared/BootstrapBlazorApp.Shared.csproj
dotnet sln add b08Menu/BootstrapBlazorApp.WebAssembly/BootstrapBlazorApp.WebAssembly.csproj
注:由於模板使用了共享庫,雙出Server
和WebAssembly
工程,我們這裡只使用Server
工程做演示.
5. 資料服務
新增FreeSql服務到 BootstrapBlazorApp.Server/Program.cs
在 builder.Services.AddBootstrapBlazor(); 之前加入
builder.Services.AddFreeSql(option =>
{
//demo演示的是Sqlite驅動,FreeSql支援多種資料庫,MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/達夢/神通/人大金倉/翰高/華為GaussDB/MsAccess
option.UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=test.db;") //也可以寫到配置檔案中
#if DEBUG
//開發環境:自動同步實體
.UseAutoSyncStructure(true)
.UseNoneCommandParameter(true)
//除錯sql語句輸出
.UseMonitorCommand(cmd => System.Console.WriteLine(cmd.CommandText))
#endif
;
});
傳送門: https://github.com/densen2014/Blazor100/wiki/B03.-BootstrapBlazor實戰-10分鐘編寫資料庫維護專案
6. Menu資料實體類
使用FreeSql的父子導航屬性處理樹形分類
傳送門: https://github.com/densen2014/Blazor100/wiki/B05.-BootstrapBlazor實戰-Tree樹形控制元件使用(2)
新建類檔案 Data/WebPages.cs
/// <summary>
/// 頁面
/// </summary>
[AutoGenerateClass(Searchable = true, Filterable = true, Sortable = true)]
public class WebPages
{
public WebPages() { }
public WebPages(string PageName, string? Url = null, string? Icon = null, string? Code = "0", List<WebPages>? Childs = null)
{
this.PageName = PageName;
this.Url = Url ?? $"/{PageName}";
this.Icon = Icon;
this.Code = Code;
this.Childs = Childs;
}
/// <summary>
///程式碼
/// </summary>
[DisplayName("程式碼")]
[Column(IsPrimary = true)]
[AutoGenerateColumn(DefaultSort = true, DefaultSortOrder = SortOrder.Asc)]
public string? Code { get; set; }
/// <summary>
///父級程式碼
/// </summary>
[DisplayName("父級程式碼")]
[Column]
public string? ParentCode { get; set; }
[Navigate(nameof(ParentCode))]
[AutoGenerateColumn(Ignore = true)]
public WebPages? Parent { get; set; }
[Navigate(nameof(ParentCode))]
[AutoGenerateColumn(Ignore = true)]
public List<WebPages>? Childs { get; set; }
/// <summary>
///頁面名稱
/// </summary>
[Required(ErrorMessage = "{0}不能為空")]
[DisplayName("頁面名稱")]
public string? PageName { get; set; }
/// <summary>
///Icon
/// </summary>
[DisplayName("Icon")]
[AutoGenerateColumn(Visible = false)]
public string? Icon { get; set; }
/// <summary>
///Url
/// </summary>
[Required(ErrorMessage = "{0}不能為空")]
[DisplayName("Url")]
[AutoGenerateColumn(Visible = false)]
public string? Url { get; set; }
/// <summary>
/// 隱藏
/// </summary>
[DisplayName ("隱藏")]
public bool Hide { get; set; }
}
7. 擴充套件工具
寫文章的時候這個方法已經pr進BootstrapBlazor庫,可能讀者們看到的時候已經內建次方法了.如果重複,自行跳過這步.
public static class Utility
{
/// <summary>
/// 選單樹狀資料層次化方法
/// </summary>
/// <param name="items">資料集合</param>
/// <param name="parentId">父級節點</param>
public static IEnumerable<MenuItem> CascadingMenu(this IEnumerable<MenuItem> items, string? parentId = null) => items.Where(i => i.ParentId == parentId).Select(i =>
{
i.Items = CascadingMenu(items, i.Id).ToList();
return i;
});
}
8. 選單介面
找到BootstrapBlazorApp.Shared/Shared/MainLayout.razor
檔案,展開三角符號,開啟MainLayout.razor.cs
檔案編輯
注入FreeSql
[Inject]
[NotNull]
IFreeSql? fsql { get; set; }
Menus 初始化儲存到資料庫
using Microsoft.AspNetCore.Components;
using System.Diagnostics.CodeAnalysis;
using BootstrapBlazorApp.Shared.Data;
//private List<MenuItem>? Menus { get; set; }
private List<MenuItem>? Menus { get; set; } = new List<MenuItem>();
/// <summary>
/// OnInitialized 方法
/// </summary>
protected override void OnInitialized()
{
base.OnInitialized();
//Menus = GetIconSideMenuItems();
}
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
if (fsql.Select<WebPages>().Count() == 0)
{
var pages = new List<WebPages>(){
new WebPages("首頁","/","fa fa-home","001") ,
new WebPages("資料","","fa fa-fw fa-database","002",
new List<WebPages>(new[] {
new WebPages("FetchData","fetchdata","fa fa-fw fa-database","002_001") ,
new WebPages( "Counter","counter","fa fa-fw fa-check-square-o","002_002") ,
new WebPages("後臺管理","admins","fa fa-gears","002_003") ,
})) ,
new WebPages("Table","table","fa fa-fw fa-table","004") ,
new WebPages("花名冊","users","fa fa-fw fa-users","005")
};
var repo = fsql.GetRepository<WebPages>();//倉庫類
repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; //開啟一對多,多對多級聯儲存功能
repo.Insert(pages);
}
Menus = fsql.Select<WebPages>().OrderBy(a => a.Code)
.LeftJoin(d => d.ParentCode == d.Parent!.Code)
.ToList(a => new MenuItem()
{
Text = a.PageName,
Id = a.Code,
Url = a.Url,
ParentId = a.ParentCode,
Icon = a.Icon
}).CascadingMenu().ToList();
// 演算法獲取屬性結構資料 .CascadingMenu().ToList()
StateHasChanged();
}
}
到這一步,大家肯定迫不及待要執行一下了,來吧,少年,F5
9. 選單管理介面
使用Densen.FreeSql.Extensions.BootstrapBlazor
庫的資料庫服務直接表格編輯選單資料庫表格.
先登出模板工程自帶演示服務,BootstrapBlazorApp.Server/Program.cs
登出 builder.Services.AddTableDemoDataService();
// 增加 Table 資料服務操作類
//builder.Services.AddTableDemoDataService();
新建BootstrapBlazorApp.Shared/Pages/Admins.razor
檔案
@page "/admins"
@attribute [TabItemOption(Text = "選單管理")]
<PageTitle>選單管理</PageTitle>
<div class="table-users scroll">
<Table TItem="WebPages"
IsFixedHeader="true"
IsPagination="true"
IsStriped="true"
AutoGenerateColumns="true"
ShowSearch="true"
ShowToolbar="true"
ShowExtendButtons="true"
DoubleClickToEdit=true
ShowColumnList=true
ShowCardView=true>
</Table>
</div>
來吧,少年,F5
是不是很有成就感,你怎麼這麼優秀呢? 哈哈哈.
10.新增選單
重新整理頁面
少年, 如期而來!
11.下一篇大概是: Layout 元件
專案原始碼
關聯專案
FreeSql QQ群:4336577(已滿)、8578575(已滿)、52508226(線上)
BA & Blazor QQ群:795206915、675147445
知識共享許可協議
本作品採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名AlexChow(包含連結: https://github.com/densen2014 ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我聯絡 。