当前位置: 首页 > article >正文

【.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.kler.cn/a/386910.html

相关文章:

  • 区块链技术在慈善捐赠中的应用
  • 【ChatGPT】 如何让ChatGPT分析数据并得出结论
  • 深入理解接口测试:实用指南与最佳实践5.0(一)
  • Kafka参数了解
  • 【秋招笔试-支持在线评测】11.13花子秋招(已改编)-三语言题解
  • nginx部署H5端程序与PC端进行区分及代理多个项目及H5内页面刷新出现404问题。
  • 探索 Python 的新边疆:sh 库的革命性功能
  • AWTK fscript 中的 JSON 扩展函数
  • Spark 的介绍与搭建:从理论到实践
  • Java命名规范
  • (2024.11.5)亚博树莓派5部署yolov8目标检测
  • Jmeter的安装,设置中文,解决乱码问题
  • A021基于Spring Boot的自习室管理和预约系统设计与实现
  • 前端实现数据下载为json文件
  • 【Lucene】什么是全文检索?解读结构化数据与非结构化数据
  • 从pg_depend和pg_class开始了解MogDB/openGauss/postgresql的系统元数据设计
  • Pytest-Bdd-Playwright 系列教程(7):使用测试代码生成辅助工具
  • 【人工智能-初级】练习题:利用Scikit-learn实现K-Means聚类算法的案例
  • 原生html+js输入框下拉多选带关闭模块完整案例
  • 算力与能量的全分布式在线共享来降低5G网络的用电成本。基于随机对偶次梯度法的多时隙约束耦合问题解耦方法示例;随机对偶次梯度法的在线管理策略
  • Java基础Day-Fifteen
  • 小红书图文矩阵的运营策略与引流技巧解析
  • 兵马未动,粮草先行-InnoDB统计数据是如何收集的
  • Webserver(5.4)项目整体
  • 国产化浪潮下,高科技企业如何选择合适的国产ftp软件方案?
  • 教程:FFmpeg结合GPU实现720p至4K视频转换