升级到net6.0

This commit is contained in:
不做码农 2022-03-06 14:26:05 +08:00
parent 013b6ea4db
commit 7fe07b104c
50 changed files with 306 additions and 495 deletions

View File

@ -41,7 +41,7 @@ namespace Infrastructure
{
str = Guid.NewGuid().ToString();
}
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
MD5 md5 = MD5.Create();
return BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(str)), 4, 8).Replace("-", "");
}
}

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
@ -11,7 +11,7 @@
<ItemGroup>
<PackageReference Include="AspectCore.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

View File

@ -9,12 +9,12 @@ namespace Infrastructure
/// <summary>
/// 应用服务
/// </summary>
internal static IServiceCollection InternalServices;
public static IServiceCollection InternalServices;
/// <summary>
/// 全局配置构建器
/// </summary>
internal static IConfigurationBuilder ConfigurationBuilder;
public static IConfigurationBuilder ConfigurationBuilder;
/// <summary>
/// 获取Web主机环境
@ -24,6 +24,6 @@ namespace Infrastructure
/// <summary>
/// 获取泛型主机环境
/// </summary>
internal static IHostEnvironment HostEnvironment;
public static IHostEnvironment HostEnvironment;
}
}

View File

@ -2,10 +2,10 @@
## 🍟概述
* 本项目适合有一定NetCore和 vue基础的开发人员
* 基于.NET 5实现的通用权限管理平台RBAC模式。整合最新技术高效快速开发前后端分离模式开箱即用。
* 基于.NET5/.NET6实现的通用权限管理平台RBAC模式。整合最新技术高效快速开发前后端分离模式开箱即用。
* 代码量少、学习简单、通俗易懂、功能强大、易扩展、轻量级让web开发更快速、简单高效从此告别996解决70%的重复工作,专注您的业务,轻松开发从现在开始!
* 前端采用Vue2.0、Element UI。
* 后端采用Net5、Sqlsugar、MySQL。
* 后端采用Net5/Net6、Sqlsugar、MySQL。
* 权限认证使用Jwt支持多终端认证系统。
* 支持加载动态权限菜单,多方式轻松权限控制
* 七牛云通用云产品优惠券:[点我进入](https://s.qiniu.com/FzEfay)。
@ -29,7 +29,7 @@
Vue版前端技术栈 基于vue、vuex、vue-router 、vue-cli 、axios 和 element-ui前端采用vscode工具开发
## 🍀后端技术
核心框架:.Net5.0 + Web API + sqlsugar + swagger + signalR
核心框架:.Net5.0/.Net6 + Web API + sqlsugar + swagger + signalR
定时计划任务Quartz.Net组件

View File

@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "5.0.0",
"version": "6.0.2",
"commands": [
"dotnet-ef"
]

View File

@ -75,7 +75,7 @@ namespace ZR.Admin.WebApi.Controllers
/// <param name="resultCode"></param>
/// <param name="data"></param>
/// <returns></returns>
protected ApiResult GetApiResult(ResultCode resultCode, object data = null)
protected ApiResult GetApiResult(ResultCode resultCode, object? data = null)
{
var apiResult = new ApiResult((int)resultCode, resultCode.ToString())
{

View File

@ -67,7 +67,7 @@ namespace ZR.Admin.WebApi.Controllers
/// <returns></returns>
[HttpGet("getTableList")]
[ActionPermissionFilter(Permission = "tool:gen:list")]
public IActionResult FindListTable(string dbName, string tableName, PagerInfo pager)
public IActionResult FindListTable(string dbName, string? tableName, PagerInfo pager)
{
List<DbTableInfo> list = _CodeGeneraterService.GetAllTables(dbName, tableName, pager);
var page = new PagedInfo<DbTableInfo>
@ -89,7 +89,7 @@ namespace ZR.Admin.WebApi.Controllers
/// <returns></returns>
[HttpGet("list")]
[ActionPermissionFilter(Permission = "tool:gen:list")]
public IActionResult GetGenTable(string tableName, PagerInfo pagerInfo)
public IActionResult GetGenTable(string? tableName, PagerInfo pagerInfo)
{
//查询原表数据,部分字段映射到代码生成表字段
var rows = GenTableService.GetGenTables(new GenTable() { TableName = tableName }, pagerInfo);
@ -160,7 +160,7 @@ namespace ZR.Admin.WebApi.Controllers
throw new CustomException("表不能为空");
}
string[] tableNames = tables.Split(',', StringSplitOptions.RemoveEmptyEntries);
string userName = User.Identity.Name;
var userName = HttpContext.GetName();
foreach (var tableName in tableNames)
{
@ -269,9 +269,9 @@ namespace ZR.Admin.WebApi.Controllers
if (genTableInfo.GenType == "1")
{
string tempPath = WebHostEnvironment.ContentRootPath;
var parentPath = Directory.GetParent(tempPath)?.Parent?.FullName;
//代码生成文件夹路径
dto.GenCodePath = genTableInfo.GenPath.IsEmpty() ? Directory.GetParent(tempPath).FullName : genTableInfo.GenPath;
dto.GenCodePath = genTableInfo.GenPath.IsEmpty() ? parentPath : genTableInfo.GenPath;
}
else
{

View File

@ -16,6 +16,7 @@ using ZR.Service.System;
using ZR.Model.System;
using Infrastructure.Extensions;
using Microsoft.AspNetCore.Authorization;
using ZR.Model.System.Dto;
namespace ZR.Admin.WebApi.Controllers
{

View File

@ -2,15 +2,10 @@
using Infrastructure.Enums;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using ZR.Admin.WebApi.Filters;
using ZR.Common;
using ZR.Model;
using ZR.Model.System;
using ZR.Model.System.Dto;
using ZR.Model.Vo;
using ZR.Service.System.IService;
namespace ZR.Admin.WebApi.Controllers.System

View File

@ -2,13 +2,11 @@
using Infrastructure.Enums;
using Infrastructure.Model;
using Microsoft.AspNetCore.Mvc;
using System;
using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Filters;
using ZR.Common;
using ZR.Model;
using ZR.Model.System;
using ZR.Model.Vo;
using ZR.Service.System.IService;
namespace ZR.Admin.WebApi.Controllers.System

View File

@ -1,20 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using System;
using Infrastructure;
using Infrastructure;
using Infrastructure.Attribute;
using Infrastructure.Constant;
using Infrastructure.Enums;
using Infrastructure.Model;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using SqlSugar;
using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Filters;
using ZR.Common;
using ZR.Model.Dto;
using ZR.Model.Models;
using ZR.Service.System.IService;
using ZR.Admin.WebApi.Hubs;
using Microsoft.AspNetCore.SignalR;
using Infrastructure.Constant;
using ZR.Common;
using ZR.Model.System;
using ZR.Model.System.Dto;
using ZR.Service.System.IService;
namespace ZR.Admin.WebApi.Controllers.System
{
@ -99,7 +98,7 @@ namespace ZR.Admin.WebApi.Controllers.System
}
//从 Dto 映射到 实体
var modal = parm.Adapt<SysNotice>().ToCreate(HttpContext);
modal.Create_by = User.Identity.Name;
modal.Create_by = HttpContext.GetName();
modal.Create_time = DateTime.Now;
int result = _SysNoticeService.Insert(modal, it => new

View File

@ -97,7 +97,7 @@ namespace ZR.Admin.WebApi.Controllers
tasksQz.ID = worker.NextId().ToString();
tasksQz.IsStart = false;
tasksQz.Create_by = User.Identity.Name;
tasksQz.Create_by = HttpContext.GetName();
return SUCCESS(_tasksQzService.Add(tasksQz));
}

View File

@ -8,7 +8,6 @@ using ZR.Admin.WebApi.Filters;
using ZR.Common;
using ZR.Model;
using ZR.Model.System;
using ZR.Model.Vo;
using ZR.Service.System.IService;
namespace ZR.Admin.WebApi.Controllers.monitor

View File

@ -6,14 +6,7 @@ using ZR.Admin.WebApi.Filters;
using ZR.Common;
using ZR.Model;
using ZR.Model.System.Dto;
using ZR.Model.System;
using ZR.Model.Vo;
using ZR.Service.System.IService;
using System;
using System.IO;
using OfficeOpenXml;
using Microsoft.AspNetCore.Hosting;
using System.Collections.Generic;
namespace ZR.Admin.WebApi.Controllers.monitor
{

View File

@ -1,19 +0,0 @@
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
#创建 /app文件夹
WORKDIR /app
#创建挂载目录,用于将程序部署在服务器本地
#VOLUME /app
#设置docker容器对外暴露端口
EXPOSE 5000
VOLUME /app/logs
#COPY bin/Release/net5.0/publish/ app/
COPY . app/
#设置容器内的时区如果不设置默认时区是标准时间比北京时间晚8个小时
RUN echo "Asia/shanghai" > /etc/timezone
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 复制发布文件到工作目录
#COPY . app/
ENTRYPOINT ["dotnet", "ZR.Admin.WebApi.dll"]

View File

@ -1,14 +1,14 @@
using Microsoft.AspNetCore.Http;
using Snowflake.Core;
//using Microsoft.AspNetCore.Http;
//using Snowflake.Core;
using System;
namespace ZR.Admin.WebApi.Extensions
{
public static class EntityExtension
{
public static TSource ToCreate<TSource>(this TSource source, HttpContext context = null)
public static TSource ToCreate<TSource>(this TSource source, HttpContext? context = null)
{
var types = source.GetType();
var types = source?.GetType();
//var worker = new IdWorker(1, 1);
//if (types.GetProperty("ID") != null)

View File

@ -51,7 +51,7 @@ namespace ZR.Admin.WebApi.Extensions
var result = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if (string.IsNullOrEmpty(result))
{
result = context.Connection.RemoteIpAddress.ToString();
result = context.Connection.RemoteIpAddress?.ToString();
}
if (string.IsNullOrEmpty(result) || result.Contains("::1"))
result = "127.0.0.1";
@ -72,7 +72,7 @@ namespace ZR.Admin.WebApi.Extensions
return !string.IsNullOrEmpty(uid) ? long.Parse(uid) : 0;
}
public static string GetName(this HttpContext context)
public static string? GetName(this HttpContext context)
{
var uid = context.User?.Identity?.Name;
@ -84,7 +84,7 @@ namespace ZR.Admin.WebApi.Extensions
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public static IEnumerable<ClaimsIdentity> GetClaims(this HttpContext context)
public static IEnumerable<ClaimsIdentity>? GetClaims(this HttpContext context)
{
return context.User?.Identities;
}
@ -119,7 +119,7 @@ namespace ZR.Admin.WebApi.Extensions
return c;
}
public static string GetRequestUrl(this HttpContext context)
public static string? GetRequestUrl(this HttpContext context)
{
return context != null ? context.Request.Path.Value : "";
}

View File

@ -1,13 +1,7 @@
using Infrastructure;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.Filters;
using System;
using System.Collections.Generic;
using System.IO;
namespace ZR.Admin.WebApi.Extensions
{
@ -51,7 +45,7 @@ namespace ZR.Admin.WebApi.Extensions
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Title = "ZrAdmin.NET Api - .NET5",
Title = "ZrAdmin.NET Api - .NET6",
Version = "v1",
Description = "",
});

View File

@ -2,9 +2,6 @@
using Infrastructure.Model;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ZR.Model.System;
namespace ZR.Admin.WebApi.Filters
@ -22,9 +19,7 @@ namespace ZR.Admin.WebApi.Filters
public string Permission { get; set; }
private bool HasPermi { get; set; }
private bool HasRole { get; set; }
public ActionPermissionFilter() { }
public ActionPermissionFilter(string permission)
{
Permission = permission;

View File

@ -2,16 +2,10 @@
using Infrastructure.Attribute;
using Infrastructure.Model;
using IPTools.Core;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using NLog;
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZR.Admin.WebApi.Extensions;
using ZR.Model.System;
using ZR.Service.System.IService;
@ -122,7 +116,7 @@ namespace ZR.Admin.WebApi.Filters
sysOperLog.jsonResult = logAttribute.IsSaveResponseData ? sysOperLog.jsonResult : "";
}
LogEventInfo ei = new(LogLevel.Info, "GlobalActionMonitor", "");
LogEventInfo ei = new(NLog.LogLevel.Info, "GlobalActionMonitor", "");
ei.Properties["jsonResult"] = !HttpMethods.IsGet(method) ? jsonResult : "";
ei.Properties["requestParam"] = sysOperLog.operParam;
@ -137,12 +131,12 @@ namespace ZR.Admin.WebApi.Filters
}
}
private LogAttribute GetLogAttribute(ControllerActionDescriptor controllerActionDescriptor)
private LogAttribute? GetLogAttribute(ControllerActionDescriptor controllerActionDescriptor)
{
var attribute = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true)
.FirstOrDefault(a => a.GetType().Equals(typeof(LogAttribute)));
return (LogAttribute)attribute;
return attribute as LogAttribute;
}
}
}

View File

@ -1,17 +0,0 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
namespace ZR.Admin.WebApi.Framework
{
public class CookieUtil
{
}
}

View File

@ -1,12 +1,8 @@
using Infrastructure;
using Infrastructure.Extensions;
using Microsoft.AspNetCore.Http;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using ZR.Admin.WebApi.Extensions;
@ -99,7 +95,7 @@ namespace ZR.Admin.WebApi.Framework
/// </summary>
/// <param name="token">令牌</param>
/// <returns></returns>
public static IEnumerable<Claim> ParseToken(string token)
public static IEnumerable<Claim>? ParseToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var validateParameter = ValidParameters();
@ -124,13 +120,13 @@ namespace ZR.Admin.WebApi.Framework
/// </summary>
/// <param name="jwtToken"></param>
/// <returns></returns>
public static LoginUser ValidateJwtToken(IEnumerable<Claim> jwtToken)
public static LoginUser? ValidateJwtToken(IEnumerable<Claim> jwtToken)
{
try
{
var userData = jwtToken.FirstOrDefault(x => x.Type == ClaimTypes.UserData).Value;
var userData = jwtToken.FirstOrDefault(x => x.Type == ClaimTypes.UserData);
LoginUser loginUser = JsonConvert.DeserializeObject<LoginUser>(userData);
LoginUser loginUser = JsonConvert.DeserializeObject<LoginUser>(value: userData?.Value);
return loginUser;
}
catch (Exception ex)

View File

@ -1,11 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Infrastructure.Constant;
using Infrastructure.Constant;
using Infrastructure.Model;
using Microsoft.AspNetCore.SignalR;
using ZR.Model;
using ZR.Service.System.IService;
namespace ZR.Admin.WebApi.Hubs
@ -37,7 +32,7 @@ namespace ZR.Admin.WebApi.Hubs
/// <returns></returns>
public override Task OnConnectedAsync()
{
var name = Context.User.Identity.Name;
var name = Context.User?.Identity?.Name;
var user = clientUsers.Any(u => u.ConnnectionId == Context.ConnectionId);
//判断用户是否存在,否则添加集合

View File

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace ZR.Model
namespace ZR.Admin.WebApi.Hubs
{
public class OnlineUsers
{

View File

@ -7,7 +7,6 @@ using NLog;
using System;
using System.Threading.Tasks;
using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Filters;
using ZR.Model.System;
using ZR.Service.System.IService;
@ -44,7 +43,7 @@ namespace ZR.Admin.WebApi.Middleware
private async Task HandleExceptionAsync(HttpContext context, Exception ex)
{
LogLevel logLevel = LogLevel.Info;
NLog.LogLevel logLevel = NLog.LogLevel.Info;
int code = (int)ResultCode.GLOBAL_ERROR;
string msg;
string error = string.Empty;
@ -64,7 +63,7 @@ namespace ZR.Admin.WebApi.Middleware
{
msg = "服务器好像出了点问题......";
error = $"{ex.Message}";
logLevel = LogLevel.Error;
logLevel = NLog.LogLevel.Error;
context.Response.StatusCode = 500;
}
@ -80,7 +79,7 @@ namespace ZR.Admin.WebApi.Middleware
requestMethod = context.Request.Method,
jsonResult = responseResult,
errorMsg = string.IsNullOrEmpty(error) ? msg : error,
operName = context.User.Identity.Name,
operName = HttpContextExtension.GetName(context) ,
operLocation = ip_info.Province + " " + ip_info.City,
operTime = DateTime.Now
};
@ -92,7 +91,7 @@ namespace ZR.Admin.WebApi.Middleware
ei.Properties["status"] = 1;//走正常返回都是通过走GlobalExceptionFilter不通过
ei.Properties["jsonResult"] = responseResult;
ei.Properties["requestParam"] = sysOperLog.operParam;
ei.Properties["user"] = context.User.Identity.Name;
ei.Properties["user"] = context.User.Identity?.Name;
Logger.Log(ei);
await context.Response.WriteAsync(responseResult);

View File

@ -9,7 +9,7 @@ using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace ZRAdmin.Middleware
namespace ZR.Admin.WebApi.Middleware
{
public class RequestIPMiddleware
{

View File

@ -1,29 +1,128 @@
using Infrastructure.Startups;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using NLog.Web;
using Infrastructure;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.DataProtection;
using ZR.Admin.WebApi.Framework;
using Hei.Captcha;
using Infrastructure.Extensions;
using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Filters;
using ZR.Admin.WebApi.Middleware;
using ZR.Admin.WebApi.Hubs;
namespace ZR.Admin.WebApi
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
//注入HttpContextAccessor
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//配置跨域
builder.Services.AddCors(c =>
{
public class Program
c.AddPolicy("Policy", policy =>
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
var builder = Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.Init("Infrastructure")
.UseNLog()
.UseStartup<Startup>();
policy.WithOrigins(builder.Configuration["corsUrls"].Split(',', StringSplitOptions.RemoveEmptyEntries))
.AllowAnyHeader()//允许任意头
.AllowCredentials()//允许cookie
.AllowAnyMethod();//允许任意方法
});
});
return builder;
}
}
//注入SignalR实时通讯默认用json传输
builder.Services.AddSignalR();
//消除Error unprotecting the session cookie警告
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "DataProtection"));
//普通验证码
builder.Services.AddHeiCaptcha();
//builder.Services.AddSession();
builder.Services.AddHttpContextAccessor();
//绑定整个对象到Model上
builder.Services.Configure<OptionsSetting>(builder.Configuration);
//jwt 认证
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddCookie()
.AddJwtBearer(o =>
{
o.TokenValidationParameters = JwtUtil.ValidParameters();
});
InternalApp.InternalServices = builder.Services;
builder.Services.AddAppService();
builder.Services.AddSingleton(new AppSettings(builder.Configuration));
//开启计划任务
builder.Services.AddTaskSchedulers();
//初始化db
DbExtension.AddDb(builder.Configuration);
//注册REDIS 服务
Task.Run(() =>
{
//RedisServer.Initalize();
});
builder.Services.AddMvc(options =>
{
options.Filters.Add(typeof(GlobalActionMonitor));//全局注册
})
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeConverter());
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeNullConverter());
});
builder.Services.AddSwaggerConfig();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
//使可以多次多去body内容
app.Use((context, next) =>
{
context.Request.EnableBuffering();
if (context.Request.Query.TryGetValue("access_token", out var token))
{
context.Request.Headers.Add("Authorization", $"Bearer {token}");
}
return next();
});
//开启访问静态文件/wwwroot目录文件要放在UseRouting前面
app.UseStaticFiles();
//开启路由访问
app.UseRouting();
app.UseCors("Policy");//要放在app.UseEndpoints前。
//app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
//开启缓存
app.UseResponseCaching();
//恢复/启动任务
app.UseAddTaskSchedulers();
//使用全局异常中间件
app.UseMiddleware<GlobalExceptionMiddleware>();
app.UseEndpoints(endpoints =>
{
//设置socket连接
endpoints.MapHub<MessageHub>("/msgHub");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
app.MapControllers();
app.Run();

View File

@ -2,19 +2,19 @@
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project>
<PropertyGroup>
<DeleteExistingFiles>True</DeleteExistingFiles>
<ExcludeApp_Data>False</ExcludeApp_Data>
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<DeleteExistingFiles>true</DeleteExistingFiles>
<ExcludeApp_Data>false</ExcludeApp_Data>
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<PublishProvider>FileSystem</PublishProvider>
<PublishUrl>bin\Release\net5.0\publish\</PublishUrl>
<PublishUrl>bin\Release\net6.0\publish\</PublishUrl>
<WebPublishMethod>FileSystem</WebPublishMethod>
<SiteUrlToLaunchAfterPublish />
<TargetFramework>net5.0</TargetFramework>
<ProjectGuid>ba176987-aabb-406a-b4a8-6b63b422b703</ProjectGuid>
<TargetFramework>net6.0</TargetFramework>
<ProjectGuid>e5497bb4-b0c1-4794-9fae-163f626ec399</ProjectGuid>
<SelfContained>false</SelfContained>
</PropertyGroup>
</Project>

View File

@ -1,12 +1,23 @@
{
"profiles": {
"ZRAdmin": {
"commandName": "Project",
"launchBrowser": false,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Stage"
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:63521",
"sslPort": 44395
}
},
"applicationUrl": "http://localhost:8888"
"profiles": {
"ZR.Admin.WebApi": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:8888",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -1,163 +0,0 @@
using Hei.Captcha;
using Infrastructure;
using Infrastructure.Extensions;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.IO;
using System.Threading.Tasks;
using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Filters;
using ZR.Admin.WebApi.Framework;
using ZR.Admin.WebApi.Hubs;
using ZR.Admin.WebApi.Middleware;
namespace ZR.Admin.WebApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
private NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
string corsUrls = Configuration["corsUrls"];
//配置跨域
services.AddCors(c =>
{
c.AddPolicy("Policy", policy =>
{
policy.WithOrigins(corsUrls.Split(',', StringSplitOptions.RemoveEmptyEntries))
.AllowAnyHeader()//允许任意头
.AllowCredentials()//允许cookie
.AllowAnyMethod();//允许任意方法
});
});
//注入SignalR实时通讯默认用json传输
services.AddSignalR(options =>
{
//客户端发保持连接请求到服务端最长间隔默认30秒改成4分钟网页需跟着设置connection.keepAliveIntervalInMilliseconds = 12e4;即2分钟
//options.ClientTimeoutInterval = TimeSpan.FromMinutes(4);
//服务端发保持连接请求到客户端间隔默认15秒改成2分钟网页需跟着设置connection.serverTimeoutInMilliseconds = 24e4;即4分钟
//options.KeepAliveInterval = TimeSpan.FromMinutes(2);
});
//消除Error unprotecting the session cookie警告
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "DataProtection"));
//普通验证码
services.AddHeiCaptcha();
services.AddSession();
services.AddHttpContextAccessor();
//绑定整个对象到Model上
services.Configure<OptionsSetting>(Configuration);
//jwt 认证
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddCookie()
.AddJwtBearer(o =>
{
o.TokenValidationParameters = JwtUtil.ValidParameters();
});
InjectServices(services, Configuration);
services.AddMvc(options =>
{
options.Filters.Add(typeof(GlobalActionMonitor));//全局注册
})
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeConverter());
options.JsonSerializerOptions.Converters.Add(new JsonConverterUtil.DateTimeNullConverter());
});
services.AddSwaggerConfig();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseSwagger();
//使可以多次多去body内容
app.Use((context, next) =>
{
context.Request.EnableBuffering();
if (context.Request.Query.TryGetValue("access_token", out var token))
{
context.Request.Headers.Add("Authorization", $"Bearer {token}");
}
return next();
});
//开启访问静态文件/wwwroot目录文件要放在UseRouting前面
app.UseStaticFiles();
//开启路由访问
app.UseRouting();
app.UseCors("Policy");//要放在app.UseEndpoints前。
//app.UseAuthentication会启用Authentication中间件该中间件会根据当前Http请求中的Cookie信息来设置HttpContext.User属性后面会用到
//所以只有在app.UseAuthentication方法之后注册的中间件才能够从HttpContext.User中读取到值
//这也是为什么上面强调app.UseAuthentication方法一定要放在下面的app.UseMvc方法前面因为只有这样ASP.NET Core的MVC中间件中才能读取到HttpContext.User的值。
//1.先开启认证
app.UseAuthentication();
//2.再开启授权
app.UseAuthorization();
//开启session
app.UseSession();
//开启缓存
app.UseResponseCaching();
//恢复/启动任务
app.UseAddTaskSchedulers();
//使用全局异常中间件
app.UseMiddleware<GlobalExceptionMiddleware>();
app.UseEndpoints(endpoints =>
{
//设置socket连接
endpoints.MapHub<MessageHub>("/msgHub");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
/// <summary>
/// 注册Services服务
/// </summary>
/// <param name="services"></param>
/// <param name="configuration"></param>
private void InjectServices(IServiceCollection services, IConfiguration configuration)
{
services.AddAppService();
services.AddSingleton(new AppSettings(configuration));
//开启计划任务
services.AddTaskSchedulers();
//初始化db
DbExtension.AddDb(configuration);
//注册REDIS 服务
Task.Run(() =>
{
//RedisServer.Initalize();
});
}
}
}

