【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--角色可访问接口管理

咱们继续来编写孢子记账的简易权限,这篇文章中我们将编写角色可访问接口的管理API,同样我不会把完整的代码全都列出来,只会列出部分代码,其余代码我希望大家能自己手动编写,然后对比项目代码。废话不多说,开讲。

一、需求

角色可访问接口的需求很简单,也就是简单的增删改查。

编号功能描述
1新增一个角色可绑定多个接口,但一个角色不能绑定同一个接口多次
2删除系统角色可访问的URL不可删除
3修改一个角色不能绑定同一个接口多次
4查询可根据角色名、接口地址进行模糊查询,实现分页功能
5查询根据角色可访问接口Id查询单个数据

二、编写代码

2.1 编写数据库映射类并迁移数据库
  1. 新增SysRoleUrl类,代码如下:
    using SporeAccounting.BaseModels;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;namespace SporeAccounting.Models;
    /// <summary>
    /// 角色可访问的URL
    /// </summary>
    [Table(name: "SysRoleUrl")]
    public class SysRoleUrl : BaseModel
    {/// <summary>/// 角色Id/// </summary>[Column(TypeName = "nvarchar(36)")][Required][ForeignKey("FK_SysRoleUrl_SysRole")]public string RoleId { get; set; }/// <summary>/// 接口路径/// </summary>[Column(TypeName = "nvarchar(36)")][Required][ForeignKey("FK_SysRoleUrl_SysUrl")]public string UrlId { get; set; }/// <summary>/// 导航属性/// </summary>public SysRole Role { get; set; }/// <summary>/// 导航属性/// </summary>public SysUrl Url { get; set; }
    }
    
  2. 在数据库链接上下文类SporeAccountingDBContext1中增加SysRoleUrl
    /// <summary>
    /// 接口URL表
    /// </summary>
    public DbSet<SysUrl> SysUrls { get; set; }
    
  3. SysRole类中增加SysRoleUrl的导航属性:
    /// <summary>
    /// SysRoleUrl导航属性
    /// </summary>
    public ICollection<SysRoleUrl> RoleUrls { get; set; }
    
  4. 迁移数据库,迁移后的数据库如下图
    在这里插入图片描述
2.2 编写业务逻辑

我们以删除为例,来看一下角色可访问接口如何编写。

  1. 新建服务接口ISysRoleUrlServer及其实现类SysRoleUrlImp
  2. 在接口及其实现类中增加Delete方法
    //ISysRoleUrlServer
    /// <summary>
    /// 删除角色可访问的URL
    /// </summary>
    /// <param name="roleId"></param>
    /// <param name="urlId"></param>
    void Delete(string roleId, string urlId);//SysRoleUrlImp
    /// <summary>
    /// 删除角色可访问的URL
    /// </summary>
    /// <param name="roleId"></param>
    /// <param name="urlId"></param>
    public void Delete(string roleId, string urlId)
    {try{SysRoleUrl roleUrl = _dbContext.SysRoleUrls.FirstOrDefault(x => x.RoleId == roleId && x.UrlId == urlId);if (roleUrl != null){_dbContext.SysRoleUrls.Remove(roleUrl);_dbContext.SaveChanges();}}catch (Exception e){throw;}
    }
    
  3. 新建SysRoleUrlController ,并实现Delete方法
    using AutoMapper;
    using Microsoft.AspNetCore.Mvc;
    using SporeAccounting.BaseModels;
    using SporeAccounting.BaseModels.ViewModel.Response;
    using SporeAccounting.Models;
    using SporeAccounting.Models.ViewModels;
    using SporeAccounting.Server.Interface;
    using System.Net;namespace SporeAccounting.Controllers
    {/// <summary>/// 角色可访问URL/// </summary>[Route("api/[controller]")][ApiController]public class SysRoleUrlController : ControllerBase{private readonly ISysRoleUrlServer _sysRoleUrlServer;private readonly IMapper _mapper;public SysRoleUrlController(ISysRoleUrlServer sysRoleUrlServer,IMapper mapper){_sysRoleUrlServer = sysRoleUrlServer;_mapper = mapper;}/// <summary>/// 删除角色可访问的URL/// </summary>/// <param name="roleId"></param>/// <param name="urlId"></param>/// <returns></returns>[HttpDelete][Route("Delete/{roleId}/{urlId}")]public ActionResult<ResponseData<bool>> Delete([FromRoute] string roleId, [FromRoute] string urlId){try{bool isExist = _sysRoleUrlServer.IsExist(roleId, urlId);if (!isExist){return Ok(new ResponseData<bool>(HttpStatusCode.NotFound, $"角色{roleId}不存在URL{urlId}!", false));}bool isDelete= _sysRoleUrlServer.IsDelete(roleId, urlId);if (!isDelete){return Ok(new ResponseData<bool>(HttpStatusCode.Conflict, $"角色{roleId}不允许删除URL{urlId}!", false));}_sysRoleUrlServer.Delete(roleId, urlId);return Ok(new ResponseData<bool>(HttpStatusCode.OK, data: true));}catch (Exception e){return Ok(new ResponseData<bool>(HttpStatusCode.InternalServerError, "服务器异常", false));}}}
    }
    
  4. 在上述代码中我们在执行删除操作时需要判断角色可访问接口是否存在以及角色可访问接口是否可以删除,因此需要在接口及其实现类中增加IsExistIsDelete方法
    //ISysRoleUrlServer
    /// <summary>
    /// 角色可访问的URL是否存在
    /// </summary>
    /// <param name="roleId"></param>
    /// <param name="urlId"></param>
    /// <returns></returns>
    bool IsExist(string roleId, string urlId);/// <summary>
    /// 是否可以删除
    /// </summary>
    /// <param name="roleId"></param>
    /// <param name="urlId"></param>
    /// <returns></returns>
    bool IsDelete(string roleId, string urlId);//SysRoleUrlImp
    /// <summary>
    /// 角色可访问的URL是否存在
    /// </summary>
    /// <param name="roleId"></param>
    /// <param name="url"></param>
    /// <returns></returns>
    public bool IsExist(string roleId, string urlId)
    {try{return _dbContext.SysRoleUrls.Any(x => x.RoleId == roleId && x.UrlId == urlId);}catch (Exception e){throw;}
    }/// <summary>
    /// 是否可以删除
    /// </summary>
    /// <param name="roleId"></param>
    /// <param name="urlId"></param>
    /// <returns></returns>
    public bool IsDelete(string roleId, string urlId)
    {try{return _dbContext.SysRoleUrls.Any(x => x.RoleId == roleId && x.UrlId == urlId && x.CanDelete);}catch (Exception e){throw;}
    }
    

