.net6项目模板搭建教程

1.集成log4net

安装如下扩展依赖即可,已经包含了log4net依赖:

Microsoft.Extensions.Logging.Log4Net.AspNetCore

 

添加日志配置文件:

日志配置文件属性设置为始终复制:

注入服务:

#region 注入log4net日志服务builder.Logging.AddLog4Net("Config/log4net.config");#endregion

此时集成完毕。 

2.集成automapper

安装如下依赖,此版本已经合并扩展依赖。

AutoMapper

编写配置映射类:

代码如下:

using AutoMapper;
using DataApi.Model.Dto;
using DataApi.Model.Entity;namespace DataApi.Extension
{/// <summary>/// 映射描述类/// </summary>public class AutoMapperProfile : Profile{/// <summary>/// 构造函数/// </summary>public AutoMapperProfile(){//部门CreateMap<SysDept, SysDeptDto>();}}
}

 注册服务:

#region 注入AutoMapper服务builder.Services.AddAutoMapper(typeof(AutoMapperProfile));#endregion

使用过程如下:

[HttpGet]
[Route("list")]
public async Task<ApiResult> GetSysDepts()
{List<SysDept> sysDepts = await _sysDeptRepository.GetListAsync(opt => opt.DeptId == 100);return ApiResult.Success(_mapper.Map<List<SysDeptDto>>(sysDepts));
}

 对应的实体类和dto如下:

3.响应json时间本地化 

安装如下依赖:

Microsoft.AspNetCore.Mvc.NewtonsoftJson

更改响应时间格式:

#region 更改响应时间格式builder.Services.AddControllers().AddNewtonsoftJson(options =>{//更改响应时间格式options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";});#endregion

4.集成跨域

注入服务:

#region 注入跨域服务builder.Services.AddCors(options =>
{options.AddPolicy("Cors", policy => policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
});#endregion

添加跨域中间件:

# region 跨域中间件app.UseCors("Cors");#endregion

 

5.集成sqlsugar

安装如下依赖:

SqlSugarCore

创建仓储:

using SqlSugar;namespace DataApi.Repository
{/// <summary>/// 仓储类/// </summary>/// <typeparam name="T">T</typeparam>public class Repository<T> : SimpleClient<T> where T : class, new(){/// <summary>/// 构造函数/// </summary>/// <param name="db">ISqlSugarClient</param>public Repository(ISqlSugarClient db){base.Context = db;}}
}

 执行扩展方法:

#region 注入Sqlsugar服务builder.Services.AddSqlSugarExt("MySql");#endregion
#region 注入泛型仓储builder.Services.AddScoped(typeof(Repository<>));#endregion

编写扩展类:

using DataApi.Common;
using SqlSugar;
using System.Data;namespace DataApi.Extension
{/// <summary>/// SqlSugar扩展类/// </summary>public static class SqlSugarExt{/// <summary>/// 扩展方法/// </summary>/// <param name="services">容器</param>/// <param name="sqlType">数据库类型</param>public static void AddSqlSugarExt(this IServiceCollection services, string sqlType = "MySql"){//注册SqlSugarservices.AddSingleton<ISqlSugarClient>(s =>{//配置实例var configuration = s.GetRequiredService<IConfiguration>();//日志实例var logger = s.GetRequiredService<ILogger<Program>>();SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig{//数据库类型DbType = ToolHelper.GetDbType(sqlType),//连接字符串ConnectionString = configuration.GetConnectionString(sqlType),//自动关闭连接IsAutoCloseConnection = true},db =>{//单例参数配置,所有上下文生效db.Aop.OnLogExecuting = (sql, pars) =>{//输出sqllogger.LogInformation(sql);if (pars != null){//输出参数logger.LogInformation(string.Join(",", pars.Select(p => p.ParameterName + ":" + p.Value)));}};});return sqlSugar;});}}
}

 

获取dbtype:

