码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 从零开始Blazor Server(9)--修改Layout


    🚀 优质资源分享 🚀

    学习路线指引(点击解锁)知识定位人群定位
    🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
    💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

    目前我们的MainLayout还是默认的,这里我们需要修改为BootstrapBlazor的Layout,并且处理一下菜单。

    修改MainLayout

    BootstrapBlazor已经自带了一个Layout组件,这个组件里常用功能已经很全了,所以我们直接使用这个组件即可。

    
        
    BlazorLearnspan>
    div> LogoutLink> LinkTemplate> Logout> Header>
    BlazorLearnspan> div> div> Side>
    @Body CascadingValue> Main>
    BlazorLearna> div> Footer> Layout> @code { private bool IsCollapsed { get; set; } private List? _menuItems; [NotNull] private UserEntity? _user; private Task OnCollapsed(bool collapsed) { IsCollapsed = collapsed; return Task.CompletedTask; } protected override void OnInitialized() { base.OnInitialized(); _user = UserEntity.Where(x => x.UserName == Furion.App.User.FindFirstValue(ClaimTypes.Name)).First(); if (_user == null) { return; } _menuItems = CreateMenuItems(MenuEntity.Where(x => x.Roles!.Any(y => y.Id == _user.RoleId)).ToList(), 0); } private List CreateMenuItems(List menus, int parentId) { var selectedMenus = new List(); var selectedMenuEntities = menus.Where(x => x.ParentId == parentId).ToList(); foreach (var menuEntity in selectedMenuEntities) { var menuItem = new MenuItem(menuEntity.Name!, menuEntity.Url, menuEntity.Icon); menuItem.Items = CreateMenuItems(menus, menuEntity.Id); selectedMenus.Add(menuItem); } return selectedMenus; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    这里没什么需要多说的,每个参数的意义在文档里都比较清楚,如果需要查询具体的含义,可以看这里。

    这里需要注意的是,Menus里面必须要定义一个变量,不能直接放一个方法,否则此方法每次跳转都会执行,导致菜单不正常。

    另外Logout是一个独立的组件,这个组件其实叫Logout并不贴切,它是一个带有头像,欢迎信息以及下拉菜单的用户信息组件。

    这里我们只放一个LogoutLink登出菜单。

    修改AdminHandler

    如果你直接启动项目,会发现Layout不见了,因为我们的Layout里面做了比较多的处理,会有一个需要权限验证的请求。这个请求不会携带Resource,所以不会返回true。就导致Layout一直不显示,所以我们需要处理这种情况,我们目前修改为Resource里不是RouteData的全部都通过验证。

        public override Task PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
        {
            if (!int.TryParse(context.User.FindFirst(ClaimTypes.Role)?.Value, out var roleId))
            {
                return Task.FromResult(false);
            }
            if (context.Resource is RouteData routeData)
            {
                var routeAttr = routeData.PageType.CustomAttributes.FirstOrDefault(x =>
                    x.AttributeType == typeof(RouteAttribute));
                if (routeAttr == null)
                {
                    return Task.FromResult(true);
                }
                else
                {
                    var url = routeAttr.ConstructorArguments[0].Value as string;
                    var permission = MenuEntity
                        .Where(x => x.Roles!.Any(y => y.Id == roleId) && x.Url == url).First();
                    if (permission != null)
                    {
                        return Task.FromResult(true);
                    }
                }
            }
            else
            {
                return Task.FromResult(true);
            }
            
            return Task.FromResult(false);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    这样我们再启动应该就可以看到Layout了。

    修改LoginController

    我们之前只有一个登录,所以我们写了一个LoginController,现在我们需要加入登出,所以我们直接把LoginController改为AccountController,然后内容改为PostLogin、GetLogout。

    public class AccountController: IDynamicApiController
    {
        public async Task PostLogin([FromBody]LoginVo loginVo)
        {
            if (string.IsNullOrEmpty(loginVo.UserName))
            {
                return new { code = 50000, message = "用户名不能为空" };
            }
            if (string.IsNullOrEmpty(loginVo.Password))
            {
                return new { code = 50000, message = "密码不能为空" };
            }
    
            var password = MD5Encryption.Encrypt(loginVo.Password);
            var user = await UserEntity.Where(x =>
                x.UserName == loginVo.UserName && x.Password == password).Include(x => x.Role).FirstAsync();
            if (user != null)
            {
                var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
                identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName!));
                identity.AddClaim(new Claim(ClaimTypes.Role, user.Role!.Id.ToString()));
                await Furion.App.HttpContext.SignInAsync(new ClaimsPrincipal(identity), new AuthenticationProperties(){IsPersistent = true, ExpiresUtc = loginVo.RememberMe? DateTimeOffset.Now.AddDays(5): DateTimeOffset.Now.AddMinutes(30)});
    
                return new { code = 20000, message = "登录成功" };
            }
            return new { code = 50000, message = "用户名或密码错误" };
        }
    
        [Authorize]
        public async Task GetLogout()
        {
            await Furion.App.HttpContext.SignOutAsync();
            return new RedirectResult("/Login");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    这里我们直接给Logout加[Authorize],只有登录以后才能访问。

    代码在github:https://github.com/j4587698/BlazorLearnj,分支lesson9。

  • 相关阅读:
    计算机外设:显示器是如何工作的?
    【Python】文件操作
    相机标定:现实到虚拟世界的映射关系
    第7天:信息打点-资产泄漏&CMS识别&Git监控&SVN&DS_Store&备份
    HttpServlet详解
    含文档+PPT+源码等]精品基于Uniapp+Springboot实现的患者服药提醒APP[包运行成功]Springboot毕业设计安卓项目源码
    Kotlin协程createCoroutine和startCoroutine原理
    基于LQR算法的一阶倒立摆控制
    改变光标形状的多种方式
    Vue+ElementUI项目打包部署到Ubuntu服务器中
  • 原文地址:https://blog.csdn.net/u012804784/article/details/126245338
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号