前言

由于第七天Blazor前端页面编写和接口对接的内容比较的多,所以这一章节将会分为三篇文章来进行讲解,大家可以认为分为早、中、晚来进行阶段性学习,从而提高学习效率。

七天.NET 8 操作 SQLite 入门到实战详细教程

EasySQLite 项目源码地址

GitHub 地址:https://github.com/YSGStudyHards/EasySQLite

Blazor简介和快速入门

不熟悉Blazor的同学可以先看这篇文章大概了解一下。

全面的ASP.NET Core Blazor简介和快速入门

BootstrapBlazor介绍

  • 使用文档:https://www.blazor.zone/introduction
  • Gitee项目地址:https://gitee.com/LongbowEnterprise/BootstrapBlazor

BootstrapBlazor是一套基于 Bootstrap 和 Blazor 的企业级组件库,可以认为是 Bootstrap 项目的 Blazor 版实现。基于 Bootstrap 样式库精心打造,并且额外增加了 100 多种常用的组件,为您快速开发项目带来非一般的感觉(喜欢Bootstrap风格的同学推荐使用)。

BootstrapBlazor类库安装

管理Nuget程序包=>搜索BootstrapBlazor进行安装。

BootstrapBlazor库注入容器

Program.cs中将 BootstrapBlazor 库添加到 ASP.NET Core 项目中的依赖关系注入容器中。

导入BootstrapBlazor组件库命名空间

打开_Imports.razor文件,导入BootstrapBlazor组件库命名空间:@using BootstrapBlazor.Components。

Menu 导航菜单设置

MainLayout.razor

@inherits LayoutComponentBase

<Layout SideWidth="0" IsPage="true" ShowGotoTop="true" ShowCollapseBar="true"
        IsFullSide="@IsFullSide" IsFixedHeader="@IsFixedHeader" IsFixedFooter="@IsFixedFooter" ShowFooter="@ShowFooter"
        TabDefaultUrl="/"
        Menus="@Menus" UseTabSet="@UseTabSet" AdditionalAssemblies="new[] { GetType().Assembly }" class="@Theme">
    <Header>
        <span class="ms-3 flex-sm-fill d-none d-sm-block">Bootstrap of Blazor</span>
        <div class="flex-fill d-sm-none">
        </div>
        <div class="layout-drawer" @onclick="@(e => IsOpen = !IsOpen)"><i class="fa fa-gears"></i></div>
    </Header>
    <Side>
        <div class="layout-banner">
            <div class="layout-title">
                <span>EasySQLite</span>
            </div>
        </div>
        <div class="layout-user">
            <img class="layout-avatar" src="./favicon.png">
            <div class="layout-title">
                <span>管理员</span>
            </div>
            <div class="layout-user-state"></div>
        </div>
    </Side>
    <Main>
        <CascadingValue Value="this" IsFixed="true">
            @Body
        </CascadingValue>
    </Main>
    <Footer>
        <div class="text-center flex-fill">
            <a class="page-layout-demo-footer-link" href="https://gitee.com/LongbowEnterprise/BootstrapAdmin" target="_blank">Bootstrap Admin</a>
        </div>
    </Footer>
    <NotFound>
        <p>Sorry, there's nothing at this address.</p>
    </NotFound>
</Layout>

