接上篇: B08. BootstrapBlazor实战 Menu 导航菜单使用(1)

3.项目模板

节省时间,直接使用 Bootstrap Blazor App 模板快速搭建项目

传送门: https://www.blazor.zone/template

3.1. 安装项目模板

dotnet new -i Bootstrap.Blazor.Templates

3.2. 创建工程

dotnet new bbapp

4. 本次演示使用工程名字 b08Menu ,命令如下

  1. dotnet new bbapp -o b08Menu
  2. dotnet add b08Menu/BootstrapBlazorApp.Shared package FreeSql.Provider.Sqlite
  3. dotnet add b08Menu/BootstrapBlazorApp.Shared package Densen.FreeSql.Extensions.BootstrapBlazor
  4. dotnet sln add b08Menu/BootstrapBlazorApp.Server/BootstrapBlazorApp.Server.csproj
  5. dotnet sln add b08Menu/BootstrapBlazorApp.Shared/BootstrapBlazorApp.Shared.csproj
  6. dotnet sln add b08Menu/BootstrapBlazorApp.WebAssembly/BootstrapBlazorApp.WebAssembly.csproj

注:由于模板使用了共享库,双出ServerWebAssembly工程,我们这里只使用Server工程做演示.

5. 数据服务

添加FreeSql服务到 BootstrapBlazorApp.Server/Program.cs 在 builder.Services.AddBootstrapBlazor(); 之前加入

  1. builder.Services.AddFreeSql(option =>
  2. {
  3. //demo演示的是Sqlite驱动,FreeSql支持多种数据库,MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/神通/人大金仓/翰高/华为GaussDB/MsAccess
  4. option.UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=test.db;") //也可以写到配置文件中
  5. #if DEBUG
  6. //开发环境:自动同步实体
  7. .UseAutoSyncStructure(true)
  8. .UseNoneCommandParameter(true)
  9. //调试sql语句输出
  10. .UseMonitorCommand(cmd => System.Console.WriteLine(cmd.CommandText))
  11. #endif
  12. ;
  13. });

传送门: 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

  1. /// <summary>
  2. /// 页面
  3. /// </summary>
  4. [AutoGenerateClass(Searchable = true, Filterable = true, Sortable = true)]
  5. public class WebPages
  6. {
  7. public WebPages() { }
  8. public WebPages(string PageName, string? Url = null, string? Icon = null, string? Code = "0", List<WebPages>? Childs = null)
  9. {
  10. this.PageName = PageName;
  11. this.Url = Url ?? $"/{PageName}";
  12. this.Icon = Icon;
  13. this.Code = Code;
  14. this.Childs = Childs;
  15. }
  16. /// <summary>
  17. ///代码
  18. /// </summary>
  19. [DisplayName("代码")]
  20. [Column(IsPrimary = true)]
  21. [AutoGenerateColumn(DefaultSort = true, DefaultSortOrder = SortOrder.Asc)]
  22. public string? Code { get; set; }
  23. /// <summary>
  24. ///父级代码
  25. /// </summary>
  26. [DisplayName("父级代码")]
  27. [Column]
  28. public string? ParentCode { get; set; }
  29. [Navigate(nameof(ParentCode))]
  30. [AutoGenerateColumn(Ignore = true)]
  31. public WebPages? Parent { get; set; }
  32. [Navigate(nameof(ParentCode))]
  33. [AutoGenerateColumn(Ignore = true)]
  34. public List<WebPages>? Childs { get; set; }
  35. /// <summary>
  36. ///页面名称
  37. /// </summary>
  38. [Required(ErrorMessage = "{0}不能为空")]
  39. [DisplayName("页面名称")]
  40. public string? PageName { get; set; }
  41. /// <summary>
  42. ///Icon
  43. /// </summary>
  44. [DisplayName("Icon")]
  45. [AutoGenerateColumn(Visible = false)]
  46. public string? Icon { get; set; }
  47. /// <summary>
  48. ///Url
  49. /// </summary>
  50. [Required(ErrorMessage = "{0}不能为空")]
  51. [DisplayName("Url")]
  52. [AutoGenerateColumn(Visible = false)]
  53. public string? Url { get; set; }
  54. /// <summary>
  55. /// 隐藏
  56. /// </summary>
  57. [DisplayName ("隐藏")]
  58. public bool Hide { get; set; }
  59. }

7. 扩展工具

