diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/appsettings.json b/Yi.Framework/Yi.Framework.ApiMicroservice/appsettings.json index 933191fa..275f5aad 100644 --- a/Yi.Framework/Yi.Framework.ApiMicroservice/appsettings.json +++ b/Yi.Framework/Yi.Framework.ApiMicroservice/appsettings.json @@ -8,7 +8,7 @@ }, "AllowedHosts": "*", "Apollo": { - "AppId": "Yi-ApiMicroservice", + "AppId": "Yi.Framework.ApiMicroservice", "Env": "DEV", "MetaServer": "http://192.168.2.168:8080", "ConfigServer": [ "http://192.168.2.168:8080" ] diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs b/Yi.Framework/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs new file mode 100644 index 00000000..182d709b --- /dev/null +++ b/Yi.Framework/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Yi.Framework.AuthenticationCenter.Controllers +{ + [ApiController] + [Route("[controller]")] + public class WeatherForecastController : ControllerBase + { + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet] + public IEnumerable Get() + { + var rng = new Random(); + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateTime.Now.AddDays(index), + TemperatureC = rng.Next(-20, 55), + Summary = Summaries[rng.Next(Summaries.Length)] + }) + .ToArray(); + } + } +} diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/Program.cs b/Yi.Framework/Yi.Framework.AuthenticationCenter/Program.cs new file mode 100644 index 00000000..e75b3a47 --- /dev/null +++ b/Yi.Framework/Yi.Framework.AuthenticationCenter/Program.cs @@ -0,0 +1,26 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Yi.Framework.AuthenticationCenter +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } +} diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/Properties/launchSettings.json b/Yi.Framework/Yi.Framework.AuthenticationCenter/Properties/launchSettings.json new file mode 100644 index 00000000..3a968be9 --- /dev/null +++ b/Yi.Framework/Yi.Framework.AuthenticationCenter/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:55249", + "sslPort": 44360 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Yi.Framework.AuthenticationCenter": { + "commandName": "Project", + "dotnetRunMessages": "true", + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/Startup.cs b/Yi.Framework/Yi.Framework.AuthenticationCenter/Startup.cs new file mode 100644 index 00000000..6c28a88d --- /dev/null +++ b/Yi.Framework/Yi.Framework.AuthenticationCenter/Startup.cs @@ -0,0 +1,59 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpsPolicy; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.OpenApi.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Yi.Framework.AuthenticationCenter +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + + services.AddControllers(); + services.AddSwaggerGen(c => + { + c.SwaggerDoc("v1", new OpenApiInfo { Title = "Yi.Framework.AuthenticationCenter", Version = "v1" }); + }); + } + + // 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(); + app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Yi.Framework.AuthenticationCenter v1")); + } + + app.UseHttpsRedirection(); + + app.UseRouting(); + + app.UseAuthorization(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + } + } +} diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/WeatherForecast.cs b/Yi.Framework/Yi.Framework.AuthenticationCenter/WeatherForecast.cs new file mode 100644 index 00000000..520fb1b1 --- /dev/null +++ b/Yi.Framework/Yi.Framework.AuthenticationCenter/WeatherForecast.cs @@ -0,0 +1,15 @@ +using System; + +namespace Yi.Framework.AuthenticationCenter +{ + public class WeatherForecast + { + public DateTime Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string Summary { get; set; } + } +} diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj b/Yi.Framework/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj new file mode 100644 index 00000000..28847161 --- /dev/null +++ b/Yi.Framework/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj @@ -0,0 +1,11 @@ + + + + net5.0 + + + + + + + diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/appsettings.Development.json b/Yi.Framework/Yi.Framework.AuthenticationCenter/appsettings.Development.json new file mode 100644 index 00000000..8983e0fc --- /dev/null +++ b/Yi.Framework/Yi.Framework.AuthenticationCenter/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/appsettings.json b/Yi.Framework/Yi.Framework.AuthenticationCenter/appsettings.json new file mode 100644 index 00000000..d9d9a9bf --- /dev/null +++ b/Yi.Framework/Yi.Framework.AuthenticationCenter/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} diff --git a/Yi.Framework/Yi.Framework.Common/Models/SwaggerModel.cs b/Yi.Framework/Yi.Framework.Common/Models/SwaggerModel.cs new file mode 100644 index 00000000..43d8f300 --- /dev/null +++ b/Yi.Framework/Yi.Framework.Common/Models/SwaggerModel.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Models +{ + public class SwaggerModel + { + public SwaggerModel(string url, string name) + { + this.url = url; + this.name = name; + } + public string url { get; set; } + public string name { get; set; } + } +} diff --git a/Yi.Framework/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs b/Yi.Framework/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs new file mode 100644 index 00000000..fd20b344 --- /dev/null +++ b/Yi.Framework/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.QueueModel +{ + /// + /// 下单成功后的实体 + /// + public class OrderCreateQueueModel + { + /// + /// 用户Id + /// + public long UserId { get; set; } + /// + /// 订单Id + /// + public long OrderId { get; set; } + /// + /// sku ID 集合 + /// + public List SkuIdList { get; set; } + + /// + /// 尝试次数 + /// + public int TryTime { get; set; } + + public OrderTypeEnum OrderType { get; set; } + + public enum OrderTypeEnum + { + Normal, + Seckill + } + + } +} diff --git a/Yi.Framework/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs b/Yi.Framework/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs new file mode 100644 index 00000000..80c926cf --- /dev/null +++ b/Yi.Framework/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.QueueModel +{ + public class SKUWarmupQueueModel + { + public bool Warmup { get; set; } + } +} diff --git a/Yi.Framework/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs b/Yi.Framework/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs new file mode 100644 index 00000000..a9a2efba --- /dev/null +++ b/Yi.Framework/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.QueueModel +{ + /// + /// 以SPU为单位 + /// + public class SPUCQRSQueueModel + { + public long SpuId { get; set; } + + /// + /// enum SPUCQRSQueueModelType + /// + public int CQRSType { get; set; } + } + + /// + /// 操作类型 + /// + public enum SPUCQRSQueueModelType + { + Insert = 0, + Update = 1, + Delete = 2, + Search = 3 + } +} diff --git a/Yi.Framework/Yi.Framework.Common/Yi.Framework.Common.csproj b/Yi.Framework/Yi.Framework.Common/Yi.Framework.Common.csproj index 3f64571d..f208d303 100644 --- a/Yi.Framework/Yi.Framework.Common/Yi.Framework.Common.csproj +++ b/Yi.Framework/Yi.Framework.Common/Yi.Framework.Common.csproj @@ -4,8 +4,4 @@ net5.0 - - - - diff --git a/Yi.Framework/Yi.Framework.ElasticSearchProcessor/Class1.cs b/Yi.Framework/Yi.Framework.ElasticSearchProcessor/Class1.cs new file mode 100644 index 00000000..553b9bc6 --- /dev/null +++ b/Yi.Framework/Yi.Framework.ElasticSearchProcessor/Class1.cs @@ -0,0 +1,8 @@ +using System; + +namespace Yi.Framework.ElasticSearchProcessor +{ + public class Class1 + { + } +} diff --git a/Yi.Framework/Yi.Framework.ElasticSearchProcessor/Yi.Framework.ElasticSearchProcessor.csproj b/Yi.Framework/Yi.Framework.ElasticSearchProcessor/Yi.Framework.ElasticSearchProcessor.csproj new file mode 100644 index 00000000..f208d303 --- /dev/null +++ b/Yi.Framework/Yi.Framework.ElasticSearchProcessor/Yi.Framework.ElasticSearchProcessor.csproj @@ -0,0 +1,7 @@ + + + + net5.0 + + + diff --git a/Yi.Framework/Yi.Framework.MSUnitTest/UnitTest1.cs b/Yi.Framework/Yi.Framework.MSUnitTest/UnitTest1.cs new file mode 100644 index 00000000..67df934b --- /dev/null +++ b/Yi.Framework/Yi.Framework.MSUnitTest/UnitTest1.cs @@ -0,0 +1,13 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Yi.Framework.MSUnitTest +{ + [TestClass] + public class UnitTest1 + { + [TestMethod] + public void TestMethod1() + { + } + } +} diff --git a/Yi.Framework/Yi.Framework.MSUnitTest/Yi.Framework.MSUnitTest.csproj b/Yi.Framework/Yi.Framework.MSUnitTest/Yi.Framework.MSUnitTest.csproj new file mode 100644 index 00000000..db7e1fed --- /dev/null +++ b/Yi.Framework/Yi.Framework.MSUnitTest/Yi.Framework.MSUnitTest.csproj @@ -0,0 +1,16 @@ + + + + net5.0 + + false + + + + + + + + + + diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/Log4net.config b/Yi.Framework/Yi.Framework.OcelotGateway/Log4net.config new file mode 100644 index 00000000..958c7e78 --- /dev/null +++ b/Yi.Framework/Yi.Framework.OcelotGateway/Log4net.config @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/Program.cs b/Yi.Framework/Yi.Framework.OcelotGateway/Program.cs new file mode 100644 index 00000000..c2e35d88 --- /dev/null +++ b/Yi.Framework/Yi.Framework.OcelotGateway/Program.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Yi.Framework.OcelotGateway +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureAppConfiguration((hostBuilderContext, configurationBuilder) => + { + configurationBuilder.AddCommandLine(args); + configurationBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false); + configurationBuilder.AddJsonFile("configuration.json", optional: false, reloadOnChange: true); + #region + //Apollo + #endregion + //configurationBuilder.AddApolloService("Yi"); + }) + .ConfigureLogging(loggingBuilder => + { + loggingBuilder.AddFilter("System", Microsoft.Extensions.Logging.LogLevel.Warning); + loggingBuilder.AddFilter("Microsoft", Microsoft.Extensions.Logging.LogLevel.Warning); + loggingBuilder.AddLog4Net(); + }) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup().UseUrls("http://*:7200"); + }); + } +} diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/Properties/launchSettings.json b/Yi.Framework/Yi.Framework.OcelotGateway/Properties/launchSettings.json new file mode 100644 index 00000000..45ed6a09 --- /dev/null +++ b/Yi.Framework/Yi.Framework.OcelotGateway/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:54400", + "sslPort": 44373 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Yi.Framework.OcelotGateway": { + "commandName": "Project", + "dotnetRunMessages": "true", + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/Startup.cs b/Yi.Framework/Yi.Framework.OcelotGateway/Startup.cs new file mode 100644 index 00000000..25a2f4b2 --- /dev/null +++ b/Yi.Framework/Yi.Framework.OcelotGateway/Startup.cs @@ -0,0 +1,80 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpsPolicy; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.OpenApi.Models; +using Ocelot.DependencyInjection; +using Ocelot.Middleware; +using Ocelot.Provider.Consul; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Ocelot.Cache.CacheManager; +using Yi.Framework.WebCore.MiddlewareExtend; +using Ocelot.Provider.Polly; + +namespace Yi.Framework.OcelotGateway +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + + services.AddControllers(); + #region + // + #endregion + services.AddCorsService(); + + #region + //ط + #endregion + services.AddOcelot().AddConsul().AddCacheManager(x =>{x.WithDictionaryHandle();}).AddPolly(); + + #region + //Swagger + #endregion + services.AddSwaggerService("Yi.Framework.OcelotGateway"); + #region + //JwtȨ + #endregion + services.AddJwtService(); + } + + // 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(); + #region + //Swaggerע + #endregion + app.UseSwaggerService(new SwaggerModel("api/api/swagger/v1/swagger.json","API"), new SwaggerModel("api/item/swagger/v1/swagger.json", "̬ҳ")); + } + #region + //طע + #endregion + app.UseOcelot(); + + #region + //Ȩע + #endregion + app.UseAuthentication(); + } + } +} diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/SwaggerDoc.xml b/Yi.Framework/Yi.Framework.OcelotGateway/SwaggerDoc.xml new file mode 100644 index 00000000..16f3de1b --- /dev/null +++ b/Yi.Framework/Yi.Framework.OcelotGateway/SwaggerDoc.xml @@ -0,0 +1,8 @@ + + + + Yi.Framework.OcelotGateway + + + + diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/Yi.Framework.OcelotGateway.csproj b/Yi.Framework/Yi.Framework.OcelotGateway/Yi.Framework.OcelotGateway.csproj new file mode 100644 index 00000000..9bb224ac --- /dev/null +++ b/Yi.Framework/Yi.Framework.OcelotGateway/Yi.Framework.OcelotGateway.csproj @@ -0,0 +1,23 @@ + + + + net5.0 + + + + D:\CC.Yi\CC.Yi\Yi.Framework\Yi.Framework.OcelotGateway\SwaggerDoc.xml + 1701;1702;CS1591 + + + + + + + + + + + + + + diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/appsettings.Development.json b/Yi.Framework/Yi.Framework.OcelotGateway/appsettings.Development.json new file mode 100644 index 00000000..8983e0fc --- /dev/null +++ b/Yi.Framework/Yi.Framework.OcelotGateway/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/appsettings.json b/Yi.Framework/Yi.Framework.OcelotGateway/appsettings.json new file mode 100644 index 00000000..3d943a6e --- /dev/null +++ b/Yi.Framework/Yi.Framework.OcelotGateway/appsettings.json @@ -0,0 +1,21 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*", + "Apollo": { + "AppId": "Yi.Framework.OcelotGateway", + "Env": "DEV", + "MetaServer": "http://192.168.2.168:8080", + "ConfigServer": [ "http://192.168.2.168:8080" ] + }, + "JWTTokenOptions": { + "Audience": "http://localhost:7000", + "Issuer": "http://localhost:7000", + "SecurityKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB" + } +} diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/configuration.json b/Yi.Framework/Yi.Framework.OcelotGateway/configuration.json new file mode 100644 index 00000000..026deea0 --- /dev/null +++ b/Yi.Framework/Yi.Framework.OcelotGateway/configuration.json @@ -0,0 +1,432 @@ +////*****************************ַʵؾ+Consul******************************** +//{ +// "Routes": [ +// { +// "DownstreamPathTemplate": "/api/{url}", //ַ--url +// "DownstreamScheme": "http", +// "UpstreamPathTemplate": "/T/{url}", //صַ--url +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "UseServiceDiscovery": true, +// "ServiceName": "ZhaoxiService", //consul +// "LoadBalancerOptions": { +// "Type": "RoundRobin" //ѯ LeastConnection-ķ NoLoadBalanceؾ +// } +// } +// ], +// "GlobalConfiguration": { +// "BaseUrl": "http://127.0.0.1:6299", //ضַ +// "ServiceDiscoveryProvider": { +// "Host": "47.95.2.2", +// "Port": 8089, +// "Type": "Consul" //Consulṩ, ÿȥconsul +// } //Ocelotû֧öConsul + +// //,"ServiceDiscoveryProvider": { +// // "Host": "localhost", +// // "Port": 8500, +// // "Type": "PollConsul", //Consulṩ, +// // "PollingInterval": 1000 //ѯconsul,Ƶʺ--downDz֪ +// // //"Token": "footoken"//ҪACLĻ +// //} +// } +//} + + + +//*****************************Ocelot+Consul******************************** +{ + "Routes": [ + { + "UpstreamPathTemplate": "api/api/{url}", //ַ-- + "UpstreamHttpMethod": [ "Get", "Post", "Put", "PATCH", "Delete", "Options" ], + "UseServiceDiscovery": true, + "ServiceName": "ApiMicroservice", + "LoadBalancerOptions": { + "Type": "RoundRobin" //ѯ LeastConnection-ķ NoLoadBalanceؾ + }, + "DownstreamPathTemplate": "api/api/{url}", //ַ--url + "DownstreamScheme": "https", + "DownstreamHeaderTransform": { + "Access-Control-Allow-Origin": "*", //ھ + "Access-Control-Allow-Methods": "*", + "Access-Control-Allow-Headers": "*" + } + }, + { + "UpstreamPathTemplate": "api/item/{url}", //ַ-- + "UpstreamHttpMethod": [ "Get", "Post", "Put", "PATCH", "Delete", "Options" ], + "UseServiceDiscovery": true, + "ServiceName": "PageDetail", + "LoadBalancerOptions": { + "Type": "RoundRobin" //ѯ LeastConnection-ķ NoLoadBalanceؾ + }, + "DownstreamPathTemplate": "api/item/{url}", //ַ--url + "DownstreamScheme": "https", + "DownstreamHeaderTransform": { + "Access-Control-Allow-Origin": "*", //ھ + "Access-Control-Allow-Methods": "*", + "Access-Control-Allow-Headers": "*" + } + } + ], + "GlobalConfiguration": { + "BaseUrl": "http://127.0.0.1:7200", //ضַ + "ServiceDiscoveryProvider": { + "Host": "192.168.2.128", + "Port": 8500, + "Type": "Consul" //Consulṩ, ÿȥconsul + }, + "RateLimitOptions": { + "QuotaExceededMessage": "ƵԺԣ", // رضʱصϢ + "HttpStatusCode": 666 // رضʱصhttp status + //"ClientIdHeader": "client_id" // ʶͻ˵ͷĬ ClientId + } + + //,"ServiceDiscoveryProvider": { + // "Host": "localhost", + // "Port": 8500, + // "Type": "PollConsul", //Consulṩ, + // "PollingInterval": 1000 //ѯconsul,Ƶʺ--downDz֪ + // //"Token": "footoken"//ҪACLĻ + //} + } +} + +////*****************************ַ--Consul******************************** +//{ +// "Routes": [ +// { +// "UpstreamPathTemplate": "/api/auth/{url}", //ַ-- +// "UpstreamHttpMethod": [ "Get", "Post", "Put", "PATCH", "Delete", "Options" ], +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 7200 //api ˿ +// } +// ], +// "DownstreamPathTemplate": "/api/{url}", //ַ--url +// "DownstreamScheme": "http", +// "DownstreamHeaderTransform": { +// "Access-Control-Allow-Origin": "*", //ھ +// "Access-Control-Allow-Methods": "*", +// "Access-Control-Allow-Headers": "*" +// } +// } +// ] +//} + +////*****************************ַȫƥ******************************** +//{ +// "Routes": [ +// { +// "DownstreamPathTemplate": "/{url}", //ַ--url +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 5726 //˿ +// } +// ], +// "UpstreamPathTemplate": "/{url}", //صַ--url //ͻĻԼȨPriority +// "UpstreamHttpMethod": [ "Get", "Post" ] +// } +// ] +//} + +////*****************************ַʵ******************************** +//{ +// "Routes": [ +// { +// "DownstreamPathTemplate": "/api/{url}", //ַ--url +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 5726 //˿ +// } +// ], +// "UpstreamPathTemplate": "/T5726/{url}", //صַ--url +// "UpstreamHttpMethod": [ "Get", "Post" ] +// }, +// { +// "DownstreamPathTemplate": "/api/{url}", //ַ--url +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 5727 //˿ +// } +// ], +// "UpstreamPathTemplate": "/T5727/{url}", //صַ--url +// "UpstreamHttpMethod": [ "Get", "Post" ] +// }, +// { +// "DownstreamPathTemplate": "/api/{url}", //ַ--url +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 5728 //˿ +// } +// ], +// "UpstreamPathTemplate": "/T5728/{url}", //صַ--url +// "UpstreamHttpMethod": [ "Get", "Post" ] +// } +// ] +//} + +//////MVC·ɹǽˮ¥̨ȵ-- +////*****************************·ɳͻ+Ȩƥ******************************** +//{ +// "Routes": [ +// { +// "DownstreamPathTemplate": "/{url}", //ַ--url +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 5726 //˿ +// } +// ], +// "UpstreamPathTemplate": "/{url}", //صַ--url //ͻĻԼȨPriority +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "Priority": 0 //Ĭ0 Ӹ1 +// }, +// { +// "DownstreamPathTemplate": "/api/users/get?id={id}", //ַ--url +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 5727 //˿ +// } +// ], +// "UpstreamPathTemplate": "/api/users/get/{id}", //صַ--url //ͻĻԼȨPriority +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "Priority": 1 //Ĭ0 Ӹ1 +// }, +// { +// "DownstreamPathTemplate": "/api/users/{url}?id={id}", //ַ--url +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 5728 //˿ +// } +// ], +// "UpstreamPathTemplate": "/api/users/{url}/{id}", //صַ--url //ͻĻԼȨPriority +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "Priority": 2 //Ĭ0 Ӹ1 +// } +// ] +//} + +////*****************************ַʵؾ******************************** +//{ +// "Routes": [ +// { +// "DownstreamPathTemplate": "/api/{url}", //ַ--url +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "47.95.2.2", +// "Port": 5726 +// }, //Ocelotؾ +// { +// "Host": "47.95.2.2", +// "Port": 5727 +// }, +// { +// "Host": "47.95.2.2", +// "Port": 5728 +// } +// ], +// "UpstreamPathTemplate": "/T/{url}", //صַ--url //ͻĻԼȨPriority +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "LoadBalancerOptions": { +// "Type": "RoundRobin" //ѯ //"LeastConnection" //ķ "NoLoadBalance" //ؾ //"CookieStickySessions" //Ựճ // +// } +// //"LoadBalancerOptions": { +// // "Type": "CookieStickySessions", +// // "Key": "ASP.NET_SessionId", +// // "Expiry": 1800000 +// //} +// } +// ] +//} + +////*****************************ַʵؾ+Consul******************************** +//{ +// "Routes": [ +// { +// "DownstreamPathTemplate": "/api/{url}", //ַ--url +// "DownstreamScheme": "http", +// "UpstreamPathTemplate": "/T/{url}", //صַ--url +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "UseServiceDiscovery": true, +// "ServiceName": "ZhaoxiService", //consul +// "LoadBalancerOptions": { +// "Type": "RoundRobin" //ѯ LeastConnection-ķ NoLoadBalanceؾ +// } +// } +// ], +// "GlobalConfiguration": { +// "BaseUrl": "http://127.0.0.1:6299", //ضַ +// "ServiceDiscoveryProvider": { +// "Host": "47.95.2.2", +// "Port": 8089, +// "Type": "Consul" //Consulṩ, ÿȥconsul +// } //Ocelotû֧öConsul + +// //,"ServiceDiscoveryProvider": { +// // "Host": "localhost", +// // "Port": 8500, +// // "Type": "PollConsul", //Consulṩ, +// // "PollingInterval": 1000 //ѯconsul,Ƶʺ--downDz֪ +// // //"Token": "footoken"//ҪACLĻ +// //} +// } +//} + +////*****************************Consul+Cache******************************** +//{ +// "Routes": [ +// { +// "DownstreamPathTemplate": "/api/{url}", //ַ--url +// "DownstreamScheme": "http", +// "UpstreamPathTemplate": "/T/{url}", //صַ--url +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "UseServiceDiscovery": true, +// "ServiceName": "ZhaoxiService", //consul +// "LoadBalancerOptions": { +// "Type": "RoundRobin" //ѯ LeastConnection-ķ NoLoadBalanceؾ +// }, +// "FileCacheOptions": { +// "TtlSeconds": 15, //Second +// "Region": "UserCache" //ԵApi +// } +// } +// ], +// "GlobalConfiguration": { +// "BaseUrl": "http://127.0.0.1:6299", //ضַ +// "ServiceDiscoveryProvider": { +// "Host": "47.95.2.2", +// "Port": 8089, +// "Type": "Consul" //Consulṩ, ÿȥconsul +// } +// //"ServiceDiscoveryProvider": { +// // "Host": "localhost", +// // "Port": 8500, +// // "Type": "PollConsul", //Consulṩ, +// // "PollingInterval": 1000 //ѯconsul,Ƶʺ--downDz֪ +// // //"Token": "footoken"//ҪACLĻ +// //} +// } +//} + +////*****************************ʱ++۶++Consul+Polly******************************** +//{ +// "Routes": [ +// { +// "DownstreamPathTemplate": "/api/{url}", //ַ--url +// "DownstreamScheme": "http", +// "UpstreamPathTemplate": "/T/{url}", //صַ--url +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "UseServiceDiscovery": true, +// "ServiceName": "ZhaoxiService", //consul +// "LoadBalancerOptions": { +// "Type": "RoundRobin" //ѯ LeastConnection-ķ NoLoadBalanceؾ +// }, +// "RateLimitOptions": { +// "ClientWhitelist": [ "eleven", "seven" ], // ClientId ִСд +// "EnableRateLimiting": true, +// "Period": "5m", //1s, 5m, 1h, 1d +// "PeriodTimespan": 30, //֮ͻ˿ +// "Limit": 5 //ͳʱ +// }, +// "AuthenticationOptions": { +// "AuthenticationProviderKey": "UserGatewayKey", +// "AllowedScopes": [] +// }, +// "QoSOptions": { +// "ExceptionsAllowedBeforeBreaking": 3, //ٸ쳣 +// "DurationOfBreak": 10000, // ۶ϵʱ䣬λΪms +// "TimeoutValue": 2000 //λms Ĵʱ䳬罫Ϊʱ Ĭ90 +// } +// //"FileCacheOptions": { +// // "TtlSeconds": 15, +// // "Region": "UserCache" //ԵApi +// //} +// } +// ], +// "GlobalConfiguration": { +// "BaseUrl": "http://127.0.0.1:6299", //ضַ +// "ServiceDiscoveryProvider": { +// "Host": "47.95.2.2", +// "Port": 8089, +// "Type": "Consul" //Consulṩ +// }, +// "RateLimitOptions": { +// "QuotaExceededMessage": "Too many requests, maybe later? 11", // رضʱصϢ +// "HttpStatusCode": 666, // رضʱصhttp status +// //"ClientIdHeader": "client_id" // ʶͻ˵ͷĬ ClientId +// } +// } +//} + +////*****************************ۺAggregator******************************** +//{ +// "Routes": [ +// { +// "DownstreamPathTemplate": "/api/users/all", +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 5726 //˿ +// } //Զиؾ +// ], +// "UpstreamPathTemplate": "/T5726/users/all", +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "key": "T5726" +// }, +// { +// "DownstreamPathTemplate": "/api/users/all", +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 5727 //˿ +// } +// ], +// "UpstreamPathTemplate": "/T5727/users/all", +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "key": "T5727" +// }, +// { +// "DownstreamPathTemplate": "/api/users/all", +// "DownstreamScheme": "http", +// "DownstreamHostAndPorts": [ +// { +// "Host": "localhost", +// "Port": 5728 //˿ +// } +// ], +// "UpstreamPathTemplate": "/T5728/users/all", +// "UpstreamHttpMethod": [ "Get", "Post" ], +// "key": "T5728" +// } +// ], +// "Aggregates": [ +// { +// "RouteKeys": [ +// "T5726", +// "T5727", +// "T5728" +// ], +// "UpstreamPathTemplate": "/UserAggregator", //ij404 DzӰ췵أnull +// "Aggregator": "CustomUserAggregator" //Զۺ +// } +// ] +//} + diff --git a/Yi.Framework/Yi.Framework.PageDetail/Controllers/PageDetaiController.cs b/Yi.Framework/Yi.Framework.PageDetail/Controllers/PageDetaiController.cs new file mode 100644 index 00000000..39a8aeaa --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/Controllers/PageDetaiController.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; + +namespace Yi.Framework.PageDetail.Controllers +{ + public class PageDetaiController : Controller + { + private IUserService _IUserService; + public PageDetaiController(IUserService IUserService) + { + _IUserService = IUserService; + } + [Route("/item/{id}.html")] + public IActionResult Index(int id) + { + var htmlmodel = _IUserService.GetEntityById(id); + return View(htmlmodel); + } + } +} diff --git a/Yi.Framework/Yi.Framework.PageDetail/Log4net.config b/Yi.Framework/Yi.Framework.PageDetail/Log4net.config new file mode 100644 index 00000000..958c7e78 --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/Log4net.config @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Yi.Framework/Yi.Framework.PageDetail/Program.cs b/Yi.Framework/Yi.Framework.PageDetail/Program.cs new file mode 100644 index 00000000..17f7bd75 --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/Program.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Yi.Framework.PageDetail +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureAppConfiguration((hostBuilderContext, configurationBuilder) => + { + configurationBuilder.AddCommandLine(args); + configurationBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false); + configurationBuilder.AddJsonFile("configuration.json", optional: false, reloadOnChange: true); + #region + //Apollo + #endregion + //configurationBuilder.AddApolloService("Yi"); + }) + .ConfigureLogging(loggingBuilder => + { + loggingBuilder.AddFilter("System", Microsoft.Extensions.Logging.LogLevel.Warning); + loggingBuilder.AddFilter("Microsoft", Microsoft.Extensions.Logging.LogLevel.Warning); + loggingBuilder.AddLog4Net(); + }) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup().UseUrls("http://*:7007"); + }); + } +} diff --git a/Yi.Framework/Yi.Framework.PageDetail/Properties/launchSettings.json b/Yi.Framework/Yi.Framework.PageDetail/Properties/launchSettings.json new file mode 100644 index 00000000..2c360cb4 --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:55468", + "sslPort": 44333 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Yi.Framework.PageDetail": { + "commandName": "Project", + "dotnetRunMessages": "true", + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Yi.Framework/Yi.Framework.PageDetail/Startup.cs b/Yi.Framework/Yi.Framework.PageDetail/Startup.cs new file mode 100644 index 00000000..d4138a01 --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/Startup.cs @@ -0,0 +1,67 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpsPolicy; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.OpenApi.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Interface; +using Yi.Framework.Service; +using Yi.Framework.WebCore.MiddlewareExtend; + +namespace Yi.Framework.PageDetail +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddIocService(Configuration); + + services.AddControllers(); + #region + //Swagger + #endregion + services.AddSwaggerService("Yi.Framework.OcelotGateway.PageDetail"); + + services.AddScoped(); + } + + // 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(); + #region + //Swaggerע + #endregion + app.UseSwaggerService(); + } + + app.UseHttpsRedirection(); + + app.UseRouting(); + + app.UseAuthorization(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + } + } +} diff --git a/Yi.Framework/Yi.Framework.PageDetail/SwaggerDoc.xml b/Yi.Framework/Yi.Framework.PageDetail/SwaggerDoc.xml new file mode 100644 index 00000000..f7714016 --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/SwaggerDoc.xml @@ -0,0 +1,8 @@ + + + + Yi.Framework.PageDetail + + + + diff --git a/Yi.Framework/Yi.Framework.PageDetail/Views/PageDetai/Index.cshtml b/Yi.Framework/Yi.Framework.PageDetail/Views/PageDetai/Index.cshtml new file mode 100644 index 00000000..703417fb --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/Views/PageDetai/Index.cshtml @@ -0,0 +1,90 @@ +@model Yi.Framework.Model.Models.user + +@{ + ViewData["Title"] = "Index"; +} + +

