WebApi配置Swagger、Serilog、NewtonsoftJson、Sqlsugar、依赖注入框架Autofac、MD5加密
文章目录
- 项目准备
- 1、创建WebApi项目
- 配置Swagger、Serilog、NewtonsoftJson
- NewtonsoftJson
- Swagger
- Serilog
- 使用ORM框架`SqlSugar`
- 创建Service类库构成MVC框架
- 使用AutoFac进行依赖注入
- 创建用户登录接口
- 添加用户时进行安全防护
项目准备
1、创建WebApi项目
配置Swagger、Serilog、NewtonsoftJson
NewtonsoftJson
引入
Microsoft.AspNetCore.Mvc.NewtonsoftJson的包
编写配置代码,在启动类中使用Program
/*Json格式化*/
builder.Services.AddControllers().AddNewtonsoftJson(options =>
{options.SerializerSettings.ContractResolver = new DefaultContractResolver();options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
});
Swagger
使用扩展的方式进行swagger注释的配置
using System.Reflection;
using Microsoft.OpenApi.Models;
using noteVersion.utils;namespace noteVersion.ExtTool;public static class SwaggerExt
{/// <summary>/// 添加Swagger扩展/// </summary>public static void AddSwaggerExt(this IServiceCollection services){services.AddSwaggerGen(c =>{/*版本控制*/typeof(ApiVersion).GetEnumNames().ToList().ForEach(version =>{c.SwaggerDoc(version, new OpenApiInfo { Title = "NoteVersion Api", Version = version });});/*添加注释*/var xmlFile = $"{Assembly.GetEntryAssembly().GetName().Name}.xml";var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);c.IncludeXmlComments(xmlPath);});}/// <summary>/// 使用Swagger扩展/// </summary>public static void UseSwaggerExt(this WebApplication application){application.UseSwagger();application.UseSwaggerUI(c =>{foreach (var item in typeof(ApiVersion).GetEnumNames()){c.SwaggerEndpoint($"/swagger/{item}/swagger.json", $"WebAread Api {item}版本");}});}
}
在启动类中使用Program
//注册扩展
builder.Services.AddSwaggerExt();
//使用扩展
app.UseSwaggerExt();
在项目的属性文件里配置开启文档生成projrct.csproj
<GenerateDocumentationFile>True</GenerateDocumentationFile>
Serilog
下载Serilog.AspNetCore包
编写log扩展(依赖注入方式使用插件,还有配置文件方式等)
using Serilog;
using Serilog.Events;namespace noteVersion.ExtTool;public static class SerilogExt
{public static void AddSerilogExt(this WebApplicationBuilder builder){builder.Services.AddSerilog(cfg =>{cfg.MinimumLevel.Information().WriteTo.File("Logs/log.txt", rollingInterval: RollingInterval.Day, restrictedToMinimumLevel: LogEventLevel.Information).WriteTo.File("Logs/Errors/log.txt", rollingInterval: RollingInterval.Day, restrictedToMinimumLevel: LogEventLevel.Error);});}
}
在Program里注册Serilog
builder.AddSerilogExt();
使用在Controller类里
using Microsoft.AspNetCore.Mvc;namespace noteVersion.Controllers;
/// <summary>
/// 用户
/// </summary>
[ApiController]
[Route("[Controller]/[Action]")]
public class UserController : ControllerBase
{private readonly ILogger<UserController> _logger;private int a = 27;public UserController(ILogger<UserController> logger){_logger = logger;}/// <summary>/// 测试/// </summary>/// <returns></returns>[HttpGet]public async Task<IActionResult> Test(){_logger.LogInformation($"{typeof(UserController).FullName}:{nameof(Test)}\n log测试{a}");return Ok("测试成功");}
}
使用ORM框架SqlSugar
下载SqlSugarCore包
编写json连接字符串在appsettings.json中
"SqlSugar": {"ConnectString": "server = 127.0.0.1; Database = test; Uid = root; Pwd = root; AllowLoadLocalInfile = true;"},
创建Helper类库进行sqlsugar配置
由于Sqlsugar官方网站建议不要让SqlClient进行上下文的联动,所以一个块里new一个Sqlclient。
于是我使用传参的方式进行实例化时的配置。
using Microsoft.Extensions.Configuration;
using SqlSugar;namespace WebReadSite.DataAccess;
public class DbContext
{private readonly IConfiguration _configuration;private SqlSugarClient _dbClient;public DbContext(IConfiguration configuration){_configuration = configuration;InitializeDatabase();}private void InitializeDatabase(){string connectionString = _configuration["SqlSugar:ConnectString"];_dbClient = new SqlSugarClient(new ConnectionConfig(){ConnectionString = connectionString,DbType = DbType.MySql,IsAutoCloseConnection = true});}public SqlSugarClient GetDbClient(){return _dbClient;}
}
创建Models类库进行数据实体的配置
using SqlSugar;namespace Models;[SugarTable(tableName: "Users")]
public class User
{[SugarColumn(IsPrimaryKey = true)] public string USERID { get; set; }public string USERNAME { get; set; }public string EMAIL { get; set; }public string PASSWORD { get; set; }public DateTime CREATEAT { get; set; }public DateTime UPDATEAT { get; set; }
}
在Controller类中使用Sqlsugar
使用
IConfiguration读取Json配置,在方法里使用SqlClient执行插入
using Microsoft.AspNetCore.Mvc;
using Models;
using SqlSugar;
using WebReadSite.DataAccess;namespace noteVersion.Controllers;
/// <summary>
/// 用户
/// </summary>
[ApiController]
[Route("[Controller]/[Action]")]
public class UserController : ControllerBase
{private readonly ILogger<UserController> _logger;IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();public UserController(ILogger<UserController> logger){_logger = logger;}/// <summary>/// 测试/// </summary>/// <returns></returns>[HttpGet]public async Task<IActionResult> Test(){DbContext dbContext = new DbContext(configuration);SqlSugarClient dbClient = dbContext.GetDbClient();dbClient.Insertable(new User() { USERID = Guid.NewGuid().ToString(), USERNAME = "jack" }).ExecuteCommand();_logger.LogInformation($"{typeof(UserController).FullName}:{nameof(Test)}\n log测试");return Ok("测试成功");}
}
创建Service类库构成MVC框架
创建IService与Service类库
使用AutoFac进行依赖注入
安装Autofac包和Autofac.Extensions.DependencyInjection
创建Autofac扩展
using System.Reflection;
using Autofac;
using Autofac.Extensions.DependencyInjection;namespace noteVersion.ExtTool;public static class AutofacExt
{/// <summary>/// Autofac使用dll注入/// </summary>/// <param name="builder"></param>/// <exception cref="Exception"></exception>public static void AddAutofac(this WebApplicationBuilder builder){var basePath = AppContext.BaseDirectory;var servicesDllFile = Path.Combine(basePath, "noteVersion.Service.dll"); //服务层if (!(File.Exists(servicesDllFile) && File.Exists(servicesDllFile))){throw new Exception("service.dll 丢失,因为项目解耦了,所以需要先F6编译,再F5运行,请检查 bin 文件夹,并拷贝。");}//使用IOC工厂类builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());// 获取 Repository.dll 程序集服务,并注册var assemblysRepository = Assembly.LoadFrom(servicesDllFile);builder.Host.ConfigureContainer<ContainerBuilder>(build =>{build.RegisterAssemblyTypes(assemblysRepository).AsImplementedInterfaces().InstancePerDependency();});}
}
在Program进行注册
builder.AddAutofac();
使用在Controller中
注入了IUserManager类
using Microsoft.AspNetCore.Mvc;
using Models;
using Service;
using IService;
using WebReadSite.DataAccess;namespace noteVersion.Controllers;/// <summary>
/// 用户
/// </summary>
[ApiController]
[Route("[Controller]/[Action]")]
public class UserController : ControllerBase
{private readonly ILogger<UserController> _logger;private readonly IUserManager _userManager;private readonly IConfiguration _configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();/// <summary>/// 构造函数/// </summary>/// <param name="logger"></param>/// <param name="userManager"></param>public UserController(ILogger<UserController> logger,IUserManager userManager){_logger = logger;_userManager = userManager;}/// <summary>/// 测试/// </summary>/// <returns></returns>[HttpGet]public async Task<IActionResult> Test(){var dbContext = new DbContext(_configuration);var dbClient = dbContext.GetDbClient();await dbClient.Insertable(new User() { USERID = Guid.NewGuid().ToString(), USERNAME = "jack" }).ExecuteCommandAsync();_logger.LogInformation($"{typeof(UserController).FullName}:{nameof(Test)}\n log测试");return Ok("测试成功");}/// <summary>/// 添加用户/// </summary>/// <returns></returns>[HttpGet]public async Task<IActionResult> AddUser(string name, string email, string password){try{var result =await _userManager.CreateUser(name, email, password);return Ok(result);}catch (Exception e){Console.WriteLine(e);return BadRequest(e.Message);}}
}
创建用户登录接口
- 用户管理(User Management):
- 这个模块负责用户账户的创建、修改和删除操作。它通常包括注册新用户、更新用户信息、重置密码等功能。
Service类库下的UserManager
using System.Runtime.InteropServices.JavaScript;
using IService;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Models;
using WebReadSite.DataAccess;namespace Service;public class UserManager : IUserManager
{private readonly ILogger<UserManager> _logger;IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();public UserManager(ILogger<UserManager> logger){_logger = logger;}public UserManager(){}/// <summary>/// 创建用户/// </summary>public async Task<int> CreateUser(string name, string email, string password){var dbContext = new DbContext(configuration);var dbClient = dbContext.GetDbClient();try{await dbClient.BeginTranAsync();var result = await dbClient.Insertable(new User(){USERID = Guid.NewGuid().ToString(),USERNAME = name, EMAIL = email, PASSWORD = password,CREATEAT = DateTime.Now}).ExecuteCommandAsync();await dbClient.CommitTranAsync();return result;}catch (Exception e){_logger.LogInformation($"{typeof(UserManager).FullName}-{nameof(CreateUser)}:{e.Message}");await dbClient.RollbackTranAsync(); //数据回滚throw new Exception("创建用户失败");}}public void UpdateUser(){try{}catch (Exception e){_logger.LogInformation($"{typeof(UserManager).FullName}-{nameof(CreateUser)}:{e.Message}");throw;}}public void DeleteUser(){try{}catch (Exception e){_logger.LogInformation($"{typeof(UserManager).FullName}-{nameof(CreateUser)}:{e.Message}");throw;}}
}
在Controller中使用(同上上)
/// <summary>/// 添加用户/// </summary>/// <returns></returns>[HttpGet]public async Task<IActionResult> AddUser(string name, string email, string password){try{var result =await _userManager.CreateUser(name, email, password);return Ok(result);}catch (Exception e){Console.WriteLine(e);return BadRequest(e.Message);}}
添加用户时进行安全防护
使用Post传输且用body传输
/// <summary>/// 添加用户/// </summary>/// <returns></returns>[HttpPost]public async Task<IActionResult> AddUser(UserInfo userInfo){try{var result =await _userManager.CreateUser(userInfo.name, userInfo.email, userInfo.password);return Ok(result);}catch (Exception e){Console.WriteLine(e);return BadRequest(e.Message);}}
*添加MD5加密,之后保存进数据库UserManager*类
/// <summary>/// 创建用户/// </summary>public async Task<int> CreateUser(string name, string email, string password){var dbContext = new DbContext(configuration);var dbClient = dbContext.GetDbClient();try{await dbClient.BeginTranAsync();var result = await dbClient.Insertable(new User(){USERID = Guid.NewGuid().ToString(),USERNAME = name, EMAIL = email, PASSWORD = GetMD5Encryption(password),CREATEAT = DateTime.Now}).ExecuteCommandAsync();await dbClient.CommitTranAsync();return result;}catch (Exception e){_logger.LogInformation($"{typeof(UserManager).FullName}-{nameof(CreateUser)}:{e.Message}");await dbClient.RollbackTranAsync(); //数据回滚throw new Exception("创建用户失败");}} /// <summary>/// 获取MD5算法字符串/// </summary>/// <param name="passWord"></param>/// <returns></returns>public string GetMD5Encryption(string passWord){// 创建一个 MD5 实例using (MD5 md5Hash = MD5.Create()){// 将输入字符串转换为字节数组,并计算哈希值byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(passWord));// 创建一个 StringBuilder 来收集字节并创建字符串StringBuilder sBuilder = new StringBuilder();// 将每个字节的哈希值转换为十六进制并追加到字符串构建器for (int i = 0; i < data.Length; i++){sBuilder.Append(data[i].ToString("x2")); // 使用 "x2" 格式化符将每个字节转换为十六进制}// 返回十六进制字符串return sBuilder.ToString();}}
TODO:用户登录后进行JWT校验,校验通过后进行单点登录,之后进行文件的上传、文件列表的获取
相关文章:
WebApi配置Swagger、Serilog、NewtonsoftJson、Sqlsugar、依赖注入框架Autofac、MD5加密
文章目录 项目准备1、创建WebApi项目配置Swagger、Serilog、NewtonsoftJsonNewtonsoftJsonSwaggerSerilog 使用ORM框架SqlSugar创建Service类库构成MVC框架使用AutoFac进行依赖注入 创建用户登录接口添加用户时进行安全防护 项目准备 1、创建WebApi项目 配置Swagger、Serilog…...
【ffmpeg命令基础】视频选项讲解
文章目录 前言设置输出文件的帧数设置每秒播放的帧数设置输出视频的帧率示例1:更改输出视频的帧率示例2:将图像序列转换为视频 设置输入视频的帧率示例3:处理高帧率视频示例4:处理低帧率视频 同时设置输入和输出帧率示例5…...
使用uniapp开发小程序(基础篇)
本文章只介绍微信小程序的开发流程,如果需要了解其他平台的开发的流程的话,后续根据情况更新相应的文章,也可以根据uniapp官网的链接了解不同平台的开发流程 HBuilderX使用:https://uniapp.dcloud.net.cn/quickstart-hx.html 开发工具 开始…...
vue3【详解】组合式函数
什么是组合式函数? 利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数,用于实现逻辑复用,类似 react18 中的 hook 函数名称 – 以 use 开头,采用驼峰命名,如 useTitle参数 – 建议使用 toValue() 处理(…...
微服务实战系列之玩转Docker(六)
前言 刚进入大暑,“清凉不肯来,烈日不肯暮”,空调开到晚,还是满身汗。——碎碎念 我们知道,仓库可见于不同领域,比如粮食仓库、数据仓库。在容器领域,自然也有镜像仓库(registry&…...
Python题解Leetcode Hot100之动态规划
动态规划解题步骤-5部曲 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 70. 爬楼梯 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到…...
你了解GD32 MCU上下电要求吗
你了解GD32 MCU的上下电要求吗?MCU的上下电对于系统的稳定运行非常重要。 以GD32F30X为例,上电/掉电复位波形如如下图所示。 上电过程中,VDD/VDDA电压上电爬坡,当电压高于VPOR(上电复位电压)MCU开始启动&a…...
二、【Python】入门 - 【PyCharm】安装教程
往期博主文章分享文章: 【机器学习】专栏http://t.csdnimg.cn/sQBvw 目录 第一步:PyCharm下载 第二步:安装(点击安装包打开下图页面) 第三步:科学使用,请前往下载最新工具及教程:…...
2、程序设计语言基础知识
这一章节的内容在我们的软件设计师考试当中,考的题型比较固定,基本都是选择题,分值大概在2~4分左右。 而且考的还多是程序设计语言的一些基本语法,特别是这两年比较火的Python。 所以对于有一定要编程基础的即使本章的内容不学习&…...
ARM/Linux嵌入式面经(十八):TP-Link联洲
文章目录 虚拟内存,页表,copy on write面试题1:面试题2:面试题3:进程和线程的区别红黑树和b+树的应用红黑树的应用B+树的应用视频会议用了哪些协议1. H.323协议2. SIP协议(会话发起协议)3. WebRTC(网页实时通信)4. 其他协议io多路复用(select,poll,epoll)面试题li…...
解读vue3源码-响应式篇2
提示:看到我 请让我滚去学习 文章目录 vue3源码剖析reactivereactive使用proxy代理一个对象1.首先我们会走isObject(target)判断,我们reactive全家桶仅对对象类型有效(对象、数组和 Map、Set 这样的集合类型),而对 str…...
【测开能力提升-fastapi框架】fastapi能力提升 - 中间件与CORS
1. 中间件 1.1 介绍(ChatGPT抄的,大致可以理解) 一种机制,用于在处理请求和响应之前对其进行拦截、处理或修改。中间件可以在应用程序的请求处理管道中插入自定义逻辑,以实现一些通用的功能,如身份验证、…...
centos7安装es及简单使用
为了方便日后查看,简单记录下! 【启动es前,需要调整这个配置文件(/opt/elasticsearch-6.3.0/config/elasticsearch.yml)的两处ip地址,同时访问页面地址的ip:9200时,ip地址也对应修改】 【启动kibana前,需要调整这个配置文件(/opt/kibana-6.3.0/config/k…...
2024年自动驾驶SLAM面试题及答案(更新中)
自动驾驶中的SLAM(Simultaneous Localization and Mapping,即同步定位与地图构建)是关键技术,它能够让车辆在未知环境中进行自主定位和地图建构。秋招来临之际,相信大家都已经在忙碌的准备当中了,尤其是应届…...
HTML零基础自学笔记(上)-7.18
HTML零基础自学笔记(上) 参考:pink老师一、HTML, Javascript, CSS的关系是什么?二、什么是HTML?1、网页,网站的概念2、THML的基本概念3、THML的骨架标签/基本结构标签 三、HTML标签1、THML标签介绍2、常用标签图像标签ÿ…...
数学建模--图论与最短路径
目录 图论与最短路径问题 最短路径问题定义 常用的最短路径算法 Dijkstra算法 Floyd算法 Bellman-Ford算法 SPFA算法 应用实例 结论 延伸 如何在实际应用中优化Dijkstra算法以提高效率? 数据结构优化: 边的优化: 并行计算&…...
FLINK-checkpoint失败原因及处理方式
在 Flink 或其他分布式数据处理系统中,Checkpoint 失败可能由多种原因引起。以下是一些常见的原因: 资源不足: 如果 TaskManager 的内存或磁盘空间不足,可能无法完成状态的快照,导致 Checkpoint 失败。 网络问题&am…...
Hbase映射为Hive外表
作者:振鹭 Hbase对应Hive外表 (背景:在做数据ETL中,可能原始数据在列式存储Hbase中,这个时候,如果我们想清洗数据,可以考虑把Hbase表映射为Hive的外表,然后使用Hive的HQL来清除处理数据) 1. …...
洛谷P1002(过河卒)题解
题目传送门 思路 直接爆搜会TLE,所以考虑进行DP。 由于卒只可以从左边和上面走,所以走到(i,j)的路程总数为从上面走的路程总数加上从左边走的路程总数。我们用dp[i][j]表示从起点走到(i,j)的路程总数,那么状态转移方程为: dp[…...
微信小程序 async-validator 表单验证 第三方包
async-validator 是一个基于 JavaScript 的表单验证库,支持异步验证规则和自定义验证规则 主流的 UI 组件库 Ant-design 和 Element 中的表单验证都是基于 async-validator 使用 async-validator 可以方便地 构建表单中逻辑,使得错误提示信息更加友好和灵…...
.net10+winform+Antdui 制作 LOL 小助手二
功能1.各个功能模块目前分为了六个标签页、首页、对局、战绩查询、关于、设置、日志首页:包含个人段位信息,战绩查看,查找他人信息对局:支持查看当前对局所有人的战绩信息,显示最近的九盘对局记录战绩查询:…...
终极SQL实战训练:如何通过谋杀谜案游戏高效掌握数据库查询技能
终极SQL实战训练:如何通过谋杀谜案游戏高效掌握数据库查询技能 【免费下载链接】sql-mysteries Inspired by veltmans command-line mystery, use SQL to research clues and find out whodunit! 项目地址: https://gitcode.com/gh_mirrors/sq/sql-mysteries …...
Kiro使用最佳教程
Kiro使用最佳教程:从入门到精通,高效AI编程全攻略Kiro是亚马逊云科技推出的新一代AI驱动型集成开发环境(IDE),同时配套CLI命令行工具,主打规范驱动开发(Spec-Driven Development)&am…...
黄仁勋把Token、智能体和万亿美元周期串起来了
作者|YaraGTC大会前两周的旧金山,在摩根士丹利TMT大会上(Morgan Stanley 2026 Technology, Media & Telecom Conference),黄仁勋与摩根士丹利联合主席Dan Simkowitz进行了一场炉边对话。这场对话值得复盘ÿ…...
Win10系统下VS2019极简配置指南:快速搭建C/C++开发环境
1. 为什么选择VS2019社区版? 作为一个从VC6.0时代就开始用微软开发工具的老码农,我亲历了Visual Studio的每一次重大升级。说实话,VS2019社区版是目前最适合个人开发者和小团队的免费神器。相比之前的版本,它有几个明显的优势&am…...
从Arduino IDE迁移到VSCode+PlatformIO:一个ESP32-S3老玩家的环境搭建与项目移植全记录
从Arduino IDE迁移到VSCodePlatformIO:ESP32-S3开发者的生产力跃迁指南 作为一名长期使用Arduino IDE的嵌入式开发者,我深刻理解那种"又爱又恨"的复杂感受。Arduino IDE以其简单易用著称,但随着项目复杂度提升,简陋的编…...
Qwen-Image-2512-Pixel-Art-LoRA完整指南:三档生成模式(10/30/45步)性能实测对比
Qwen-Image-2512-Pixel-Art-LoRA完整指南:三档生成模式(10/30/45步)性能实测对比 1. 模型概述 Qwen-Image-2512-Pixel-Art-LoRA是基于通义万相Qwen-Image-2512大模型的像素艺术风格微调版本,由社区开发者prithivMLmods训练并开源…...
Python 异常处理进阶实战:掌握异常链与 `raise ... from ...`,让生产调试从“猜谜”到“10 分钟定位
📌 Python 异常处理进阶实战:掌握异常链与 raise ... from ...,让生产调试从“猜谜”到“10 分钟定位”引言:Python 的优雅不止于简洁,更在于“可控的失败” Python 从 1991 年 Guido van Rossum 发布首个版本至今&…...
OpenClaw内存优化:在8GB设备上流畅运行Qwen3.5-9B的技巧
OpenClaw内存优化:在8GB设备上流畅运行Qwen3.5-9B的技巧 1. 为什么需要内存优化? 第一次在MacBook Air(M1芯片/8GB内存)上部署OpenClaw对接Qwen3.5-9B时,系统频繁弹出内存不足警告。当时我正在尝试用自动化流程整理季…...
QGIS高效加载OpenStreetMap数据的两种实用方法
1. 快速加载OSM底图的秘密武器:QuickMapServices插件 第一次用QGIS加载OpenStreetMap数据时,我像大多数人一样先尝试了官方提供的标准方法,结果发现要么加载速度慢得像蜗牛,要么显示效果差强人意。直到发现了QuickMapServices这个…...