写文章的时候这个方法已经pr进BootstrapBlazor库,可能读者们看到的时候已经内置次方法了.如果重复,自行跳过这步.

  1. public static class Utility
  2. {
  3. /// <summary>
  4. /// 菜单树状数据层次化方法
  5. /// </summary>
  6. /// <param name="items">数据集合</param>
  7. /// <param name="parentId">父级节点</param>
  8. public static IEnumerable<MenuItem> CascadingMenu(this IEnumerable<MenuItem> items, string? parentId = null) => items.Where(i => i.ParentId == parentId).Select(i =>
  9. {
  10. i.Items = CascadingMenu(items, i.Id).ToList();
  11. return i;
  12. });
  13. }

8. 菜单界面

找到BootstrapBlazorApp.Shared/Shared/MainLayout.razor文件,展开三角符号,打开MainLayout.razor.cs文件编辑

注入FreeSql

  1. [Inject]
  2. [NotNull]
  3. IFreeSql? fsql { get; set; }

Menus 初始化保存到数据库

  1. using Microsoft.AspNetCore.Components;
  2. using System.Diagnostics.CodeAnalysis;
  3. using BootstrapBlazorApp.Shared.Data;
  4. //private List<MenuItem>? Menus { get; set; }
  5. private List<MenuItem>? Menus { get; set; } = new List<MenuItem>();
  6. /// <summary>
  7. /// OnInitialized 方法
  8. /// </summary>
  9. protected override void OnInitialized()
  10. {
  11. base.OnInitialized();
  12. //Menus = GetIconSideMenuItems();
  13. }
  14. protected override void OnAfterRender(bool firstRender)
  15. {
  16. if (firstRender)
  17. {
  18. if (fsql.Select<WebPages>().Count() == 0)
  19. {
  20. var pages = new List<WebPages>(){
  21. new WebPages("首页","/","fa fa-home","001") ,
  22. new WebPages("数据","","fa fa-fw fa-database","002",
  23. new List<WebPages>(new[] {
  24. new WebPages("FetchData","fetchdata","fa fa-fw fa-database","002_001") ,
  25. new WebPages( "Counter","counter","fa fa-fw fa-check-square-o","002_002") ,
  26. new WebPages("后台管理","admins","fa fa-gears","002_003") ,
  27. })) ,
  28. new WebPages("Table","table","fa fa-fw fa-table","004") ,
  29. new WebPages("花名册","users","fa fa-fw fa-users","005")
  30. };
  31. var repo = fsql.GetRepository<WebPages>();//仓库类
  32. repo.DbContextOptions.EnableAddOrUpdateNavigateList = true; //开启一对多,多对多级联保存功能
  33. repo.Insert(pages);
  34. }
  35. Menus = fsql.Select<WebPages>().OrderBy(a => a.Code)
  36. .LeftJoin(d => d.ParentCode == d.Parent!.Code)
  37. .ToList(a => new MenuItem()
  38. {
  39. Text = a.PageName,
  40. Id = a.Code,
  41. Url = a.Url,
  42. ParentId = a.ParentCode,
  43. Icon = a.Icon
  44. }).CascadingMenu().ToList();
  45. // 算法获取属性结构数据 .CascadingMenu().ToList()
  46. StateHasChanged();
  47. }
  48. }

到这一步,大家肯定迫不及待要运行一下了,来吧,少年,F5

9. 菜单管理界面

使用Densen.FreeSql.Extensions.BootstrapBlazor库的数据库服务直接表格编辑菜单数据库表格.

先注销模板工程自带演示服务,BootstrapBlazorApp.Server/Program.cs 注销 builder.Services.AddTableDemoDataService();

  1. // 增加 Table 数据服务操作类
  2. //builder.Services.AddTableDemoDataService();

新建BootstrapBlazorApp.Shared/Pages/Admins.razor文件

  1. @page "/admins"
  2. @attribute [TabItemOption(Text = "菜单管理")]
  3. <PageTitle>菜单管理</PageTitle>
  4. <div class="table-users scroll">
  5. <Table TItem="WebPages"
  6. IsFixedHeader="true"
  7. IsPagination="true"
  8. IsStriped="true"
  9. AutoGenerateColumns="true"
  10. ShowSearch="true"
  11. ShowToolbar="true"
  12. ShowExtendButtons="true"
  13. DoubleClickToEdit=true
  14. ShowColumnList=true
  15. ShowCardView=true>
  16. </Table>
  17. </div>

来吧,少年,F5

是不是很有成就感,你怎么这么优秀呢? 哈哈哈.

10.添加菜单

刷新页面

少年, 如期而来!

11.下一篇大概是: Layout 组件