using SqlSugar;namespace DataApi.Common
{/// <summary>/// 工具帮助类/// </summary>public class ToolHelper{/// <summary>/// GetDbType/// </summary>/// <param name="sqlType">string</param>/// <returns>DbType</returns>public static DbType GetDbType(string sqlType){DbType dbType = DbType.MySql;switch (sqlType){case "SqlServer":dbType = DbType.SqlServer;break;case "MySql":dbType = DbType.MySql;break;case "Dm":dbType = DbType.Dm;break;case "Oracle":dbType = DbType.Oracle;break;case "PostgreSQL":dbType = DbType.PostgreSQL;break;case "Sqlite":dbType = DbType.Sqlite;break;}return dbType;}}
}

 

跟datalink保持一致,只支持6种数据库。

6.jwt及swagger完整配置

安装如下依赖:

Microsoft.AspNetCore.Authentication.JwtBearer
Swashbuckle.AspNetCore.Filters

编写API版本类:

namespace DataApi.Common
{/// <summary>/// Api版本枚举/// </summary>public enum ApiVersion{/// <summary>/// V1版本/// </summary>V1 = 1,/// <summary>/// V2版本/// </summary>V2}
}

 

jwt配置类编写如下:

namespace DataApi.Common
{/// <summary>/// Jwt配置/// </summary>public class JwtSetting{/// <summary>/// 密钥/// </summary>public string SecurityKey { get; set; } = string.Empty;/// <summary>/// 签发者/// </summary>public string? Issuer { get; set; }/// <summary>/// 签收者/// </summary>public string? Audience { get; set; }/// <summary>/// 过期时间/// </summary>public int ExpiredTime { get; set; }}
}

 

 appsettings.json配置内容如下:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","ConnectionStrings": {//MySql"MySql": "Server=127.0.0.1;Database=dmp;Port=3306;Uid=root;Pwd=wong123456;Allow User Variables=True;",//SqlServer"SqlServer": "Data Source=43.143.48.100;Initial Catalog=ALEAN;User Id=sa;Password=ghy520WXF;"},//Jwt配置"JwtSetting": {//密钥"SecurityKey": "7k5yOxSMHVdYjs61gkgUY3W9DHbgk7tokaZlP3QIlfk34D1H7jYEOcLybClW1aKl",//签发者"Issuer": "DataApi",//签收者"Audience": "DataApi",//过期时间,单位秒,默认24小时"ExpiredTime": 86400}
}

 

注入配置:

#region 注入Jwt服务builder.AddJwtExt();#endregion#region 注入Swagger服务builder.AddSwaggerExt();#endregion#region 注入Jwt配置builder.Services.Configure<JwtSetting>(builder.Configuration.GetSection("JwtSetting"));#endregion
# region SwaggerUI配置if (app.Environment.IsDevelopment() || app.Environment.IsProduction())
{app.UseSwaggerExt();
}#endregion
# region 认证中间件app.UseAuthentication();#endregion

jwtAuth扩展:

using DataApi.Common;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;namespace DataApi.Extension
{/// <summary>/// Jwt扩展类/// </summary>public static class JwtAuthExt{/// <summary>/// 扩展方法/// </summary>/// <param name="builder">WebApplicationBuilder</param>public static void AddJwtExt(this WebApplicationBuilder builder){#region 注入认证服务builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{JwtSetting jwtSetting = builder.Configuration.GetSection("JwtSetting").Get<JwtSetting>();options.TokenValidationParameters = new TokenValidationParameters(){//是否验证IssuerValidateIssuer = true,ValidIssuer = jwtSetting.Issuer,//是否验证AudienceValidateAudience = true,ValidAudience = jwtSetting.Audience,//是否验证失效时间ValidateLifetime = true, //默认含300s容错时间//是否验证SecurityKeyValidateIssuerSigningKey = true,IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSetting.SecurityKey))};});#endregion}}
}

swagger扩展:

using DataApi.Common;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.Filters;
using System.Reflection;
using System.Text;namespace DataApi.Extension
{/// <summary>/// Swagger扩展类/// </summary>public static class SwaggerExt{/// <summary>/// 扩展方法/// </summary>/// <param name="builder">WebApplicationBuilder</param>public static void AddSwaggerExt(this WebApplicationBuilder builder){builder.Services.AddSwaggerGen(options =>{//遍历所有版本,展示文档信息typeof(ApiVersion).GetEnumNames().ToList().ForEach(version =>{//添加文档介绍options.SwaggerDoc(version, new OpenApiInfo(){Title = "DataApi",Version = version,Description = $"数据接口服务:【{version}】版本"});});//获取xml文件名称string xmlApiFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";//显示控制器注释options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlApiFileName), true);//根据action名称进行排序options.OrderActionsBy(o => o.RelativePath);//开启加权小锁options.OperationFilter<AddResponseHeadersFilter>();//options.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();// 在header中添加token,传递到后台//options.OperationFilter<SecurityRequirementsOperationFilter>();//添加安全定义options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme(){Description = "在下框中输入Jwt授权Token:Bearer Token",Name = "Authorization",In = ParameterLocation.Header,Type = SecuritySchemeType.ApiKey,BearerFormat = "JWT",Scheme = "Bearer"});//添加安全要求options.AddSecurityRequirement(new OpenApiSecurityRequirement(){{new OpenApiSecurityScheme(){Reference = new OpenApiReference(){Type = ReferenceType.SecurityScheme,Id = "Bearer"}},new string[]{}}});options.SchemaFilter<DateTimeSchemaFilter>();});}/// <summary>/// 扩展方法/// </summary>/// <param name="app">WebApplication</param>public static void UseSwaggerExt(this WebApplication app){app.UseSwagger();//版本切换app.UseSwaggerUI(options =>{typeof(ApiVersion).GetEnumNames().ToList().ForEach(version =>{options.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"【{version}】版本");});});}}
}
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;namespace DataApi.Extension
{/// <summary>/// DateTimeSchemaFilter/// </summary>public class DateTimeSchemaFilter : ISchemaFilter{public void Apply(OpenApiSchema schema, SchemaFilterContext context){if (context.Type == typeof(DateTime) || context.Type == typeof(DateTime?)){schema.Default = new OpenApiString(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); //设置为当前时间}}}
}

 

7.响应结果封装

 

