• .net6项目模板搭建教程


    1.集成log4net

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

    Microsoft.Extensions.Logging.Log4Net.AspNetCore

     

    添加日志配置文件

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

    注入服务:

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

    此时集成完毕。 

    2.集成automapper

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

    AutoMapper

    编写配置映射类:

    代码如下:

    1. using AutoMapper;
    2. using DataApi.Model.Dto;
    3. using DataApi.Model.Entity;
    4. namespace DataApi.Extension
    5. {
    6. ///
    7. /// 映射描述类
    8. ///
    9. public class AutoMapperProfile : Profile
    10. {
    11. ///
    12. /// 构造函数
    13. ///
    14. public AutoMapperProfile()
    15. {
    16. //部门
    17. CreateMap();
    18. }
    19. }
    20. }

     注册服务:

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

    使用过程如下:

    1. [HttpGet]
    2. [Route("list")]
    3. public async Task GetSysDepts()
    4. {
    5. List sysDepts = await _sysDeptRepository.GetListAsync(opt => opt.DeptId == 100);
    6. return ApiResult.Success(_mapper.Map>(sysDepts));
    7. }

     对应的实体类和dto如下:

    3.响应json时间本地化 

    安装如下依赖:

    Microsoft.AspNetCore.Mvc.NewtonsoftJson

    更改响应时间格式:

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

    4.集成跨域

    注入服务:

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

    添加跨域中间件:

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

     

    5.集成sqlsugar

    安装如下依赖:

    SqlSugarCore

    创建仓储:

    1. using SqlSugar;
    2. namespace DataApi.Repository
    3. {
    4. ///
    5. /// 仓储类
    6. ///
    7. /// T
    8. public class Repository<T> : SimpleClient<T> where T : class, new()
    9. {
    10. ///
    11. /// 构造函数
    12. ///
    13. /// ISqlSugarClient
    14. public Repository(ISqlSugarClient db)
    15. {
    16. base.Context = db;
    17. }
    18. }
    19. }

     执行扩展方法:

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

    编写扩展类:

    1. using DataApi.Common;
    2. using SqlSugar;
    3. using System.Data;
    4. namespace DataApi.Extension
    5. {
    6. ///
    7. /// SqlSugar扩展类
    8. ///
    9. public static class SqlSugarExt
    10. {
    11. ///
    12. /// 扩展方法
    13. ///
    14. /// 容器
    15. /// 数据库类型
    16. public static void AddSqlSugarExt(this IServiceCollection services, string sqlType = "MySql")
    17. {
    18. //注册SqlSugar
    19. services.AddSingleton(s =>
    20. {
    21. //配置实例
    22. var configuration = s.GetRequiredService();
    23. //日志实例
    24. var logger = s.GetRequiredService>();
    25. SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig
    26. {
    27. //数据库类型
    28. DbType = ToolHelper.GetDbType(sqlType),
    29. //连接字符串
    30. ConnectionString = configuration.GetConnectionString(sqlType),
    31. //自动关闭连接
    32. IsAutoCloseConnection = true
    33. },
    34. db =>
    35. {
    36. //单例参数配置,所有上下文生效
    37. db.Aop.OnLogExecuting = (sql, pars) =>
    38. {
    39. //输出sql
    40. logger.LogInformation(sql);
    41. if (pars != null)
    42. {
    43. //输出参数
    44. logger.LogInformation(string.Join(",", pars.Select(p => p.ParameterName + ":" + p.Value)));
    45. }
    46. };
    47. });
    48. return sqlSugar;
    49. });
    50. }
    51. }
    52. }

     

    获取dbtype:

    1. using SqlSugar;
    2. namespace DataApi.Common
    3. {
    4. ///
    5. /// 工具帮助类
    6. ///
    7. public class ToolHelper
    8. {
    9. ///
    10. /// GetDbType
    11. ///
    12. /// string
    13. /// DbType
    14. public static DbType GetDbType(string sqlType)
    15. {
    16. DbType dbType = DbType.MySql;
    17. switch (sqlType)
    18. {
    19. case "SqlServer":
    20. dbType = DbType.SqlServer;
    21. break;
    22. case "MySql":
    23. dbType = DbType.MySql;
    24. break;
    25. case "Dm":
    26. dbType = DbType.Dm;
    27. break;
    28. case "Oracle":
    29. dbType = DbType.Oracle;
    30. break;
    31. case "PostgreSQL":
    32. dbType = DbType.PostgreSQL;
    33. break;
    34. case "Sqlite":
    35. dbType = DbType.Sqlite;
    36. break;
    37. }
    38. return dbType;
    39. }
    40. }
    41. }

     

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

    6.jwt及swagger完整配置

    安装如下依赖:

    1. Microsoft.AspNetCore.Authentication.JwtBearer
    2. Swashbuckle.AspNetCore.Filters

    编写API版本类:

    1. namespace DataApi.Common
    2. {
    3. ///
    4. /// Api版本枚举
    5. ///
    6. public enum ApiVersion
    7. {
    8. ///
    9. /// V1版本
    10. ///
    11. V1 = 1,
    12. ///
    13. /// V2版本
    14. ///
    15. V2
    16. }
    17. }

     

    jwt配置类编写如下:

    1. namespace DataApi.Common
    2. {
    3. ///
    4. /// Jwt配置
    5. ///
    6. public class JwtSetting
    7. {
    8. ///
    9. /// 密钥
    10. ///
    11. public string SecurityKey { get; set; } = string.Empty;
    12. ///
    13. /// 签发者
    14. ///
    15. public string? Issuer { get; set; }
    16. ///
    17. /// 签收者
    18. ///
    19. public string? Audience { get; set; }
    20. ///
    21. /// 过期时间
    22. ///
    23. public int ExpiredTime { get; set; }
    24. }
    25. }

     

     appsettings.json配置内容如下:

    1. {
    2. "Logging": {
    3. "LogLevel": {
    4. "Default": "Information",
    5. "Microsoft.AspNetCore": "Warning"
    6. }
    7. },
    8. "AllowedHosts": "*",
    9. "ConnectionStrings": {
    10. //MySql
    11. "MySql": "Server=127.0.0.1;Database=dmp;Port=3306;Uid=root;Pwd=wong123456;Allow User Variables=True;",
    12. //SqlServer
    13. "SqlServer": "Data Source=43.143.48.100;Initial Catalog=ALEAN;User Id=sa;Password=ghy520WXF;"
    14. },
    15. //Jwt配置
    16. "JwtSetting": {
    17. //密钥
    18. "SecurityKey": "7k5yOxSMHVdYjs61gkgUY3W9DHbgk7tokaZlP3QIlfk34D1H7jYEOcLybClW1aKl",
    19. //签发者
    20. "Issuer": "DataApi",
    21. //签收者
    22. "Audience": "DataApi",
    23. //过期时间,单位秒,默认24小时
    24. "ExpiredTime": 86400
    25. }
    26. }

     

    注入配置:

    1. #region 注入Jwt服务
    2. builder.AddJwtExt();
    3. #endregion
    4. #region 注入Swagger服务
    5. builder.AddSwaggerExt();
    6. #endregion
    7. #region 注入Jwt配置
    8. builder.Services.Configure(builder.Configuration.GetSection("JwtSetting"));
    9. #endregion
    10. # region SwaggerUI配置
    11. if (app.Environment.IsDevelopment() || app.Environment.IsProduction())
    12. {
    13. app.UseSwaggerExt();
    14. }
    15. #endregion
    16. # region 认证中间件
    17. app.UseAuthentication();
    18. #endregion

    jwtAuth扩展:

    1. using DataApi.Common;
    2. using Microsoft.AspNetCore.Authentication.JwtBearer;
    3. using Microsoft.IdentityModel.Tokens;
    4. using System.Text;
    5. namespace DataApi.Extension
    6. {
    7. ///
    8. /// Jwt扩展类
    9. ///
    10. public static class JwtAuthExt
    11. {
    12. ///
    13. /// 扩展方法
    14. ///
    15. /// WebApplicationBuilder
    16. public static void AddJwtExt(this WebApplicationBuilder builder)
    17. {
    18. #region 注入认证服务
    19. builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
    20. {
    21. JwtSetting jwtSetting = builder.Configuration.GetSection("JwtSetting").Get();
    22. options.TokenValidationParameters = new TokenValidationParameters()
    23. {
    24. //是否验证Issuer
    25. ValidateIssuer = true,
    26. ValidIssuer = jwtSetting.Issuer,
    27. //是否验证Audience
    28. ValidateAudience = true,
    29. ValidAudience = jwtSetting.Audience,
    30. //是否验证失效时间
    31. ValidateLifetime = true, //默认含300s容错时间
    32. //是否验证SecurityKey
    33. ValidateIssuerSigningKey = true,
    34. IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSetting.SecurityKey))
    35. };
    36. });
    37. #endregion
    38. }
    39. }
    40. }

    swagger扩展:

    1. using DataApi.Common;
    2. using Microsoft.OpenApi.Models;
    3. using Swashbuckle.AspNetCore.Filters;
    4. using System.Reflection;
    5. using System.Text;
    6. namespace DataApi.Extension
    7. {
    8. ///
    9. /// Swagger扩展类
    10. ///
    11. public static class SwaggerExt
    12. {
    13. ///
    14. /// 扩展方法
    15. ///
    16. /// WebApplicationBuilder
    17. public static void AddSwaggerExt(this WebApplicationBuilder builder)
    18. {
    19. builder.Services.AddSwaggerGen(options =>
    20. {
    21. //遍历所有版本,展示文档信息
    22. typeof(ApiVersion).GetEnumNames().ToList().ForEach(version =>
    23. {
    24. //添加文档介绍
    25. options.SwaggerDoc(version, new OpenApiInfo()
    26. {
    27. Title = "DataApi",
    28. Version = version,
    29. Description = $"数据接口服务:【{version}】版本"
    30. });
    31. });
    32. //获取xml文件名称
    33. string xmlApiFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    34. //显示控制器注释
    35. options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlApiFileName), true);
    36. //根据action名称进行排序
    37. options.OrderActionsBy(o => o.RelativePath);
    38. //开启加权小锁
    39. options.OperationFilter();
    40. //options.OperationFilter();
    41. // 在header中添加token,传递到后台
    42. //options.OperationFilter();
    43. //添加安全定义
    44. options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    45. {
    46. Description = "在下框中输入Jwt授权Token:Bearer Token",
    47. Name = "Authorization",
    48. In = ParameterLocation.Header,
    49. Type = SecuritySchemeType.ApiKey,
    50. BearerFormat = "JWT",
    51. Scheme = "Bearer"
    52. });
    53. //添加安全要求
    54. options.AddSecurityRequirement(new OpenApiSecurityRequirement()
    55. {
    56. {
    57. new OpenApiSecurityScheme()
    58. {
    59. Reference = new OpenApiReference()
    60. {
    61. Type = ReferenceType.SecurityScheme,
    62. Id = "Bearer"
    63. }
    64. },
    65. new string[]{}
    66. }
    67. });
    68. options.SchemaFilter();
    69. });
    70. }
    71. ///
    72. /// 扩展方法
    73. ///
    74. /// WebApplication
    75. public static void UseSwaggerExt(this WebApplication app)
    76. {
    77. app.UseSwagger();
    78. //版本切换
    79. app.UseSwaggerUI(options =>
    80. {
    81. typeof(ApiVersion).GetEnumNames().ToList().ForEach(version =>
    82. {
    83. options.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"【{version}】版本");
    84. });
    85. });
    86. }
    87. }
    88. }
    1. using Microsoft.OpenApi.Any;
    2. using Microsoft.OpenApi.Models;
    3. using Swashbuckle.AspNetCore.SwaggerGen;
    4. namespace DataApi.Extension
    5. {
    6. ///
    7. /// DateTimeSchemaFilter
    8. ///
    9. public class DateTimeSchemaFilter : ISchemaFilter
    10. {
    11. public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    12. {
    13. if (context.Type == typeof(DateTime) || context.Type == typeof(DateTime?))
    14. {
    15. schema.Default = new OpenApiString(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); //设置为当前时间
    16. }
    17. }
    18. }
    19. }

     

    7.响应结果封装

     

    1. using Newtonsoft.Json;
    2. using System.Net;
    3. namespace DataApi.Common
    4. {
    5. ///
    6. /// 封装响应数据
    7. ///
    8. public class ApiResult
    9. {
    10. ///
    11. /// 状态码
    12. ///
    13. public HttpStatusCode Code { get; set; }
    14. ///
    15. /// 消息
    16. ///
    17. public string? Message { get; set; }
    18. ///
    19. /// 数据
    20. ///
    21. public object? Data { get; set; }
    22. ///
    23. /// 无参构造函数
    24. ///
    25. public ApiResult()
    26. {
    27. }
    28. ///
    29. /// 带参构造函数
    30. ///
    31. /// 状态码
    32. /// 消息
    33. /// 数据
    34. public ApiResult(HttpStatusCode code, string message, object data)
    35. {
    36. Code = code;
    37. Message = message;
    38. Data = data;
    39. }
    40. ///
    41. /// 序列化对象
    42. ///
    43. /// json字符串
    44. public string ToJson()
    45. {
    46. return JsonConvert.SerializeObject(this);
    47. }
    48. ///
    49. /// Success标志
    50. ///
    51. /// 数据
    52. /// ApiResult
    53. public static ApiResult Success(object data)
    54. {
    55. return new ApiResult(HttpStatusCode.OK, "操作成功", data);
    56. }
    57. ///
    58. /// Error标志
    59. ///
    60. /// 消息
    61. /// ApiResult
    62. public static ApiResult Error(string message)
    63. {
    64. return new ApiResult(HttpStatusCode.OK, message, "Error");
    65. }
    66. ///
    67. /// Unauthorized标志
    68. ///
    69. /// ApiResult
    70. public static ApiResult Unauthorized()
    71. {
    72. return new ApiResult(HttpStatusCode.Unauthorized, "Unauthorized", "Unauthorized");
    73. }
    74. ///
    75. /// Forbidden标志
    76. ///
    77. /// ApiResult
    78. public static ApiResult Forbidden()
    79. {
    80. return new ApiResult(HttpStatusCode.Forbidden, "Forbidden", "Forbidden");
    81. }
    82. }
    83. }

     

  • 相关阅读:
    spring使用@Value标签读取.properties文件的中文乱码问题的解决
    Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因
    华为OD机考:0036-0037-最多组团数--作业总时长
    大学生必看!这些关乎你“钱途”的内容你一定要知道NISP一级证书
    【记录】PyCharm 安装 preprocess 模块(库)|| 在 PyCharm 中安装 preprocess 失败,故而在 终端 安装
    电子电路仿真(Matlab代码实现)
    sqlserver 语句执行了多长时间
    巧用count与count()
    springboot导入spring-boot-maven-plugin插件报错及打包项目到服务器上运行(手动导入加自动导入方法)-详细
    Java 常用API的运用,效率及技巧
  • 原文地址:https://blog.csdn.net/qq_16284479/article/details/137973117