View File

@ -1,78 +1,48 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<UserSecretsId>bc51af00-60b6-4e2a-935e-267c368c890a</UserSecretsId>
<EnableNETAnalyzers>false</EnableNETAnalyzers>
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>ZRAdmin.xml</DocumentationFile>
<NoWarn>1701;1702;1591;1570</NoWarn>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Filters\GlobalExceptionFilter.cs" />
<Compile Remove="Middleware\RequestIPMiddleware.cs" />
<Compile Remove="Middleware\**" />
<Content Remove="Middleware\**" />
<EmbeddedResource Remove="Middleware\**" />
<None Remove="Middleware\**" />
</ItemGroup>
<ItemGroup>
<Content Remove="wwwroot\CodeGenTemplate\VueTemplate.txt" />
<Compile Include="Middleware\GlobalExceptionMiddleware.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="EPPlus" Version="5.8.6" />
<PackageReference Include="Hei.Captcha" Version="0.3.0" />
<PackageReference Include="IPTools.China" Version="1.6.0" />
<PackageReference Include="CSRedisCore" Version="3.6.9" />
<PackageReference Include="Mapster" Version="7.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.0" NoWarn="NU1605" />
<PackageReference Include="NETCore.Encrypt" Version="2.1.0" />
<PackageReference Include="NLog" Version="4.7.14" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.14.0" />
<PackageReference Include="Snowflake.Core" Version="2.0.0" />
<PackageReference Include="SqlSugar.IOC" Version="1.7.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.2" />
<PackageReference Include="UAParser" Version="3.1.47" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ZR.CodeGenerator\ZR.CodeGenerator.csproj" />
<ProjectReference Include="..\ZR.Service\ZR.Service.csproj" />
<ProjectReference Include="..\ZR.Tasks\ZR.Tasks.csproj" />
</ItemGroup>
<ItemGroup>
<Content Update="NLog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.2" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.2" />
<PackageReference Include="UAParser" Version="3.1.47" />
<PackageReference Include="IPTools.China" Version="1.6.0" />
<PackageReference Include="NLog" Version="5.0.0-rc2" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.14.0" />
<PackageReference Include="Mapster" Version="7.3.0" />
<PackageReference Include="SqlSugar.IOC" Version="1.7.0" />
<PackageReference Include="EPPlus" Version="5.8.6" />
<PackageReference Include="Hei.Captcha" Version="0.3.0" />
<PackageReference Include="Snowflake.Core" Version="2.0.0" />
</ItemGroup>
<ItemGroup>
<Folder Include="Controllers\" />
</ItemGroup>
<ItemGroup>
<None Update="build.bat">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Dockerfile">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="ip2region.db">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="ZRAdmin.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="Controllers\Business\" />
<Folder Include="DataProtection\" />
<Folder Include="wwwroot\export\" />
</ItemGroup>
<ItemGroup>
<Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
</ItemGroup>
</Project>

