湖南建设部网站,微信小程序定制公司,秦皇岛中兵建设集团网站,黄骅贴吧在线咱们继续来编写孢子记账的简易权限#xff0c;这篇文章中我们将编写角色可访问接口的管理API#xff0c;同样我不会把完整的代码全都列出来#xff0c;只会列出部分代码#xff0c;其余代码我希望大家能自己手动编写#xff0c;然后对比项目代码。废话不多说#xff0c;开…咱们继续来编写孢子记账的简易权限这篇文章中我们将编写角色可访问接口的管理API同样我不会把完整的代码全都列出来只会列出部分代码其余代码我希望大家能自己手动编写然后对比项目代码。废话不多说开讲。
一、需求
角色可访问接口的需求很简单也就是简单的增删改查。
编号功能描述1新增一个角色可绑定多个接口但一个角色不能绑定同一个接口多次2删除系统角色可访问的URL不可删除3修改一个角色不能绑定同一个接口多次4查询可根据角色名、接口地址进行模糊查询实现分页功能5查询根据角色可访问接口Id查询单个数据
二、编写代码
2.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/// 导航属性/// /summarypublic SysRole Role { get; set; }/// summary/// 导航属性/// /summarypublic SysUrl Url { get; set; }
}在数据库链接上下文类SporeAccountingDBContext1中增加SysRoleUrl /// summary
/// 接口URL表
/// /summary
public DbSetSysUrl SysUrls { get; set; }在SysRole类中增加SysRoleUrl的导航属性/// summary
/// SysRoleUrl导航属性
/// /summary
public ICollectionSysRoleUrl RoleUrls { get; set; }迁移数据库迁移后的数据库如下图
2.2 编写业务逻辑
我们以删除为例来看一下角色可访问接口如何编写。
新建服务接口ISysRoleUrlServer及其实现类SysRoleUrlImp在接口及其实现类中增加Delete方法//ISysRoleUrlServer
/// summary
/// 删除角色可访问的URL
/// /summary
/// param nameroleId/param
/// param nameurlId/param
void Delete(string roleId, string urlId);//SysRoleUrlImp
/// summary
/// 删除角色可访问的URL
/// /summary
/// param nameroleId/param
/// param nameurlId/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;}
}新建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 nameroleId/param/// param nameurlId/param/// returns/returns[HttpDelete][Route(Delete/{roleId}/{urlId})]public ActionResultResponseDatabool Delete([FromRoute] string roleId, [FromRoute] string urlId){try{bool isExist _sysRoleUrlServer.IsExist(roleId, urlId);if (!isExist){return Ok(new ResponseDatabool(HttpStatusCode.NotFound, $角色{roleId}不存在URL{urlId}, false));}bool isDelete _sysRoleUrlServer.IsDelete(roleId, urlId);if (!isDelete){return Ok(new ResponseDatabool(HttpStatusCode.Conflict, $角色{roleId}不允许删除URL{urlId}, false));}_sysRoleUrlServer.Delete(roleId, urlId);return Ok(new ResponseDatabool(HttpStatusCode.OK, data: true));}catch (Exception e){return Ok(new ResponseDatabool(HttpStatusCode.InternalServerError, 服务器异常, false));}}}
}在上述代码中我们在执行删除操作时需要判断角色可访问接口是否存在以及角色可访问接口是否可以删除因此需要在接口及其实现类中增加IsExist和IsDelete方法//ISysRoleUrlServer
/// summary
/// 角色可访问的URL是否存在
/// /summary
/// param nameroleId/param
/// param nameurlId/param
/// returns/returns
bool IsExist(string roleId, string urlId);/// summary
/// 是否可以删除
/// /summary
/// param nameroleId/param
/// param nameurlId/param
/// returns/returns
bool IsDelete(string roleId, string urlId);//SysRoleUrlImp
/// summary
/// 角色可访问的URL是否存在
/// /summary
/// param nameroleId/param
/// param nameurl/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 nameroleId/param
/// param nameurlId/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;}
}三、总结
这篇文章主要讲解了角色可访问接口管理的编写代码和逻辑也很简单因此没有详细讲解。角色可访问接口管理的剩余需求我希望大家一起来编写出来。