.net6项目模板搭建教程

news2024/11/15 17:03:03

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")
        {
            //注册SqlSugar
            services.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) =>
                    {
                        //输出sql
                        logger.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()
                {
                    //是否验证Issuer
                    ValidateIssuer = true,
                    ValidIssuer = jwtSetting.Issuer,

                    //是否验证Audience
                    ValidateAudience = true,
                    ValidAudience = jwtSetting.Audience,

                    //是否验证失效时间
                    ValidateLifetime = true, //默认含300s容错时间

                    //是否验证SecurityKey
                    ValidateIssuerSigningKey = 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.coloradmin.cn/o/1616652.html

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

相关文章

【学习笔记之vue】vue项目放在springboot项目里后,刷新页面会显示whitelabel error page

vue项目放在springboot项目里后&#xff0c;刷新页面会显示whitelabel error page。 解决方案: 当你在Spring Boot项目中嵌入Vue项目&#xff0c;并且刷新页面时遇到了“Whitelabel Error Page”&#xff0c;这通常意味着Spring Boot后端没有正确地处理前端路由的请求。Vue.j…

X-Spider媒体下载工具

软件介绍 X-Spider 是一个功能丰富的推特媒体下载器&#xff0c;它不仅可以帮助用户从推特上下载图片和视频&#xff0c;还提供了一些高级的过滤功能。例如&#xff0c;用户可以通过指定日期范围来筛选需要下载的媒体文件&#xff0c;并且可以跳过已下载的重复文件&#xff0c…

ARTS Week 24

Algorithm 本周的算法题为 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; img 输入&#xff1a;list1 [1,2,4], list2 [1,3,4]输出&#xff1a;[1,1,2,3,4,4] 实现代码如下&…

Centos7_miniconda_devtools安装_R语言入门之R包的安装

因为有同时反馈安装R包很慢或卡住。同事提供了一个安装R包的命令给我测试&#xff0c;在安装过程中复现报错信息&#xff0c;把下载慢或卡信的链接中的域名在防火墙中调整出口。 devtools::install_github("GreenleafLab/ArchR", ref"master", repos Bio…

助力突发异常事件预警保障公共安全,基于YOLOv7【tiny/l/x】模型开发构建公共生活场景下危险人员持刀行凶异常突发事件检测预警识别系统

基于AI目标检测模型的暴力持刀行凶预警系统是当下保障人民生命安全的新途径&#xff0c;近年来&#xff0c;公众场合下的暴力袭击事件频发&#xff0c;不仅给受害者及其家庭带来了深重的伤害&#xff0c;也对社会的稳定和安全造成了极大的威胁。在这种背景下&#xff0c;如何有…

为什么iPhone支持整页中文OCR应用很少?有什么好的解决方法?

iPhone上面没有支持中文整页OCR识别的app&#xff0c;这是一个值得探讨的问题。OCR&#xff0c;即光学字符识别&#xff0c;是一种将纸质文档或图片中的文字转化为可编辑文本的技术。随着科技的发展&#xff0c;OCR技术已经广泛应用于各个领域&#xff0c;包括文档处理、图像识…

AutoCAD 2025(CAD设计软件) V2025.0.0 珊瑚海精简优化版

网盘下载 AutoCAD2025珊瑚海精简版是一款计算机辅助设计软件的AutoCAD精简版&#xff0c;提供了丰富的设计工具和功能&#xff0c;使用户能够轻松创建复杂的图纸、模型和布局。该软件还具备强大的三维建模和渲染功能&#xff0c;用户可以用来创建和编辑三维模型&#xff0c;应用…

鸿蒙原生应用元服务-访问控制(权限)开发场景与权限声明

一、场景介绍 应用的APL&#xff08;Ability Privilege Level&#xff09;等级分为normal、system_basic和system_core三个等级&#xff0c;默认情况下&#xff0c;应用的APL等级都为normal等级。权限类型分为system_grant和user_grant两种类型。 二、配置文件权限声明 应用需要…

利用regress绘制拟合图,利用Slope的趋势分析(5)

code如下&#xff1a; % SCD,积雪日数 % SCS,积雪初日 % SCM,积雪终日% SCS SCD SCM clc; clear; % 读取 Excel 表 excel_file E:\work\2024年\April20\积雪作图\tif文件\excel表\SCS.xlsx; % Excel 文件路径 data readtable(excel_file);datavalue data{:,2:end}; year (…

就业班 第三阶段(负载均衡) 2401--4.18 day2 nginx2 LVS-DR模式

3、LVS/DR 模式 实验说明&#xff1a; 1.网络使用NAT模式 2.DR模式要求Director DIP 和 所有RealServer RIP必须在同一个网段及广播域 3.所有节点网关均指定真实网关 主机名ip系统用途client172.16.147.1mac客户端lvs-server172.16.147.154centos7.5分发器real-server1172.16.…

一句话或一张图讲清楚系列之——ISERDESE2的原理

主要参考&#xff1a; https://blog.csdn.net/weixin_50810761/article/details/137383681 xilinx原语详解及仿真——ISERDESE2 作者&#xff1a;电路_fpga https://blog.csdn.net/weixin_45372778/article/details/122036112 Xilinx ISERDESE2应用笔记及仿真实操 作者&#x…

华为机考入门python3--(17)牛客17- 坐标移动

分类&#xff1a;字符串 知识点&#xff1a; 正则匹配 re.match(pattern, move) 格式字符串&#xff0c;可以在字符串中直接引用变量 f"{x},{y}" 题目来自【牛客】 import re def is_valid_coordinate(move): # 使用正则表达式验证移动是否合法 # ^: …

JavaEE初阶——多线程(七)——定时器

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第七篇文章——关于定时器 如果有不足的或者错误的请您指出! 目录 4.定时器4.1标准库提供的定时器4.2自己实现一个定时器4.2.1任务类4.2.2Timer类4.2.3 有一个线程来负…

计算机网络3——数据链路层5高速以太网

文章目录 一、100BASE-T 以太网二、吉比特以太网三、10吉比特以太网(10GbE)和更快的以太网四、使用以太网进行宽带接入 随着电子技术的发展&#xff0c;以太网的速率也不断提升。从传统的10Mbits以太网一直发展到现在常用的速率为1Gbits的吉比特以太网&#xff0c;甚至更快的以…

深度剖析图像处理—边缘检测

什么是边缘检测 边缘检测(Edge Detection)就是提取图像中的边缘点(Edge Point)。边缘点是与周围像素相比灰度值有阶跃变化或屋顶状变化的像素。边缘常存在于目标与背景之间、目标与目标之间、目标与其影子之间。 ​ 在图像处理和图像分析中&#xff0c;经常要用到边缘(Edge)、边…

【数学归纳法 反证法】菲蜀定理

裴蜀定理&#xff08;或贝祖定理&#xff0c;Bzout’s identity&#xff09;得名于法国数学家艾蒂安裴蜀&#xff0c;说明了对任何整数a、b和它们的最大公约 数d&#xff0c;关于未知数x和y的线性不定方程&#xff08;称为裴蜀等式&#xff09;&#xff1a;若a,b是整数,且&…

绿联 安装transmission

绿联 安装transmission及中文UI 1、镜像 linuxserver/transmission:latest 2、安装 2.1、创建容器 按需配置权重。 2.2、基础设置 2.3、网络 桥接即可。 注&#xff1a;如果使用IPV6&#xff0c;请选择"host"模式。 注&#xff1a;如果使用IPV6&#xff0c;请选…

Ts支持哪些类型和类型运算(下)

目录 1、条件判断 &#xff08;extends &#xff1f;&#xff09; 2、推导 infer 3、联合 | 4、交叉 & 5、映射类型 1、条件判断 &#xff08;extends &#xff1f;&#xff09; ts里的条件判断&#xff0c;语法为 T extends XXX ? true : false &#xff0c;叫做…

vulfocus靶场tomcat-cve_2017_12615 文件上传

7.0.0-7.0.81 影响版本 Windows上的Apache Tomcat如果开启PUT方法(默认关闭)&#xff0c;则存在此漏洞&#xff0c;攻击者可以利用该漏洞上传JSP文件&#xff0c;从而导致远程代码执行。 Tomcat 是一个小型的轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多…