<Drawer Placement="Placement.Right" @bind-IsOpen="@IsOpen" IsBackdrop="true">
    <div class="layout-drawer-body">
        <div class="btn btn-info w-100" @onclick="@(e => IsOpen = false)">点击关闭</div>
        <div class="page-layout-demo-option">
            <p>布局调整</p>
            <div class="row">
                <div class="col-6">
                    <div class="layout-item @(IsFullSide ? "active d-flex" : "d-flex")" @onclick="@(e => IsFullSide = true)" data-toggle="tooltip" title="左右结构">
                        <div class="layout-left d-flex flex-column">
                            <div class="layout-left-header"></div>
                            <div class="layout-left-body flex-fill"></div>
                        </div>
                        <div class="layout-right d-flex flex-column flex-fill">
                            <div class="layout-right-header"></div>
                            <div class="layout-right-body flex-fill"></div>
                            <div class="layout-right-footer"></div>
                        </div>
                    </div>
                </div>
                <div class="col-6">
                    <div class="layout-item flex-column @(IsFullSide ? "d-flex" : "active d-flex")" @onclick="@(e => IsFullSide = false)" data-toggle="tooltip" title="上下结构">
                        <div class="layout-top">
                        </div>
                        <div class="layout-body d-flex flex-fill">
                            <div class="layout-left">
                            </div>
                            <div class="layout-right flex-fill">
                            </div>
                        </div>
                        <div class="layout-footer">
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="page-layout-demo-option">
            <p>固定调整</p>
            <div class="row">
                <div class="col-6 d-flex align-items-center">
                    <Switch @bind-Value="@IsFixedHeader" OnColor="@Color.Success" OffColor="@Color.Secondary"></Switch>
                </div>
                <div class="col-6 text-right">
                    <span class="cell-label">固定页头</span>
                </div>
            </div>
            <div class="row mt-3">
                <div class="col-6 d-flex align-items-center">
                    <Switch @bind-Value="@IsFixedFooter" OnColor="@Color.Success" OffColor="@Color.Secondary"></Switch>
                </div>
                <div class="col-6 text-right">
                    <span class="cell-label">固定页脚</span>
                </div>
            </div>
            <div class="row mt-3">
                <div class="col-6 d-flex align-items-center">
                    <Switch @bind-Value="@ShowFooter" OnColor="@Color.Success" OffColor="@Color.Primary"></Switch>
                </div>
                <div class="col-6 text-right">
                    <span class="cell-label">显示页脚</span>
                </div>
            </div>
        </div>

        <div class="page-layout-demo-option">
            <p>主题配色</p>
            <div class="row">
                <div class="col-2">
                    <span class="color color1" @onclick="@(e => Theme = "color1")"></span>
                </div>
                <div class="col-2">
                    <span class="color color2" @onclick="@(e => Theme = "color2")"></span>
                </div>
                <div class="col-2">
                    <span class="color color3" @onclick="@(e => Theme = "color3")"></span>
                </div>
                <div class="col-2">
                    <span class="color color4" @onclick="@(e => Theme = "color4")"></span>
                </div>
                <div class="col-2">
                    <span class="color color5" @onclick="@(e => Theme = "color5")"></span>
                </div>
                <div class="col-2">
                    <span class="color color6" @onclick="@(e => Theme = "color6")"></span>
                </div>
            </div>
        </div>

        <div class="page-layout-demo-option">
            <p>更多设置</p>
            <div class="row">
                <div class="col-6 d-flex align-items-center">
                    <Switch @bind-Value="@UseTabSet" OnColor="@Color.Success" OffColor="@Color.Primary"></Switch>
                </div>
                <div class="col-6 text-right">
                    <span class="cell-label">@(UseTabSet ? "多标签" : "单页")</span>
                </div>
            </div>
        </div>
    </div>
</Drawer>

MainLayout.razor.cs

    public partial class MainLayout
    {
        private bool UseTabSet { get; set; } = true;

        private string Theme { get; set; } = "";

        private bool IsOpen { get; set; }

        private bool IsFixedHeader { get; set; } = true;

        private bool IsFixedFooter { get; set; } = true;

        private bool IsFullSide { get; set; } = true;

        private bool ShowFooter { get; set; } = true;

        private List<MenuItem>? Menus { get; set; }

        /// <summary>
        /// OnInitialized 方法
        /// </summary>
        protected override void OnInitialized()
        {
            base.OnInitialized();

            Menus = GetIconSideMenuItems();
        }

        private static List<MenuItem> GetIconSideMenuItems()
        {
            var menus = new List<MenuItem>
            {
               new MenuItem() { Text = "Home", Icon = "fa-solid fa-fw fa-flag", Url = "/" , Match = NavLinkMatch.All},
               new MenuItem() { Text = "班级管理", Icon = "fa-solid fa-fw fas fa-user-secret", Url = "SchoolClass" },
               new MenuItem() { Text = "学生管理", Icon = "fa-solid fa-fw fas fa-universal-access", Url = "Student" },
            };

            return menus;
        }
    }

Collapse 折叠面板组件引入

Home.razor

@page "/"
<!-- 引用 BootstrapBlazor.FontAwesome 字体库包 -->
<link href="_content/BootstrapBlazor.FontAwesome/css/font-awesome.min.css" rel="stylesheet">
<!-- 引用 BootstrapBlazor 组件库包 -->
<link href="_content/BootstrapBlazor/css/bootstrap.blazor.bundle.min.css" rel="stylesheet">

