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 可以方便地 构建表单中逻辑,使得错误提示信息更加友好和灵…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...