首页 > 其他分享 >.Net Core学习心得

.Net Core学习心得

时间:2023-04-21 20:14:33浏览次数:36  
标签:Core item 中间件 学习心得 list ParentId var Net Id

4.21:

简单RBAC项目获取用户所在权限的菜单项

第一款方案:用户表、用户角色表、角色表、角色权限表、权限表五表联查

public List<PermissionDto> GetMenus(long userid)

{

//获取全部的数据

var user = _dbContext.Users.AsQueryable();

var role = _dbContext.Roles.AsQueryable();

var user_role = _dbContext.User_Roles.AsQueryable();

var perm = _dbContext.Permissions.AsQueryable();

var role_perm = _dbContext.Role_Permissions.AsQueryable();

var roleModel = from a in user

join b in user_role on a.Id equals b.UserId

join c in role on b.RuleId equals c.Id

join d in role_perm on c.Id.ToString() equals d.RoleId

join e in perm on d.PermId equals e.Id

where (a.Id == userid)

select new PermissionDto() {

PermissionId = e.Id,

PermName = e.PermName,

PermUrl = e.PermUrl,

ParentId = e.ParentId,

Children = null

};

//根据一级菜单的父ID获取一级菜单的所有数据

var list = roleModel.Where(x => x.ParentId == "M").ToList();

//然后获取二级菜单的数据

foreach (var item in list)

{

var query =roleModel.Where(x => x.ParentId == item.PermissionId);

item.Children = query.ToList();

}

return list;

}

后面经过思考,发现用户表和角色表实际不需要,简化为3个表

var roleList = (

from b in user_role

join d in role_perm

on b.RuleId.ToString() equals d.RoleId

join e in perm

on d.PermId equals e.Id

where (b.UserId == userid)

select e).ToList();

但是之前的方案都是固定的,只有2级菜单可以如此实现,但是如果菜单层级更多呢?

通过递归方式获取:

通过list和父级ID,获取每一级的数据,然后将当前层级的权限ID作为下一层级的父级ID,通过递归的思想,调用自身一级一级的获取下一级数据,这样菜单层级再多也能搞定。

public List<PermissionDto> GetMenus(List<Permission> list,string pId)

{

//准备返回数据

List<PermissionDto> dtoList = new List<PermissionDto>();

//获取第一级的数据

var result = list.Where(x => x.ParentId == pId);

foreach (var item in result) //通过循环将数据转化为需要的格式DTO

{

PermissionDto dto = new PermissionDto();

dto.PermissionId = item.Id;

dto.ParentId = item.ParentId;

dto.PermName = item.PermName;

dto.PermUrl = item.PermUrl;

dto.Children = GetMenus(list, item.Id); //通过递归的方式获取下一级菜单数据

dtoList.Add(dto);

}

return dtoList;

}

再改进了下,通过select映射的方式

public List<PermissionDto> GetMenus(List<Permission> list,string pId)

{

#region select方式

var dtoList = list.Where(x => x.ParentId == pId).Select(x => new PermissionDto()

{

PermissionId = x.Id,

PermName = x.PermName,

PermUrl = x.PermUrl,

ParentId = x.ParentId,

Children = GetMenus(list, x.Id)

}).ToList();

return dtoList;

#endregion

}

总结:多表连接查询按照实际需要的表进行查询

递归方式实现菜单项

Select映射方式替换foreach循环方式

.Net Core内置中间件初识:

今天初步了解了下.net core中间件的知识,当用户的一个Request访问到API时,按照如下的顺序执行中间件

ExceptionHandler:异常中间件

HSTS:(HTTP Strict Transport Security),作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接

HttpsRedirection:重定向中间件

Static Files:静态文件中间件

Routing:路由中间件

CORS:跨域中间件

Authentication:鉴权中间件

Authorization:授权中间件

Custom middlewares:自定义中间件

 

标签:Core,item,中间件,学习心得,list,ParentId,var,Net,Id
From: https://www.cnblogs.com/LiuLewis/p/17341604.html