<!--引入BootstrapBlazor 组件库包-->
<script src="_content/BootstrapBlazor/js/bootstrap.blazor.bundle.min.js"></script>

<PageTitle>Home</PageTitle>

<h2>七天.NET 8操作SQLite入门到实战详细教程</h2>

<h5>SQLite是一个轻量级的嵌入式关系型数据库,它以一个小型的C语言库的形式存在。它是一个自包含、无需服务器、零配置的数据库引擎。与传统的数据库系统不同,SQLite直接读写普通磁盘文件,不需要单独的数据库服务器。它支持标准的SQL查询语言,并提供了事务支持和ACID属性(原子性、一致性、隔离性和持久性)。</h5>

<div class="images-item" style="width:60%;margin-top:10px;">
    <ImageViewer Url="./七天.NET 8操作SQLite入门到实战.png" ShowPlaceHolder="false" />
</div>

<DemoBlock Title="基础用法" Introduction="可同时展开多个面板,面板之间不影响" Name="Normal">
    <Collapse OnCollapseChanged="@OnChanged">
        <CollapseItems>
            <CollapseItem Text="嵌入式">
                <div>SQLite的库可以轻松地嵌入到应用程序中,不需要独立的数据库服务器进程。</div>
            </CollapseItem>
            <CollapseItem Text="无服务器" IsCollapsed="false">
                <div>与大多数数据库系统不同,SQLite不需要单独的数据库服务器,所有数据都存储在一个磁盘文件中。</div>
            </CollapseItem>
            <CollapseItem Text="零配置">
                <div>使用SQLite时,没有任何复杂的配置或管理任务。只需引入SQLite库,并开始使用即可。</div>
            </CollapseItem>
            <CollapseItem Text="轻量级">
                <div>SQLite是一个轻量级的数据库引擎,库文件的大小很小,并且在内存使用方面也非常高效。</div>
            </CollapseItem>
        </CollapseItems>
    </Collapse>
    <ConsoleLogger @ref="NormalLogger" />
</DemoBlock>

<AttributeTable Items="@GetAttributes()" />

Home.razor.cs

    public partial class Home
    {
        [NotNull]
        private ConsoleLogger? NormalLogger { get; set; }

        private Task OnChanged(CollapseItem item)
        {
            NormalLogger.Log($"{item.Text}: {item.IsCollapsed}");
            return Task.CompletedTask;
        }

        private bool State { get; set; }

        private void OnToggle()
        {
            State = !State;
        }

        /// <summary>
        /// 获得属性方法
        /// </summary>
        /// <returns></returns>
        private AttributeItem[] GetAttributes() =>
        [
            new()
            {
                Name = "CollapseItems",
                Description = "内容",
                Type = "RenderFragment",
                ValueList = " — ",
                DefaultValue = " — "
            },
            new()
            {
                Name = "IsAccordion",
                Description = "是否手风琴效果",
                Type = "bool",
                ValueList = "true|false",
                DefaultValue = "false"
            },
            new()
            {
                Name = "OnCollapseChanged",
                Description = "项目收起展开状态改变回调方法",
                Type = "Func<CollapseItem, Task>",
                ValueList = " — ",
                DefaultValue = " — "
            }
        ];
    }

    public class AttributeItem
    {
        /// <summary>
        /// 获取或设置属性的名称。
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 获取或设置属性的描述。
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        /// 获取或设置属性的类型。
        /// </summary>
        public string Type { get; set; }

        /// <summary>
        /// 获取或设置属性的取值列表(如果有)。
        /// </summary>
        public string ValueList { get; set; }

        /// <summary>
        /// 获取或设置属性的默认值。
        /// </summary>
        public string DefaultValue { get; set; }
    }

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。
  • 在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群