B08. BootstrapBlazor实战 Menu 导航菜单使用(2)的更多相关文章

  1. BootstrapBlazor实战 Menu 导航菜单使用(1)

    实战BootstrapBlazorMenu 导航菜单的使用, 以及整合Freesql orm快速制作菜单项数据库后台维护页面 demo演示的是Sqlite驱动,FreeSql支持多种数据库,MySql ...

  2. 使用Iview Menu 导航菜单(非 template/render 模式)

    1.首先直接参照官网Demo例子,将代码拷贝进项目中运行, 直接报错: Cannot read property 'mode' of undefined. 然后查看官网介绍,有一行注意文字,好吧. 2 ...

  3. Iview 中 获取 Menu 导航菜单 选中的值

    期望效果: 原来,我用的是脚本来控制,然后........,再然后,我再去仔细看官方文档的时候,才发现,Menu组件 有那么两个事件,on-select 和 on-open-change ,好气啊,之 ...

  4. BootstrapBlazor实战 Markdown 编辑器使用

    基础工程使用工程: B08. BootstrapBlazor实战 Menu 导航菜单使用 实战BootstrapBlazorMenu Markdown 编辑器使用, 以及整合Freesql orm快速 ...

  5. 为SharePoint网站创建自定义导航菜单

    转:http://kaneboy.blog.51cto.com/1308893/397779 相信不少人都希望把SharePoint网站内置的那个顶部导航菜单,换成自己希望的样式.由于SharePoi ...

  6. JavaScript实战(带收放动画效果的导航菜单)

    虽然有很多插件可用,但为了共同提高,我做了一系列JavaScript实战系列的实例,分享给大家,前辈们若有好的建议,请务必指出,免得误人子弟啊! ( 原创文章,转摘请注明:苏福:http://www. ...

  7. Orchard扩展 自定义后台管理导航菜单 Admin Menu

    金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉. 金天:看源码永远是Coder学习的最快捷路径.     看本文需要对Orchard大致体系, 特别是Mo ...

  8. JQUERY 插件开发——MENU(导航菜单)

    JQUERY 插件开发——MENU(导航菜单) 故事背景:由于最近太忙了,已经很久没有写jquery插件开发系列了.但是凭着自己对这方面的爱好,我还是抽了一些时间来过一下插件瘾的.今天的主题是导航菜单 ...

  9. html自定义垂直导航菜单(加强版--自定义传入menu参数,支持JSONArray、JSArray、JSONObject、JSObject)

    在上一篇中我简单写了个html自定义垂直导航菜单,缺点很明显,里面的数据是固定死的,不能动态更改数据. 这里我重写了一个修改版的垂直二级导航菜单,将原先的menuBox.init(config);修改 ...

随机推荐

  1. 生命周期内create和mounted的区别?

    created: 在模板渲染成html前调用,即通常初始化某些数据,然后再渲染成视图. mounted: 在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作 ...

  2. 什么是 bean 装配?

    装配,或 bean 装配是指在 Spring 容器中把 bean 组装到一起,前提是容器需要 知道 bean 的依赖关系,如何通过依赖注入来把它们装配到一起.

  3. redis 过期键的删除策略?

    1.定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键 的过期时间来临时,立即执行对键的删除操作. 2.惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的 ...

  4. 实验配置cisco单臂路由

    第一步 搭建实验拓扑图 第二步 对路由器做基本配置 为路由器创建名称: 设置进入特权模式 口令:控制台登录密码:vty登录密码 禁用DNS查找: 加密明文密码: 创建一个向访问设备者发出警告的标语&q ...

  5. Noob渗透笔记

    靶机下载地址:https://www.vulnhub.com/entry/noob-1,746/ kali ip 信息收集 依旧我们先使用nmap扫描确定一下靶机ip nmap -sP 192.168 ...

  6. Bootstrap 之 Metronic 模板的学习之路 - (1)总览

    写在前面 bootstrap 的模板非常多,Envato 上有着各种各样的免费及付费模板.Metronic 是我最喜欢的模板之一(看一眼就喜欢上的那种),当前售价 $28 ,觉得赞的,不妨支持一下作者 ...

  7. 使用Canvas和JavaScript做一个画板

    本文同步于个人博客:https://zhoushuo.me/blog/2018/03/11/drawing-borad/ 前些天学习了HTML5的<canvas>元素,今天就来实践一下,用 ...

  8. 人机交互BS

    B/S结构用户界面设计       [实验编号] 10003809548j Web界面设计 [实验学时] 8学时 [实验环境] l  所需硬件环境为微机: l  所需软件环境为dreamweaver ...

  9. 牛客网-剑指Offer 二维数组中的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  10. golang开发:go并发的建议

    这个是前段时间看到Go语言的贡献者与布道师 Dave Cheney对Go并发的建议或者叫使用的陷阱(不是我自己的建议),结合自己最近几年对gorotine的使用,再回头看这几条建议,真的会茅塞顿开,觉 ...