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

发布于:2024-11-04 ⋅ 阅读:(129) ⋅ 点赞:(0)

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

一、需求

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

编号 功能 描述
1 新增接口URL URL不能重复
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的需求已经完成。

三、总结

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


网站公告

今日签到

点亮在社区的每一天
去签到