相关文章

  • Kubernetes中使用Helm2的安全风险
    参考 http://rui0.cn/archives/1573英文文章 https://blog.ropnop.com/attacking-default-installs-of-helm-on-kubernetes/集群后渗透测试资源 https://blog.carnal0wnage.com/2019/01/kubernetes-master-post.htmlHelm介绍:Kubernetes是一个强大的容器调度系统,通常我们......
  • net 7 中间件sql 注入的方法
    百度一下都是filter防止sql注入的,其实到MVC的fileter已经浪费了很多性能,我们在管道组装的时候,就可以拦截非法字符。在中间件收集参数是比较麻烦的事情,、知识点储备需要理解中间件,以及怎么封装中间件,我们netcore都是add 一个服务+app.use 一个中间件开发方式 2 如果收......
  • .NET实现解析字符串表达式
    一、引子·功能需求我们创建了一个School对象,其中包含了教师列表和学生列表。现在,我们需要计算教师平均年龄和学生平均年龄。//创建对象Schoolschool=newSchool(){Name="小菜学园",Teachers=newList<Teacher>(){newTeacher(){Name="波老......
  • CentOS网卡无法启动返回'Failed to start LSB:Bring up/down networking.'
    装了一台虚机,配置docker服务的时候发现忘了开CPU虚拟化,关机开启后再登录,发现网卡down了,重启网卡报错。1.journalctl-ex  #查看日志,发现返回错误'FailedtostartLSB:Bringup/downnetworking.';2.vi/var/long/messages  #再查看系统日志,发现有关于NetworkManager的信......
  • 微软的ADO.NET帮助类SqlHelper.cs
    微软的ADO.NET帮助类,SqlHelper.cs 1//===============================================================================2//MicrosoftDataAccessApplicationBlockfor.NET3//http://msdn.microsoft.com/library/en-us/dnbda/html/daab-rm.asp4//......
  • [2core]条形码+ZXing.NET+SkiaSharp
    在将验证码功能代码从.netframework迁移到.net6后,马上就想到了条形码(1D和2D)的迁移事项,主要它们两者都涉及到图片处理方面的知识和技术。由于之前使用了类库ZXing.NET,因此在.net6中也使用了它。但是如果想要跨平台使用,就需要和图片处理的类库建立绑定关系,所以就选择了其支持的Skia......
  • ASP.NET点击按钮回车提交web页面回车提交点击回车按钮提交
    ASP.NET回车提交事件其实说到底并不是ASP.NET的编程问题,却是关于htmlform中的submit按钮就是如何规划的具体讨论。也可归于ASP.NET编程的一部分,那么ASP.NET回车提交事件的具体实现是怎么样的呢?下面我们具体的看下:ASP.NET回车提交事件实现1、当你的光标焦点进入某个表单元素......
  • 如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件
    在上一篇文章(如何在.NETCoreWebApi中处理MultipartFormDataContent)中,我们有描述过如何以最简单的方式在.NETCoreWebApi中处理MultipartFormDataContent。基于框架层面的封装,我们可以快速的从Request.Form中分别拿到文件内容和文本内容,但是这些默认的解析方式都是建......
  • net core 6 部署到ubuntu
    一、安装dotnetSDK 1.更新源sudoapt-getupdate;2.启用MicrosoftPPAwgethttps://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.debsudodpkg-ipackages-microsoft-prod.deb3.安装.NETCoreSDKsudoaptinstallapt-transport-ht......
  • Layer-Dependent Importance Sampling for Training Deep and Large Graph Convolutio
    目录概符号说明MotivationLADIES代码ZouD.,HuZ.,WangY.,JiangS.,SunY.andGuQ.Layer-dependentimportancesamplingfortrainingdeepandlargegraphconvolutionalnetworks.NIPS,2019.概本文在以往的mini-batch的快速算法上进行了改进.符号说明\(\m......