【.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.mzph.cn/web/58076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NVR监测软件/设备EasyNVR多品牌NVR管理工具/设备对城市安全有哪些具体益处?

在智慧城市的建设中&#xff0c;各种先进的技术系统正发挥着越来越重要的作用。其中&#xff0c;NVR监测软件/设备EasyNVR作为一种高效的视频边缘计算网关&#xff0c;不仅能够实现视频数据的采集、编码和存储&#xff0c;还能与其他智慧城市系统进行深度集成&#xff0c;共同推…

TCP建立连接之后怎么保持长连接(检测连接断没断)

在TCP连接建立后&#xff0c;保持长连接的主要方式是通过定期的心跳检测&#xff08;Keep-Alive&#xff09;和超时机制。以下是一些具体的方法和机制 1. TCP Keep-Alive TCP协议本身提供了一种Keep-Alive机制&#xff0c;可以通过以下步骤实现&#xff1a; 启用Keep-Alive&…

速盾:海外cdn高防

随着互联网的快速发展&#xff0c;网站的安全性和稳定性变得越来越重要。尤其是对于大型企业和电商平台来说&#xff0c;保护用户数据和维护网站稳定运行是至关重要的。为了应对日益增长的网络攻击和恶意访问&#xff0c;海外CDN高防服务成为了一种非常受欢迎的解决方案。 首先…

【NOIP提高组】虫食算

【NOIP提高组】虫食算 C语言C &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 所谓虫食算&#xff0c;就是原先的算式中有一部分被虫子啃掉了&#xff0c;需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子&#xff1a; 43#98…

【系统架构设计师】2021年真题论文: 论面向方面的编程技术及其应用(AOP)(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2021年 试题1)解题思路面向方面的编程(AOP)技术概念和原理AOP的核心机制AOP 在软件系统开发中的应用场景AOP 应用案例分析论文素材参考真题题目(2021年 试题1) 面向过程编程是一种自顶向下的编程方…

Lobe Chat:你的私人AI助理

有一天&#xff0c;一位程序员对他的朋友说&#xff1a;‘我希望有一个助手&#xff0c;能像我一样聪明&#xff0c;但不会吃饭、喝水和请病假。’朋友回答说&#xff1a;‘这很简单&#xff0c;你只需要一个智能聊天助手&#xff01;’于是&#xff0c;程序员便找到了 LobeCha…

【CAPL实战】LIN帧干扰的脚本实现

文章目录 1、帧头干扰响应linDisturbRespWithHeader1.1 函数功能1.2 参数说明1.3 代码实例1.4 执行结果 2、帧头干扰帧头linDisturbHeaderWithHeader2.1 函数功能2.2 参数说明2.3 代码实例 1、帧头干扰响应linDisturbRespWithHeader 1.1 函数功能 使用一个新的header帧头来干…

华为HarmonyOS打造开放、合规的广告生态 - 激励广告

场景介绍 激励广告是一种全屏幕的视频广告&#xff0c;用户可以选择点击观看&#xff0c;以换取相应奖励。 接口说明 接口名 描述 loadAd(adParam: AdRequestParams, adOptions: AdOptions, listener: AdLoadListener): void 请求单广告位广告&#xff0c;通过AdRequestPar…

自由学习记录(18)

动画事件的碰撞器触发 Physics 类的常用方法 RaycastHit hit; if (Physics.Raycast(origin, direction, out hit, maxDistance)) {Debug.Log("Hit: " hit.collider.name); } Physics.Raycast&#xff1a;从指定点向某个方向发射射线&#xff0c;检测是否与碰撞体…

【elkb】创建用户和角色

在使用中我们不能把超管的用户信息给到所有者&#xff0c;我们需要为不用的使用场景创建不同的用户。 登录管理员用户 打开管理页面 创建角色 点击角色&#xff0c;创建角色 填写角色信息 设置Kibana 权限 最后点击创建角色 创建用户 点击用户--->创建用户 填写信息 登录…

【论文复现】语言模型中的多模态链式推理

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐、摄影的一位博主。 &#x1f4d7;本文收录于论文复现系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

Mysql常用语法一篇文章速成

文章目录 前言前置环境数据库的增删改查查询数据查询所有条件查询多条件查询模糊查询分页查询排序查询分组查询⭐️⭐️关联查询关联分页查询 添加数据insert插入多条记录不指定列名(适用于所有列都有值的情况) 更新数据更新多条记录更新多个列更新不满足条件的记录 删除统计数…

【每日C/C++问题】

一、 结构体和联合体有什么区别&#xff1f;能否在声明过程当中缺省名字&#xff1f;&#xff08;需要写清楚使用方法&#xff09; 结构体的各个成员占用不同的内存空间&#xff0c;总大小是所有成员大小之和&#xff08;结构体字节对齐&#xff09;&#xff1a; typedef str…

Docker小记

Docker就是将程序和环境一同打包成一个独立的容器&#xff0c;容器和容器之间独立&#xff0c;可以理解为一个app,一个手机就是一个pod&#xff0c;一个pod上可以运行多个容器&#xff0c;容器之间共享磁盘和网络&#xff0c;每个容器仍然运行在自己的进程空间中&#xff0c;有…

Spring Boot代理问题

在 Spring Boot 2.x 中&#xff0c;AOP&#xff08;面向切面编程&#xff09;默认使用 CGLIB&#xff08;Code Generation Library&#xff09;来实现类的代理。CGLIB 代理是通过在运行时生成目标类的子类来增强目标类的方法。这种方式允许对没有实现接口的类进行代理。以下是一…

“不可原谅的漏洞”论文导读

文章《Unforgivable Vulnerabilities》由Steve Christey 2007年撰写&#xff0c;主要探讨了在软件安全领域中那些本可以避免的漏洞&#xff0c;即“不可原谅的漏洞”。这些漏洞通常由于开发者忽视了基本的安全开发实践而存在&#xff0c;且容易被发现和利用。文章提出了建立一套…

正则表达式(Regular Expressions)

正则表达式&#xff08;Regular Expressions, 简称 Regex&#xff09;是一种用于字符串匹配和处理的强大工具&#xff0c;通过特定的模式&#xff08;Pattern&#xff09;描述字符串。它在验证、替换、分割、提取等操作中非常有效。以下是一些基本概念和常见使用场景&#xff1…

文件夹无法访问?全面解析与高效恢复策略

一、文件夹无法访问的困境 在日常的计算机使用中&#xff0c;我们时常会遇到文件夹无法访问的尴尬情况。这种故障表现为双击文件夹时&#xff0c;系统毫无反应&#xff0c;或者弹出“无法访问&#xff0c;拒绝访问”的错误提示。更令人头疼的是&#xff0c;有时文件夹内的文件…

设计模式 策略模式 场景Vue (技术提升)

策略模式 (建议复制编辑器查看更佳) 在给定的 Vue.js 组件代码中&#xff0c;根据optionKey的不同值&#xff0c;展示了不同的表单内容并定义了不同的表单验证规则。在这里&#xff0c;optionMap对象内部定义了不同的策略&#xff08;addAccount、editAccount、editPassword&am…

万字长文详解Hive聚合函数 grouping sets、cube、rollup原理、语法、案例和优化

目录 原理与语法 使用场景 多维度报表生成 复杂的数据分析 实际案例 原理与语法 与GROUPINGSETS的区别 实际案例 原理与语法 与CUBE的对比 实际案例 执行效率比较 优化建议 Hive提供了三个强大的高级聚合函数: GROUPING SETS 、 CUBE 和 ROLLUP ,用于处理复杂的…