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

【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--接口路径管理

从这篇文章开始,我们将为孢子记账增加简易的权限系统,它包含接口路径管理、角色可访问接口管理、访问权限中间件。在本篇文章中我们先实现接口路径管理相关的接口。

一、需求

接口路径管理比较简单,需求和前面的 用户 以及 **角色**的需求类似,实现起来很简单。我们先来看一下需求

编号功能描述
1新增接口URLURL不能重复
2删除接口URL管理端相关的接口URL不能删除,其他的接口可以删除
2修改接口URL修改后的URL不能和现有的URL重复
3删除URL逻辑删除URL

由于接口比较简单,并且需求也很明确,我们只讲解部分代码,其他代码大家可以自己手动编写代码后对比GitHub上的代码。

二、编写代码

2.1 编写数据库映射类
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using SporeAccounting.BaseModels;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace SporeAccounting.Models;

/// <summary>
/// 接口URL表
/// </summary>
[Table("SysUrl")]
public class SysUrl : BaseModel
{
    /// <summary>
    /// 接口URL
    /// </summary>
    [Column(TypeName="nvarchar(200)")]
    [Required]
    public string Url { get; set; }
    /// <summary>
    /// URL描述
    /// </summary>
    [Column(TypeName="nvarchar(200)")]
    public string Description { get; set; }
    /// <summary>
    /// 是否可以删除
    /// </summary>
    [Column(TypeName = "nvarchar(200)")]
    [Required]
    public bool CanDelete { get; set; } = true;
}

SporeAccountingDBContext增加如下代码:

/// <summary>
/// 接口URL表
/// </summary>
public DbSet<SysUrl> SysUrls { get; set; }

编写完数据库映射类后我们执行数据库迁移命令即可。

2.2 编写业务逻辑

我们以新增URL为例,剩余三个需求的代码我希望大家能根据需求自己来写出相关代码。

  1. 新建服务接口ISysUrlServer及其实现类SysUrlImp
  2. 在接口及其实现类中增加Add方法
    //ISysUrlServer接口
    /// <summary>
    /// 新增URL
    /// </summary>
    /// <param name="sysUrl"></param>
    void Add(SysUrl sysUrl);
    
    //SysUrlImp实现类
    /// <summary>
    /// 新增URL
    /// </summary>
    /// <param name="sysUrl"></param>
    public void Add(SysUrl sysUrl)
    {
        try
        {
            _dbContext.SysUrls.Add(sysUrl);
            _dbContext.SaveChanges();
        }
        catch (Exception e)
        {
            throw;
        }
    }
    
    代码比较简单,不与讲解。
  3. 新建SysUrlController,并实现```Add``方法
    using AutoMapper;
    using Microsoft.AspNetCore.Mvc;
    using SporeAccounting.BaseModels;
    using SporeAccounting.Models;
    using SporeAccounting.Models.ViewModels;
    using SporeAccounting.Server.Interface;
    using System.Net;
    
    namespace SporeAccounting.Controllers
    {
        [Route("api/[controller]")]
        [ApiController]
        public class SysUrlController : ControllerBase
        {
            private readonly ISysUrlServer _sysUrlServer;
            private readonly IMapper _mapper;
    
            public SysUrlController(ISysUrlServer sysUrlServer, IMapper mapper)
            {
                _sysUrlServer = sysUrlServer;
                _mapper = mapper;
            }
    
            [HttpPost]
            [Route("Add")]
            public ActionResult<ResponseData<bool>> Add([FromBody] SysUrlViewModel sysUrlViewModel)
            {
                try
                {
                    bool isExist = _sysUrlServer.IsExist(sysUrlViewModel.Url);
                    if (isExist)
                    {
                        return Ok(new ResponseData<bool>(HttpStatusCode.BadRequest, $"URL{sysUrlViewModel.Url}已存在"));
                    }
                    SysUrl sysUrl = _mapper.Map<SysUrl>(sysUrlViewModel);
                    sysUrl.CreateDateTime = DateTime.Now;
                    //TODO:这里暂时写死,等权限和授权完成后再改为动态获取
                    sysUrl.CreateUserId = "08f35c1e-117f-431d-979d-9e51e29b0b7d";
                    _sysUrlServer.Add(sysUrl);
                    return Ok(new ResponseData<bool>(HttpStatusCode.OK,data:true));
                }
                catch (Exception e)
                {
                    return Ok(new ResponseData<bool>(HttpStatusCode.InternalServerError, "服务器异常"));
                }
            }
        }
    }
    
    需求中要求URL不能重复,因此我们在Add方法中调用了IsExist方法,如果传入的Url存在则向客户端提示已存在。
  4. 在接口及其实现类中增加IsExist方法
    //ISysUrlServer接口
    /// <summary>
    /// URL是否存在
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    bool IsExist(string url);
    
    //SysUrlImp实现类
    /// <summary>
    /// URL是否存在
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    public bool IsExist(string url)
    {
        try
        {
            return _dbContext.SysUrls.Any(x => x.Url == url);
        }
        catch (Exception e)
        {
            throw;
        }
    }
    

得到目前为止,新增接口URL的需求已经完成。

三、总结

这篇文章主要讲解了接口路径管理的开发,功能比较简单。从这篇文章开始,我们将引导大家自主编写代码,我只提供其中一个需求的代码,但是对于逻辑复杂的代码,我会带领大家一步一步的来实现。


http://www.kler.cn/a/377590.html

相关文章:

  • mysql之命令行基础指令
  • 批量删除redis数据【亲测可用】
  • Manjaro Linux安装过程简介
  • channel error 报错【已解决】
  • HO-XGBoost河马算法优化极限梯度提升树多变量回归预测(Matlab)
  • FPGA在高速数据采集系统中的应用!!!
  • K 临近算法
  • AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具
  • Nginx 深度解析:高性能 Web 服务器与反向代理的艺术
  • Hcia知识汇总
  • 局部加权回归
  • 【MySQL】 运维篇—安全管理:数据加密与SSL配置
  • 快消零售行业的培训创新:构建在线培训知识库
  • Apache Hive分布式容错数据仓库系统
  • 函数理解(c)
  • 1009:带余除法
  • Windows 安全日志解析
  • 飞桨首创 FlashMask :加速大模型灵活注意力掩码计算,长序列训练的利器
  • 程序的全生命周期
  • vue3 keep-alive简单说明
  • (转载)Tools for Learning LLVM TableGen
  • 随着飞行汽车的亮相,在环保方面有什么保护措施吗
  • 每天五分钟深度学习pytoroch:基于pytorch搭建逻辑回归算法模型
  • C/C++语言基础--C++模板与元编程系列二类模板、全特化、偏特化、编译模型简介、实现简单Vetctor等…………)
  • 2024最新精仿抖音直播软件源码
  • 从一到无穷大 #39:从 Vectorized Mode vs Code Gen 权衡特定场景执行引擎技术选型标准