三、总结

这篇文章主要讲解了角色可访问接口管理的编写,代码和逻辑也很简单,因此没有详细讲解。角色可访问接口管理的剩余需求我希望大家一起来编写出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Monetico: 文本到图像合成的革命性变革

在人工智能和创意技术领域&#xff0c;Collov-Labs 推出了具有开创性的文本到图像合成模型 Monetico&#xff0c;它将彻底改变我们创建和可视化数字内容的方式。Monetico 是著名的 Meissonic 模型的有效再现&#xff0c;它提供了一种独特且易于使用的方法&#xff0c;可根据文本…

一步步安装deeponet的详细教学

1.deepoent官网如下&#xff1a; https://github.com/lululxvi/deeponet 需要下载依赖 1.python3 2.DeepXDE&#xff08;这里安装DeepXDE<0.11.2,这个最方便&#xff09; Optional: For CNN, install Matlab and TensorFlow 1; for Seq2Seq, install PyTorch&#xff0…

Error creating bean with name ‘reactiveElasticsearchClient

程序报错&#xff1a; org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘reactiveElasticsearchClient’ defined in class path resource [org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRestC…

海康私有化视频平台EasyCVR视频分析设备平台流媒体协议RTMP、HTTP-FLV、HLS的简单对比

在当今的数字化世界中&#xff0c;视频流协议的选择对于确保流畅、高效的视频传输至关重要。随着互联网技术的快速发展&#xff0c;直播和视频点播服务已经成为人们日常生活中不可或缺的一部分。无论是安防监控、在线教育、远程会议还是娱乐直播&#xff0c;用户对于视频流的实…

Halcon 循环画框

read_image (Image, fabrik) * 循环画框 左键开始画 中间键结束 while (1) get_mbutton (3600, dummy, dummy, Button) if(Button ! 2 and Button ! 4) * 循环画框 draw_rectangle1 (3600, Row1, Column1, Row2, Column2) …

Java多线程详解⑥(全程干货!!!)死锁 || 构成死锁的条件 || 死锁总结 || Java标准库的线程安全类

这里是Themberfue 在上一节中&#xff0c;我们介绍了线程安全问题&#xff0c;对锁的概念以及使用 在本节中&#xff0c;进入 "死锁" 的概念以及如何产生 "死锁" 死锁 一个线程&#xff0c;一把锁&#xff0c;同时加两把锁 要想进入死锁的介绍和概念&a…

适用于 Windows 11/10 电脑 的 13 个最佳文件恢复软件

如果您由于系统故障、硬件损坏、人为错误或病毒攻击而丢失了重要文件或文件夹。不用担心&#xff0c;因为我们随时为您提供帮助&#xff01;借助正确的文件恢复工具&#xff0c;您可以立即检索计算机上不同类型的文件。如果你有为您的文件创建备份&#xff0c;你不用担心&#…

> 甘晴void:课程资源免费下载