Index

+ +
+

user

+
+
+
+ @Html.DisplayNameFor(model => model.username) +
+
+ @Html.DisplayFor(model => model.username) +
+
+ @Html.DisplayNameFor(model => model.password) +
+
+ @Html.DisplayFor(model => model.password) +
+
+ @Html.DisplayNameFor(model => model.icon) +
+
+ @Html.DisplayFor(model => model.icon) +
+
+ @Html.DisplayNameFor(model => model.nick) +
+
+ @Html.DisplayFor(model => model.nick) +
+
+ @Html.DisplayNameFor(model => model.email) +
+
+ @Html.DisplayFor(model => model.email) +
+
+ @Html.DisplayNameFor(model => model.ip) +
+
+ @Html.DisplayFor(model => model.ip) +
+
+ @Html.DisplayNameFor(model => model.age) +
+
+ @Html.DisplayFor(model => model.age) +
+
+ @Html.DisplayNameFor(model => model.introduction) +
+
+ @Html.DisplayFor(model => model.introduction) +
+
+ @Html.DisplayNameFor(model => model.address) +
+
+ @Html.DisplayFor(model => model.address) +
+
+ @Html.DisplayNameFor(model => model.phone) +
+
+ @Html.DisplayFor(model => model.phone) +
+
+ @Html.DisplayNameFor(model => model.id) +
+
+ @Html.DisplayFor(model => model.id) +
+
+ @Html.DisplayNameFor(model => model.is_delete) +
+
+ @Html.DisplayFor(model => model.is_delete) +
+
+
+
+ @Html.ActionLink("Edit", "Edit", new { /* id = Model.PrimaryKey */ }) | + Back to List +
diff --git a/Yi.Framework/Yi.Framework.PageDetail/Views/Shared/_ValidationScriptsPartial.cshtml b/Yi.Framework/Yi.Framework.PageDetail/Views/Shared/_ValidationScriptsPartial.cshtml new file mode 100644 index 00000000..ed86611b --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/Views/Shared/_ValidationScriptsPartial.cshtml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/Yi.Framework/Yi.Framework.PageDetail/Yi.Framework.PageDetail.csproj b/Yi.Framework/Yi.Framework.PageDetail/Yi.Framework.PageDetail.csproj new file mode 100644 index 00000000..8137388a --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/Yi.Framework.PageDetail.csproj @@ -0,0 +1,43 @@ + + + + net5.0 + + + + D:\CC.Yi\CC.Yi\Yi.Framework\Yi.Framework.PageDetail\SwaggerDoc.xml + ;NU1605 + 1701;1702;CS1591 + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + true + PreserveNewest + + + + diff --git a/Yi.Framework/Yi.Framework.PageDetail/appsettings.Development.json b/Yi.Framework/Yi.Framework.PageDetail/appsettings.Development.json new file mode 100644 index 00000000..8983e0fc --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/Yi.Framework/Yi.Framework.PageDetail/appsettings.json b/Yi.Framework/Yi.Framework.PageDetail/appsettings.json new file mode 100644 index 00000000..dde260d7 --- /dev/null +++ b/Yi.Framework/Yi.Framework.PageDetail/appsettings.json @@ -0,0 +1,43 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*", + "MysqlConn": { + "Url": "" + }, + "RedisConn": { + "Host": "192.168.2.128", + "Prot": 6379, + "DB": 0, + "Password": "123456" + }, + "StaticDirectory": "D:/cc-app/", + //"StaticDirectory": "/app/temp/staticfile/", + "IsSaveHtml": true, + "ConsulClientOption": { + "IP": "192.168.2.128", + "Port": "8500", + "Datacenter": "dc1" + }, + "ConsulRegisterOption": { + "IP": "192.168.0.103", + "Port": "7007", + "GroupName": "PageDetail", + "HealthCheckUrl": "/Health", + "Interval": 10, + "Timeout": 5, + "DeregisterCriticalServiceAfter": 60, + "Tag": "13" + }, + "Apollo": { + "AppId": "Yi.Framework.PageDetail", + "Env": "DEV", + "MetaServer": "http://192.168.2.168:8080", + "ConfigServer": [ "http://192.168.2.168:8080" ] + } +} \ No newline at end of file diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/InitPageWorker.cs b/Yi.Framework/Yi.Framework.StaticPageProcessor/InitPageWorker.cs new file mode 100644 index 00000000..86e132f7 --- /dev/null +++ b/Yi.Framework/Yi.Framework.StaticPageProcessor/InitPageWorker.cs @@ -0,0 +1,100 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Yi.Framework.Common.IOCOptions; +using Yi.Framework.Common.Models; +using Yi.Framework.Common.QueueModel; +using Yi.Framework.Core; +using Yi.Framework.Core.ConsulExtend; + +namespace Yi.Framework.StaticPageProcessor +{ + public class InitPageWorker : BackgroundService + { + private readonly IConfiguration _configuration; + private readonly ILogger _logger; + private readonly RabbitMQInvoker _RabbitMQInvoker; + private readonly AbstractConsulDispatcher _AbstractConsulDispatcher = null; + + public InitPageWorker(ILogger logger, RabbitMQInvoker rabbitMQInvoker, IConfiguration configuration, AbstractConsulDispatcher abstractConsulDispatcher) + { + this._logger = logger; + this._RabbitMQInvoker = rabbitMQInvoker; + this._configuration = configuration; + this._AbstractConsulDispatcher = abstractConsulDispatcher; + + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + RabbitMQConsumerModel rabbitMQConsumerModel = new RabbitMQConsumerModel() + { + ExchangeName = RabbitMQExchangeQueueName.SKUCQRS_Exchange, + QueueName = RabbitMQExchangeQueueName.SKUCQRS_Queue_StaticPage + }; + HttpClient _HttpClient = new HttpClient(); + this._RabbitMQInvoker.RegistReciveAction(rabbitMQConsumerModel, message => + { + SPUCQRSQueueModel skuCQRSQueueModel = JsonConvert.DeserializeObject(message); + + string detailUrl = this._AbstractConsulDispatcher.GetAddress(this._configuration["DetailPageUrl"]); + string totalUrl = null; + switch (skuCQRSQueueModel.CQRSType) + { + case (int)SPUCQRSQueueModelType.Insert: + totalUrl = $"{detailUrl}{skuCQRSQueueModel.SpuId}.html"; + break; + case (int)SPUCQRSQueueModelType.Update: + totalUrl = $"{detailUrl}{skuCQRSQueueModel.SpuId}.html"; + break; + case (int)SPUCQRSQueueModelType.Delete: + totalUrl = $"{detailUrl}{skuCQRSQueueModel.SpuId}.html?ActionHeader=Delete"; + break; + default: + break; + } + + try + { + var result = _HttpClient.GetAsync(totalUrl).Result; + if (result.StatusCode == HttpStatusCode.OK) + { + this._logger.LogInformation($"{nameof(WarmupPageWorker)}.Init succeed {totalUrl}"); + return true; + } + else + { + this._logger.LogWarning($"{nameof(WarmupPageWorker)}.Init succeed {totalUrl}"); + return false; + } + } + catch (Exception ex) + { + var logModel = new LogModel() + { + OriginalClassName = this.GetType().FullName, + OriginalMethodName = nameof(ExecuteAsync), + Remark = "ʱҵ־" + }; + this._logger.LogError(ex, $"{nameof(WarmupPageWorker)}.Init failed {totalUrl}, Exception:{ex.Message}", JsonConvert.SerializeObject(logModel)); + return false; + } + }); + await Task.CompletedTask; + //while (!stoppingToken.IsCancellationRequested) + //{ + // _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); + // await Task.Delay(1000, stoppingToken); + //} + } + } +} diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/Log4net.config b/Yi.Framework/Yi.Framework.StaticPageProcessor/Log4net.config new file mode 100644 index 00000000..958c7e78 --- /dev/null +++ b/Yi.Framework/Yi.Framework.StaticPageProcessor/Log4net.config @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/Program.cs b/Yi.Framework/Yi.Framework.StaticPageProcessor/Program.cs new file mode 100644 index 00000000..d540e7a6 --- /dev/null +++ b/Yi.Framework/Yi.Framework.StaticPageProcessor/Program.cs @@ -0,0 +1,67 @@ +using Com.Ctrip.Framework.Apollo; +using Com.Ctrip.Framework.Apollo.Core; +using Com.Ctrip.Framework.Apollo.Enums; +using Com.Ctrip.Framework.Apollo.Logging; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using Yi.Framework.Common.IOCOptions; +using Yi.Framework.Core; +using Yi.Framework.Core.ConsulExtend; + +namespace Yi.Framework.StaticPageProcessor +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureAppConfiguration((hostBuilderContext, configurationBuilder) => + { + configurationBuilder.AddCommandLine(args); + configurationBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false); + configurationBuilder.AddJsonFile("configuration.json", optional: false, reloadOnChange: true); + #region + //Apollo配置 + #endregion + //configurationBuilder.AddApolloService("Yi"); + }) + .ConfigureLogging(loggingBuilder => + { + loggingBuilder.AddFilter("System", Microsoft.Extensions.Logging.LogLevel.Warning); + loggingBuilder.AddFilter("Microsoft", Microsoft.Extensions.Logging.LogLevel.Warning); + loggingBuilder.AddLog4Net(); + }) + .ConfigureServices((hostContext, services) => + { + + IConfiguration configuration = services.BuildServiceProvider().GetRequiredService(); + + services.AddHostedService(); + services.AddHostedService(); + + #region 服务注入 + services.Configure(configuration.GetSection("MysqlConn")); + + services.AddTransient(); + services.Configure(configuration.GetSection("RedisConn")); + + services.AddSingleton(); + services.Configure(configuration.GetSection("RabbitMQOptions")); + #endregion + + #region Consul + services.Configure(configuration.GetSection("ConsulClientOption")); + services.AddTransient(); + #endregion + + services.AddHostedService(); + }); + } + } diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/WarmupPageWorker.cs b/Yi.Framework/Yi.Framework.StaticPageProcessor/WarmupPageWorker.cs new file mode 100644 index 00000000..23d9d4c5 --- /dev/null +++ b/Yi.Framework/Yi.Framework.StaticPageProcessor/WarmupPageWorker.cs @@ -0,0 +1,133 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Yi.Framework.Common.IOCOptions; +using Yi.Framework.Common.Models; +using Yi.Framework.Common.QueueModel; +using Yi.Framework.Core; +using Yi.Framework.Core.ConsulExtend; + +namespace Yi.Framework.StaticPageProcessor +{ + public class WarmupPageWorker : BackgroundService + { + private readonly IConfiguration _configuration; + private readonly ILogger _logger; + private readonly RabbitMQInvoker _RabbitMQInvoker; + private readonly AbstractConsulDispatcher _IConsulDispatcher = null; + + public WarmupPageWorker(ILogger logger, RabbitMQInvoker rabbitMQInvoker, IConfiguration configuration, AbstractConsulDispatcher consulDispatcher) + { + this._logger = logger; + this._RabbitMQInvoker = rabbitMQInvoker; + this._configuration = configuration; + this._IConsulDispatcher = consulDispatcher; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + RabbitMQConsumerModel rabbitMQConsumerModel = new RabbitMQConsumerModel() + { + ExchangeName = RabbitMQExchangeQueueName.SKUWarmup_Exchange, + QueueName = RabbitMQExchangeQueueName.SKUWarmup_Queue_StaticPage + }; + HttpClient _HttpClient = new HttpClient(); + this._RabbitMQInvoker.RegistReciveAction(rabbitMQConsumerModel, message => + { + string realUrl= this._IConsulDispatcher.GetAddress(this._configuration["DetailPageUrl"]); + + SKUWarmupQueueModel skuWarmupQueueModel = JsonConvert.DeserializeObject(message); + #region ClearAll + { + string totalUrl = $"{realUrl}{0}.html?ActionHeader=ClearAll"; + try + { + var result = _HttpClient.GetAsync(totalUrl).Result; + if (result.StatusCode == HttpStatusCode.OK) + { + this._logger.LogInformation($"{nameof(WarmupPageWorker)}.ClearAll succeed {totalUrl}"); + //return true; + } + else + { + this._logger.LogWarning($"{nameof(WarmupPageWorker)}.ClearAll failed {totalUrl}"); + return false; + } + } + catch (Exception ex) + { + this._logger.LogError($"{nameof(WarmupPageWorker)}.ClearAll failed {totalUrl}, Exception:{ex.Message}"); + return false; + } + } + #endregion + + #region Ȼȫ Warmup + { + // -------¼µ + + int count = 100;//βѯ + int pageIndex = 1;//ҳҳߵ + while (count == 100) + { + + +// -------------------> ˴ɾ̬ҳƣͨʹidʶ,ͨserviceIJѯõid + List ids = new List{ 1,2,3,4,5,6,7,8,9}; +// -------------------> ˴ɾ̬ҳƣͨʹidʶ,ͨserviceIJѯõid + + + foreach (var id in ids) + { + string totalUrl = $"{realUrl}{id}.html"; + try + { + var result = _HttpClient.GetAsync(totalUrl).Result; + if (result.StatusCode == HttpStatusCode.OK) + { + this._logger.LogInformation($"{nameof(WarmupPageWorker)}.Warmup succeed {totalUrl}"); + //return true; + } + else + { + this._logger.LogWarning($"{nameof(WarmupPageWorker)}.Warmup failed {totalUrl}"); + return false; + } + } + catch (Exception ex) + { + var logModel = new LogModel() + { + OriginalClassName = this.GetType().FullName, + OriginalMethodName = nameof(ExecuteAsync), + Remark = "ʱҵ־" + }; + this._logger.LogError(ex, $"{nameof(WarmupPageWorker)}.Warmup failed {totalUrl}, Exception:{ex.Message}", JsonConvert.SerializeObject(logModel)); + return false; + } + } + pageIndex++; + count = ids.Count; + } + } + #endregion + return true; + }); + await Task.CompletedTask; + //while (!stoppingToken.IsCancellationRequested) + //{ + // _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); + // await Task.Delay(1000, stoppingToken); + //} + } + } +} diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/Worker.cs b/Yi.Framework/Yi.Framework.StaticPageProcessor/Worker.cs new file mode 100644 index 00000000..f73f389e --- /dev/null +++ b/Yi.Framework/Yi.Framework.StaticPageProcessor/Worker.cs @@ -0,0 +1,32 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Yi.Framework.StaticPageProcessor +{ + public class Worker : BackgroundService + { + private readonly ILogger _logger; + private readonly IConfiguration _IConfiguration; + public Worker(ILogger logger, IConfiguration configuration) + { + this._logger = logger; + this._IConfiguration = configuration; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + while (!stoppingToken.IsCancellationRequested) + { + _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); + _logger.LogInformation($"Worker appsetting ConsulClientOption:Ip={this._IConfiguration["ConsulClientOption:Ip"]}"); + await Task.Delay(1000, stoppingToken); + } + } + } +} diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj b/Yi.Framework/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj new file mode 100644 index 00000000..b42904f3 --- /dev/null +++ b/Yi.Framework/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj @@ -0,0 +1,23 @@ + + + + net5.0 + + + + + + + + + PreserveNewest + true + PreserveNewest + + + + + + + + diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/appsettings.Development.json b/Yi.Framework/Yi.Framework.StaticPageProcessor/appsettings.Development.json new file mode 100644 index 00000000..8983e0fc --- /dev/null +++ b/Yi.Framework/Yi.Framework.StaticPageProcessor/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/appsettings.json b/Yi.Framework/Yi.Framework.StaticPageProcessor/appsettings.json new file mode 100644 index 00000000..e1db65d8 --- /dev/null +++ b/Yi.Framework/Yi.Framework.StaticPageProcessor/appsettings.json @@ -0,0 +1,36 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "RedisConn": { + "Host": "192.168.2.128", + "Prot": 6379, + "DB": 0, + "Password": "123456" + }, + "RabbitMQOptions": { + "HostName": "192.168.2.128", + "UserName": "cc", + "Password": "cc" + }, + //"DetailPageUrl": "http://localhost:5728/item/", + "DetailPageUrl": "http://PageDetail/item/", + "ConsulClientOption": { + "IP": "192.168.2.128", + "Port": "8500", + "Datacenter": "dc1" + }, + "MysqlConn": { + "Url": "server=192.168.2.128;port=3306;database=ECDB;user id=root;password=123456" + }, + "Apollo": { + "AppId": "Yi.Framework.StaticPageProcessor", + "Env": "DEV", + "MetaServer": "http://192.168.2.168:8080", + "ConfigServer": [ "http://192.168.2.168:8080" ] + } +} diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs b/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs index d395358a..cbb7040a 100644 --- a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs +++ b/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using System; using System.IO; +using Yi.Framework.Common.Models; namespace Yi.Framework.WebCore.MiddlewareExtend { @@ -11,11 +12,11 @@ namespace Yi.Framework.WebCore.MiddlewareExtend /// public static class SwaggerExtension { - public static IServiceCollection AddSwaggerService(this IServiceCollection services) + public static IServiceCollection AddSwaggerService(this IServiceCollection services, string title = "Yi意框架-API接口") { var apiInfo = new OpenApiInfo { - Title = "Yi意框架-API接口", + Title = title, Version = "v1", Contact = new OpenApiContact { Name = "橙子", Email = "454313500@qq.com", Url = new System.Uri("https://ccnetcore.com") } }; @@ -64,12 +65,28 @@ namespace Yi.Framework.WebCore.MiddlewareExtend return services; } - public static void UseSwaggerService(this IApplicationBuilder app) + public static void UseSwaggerService(this IApplicationBuilder app, params SwaggerModel[] swaggerModels) { //在 Startup.Configure 方法中,启用中间件为生成的 JSON 文档和 Swagger UI 提供服务: // Enable middleware to serve generated Swagger as a JSON endpoint. app.UseSwagger(); - app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Yi.Framework")); + app.UseSwaggerUI(c => + { + if (swaggerModels.Length == 0) + { + c.SwaggerEndpoint("/swagger/v1/swagger.json", "Yi.Framework"); + } + else + { + foreach (var k in swaggerModels) + { + c.SwaggerEndpoint(k.url, k.name); + } + } + + } + + ); } } diff --git a/Yi.Framework/Yi.Framework.sln b/Yi.Framework/Yi.Framework.sln index 42d134ed..01222fad 100644 --- a/Yi.Framework/Yi.Framework.sln +++ b/Yi.Framework/Yi.Framework.sln @@ -29,6 +29,18 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.WebCore", "Yi. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yi.Framework.ApiMicroservice", "Yi.Framework.ApiMicroservice\Yi.Framework.ApiMicroservice.csproj", "{A95157D2-907F-411E-BA1D-A17F48C54A0E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.OcelotGateway", "Yi.Framework.OcelotGateway\Yi.Framework.OcelotGateway.csproj", "{671E38D8-ECAF-484B-A2AE-63DDC469C315}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.AuthenticationCenter", "Yi.Framework.AuthenticationCenter\Yi.Framework.AuthenticationCenter.csproj", "{694C0EC0-ED32-4E5D-8EA1-FB82E1303EAB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.StaticPageProcessor", "Yi.Framework.StaticPageProcessor\Yi.Framework.StaticPageProcessor.csproj", "{D2BC3EBE-7F08-476E-9BB5-58A6F27AB31A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.ElasticSearchProcessor", "Yi.Framework.ElasticSearchProcessor\Yi.Framework.ElasticSearchProcessor.csproj", "{EEF89893-A6A9-4C02-818C-D116C8EAE0EF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.MSUnitTest", "Yi.Framework.MSUnitTest\Yi.Framework.MSUnitTest.csproj", "{531255B3-9669-4BC1-B4E5-A0C6E0540F0D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yi.Framework.PageDetail", "Yi.Framework.PageDetail\Yi.Framework.PageDetail.csproj", "{637501E2-A32E-485C-8680-ED863D1793C2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -67,6 +79,30 @@ Global {A95157D2-907F-411E-BA1D-A17F48C54A0E}.Debug|Any CPU.Build.0 = Debug|Any CPU {A95157D2-907F-411E-BA1D-A17F48C54A0E}.Release|Any CPU.ActiveCfg = Release|Any CPU {A95157D2-907F-411E-BA1D-A17F48C54A0E}.Release|Any CPU.Build.0 = Release|Any CPU + {671E38D8-ECAF-484B-A2AE-63DDC469C315}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {671E38D8-ECAF-484B-A2AE-63DDC469C315}.Debug|Any CPU.Build.0 = Debug|Any CPU + {671E38D8-ECAF-484B-A2AE-63DDC469C315}.Release|Any CPU.ActiveCfg = Release|Any CPU + {671E38D8-ECAF-484B-A2AE-63DDC469C315}.Release|Any CPU.Build.0 = Release|Any CPU + {694C0EC0-ED32-4E5D-8EA1-FB82E1303EAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {694C0EC0-ED32-4E5D-8EA1-FB82E1303EAB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {694C0EC0-ED32-4E5D-8EA1-FB82E1303EAB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {694C0EC0-ED32-4E5D-8EA1-FB82E1303EAB}.Release|Any CPU.Build.0 = Release|Any CPU + {D2BC3EBE-7F08-476E-9BB5-58A6F27AB31A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2BC3EBE-7F08-476E-9BB5-58A6F27AB31A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2BC3EBE-7F08-476E-9BB5-58A6F27AB31A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2BC3EBE-7F08-476E-9BB5-58A6F27AB31A}.Release|Any CPU.Build.0 = Release|Any CPU + {EEF89893-A6A9-4C02-818C-D116C8EAE0EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EEF89893-A6A9-4C02-818C-D116C8EAE0EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EEF89893-A6A9-4C02-818C-D116C8EAE0EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EEF89893-A6A9-4C02-818C-D116C8EAE0EF}.Release|Any CPU.Build.0 = Release|Any CPU + {531255B3-9669-4BC1-B4E5-A0C6E0540F0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {531255B3-9669-4BC1-B4E5-A0C6E0540F0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {531255B3-9669-4BC1-B4E5-A0C6E0540F0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {531255B3-9669-4BC1-B4E5-A0C6E0540F0D}.Release|Any CPU.Build.0 = Release|Any CPU + {637501E2-A32E-485C-8680-ED863D1793C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {637501E2-A32E-485C-8680-ED863D1793C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {637501E2-A32E-485C-8680-ED863D1793C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {637501E2-A32E-485C-8680-ED863D1793C2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -80,6 +116,12 @@ Global {07A80C17-E03E-475D-9BBF-98E3B1393652} = {9ABAF6B1-6C02-498A-90A2-ABC1140CF89A} {E4734315-158C-4D35-AF01-1122C22F2955} = {9ABAF6B1-6C02-498A-90A2-ABC1140CF89A} {A95157D2-907F-411E-BA1D-A17F48C54A0E} = {026D2797-07D1-4BA5-8070-50CDE0258C59} + {671E38D8-ECAF-484B-A2AE-63DDC469C315} = {D6B44435-EAFA-4D55-90D0-3AF80485FB83} + {694C0EC0-ED32-4E5D-8EA1-FB82E1303EAB} = {D6B44435-EAFA-4D55-90D0-3AF80485FB83} + {D2BC3EBE-7F08-476E-9BB5-58A6F27AB31A} = {D6B44435-EAFA-4D55-90D0-3AF80485FB83} + {EEF89893-A6A9-4C02-818C-D116C8EAE0EF} = {D6B44435-EAFA-4D55-90D0-3AF80485FB83} + {531255B3-9669-4BC1-B4E5-A0C6E0540F0D} = {C90E38FB-69EA-4997-8B3A-2C71EFA65B2B} + {637501E2-A32E-485C-8680-ED863D1793C2} = {026D2797-07D1-4BA5-8070-50CDE0258C59} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {1ED77A6E-377F-4EEF-A3D0-D65C94657DAF}