.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")
        {
            //注册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");
        }
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IUG-CF论文精读

Neural collaborative filtering with ideal user group labels &#xff08;具有理想用户组标签的神经协同过滤&#xff09; 论文地址&#xff1a;https://www.sciencedirect.com/science/article/pii/S0957417423023898 摘要&#xff1a; 人口统计信息是推荐系统(RSs)的关键…

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

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

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. 静态全…

通义灵码牵手阿里云函数计算 FC ,打造智能编码新体验

通义灵码自成功入职阿里云后&#xff0c;其智能编程助手的角色除了服务于阿里云内部几万开发者&#xff0c;如今进一步服务函数计算 FC 产品开发者。近日&#xff0c;通义灵码正式进驻函数计算 FC WebIDE&#xff0c;让使用函数计算产品的开发者在其熟悉的云端集成开发环境中&a…

《Vid2Seq》论文笔记

原文链接 [2302.14115] Vid2Seq: Large-Scale Pretraining of a Visual Language Model for Dense Video Captioning (arxiv.org) 原文笔记 What&#xff1a; 《Vid2Seq: Large-Scale Pretraining of a Visual Language Model for Dense Video Captioning》 作者提出一种多…

利用selenium发挥vip残存的价值

历史版本谷歌浏览器驱动下载地址 https://chromedriver.storage.googleapis.com/index.html 找到与你电脑当前谷歌浏览器版本一致的驱动然后下载下来(大版本一致即可)。我本地版本是 99.0.04844.51 我这里把 chromedriver 放到 /usr/local/bin 下面了。 启动测试窗口 这里需要…

就业班 第三阶段(负载均衡) 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.…

【STM32+HAL+Proteus】系列学习教程---串口USART(DMA 方式)定长,不定长收发。

实现目标 1、利用UART实现上位机PC与下位机开发板之间的数据通信 2、学会STM32CubeMX软件关于UART的DMA模式配置 3、具体目标&#xff1a;1、实现串口定长收发数据通信&#xff1b;2、串口不定长收发数据通信。 一、DMA简介 1、什么是DMA? DMA&#xff08;Direct Memory …

Dubbo 和 Spring Cloud 的区别

根据微服务架构在各方面的要素&#xff0c;看看 Spring Cloud 和 Dubbo 都提供了哪些支持。 使用 Dubbo 构建的微服务架构就像组装电脑&#xff0c;各环节我们的选择自由度很高&#xff0c;但是最终结果很有可能因为一条内存质量不行就点不亮了&#xff0c;总是让人不怎么放心…

10.Godot Input与自定义单例的使用

单例 单例是一个可以在任何一个脚本中对其进行直接访问的对象&#xff0c;分为内置单例与自定义单例。每个单例都是独一无二的对象。内置单例不是节点&#xff0c;主要成员是各类 Server&#xff0c;开发者可以使用它们直接控制游戏程序的图形与音效等内容。此外&#xff0c;还…

cesium 动态线效果

一、扩展材质 function PolylineTrailMaterial(options) {options Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT);this._definitionChanged new Cesium.Event();// 变量初始化this.color Cesium.defaultValue(options.color && new Cesium.Colo…

MATLAB基于图像特征的火灾检测

实验目标 基于图像特征的火灾检测 实验环境 Windows电脑、MATLAB R2020a 实验内容 1.读取图像&#xff0c;彩色图像的灰度化处理&#xff0c;进行边缘检测&#xff0c;实现对火焰的检测。 2.对两幅RGB图像进行火焰特征提取实验 3.对比分析边缘检测算法处理结果和基于图像…

vue3+elementui-plus实现无限递归菜单

效果图 实现方式是&#xff1a;通过给定的数据结构层数来动态生成多级菜单 menu.vue<template><el-menu:default-active"activeIndex"class"el-menu-demo"mode"horizontal"select"handleSelect"background-color"#f8f…

LaTeX中长公式折行显示为类似首行缩进的形式

长公式折行在《Ishort》4.4.1节和刘海洋书4.4节都有叙述。 普通的长公式折行可以使用 align 或 multiline 环境&#xff0c;具体用法可参考上面两本书&#xff0c;但感觉使用起来比较麻烦。 自己目前比较习惯的用法是类似 \begin{equation} \begin{aligned}f(x) & \frac{1…

Qt 跨平台开发的一丢丢总结

Qt 跨平台开发 文章目录 Qt 跨平台开发摘要第一 \ & /第二 神奇{不能换行显示第三 预处理宏 关键字&#xff1a; Qt、 win、 linux、 lib、 MSVC 摘要 最近一直在琢磨Qt跨平台开发的问题&#xff0c;缘由有以下几个&#xff0c; 首先第一个&#xff0c;我们目前开发…

汇舟问卷:国外问卷调查做题完整步骤细节展示

大家好&#xff0c;我是汇舟问卷​。很多朋友联系我&#xff0c;想要看做题的步骤&#xff0c;内容是什么&#xff0c;应该怎么去做。今天我给大家展示一下我们日常做问卷的具体步骤&#xff0c;帮助大家更好地了解问卷​。 在参与问卷之前&#xff0c;首先要搭建国外的环境&a…

线程池 ThreadPoolExecutor 参数详解

一、引言 提到 Java 线程池&#xff0c;就不得不说 ThreadPoolExecutor&#xff0c;它是 Java 并发包 java.util.concurrent 中的一个类&#xff0c;提供一个高效、稳定、灵活的线程池实现&#xff0c;用于实现多线程并发执行任务&#xff0c;提高应用程序的执行效率。 在《任…

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

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

链表从指定的节点前插入新的节点

1.第一种情况&#xff1a; 在头节点插入时&#xff0c;head和p都指在1&#xff0c;new ->next head;return new;返回new节点地址&#xff0c;由打印函数打印即可成功插入 2.第二种情况&#xff1a; 2.1当我们要在第2个节点插入时&#xff0c;p和head都是指向1节点的&#…

springboot整合mybatis-puls登陆注册

目录 创建springboot项目 目录结构&#xff1a; 启动类 测试类 idea建表 pom文件 编写yml文件 qq邮箱设置 登陆注册代码 编写持久层(Dao) 注册代码 业务层 业务实现类 mapper 控制层 前端代码 注册页面 邮件正文&#xff1a; 登录代码 控制层 业务层&#…