为进一步减少信息差&#xff0c;便利同学&#xff0c;我把部分重要课程的轨迹&#xff08;期中期末考卷、机考题、作业答案、代码、工程项目等&#xff09;上传至Github。网址链接如下&#xff1a; https://github.com/wolfvoid/HNU-resourses Github平台的优势是下载免费&am…

华为OD机试 - 求小球落地5次后所经历的路程和第5次反弹的高度 (Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题 点这里。 实战项目访问&#xff1a;http://javapub.net.cn/ 专栏导读 本专栏收录于 《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》 。 刷的越多&#xff0c;抽中的概率越大&…

uniapp—android原生插件开发(2原生插件开发)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; ***环境问题移步至&#xff1a;uniapp—an…

【机器学习】强化学习(1)——强化学习原理浅析(区分强化学习、监督学习和启发式算法)

文章目录 强化学习介绍强化学习和监督学习比较监督学习强化学习 强化学习的数学和过程表达动作空间序列决策策略&#xff08;policy&#xff09;价值函数&#xff08;value function&#xff09;模型&#xff08;model&#xff09; 强化学习和启发式算法比较强化学习步骤代码走…

ClickHouse创建分布式表

ClickHouse创建分布式表 当数据量剧增的时候&#xff0c;clickhouse是采用分片的方式进行数据的存储的&#xff0c;类似于redis集群的实现方式。然后想进行统一的查询的时候&#xff0c;因为涉及到多个本地表&#xff0c;可以通过分布式表的方式来提供统一的入口。由于是涉及到…

Jetson Orin Nano平台自研载板MIPI 4Lane 2.5G 接收不稳定问题调试记录

1. 前言 问题描述 参考官方文档,设计了载板,配套Orin Nano SOM来使用 测试过程中发现4lane的MIPI在2.5G速率下工作不稳定(丢帧/断流) 部分板子在2.3G/2.4G速率下才可以长时间稳定工作 2. 测试对比 2.1 根据上述现象,单独制作了转接板 转接板严格控制了MIPI走线长度(…

常见 HTTP 状态码分类和解释及服务端向前端返回响应时的最完整格式

目前开发的项目很大程度上是为明年的国产化做准备了&#xff0c;所以借这个机会把用了十年的自研系统全部重写&#xff0c;订立更严格的规范&#xff0c;本文记录一下返回格式及对应状态码。 常见 HTTP 状态码及解释 HTTP 状态码用于表示客户端请求的响应状态&#xff0c;它们…

Redis相关技术内容

1. Redis整体的技术全景 应用场景&#xff1a;数据结构的应用、缓存应用、集群应用 底层原理&#xff1a;线程模型、主从复制、负载均衡 ​ 数据结构、哨兵机制、数据分片 ​ AOF、 RDB 2. 并发承载 redis&#xff08;官方 10w/s&#xff09;数据库->mysql 并发范围&…

深入理解JVM

文章目录 1. JVM内存区域划分2. JVM中类加载过程类加载&#xff08;1&#xff09;类加载的基本流程&#xff08;2&#xff09;双亲委派模型 《深入理解java虚拟机》 在这本书前&#xff0c;面试官对于JVM也不是很了解。 这本书主要还是写个一下开发 JVM 的人。 1. JVM内存区域…

如何选情绪龙头

一、情绪龙头的特性及选股指标 情绪龙头股在市场中的表现往往具有独特的特性&#xff0c;这些特性不仅反映了市场的情绪波动&#xff0c;也为投资者提供了重要的选股依据。以下是情绪龙头股的十大特性及其对应的选股指标&#xff1a; 1. 高波动性 情绪龙头股通常具有极高的股…

启动软件是用例吗

沙亚雄 2020-8-13 14:06 潘老师&#xff0c;你好&#xff0c;最近读了您的软件方法&#xff0c;结合自己的项目发现始终有一个疑问&#xff1f;那就是启动软件算不算一个用例&#xff0c;因为软件在启动的时候一般都要实例化一些对象&#xff0c;读一些配置文件等等。那启动软…

Ubuntu22.04中使用CMake配置运行boost库示例程序

Ubuntu22.04中使用CMake配置运行boost库示例程序 boost是一个比较强大的C准标准库&#xff0c;里面有很多值得学习的东西&#xff0c;比较asio网络库可以用来编写C TCP客户端或者TCP服务端接收程序。本文主要讲解如何在Ubuntu22.04中使用Cmake配置boost库&#xff0c;以及运行…

弄巧成拙的 PFC(Priority-based Flow Control)

先说几句车轱辘话&#xff0c;TCP 性能低&#xff0c;所以 RDMA&#xff0c;以太网丢包&#xff0c;所以 PFC&#xff0c;网卡不能太复杂&#xff0c;所以 GBN… HPC&#xff0c;AI 对吞吐&#xff0c;时延要求非常高&#xff0c;同时需要更多计算资源&#xff0c;而 TCP 处理…