七天.NET 8操作SQLite入门到实战 - 第七天BootstrapBlazor UI组件库引入(1)的更多相关文章

  1. reactjs入门到实战(七)---- React的组件的生命周期

    React的组件的生命周期有三个状态分别是:挂载(生产组件示例化.准备挂载到页面.挂载到页面).更新(更新值.更新DOM).和卸载(卸载后). >>>其他     getInitia ...

  2. 小程序开发-iView Weapp微信小程序UI组件库入门使用

    iView Weapp UI组件库 今天来试试iView Weapp 这个微信小程序组件库,看看好不好用~~ 官网地址: http://inmap.talkingdata.com/wx/index_p ...

  3. C#操作Sqlite快速入门及相关工具收集

    Sqlite不需要安装即可使用.Sqlite是不是那个System.Data.SQLite.DLL临时创建了数据库引擎? 1.新建一个WinForm项目,引用System.Data.SQLite.DL ...

  4. 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作

    图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...

  5. 七、Android学习第六天——SQLite与文件下载(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 七.Android学习第六天——SQLite与文件下载 SQLite SQ ...

  6. SQLite入门与分析(二)---设计与概念(续)

    SQLite入门与分析(二)---设计与概念(续)   写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...

  7. SQLite 入门教程(三)好多约束 Constraints(转)

    转于: SQLite 入门教程(三)好多约束 Constraints 一.约束 Constraints 在上一篇随笔的结尾,我提到了约束, 但是在那里我把它翻译成了限定符,不太准确,这里先更正一下,应 ...

  8. SQLite 入门教程(四)增删改查,有讲究 (转)

    转于: SQLite 入门教程(四)增删改查,有讲究 一.插入数据 INSERT INTO 表(列...) VALUES(值...) 根据前面几篇的内容,我们可以很轻送的创建一个数据表,并向其中插入一 ...

  9. C#操作SQLite方法实例详解

    用 C# 访问 SQLite 入门(1) CC++C#SQLiteFirefox  用 C# 访问 SQLite 入门 (1) SQLite 在 VS C# 环境下的开发,网上已经有很多教程.我也是从 ...

  10. ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 G ...

随机推荐

  1. Vue框架快速上手

    Vue基础 vue指令 内容绑定 v-text 设置标签的内容一般通过双大括号的表达式{{ }}去替换内容 {{ hello }} v-html 与v-text类似区别在于html中的结构会被解析为标 ...

  2. 有关library导入的个人总结和反思

    本来帮助朋友找寻一下android的一些特效的demo,结果找到了一个,朋友试验可以,自己却是在导入项目需要的library的时候总是出问题,真的很是丢人,反省反省. 也许专业人士看来这是非常可笑的问 ...

  3. 基于Python语言的KNN算法

    import operator import numpy as np # 鸢尾花的数据集 load_iris from sklearn.datasets import load_iris ''' 对测 ...

  4. 「译文」Google SRE 二十年的经验教训

    ️URL: https://sre.google/resources/practices-and-processes/twenty-years-of-sre-lessons-learned/ ✍️Au ...

  5. HanLP — Aho-Corasick DoubleArrayTire 算法 ACDAT - 基于双数组字典树的AC自动机

    双数组字典树能在O(1)(1是模式串长度)时间内高速完成单串匹配,并且内存消耗可控,然而软肋在于多模式匹配.如果要匹配多个模式串,必须先实现前缀查询,然后频繁截取文本后缀才可多匹配.比如 ushers ...

  6. Python Web UI自动化报错 :ResourceWarning: Enable tracemalloc to get the object allocation traceback

    ResourceWarning资源警告解决方案 原因:在执行线性脚本完毕时,没有及时释放相应资源,导致内存堆积,从而造成内存溢出(如关闭浏览器等操作),此时,Python将会做出提醒: 在百度吸取 网 ...

  7. 深入理解JMeter中的JSON Extractor

    Apache JMeter是一款出色的开源性能和功能测试工具,这款工具提供了丰富的功能和强大的扩展性,可以应对各种复杂的测试需求.当我们在进行接口测试时,经常会遇到需要从接口响应中提取信息并在后续请求 ...

  8. 如何保证Spring Boot接口安全的呢?

    在保证Spring Boot接口安全时,我们需要关注的主要方面包括:认证(Authentication).授权(Authorization).数据安全性(Data Security).以及防止常见的W ...

  9. UNI-APP之微信小程序转H5

    开始 最近有个需求,需要将微信小程序中一些页面和功能改成h5,这次功能开发的时间有点紧,而且重新写一套有点来不及.考虑到微信小程序与uni-app有着一些共通之处,所以打算直接转成uni-app.un ...

  10. 基于FFmpeg和Qt实现简易视频播放器

    VideoPlay001 记得一键三连哦 使用qt+ffmpeg开发简单的视频播放器,无声音 视频解码使用的是软解码即只用CPU进行QPainter绘制每一帧图像,CPU占用过高 简单易学,适合小白入 ...