View File

@ -1,8 +0,0 @@
@echo off
docker build -t ZRAdmin.NET:latest -f ./Dockerfile .
echo "==============查看镜像==========="
docker images
pause

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
@ -9,7 +9,7 @@
<PackageReference Include="CSRedisCore" Version="3.6.9" />
<PackageReference Include="EPPlus" Version="5.8.6" />
<PackageReference Include="MailKit" Version="3.1.1" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" />
</ItemGroup>
<ItemGroup>

View File

@ -1,6 +1,6 @@
using System;
namespace ZR.Model.Dto
namespace ZR.Model.System.Dto
{
/// <summary>
/// 参数配置输入对象模型
@ -18,7 +18,7 @@ namespace ZR.Model.Dto
/// <summary>
/// 参数配置查询对象模型
/// </summary>
public class SysConfigQueryDto: PagerInfo
public class SysConfigQueryDto : PagerInfo
{
public string ConfigName { get; set; }
public string ConfigKey { get; set; }

View File

@ -2,10 +2,9 @@ using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using ZR.Model.Dto;
using ZR.Model.Models;
namespace ZR.Model.Dto
namespace ZR.Model.System.Dto
{
/// <summary>
/// 通知公告表输入对象

View File

@ -1,9 +1,8 @@
using System;
using System.Collections.Generic;
using SqlSugar;
using ZR.Model.System;
namespace ZR.Model.Models
namespace ZR.Model.System
{
/// <summary>
/// 通知公告表,数据实体对象
@ -19,7 +18,7 @@ namespace ZR.Model.Models
/// 描述 : 公告ID
/// 空值 : true
/// </summary>
[SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "notice_id")]
[SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "notice_id")]
public int NoticeId { get; set; }
/// <summary>
/// 描述 : 公告标题

View File

@ -4,7 +4,7 @@ using System.Collections.Generic;
using System.Text;
using ZR.Model.System;
namespace ZR.Model.Vo.System
namespace ZR.Model.System.Vo
{
/// <summary>
/// Treeselect树结构实体类

View File

@ -2,6 +2,7 @@ using System;
using Infrastructure.Attribute;
using ZR.Repository.System;
using ZR.Model.Models;
using ZR.Model.System;
namespace ZR.Repository.System
{

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
@ -10,7 +10,6 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" />
<PackageReference Include="MySql.Data" Version="8.0.25" />
<PackageReference Include="NETCore.Encrypt" Version="2.1.0" />
<PackageReference Include="SqlSugar.IOC" Version="1.7.0" />

View File

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
using ZR.Model.System;
using ZR.Model.Vo.System;
using ZR.Model.System.Vo;
namespace ZR.Service.System.IService
{

View File

@ -2,7 +2,6 @@
using ZR.Model.System.Dto;
using ZR.Model.System;
using ZR.Model.System.Vo;
using ZR.Model.Vo.System;
namespace ZR.Service.System.IService
{

View File

@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
using ZR.Model.Models;
using ZR.Model.System;
namespace ZR.Service.System.IService
{

View File

@ -8,7 +8,7 @@ using System.Linq;
using System.Text;
using ZR.Common;
using ZR.Model.System;
using ZR.Model.Vo.System;
using ZR.Model.System.Vo;
using ZR.Repository.System;
using ZR.Service.System.IService;

View File

@ -73,7 +73,7 @@ namespace ZR.Service.System
{
str = Guid.NewGuid().ToString();
}
MD5CryptoServiceProvider md5 = new();
MD5 md5 = MD5.Create();
return BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(str)), 4, 8).Replace("-", "");
}

View File

@ -4,7 +4,6 @@ using System.Linq;
using ZR.Model.System.Dto;
using ZR.Model.System;
using ZR.Model.System.Vo;
using ZR.Model.Vo.System;
using ZR.Repository.System;
using ZR.Service.System.IService;
using ZR.Common;

View File

@ -3,6 +3,7 @@ using Infrastructure.Attribute;
using SqlSugar;
using System.Collections.Generic;
using ZR.Model.Models;
using ZR.Model.System;
using ZR.Repository;
using ZR.Repository.System;
using ZR.Service.System.IService;

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>

View File

@ -1,11 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="4.7.14" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" />
<PackageReference Include="NLog" Version="5.0.0-rc2" />
<PackageReference Include="Quartz" Version="3.3.3" />
<PackageReference Include="Quartz.Serialization.Json" Version="3.3.3" />
</ItemGroup>

View File

@ -1,31 +1,23 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30711.63
# Visual Studio Version 17
VisualStudioVersion = 17.1.32210.238
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Admin.WebApi", "ZR.Admin.WebApi\ZR.Admin.WebApi.csproj", "{BA176987-AABB-406A-B4A8-6B63B422B703}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZR.Admin.WebApi", "ZR.Admin.WebApi\ZR.Admin.WebApi.csproj", "{E5497BB4-B0C1-4794-9FAE-163F626EC399}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Repository", "ZR.Repository\ZR.Repository.csproj", "{0665F19A-F8DC-4C8C-8382-68ABE75E8646}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Model", "ZR.Model\ZR.Model.csproj", "{B35D73B1-2E22-4636-B88B-10C5E6D8E524}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Model", "ZR.Model\ZR.Model.csproj", "{F762038D-733D-4572-A55F-4C4EA6A8BE5F}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Common", "ZR.Common\ZR.Common.csproj", "{42C84599-1E99-45B4-929B-417C37337EF8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Service", "ZR.Service\ZR.Service.csproj", "{76F7557E-BB62-48AC-AF6D-EE62BBF64225}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Infrastructure", "Infrastructure\Infrastructure.csproj", "{5D740120-5491-4FE2-B5BE-8A9C48BFE3C5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Common", "ZR.Common\ZR.Common.csproj", "{D7F7C898-8758-46E6-B26B-960FE79FF8CF}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Tasks", "ZR.Tasks\ZR.Tasks.csproj", "{B657ED99-40E5-423A-AFE7-157C4EE576CB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Infrastructure", "Infrastructure\Infrastructure.csproj", "{DF8B3C35-6E0E-481B-B2CB-C2BED3AF8634}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Service", "ZR.Service\ZR.Service.csproj", "{75ADA3C1-148D-4727-A718-79447D9B5EEE}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "02 Interfaces", "02 Interfaces", "{CAB76A06-3117-4AEB-8540-58ED63E7F96C}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Repository", "ZR.Repository\ZR.Repository.csproj", "{17E277BF-B2B8-4111-AE43-38246128C83C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "01 基础设施层", "01 基础设施层", "{3DA5CBAB-687B-4022-B43B-AA7856121B9E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.Tasks", "ZR.Tasks\ZR.Tasks.csproj", "{328C152F-4DA3-4ABB-A9B7-628109902088}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Quartz定时任务", "Quartz定时任务", "{8A1C9D96-9967-42DA-9A57-2C945E08E93E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{7BBADB30-A3CB-4A8D-91E2-FE8F13AD1536}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.CodeGenerator", "ZR.CodeGenerator\ZR.CodeGenerator.csproj", "{42F902A7-33C4-44D6-A7D8-5E0E72DAA03C}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZR.CodeGenerator", "ZR.CodeGenerator\ZR.CodeGenerator.csproj", "{B353DE0B-12C6-4C15-909A-DB68F71D5AE9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -33,53 +25,43 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BA176987-AABB-406A-B4A8-6B63B422B703}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BA176987-AABB-406A-B4A8-6B63B422B703}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BA176987-AABB-406A-B4A8-6B63B422B703}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BA176987-AABB-406A-B4A8-6B63B422B703}.Release|Any CPU.Build.0 = Release|Any CPU
{0665F19A-F8DC-4C8C-8382-68ABE75E8646}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0665F19A-F8DC-4C8C-8382-68ABE75E8646}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0665F19A-F8DC-4C8C-8382-68ABE75E8646}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0665F19A-F8DC-4C8C-8382-68ABE75E8646}.Release|Any CPU.Build.0 = Release|Any CPU
{F762038D-733D-4572-A55F-4C4EA6A8BE5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F762038D-733D-4572-A55F-4C4EA6A8BE5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F762038D-733D-4572-A55F-4C4EA6A8BE5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F762038D-733D-4572-A55F-4C4EA6A8BE5F}.Release|Any CPU.Build.0 = Release|Any CPU
{76F7557E-BB62-48AC-AF6D-EE62BBF64225}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76F7557E-BB62-48AC-AF6D-EE62BBF64225}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76F7557E-BB62-48AC-AF6D-EE62BBF64225}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76F7557E-BB62-48AC-AF6D-EE62BBF64225}.Release|Any CPU.Build.0 = Release|Any CPU
{D7F7C898-8758-46E6-B26B-960FE79FF8CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D7F7C898-8758-46E6-B26B-960FE79FF8CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D7F7C898-8758-46E6-B26B-960FE79FF8CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D7F7C898-8758-46E6-B26B-960FE79FF8CF}.Release|Any CPU.Build.0 = Release|Any CPU
{DF8B3C35-6E0E-481B-B2CB-C2BED3AF8634}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DF8B3C35-6E0E-481B-B2CB-C2BED3AF8634}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF8B3C35-6E0E-481B-B2CB-C2BED3AF8634}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DF8B3C35-6E0E-481B-B2CB-C2BED3AF8634}.Release|Any CPU.Build.0 = Release|Any CPU
{328C152F-4DA3-4ABB-A9B7-628109902088}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{328C152F-4DA3-4ABB-A9B7-628109902088}.Debug|Any CPU.Build.0 = Debug|Any CPU
{328C152F-4DA3-4ABB-A9B7-628109902088}.Release|Any CPU.ActiveCfg = Release|Any CPU
{328C152F-4DA3-4ABB-A9B7-628109902088}.Release|Any CPU.Build.0 = Release|Any CPU
{42F902A7-33C4-44D6-A7D8-5E0E72DAA03C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{42F902A7-33C4-44D6-A7D8-5E0E72DAA03C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{42F902A7-33C4-44D6-A7D8-5E0E72DAA03C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{42F902A7-33C4-44D6-A7D8-5E0E72DAA03C}.Release|Any CPU.Build.0 = Release|Any CPU
{E5497BB4-B0C1-4794-9FAE-163F626EC399}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5497BB4-B0C1-4794-9FAE-163F626EC399}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E5497BB4-B0C1-4794-9FAE-163F626EC399}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5497BB4-B0C1-4794-9FAE-163F626EC399}.Release|Any CPU.Build.0 = Release|Any CPU
{B35D73B1-2E22-4636-B88B-10C5E6D8E524}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B35D73B1-2E22-4636-B88B-10C5E6D8E524}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B35D73B1-2E22-4636-B88B-10C5E6D8E524}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B35D73B1-2E22-4636-B88B-10C5E6D8E524}.Release|Any CPU.Build.0 = Release|Any CPU
{42C84599-1E99-45B4-929B-417C37337EF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{42C84599-1E99-45B4-929B-417C37337EF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{42C84599-1E99-45B4-929B-417C37337EF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{42C84599-1E99-45B4-929B-417C37337EF8}.Release|Any CPU.Build.0 = Release|Any CPU
{5D740120-5491-4FE2-B5BE-8A9C48BFE3C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5D740120-5491-4FE2-B5BE-8A9C48BFE3C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5D740120-5491-4FE2-B5BE-8A9C48BFE3C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5D740120-5491-4FE2-B5BE-8A9C48BFE3C5}.Release|Any CPU.Build.0 = Release|Any CPU
{B657ED99-40E5-423A-AFE7-157C4EE576CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B657ED99-40E5-423A-AFE7-157C4EE576CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B657ED99-40E5-423A-AFE7-157C4EE576CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B657ED99-40E5-423A-AFE7-157C4EE576CB}.Release|Any CPU.Build.0 = Release|Any CPU
{75ADA3C1-148D-4727-A718-79447D9B5EEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{75ADA3C1-148D-4727-A718-79447D9B5EEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{75ADA3C1-148D-4727-A718-79447D9B5EEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{75ADA3C1-148D-4727-A718-79447D9B5EEE}.Release|Any CPU.Build.0 = Release|Any CPU
{17E277BF-B2B8-4111-AE43-38246128C83C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{17E277BF-B2B8-4111-AE43-38246128C83C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{17E277BF-B2B8-4111-AE43-38246128C83C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{17E277BF-B2B8-4111-AE43-38246128C83C}.Release|Any CPU.Build.0 = Release|Any CPU
{B353DE0B-12C6-4C15-909A-DB68F71D5AE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B353DE0B-12C6-4C15-909A-DB68F71D5AE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B353DE0B-12C6-4C15-909A-DB68F71D5AE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B353DE0B-12C6-4C15-909A-DB68F71D5AE9}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{BA176987-AABB-406A-B4A8-6B63B422B703} = {7BBADB30-A3CB-4A8D-91E2-FE8F13AD1536}
{0665F19A-F8DC-4C8C-8382-68ABE75E8646} = {CAB76A06-3117-4AEB-8540-58ED63E7F96C}
{F762038D-733D-4572-A55F-4C4EA6A8BE5F} = {CAB76A06-3117-4AEB-8540-58ED63E7F96C}
{76F7557E-BB62-48AC-AF6D-EE62BBF64225} = {CAB76A06-3117-4AEB-8540-58ED63E7F96C}
{D7F7C898-8758-46E6-B26B-960FE79FF8CF} = {3DA5CBAB-687B-4022-B43B-AA7856121B9E}
{DF8B3C35-6E0E-481B-B2CB-C2BED3AF8634} = {3DA5CBAB-687B-4022-B43B-AA7856121B9E}
{328C152F-4DA3-4ABB-A9B7-628109902088} = {8A1C9D96-9967-42DA-9A57-2C945E08E93E}
{42F902A7-33C4-44D6-A7D8-5E0E72DAA03C} = {3DA5CBAB-687B-4022-B43B-AA7856121B9E}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F420E614-D8A9-4E15-B9EA-9205B3DE7BAB}
SolutionGuid = {0469FF3A-7322-4053-94C7-881B103A57C5}
EndGlobalSection
EndGlobal