从这篇文章开始,我们将为孢子记账增加简易的权限系统,它包含接口路径管理、角色可访问接口管理、访问权限中间件。在本篇文章中我们先实现接口路径管理相关的接口。
一、需求
接口路径管理比较简单,需求和前面的 用户 以及 **角色**的需求类似,实现起来很简单。我们先来看一下需求
编号 | 功能 | 描述 |
---|---|---|
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为例,剩余三个需求的代码我希望大家能根据需求自己来写出相关代码。
- 新建服务接口
ISysUrlServer
及其实现类SysUrlImp
- 在接口及其实现类中增加
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; } }
- 新建
SysUrlController
,并实现```Add``方法
需求中要求URL不能重复,因此我们在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, "服务器异常")); } } } }
Add
方法中调用了IsExist
方法,如果传入的Url存在则向客户端提示已存在。 - 在接口及其实现类中增加
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的需求已经完成。
三、总结
这篇文章主要讲解了接口路径管理的开发,功能比较简单。从这篇文章开始,我们将引导大家自主编写代码,我只提供其中一个需求的代码,但是对于逻辑复杂的代码,我会带领大家一步一步的来实现。