using Newtonsoft.Json;
using System.Net;namespace DataApi.Common
{/// <summary>/// 封装响应数据/// </summary>public class ApiResult{/// <summary>/// 状态码/// </summary>public HttpStatusCode Code { get; set; }/// <summary>/// 消息/// </summary>public string? Message { get; set; }/// <summary>/// 数据/// </summary>public object? Data { get; set; }/// <summary>/// 无参构造函数/// </summary>public ApiResult(){}/// <summary>/// 带参构造函数/// </summary>/// <param name="code">状态码</param>/// <param name="message">消息</param>/// <param name="data">数据</param>public ApiResult(HttpStatusCode code, string message, object data){Code = code;Message = message;Data = data;}/// <summary>/// 序列化对象/// </summary>/// <returns>json字符串</returns>public string ToJson(){return JsonConvert.SerializeObject(this);}/// <summary>/// Success标志/// </summary>/// <param name="data">数据</param>/// <returns>ApiResult</returns>public static ApiResult Success(object data){return new ApiResult(HttpStatusCode.OK, "操作成功", data);}/// <summary>/// Error标志/// </summary>/// <param name="message">消息</param>/// <returns>ApiResult</returns>public static ApiResult Error(string message){return new ApiResult(HttpStatusCode.OK, message, "Error");}/// <summary>/// Unauthorized标志/// </summary>/// <returns>ApiResult</returns>public static ApiResult Unauthorized(){return new ApiResult(HttpStatusCode.Unauthorized, "Unauthorized", "Unauthorized");}/// <summary>/// Forbidden标志/// </summary>/// <returns>ApiResult</returns>public static ApiResult Forbidden(){return new ApiResult(HttpStatusCode.Forbidden, "Forbidden", "Forbidden");}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2033.shtml

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

相关文章

一年期免费SSL证书正在消失?这里还有

在数字化时代&#xff0c;数据安全与隐私保护的重要性不言而喻。SSL&#xff08;Secure Sockets Layer&#xff09;证书作为保障互联网通信安全的关键工具&#xff0c;其有效期一直是业界关注的焦点。近年来&#xff0c;我们见证了免费一年期SSL证书向三个月有效期的转变&#…

win11右键默认显示更多选项

目录 方法一&#xff1a;使用 Shift 键加右键单击方法二&#xff1a;修改注册表方法三&#xff1a;运行命令重启打开命令行恢复win10右键恢复win11右键 在 Windows 11 中&#xff0c;右键单击某个文件或文件夹时&#xff0c;默认情况下可能会显示较少的选项。如果您希望在右键菜…

Oracle EBS Interface/API(54)- GL日记账审批

背景: 客户化创建薪酬凭证或者银企付款入账日记账以后,用户希望自动提交审批流程,无需到系统标准功能点击审批,减少用户操作。 快速参考 参考点内容功能导航N: GL->日记账->输入并发请求None基表GL.GL_JE_BATCHESAPI参考下面介绍错误信息表None接口FormNone接口Reque…

相机标定的原理

1.相机标定资料 这个视频是建议有一定基础的去看&#xff0c;详细介绍了整个标定的过程。 https://www.bilibili.com/video/BV1R7411m7ZQ/?spm_id_from333.337.search-card.all.click&vd_sourcec205d4d10f730a57820343328741984a 这个文章基础一点&#xff0c;可以先看 h…

【YOLOv8改进[注意力]】YOLOv8添加DAT(Vision Transformer with Deformable Attention)助力涨点

目录 一 DAT 二 YOLOv8添加DAT助力涨点 1 总体修改 2 配置文件 3 训练 其他 一 DAT 官方论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/Xia_Vision_Transformer_With_Deformable_Attention_CVPR_2022_paper.pdf Transformers最近在各种视…

轻松搭建llama3Web 交互界面 - Ollama + Open WebUI

Ubuntu下安装&#xff1a;&#xff08;官网&#xff1a;Download Ollama on Linux&#xff09; curl -fsSL https://ollama.com/install.sh | sh 就运行起来ollama了&#xff0c;不放心可以用ollama serve查看一下 ollama run llama3 就可以跑起来了&#xff0c; 那么我们肯…

windows10环境下conda迁移到linux环境

网上给出的方案错误百出&#xff0c;记录一下正确方案。 1 创建yaml文件 创建到终端所在路径下 conda activate 环境名 conda env export --no-build >环境名.yaml2 新操作系统中创建新的conda环境 conda env create -f 环境名.yaml3 删除不兼容的包 终端报错 Could n…

CUDA编程【2】-(51-78)

系列文章目录 文章目录 系列文章目录前言51、寄存器溢出51.1 溢出概念51.1 使用控制 52、本地内存和共享内存52.1 本地内存52.2. 共享内存 53. 常量内存53.1 概念53.2 初始化 54. 全局内存54.1 概念54.2 初始化 55. GPU缓存和变量作用域55.1 缓存类型55.2 变量作用域 56. 静态全…

我的一些 35+ 前同事的现状

大家好&#xff0c;我是坤哥&#xff0c;好久不见&#xff0c;今天简单和大家聊一下我目前观察到的前同事的现状 今年和一些前同事简单聊过&#xff0c;他们的现状如下&#xff1a; A: 去新西兰做 iOS 开发快 10 年了&#xff0c;马上就要拿到永久居留证了&#xff0c;他说在新…

(六)小案例银行家应用程序-删除账号-findindex方法

findindex方法和find方法非常类似&#xff0c;只不过findindex顾名思义&#xff0c;他返回的是index&#xff1b; ● 下面我们使用删除账号的功能来学习一下findindex的 ● 当用户登录成功之后&#xff0c;可以在下方输入自己的用户名和密码&#xff0c;然后提交&#xff0c…

Unity 中(提示框Tweet)

using UnityEngine; using UnityEngine.UI; using DG.Tweening; using System; public class Message : MonoBehaviour {public float dropDuration 0.5f; // 掉落持续时间public float persisterDuration 1f; // 持续显示时间public float dorpHeight;public static Message…

Redis入门到通关之Redis数据结构-String篇

文章目录 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&#xff1a; 在我的…

HarmonyOS ArkUI实战开发-NAPI 加载原理(下)

上一节笔者给大家讲解了 JS 引擎解释执行到 import 语句的加载流程&#xff0c;总结起来就是利用 dlopen() 方法的加载特性向 NativeModuleManager 内部的链接尾部添加一个 NativeModule&#xff0c;没有阅读过上节文章的小伙伴&#xff0c;笔者强烈建议阅读一下&#xff0c;本…

初识《list》及手搓模拟《list》

目录 前言&#xff1a; 1. list的介绍及使用 list的介绍&#xff1a; list的使用&#xff1a; 1、list的构造​编辑 2、list iterator的使用 3、list capacity 4、list element access 5、list modifiers 2.list的模拟实现 1、关于迭代器&#xff1a; 2、迭代器类的…

ScriptableObject数据容器讲解

概述 是Unity提供的一个用于创建可重用的数据容器或逻辑的基类。 ScriptableObject 是继承自 UnityEngine.Object 的一个类&#xff0c;但与普通的 MonoBehaviour 不同&#xff0c;它不能附加到GameObject上作为组件。 相反&#xff0c;ScriptableObject 通常用于存储和管理…

ThingsBoard实战教程(七):模拟设备遥测

tb做为一个多租户的物联网平台,文档也很齐全。后端使用的是java语言编写的,可以用swagger来导出文档。tb的所有服务都可以通过接口来看到。接口主要分为两部分,一部分是设备API,另一部分是用于服务端API。 在我们启动tb之后,可以通过http://ip +port/swagger-ui.html 来…

linux,从零安装nginx,并且部署vue应用程序

前言&#xff1a;系统使用龙蜥&#xff08;8.5&#xff09;的最小化安装&#xff0c;服务器安装这里不在赘述。 nginx 的版本&#xff1a;1.22.0 软件已经放在系统/home/software/ 一、安装nginx 进入路径/home/software/ 1》执行命令&#xff1a;rpm -ivh nginx-1.22.0-1.el7…

uboot大致流程总结

文章目录 一、uboot介绍二、uboot的配置编译过程2.1 make xxx_defconfig2.2 make 一、uboot介绍 uboot是一个bootloader&#xff0c;用于在嵌入式设备中引导linux内核启动&#xff0c;在嵌入式设备中常见的组织结构如下&#xff1a; 芯片内部固化代码 -> bootloader -> …

Docker NetWork (网络)

Docker 为什么需要网络管理 容器的网络默认与宿主机及其他容器都是相互隔离的&#xff0c;但同时我们也要考虑下面的一些问题&#xff0c; 比如 多个容器之间是如何通信的容器和宿主机是如何通信的容器和外界主机是如何通信的容器中要运行一些网络应用(如 nginx、web 应用、数…

第66天:API攻防-接口安全阿里云KEYPostmanDVWSXXE鉴权泄漏

案例一&#xff1a;安全问题-Dvws泄漏&鉴权&XXE 靶场地址&#xff1a;https://github.com/snoopysecurity/dvws-node 利用docker命令去启动 首先先注册一个账户 注册后登录点击admin area 发现点不进去 这里把bp打开但是不抓包&#xff0c;只做流量转发&#xff0c;进…