From 6503ad905b67a6ede68cf5deb15ed00c0dcbfdbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Sat, 25 Dec 2021 14:50:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4.Net6=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/AccountController.cs | 0 .../Controllers/FileController.cs | 0 .../Controllers/JobController.cs | 0 .../Controllers/MenuController.cs | 0 .../Controllers/MouldController.cs | 0 .../Controllers/RoleController.cs | 0 .../Controllers/SettingController.cs | 0 .../Controllers/UserController.cs | 0 .../Log4net.config | 0 .../Yi.Framework.ApiMicroservice/Program.cs | 0 .../Yi.Framework.ApiMicroservice/Startup.cs | 0 .../SwaggerDoc.xml | 278 ++++ .../Yi.Framework.ApiMicroservice.csproj | 0 .../wwwroot/Excel/Excel_20211102231510.xlsx | Bin .../wwwroot/Excel/Excel_20211102232113.xlsx | Bin .../0a5221e4-dca6-4d4e-8486-acf86822f2e4.jpg | Bin .../1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg | Bin .../3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg | Bin .../6312706b-7013-4aa5-af3c-0bbb6b3f4804.jpg | Bin .../7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg | Bin .../966200f6-265c-4470-ad20-c91c3d84a1cc.jpg | Bin .../feae1964-04ce-464b-848b-86f2245f3f63.jpeg | Bin .../Controllers/WeatherForecastController.cs | 0 .../Program.cs | 0 .../Startup.cs | 0 .../Yi.Framework.AuthenticationCenter.csproj | 0 .../Yi.Framework.Common/Const/DbConst.cs | 0 .../Yi.Framework.Common/Const/FileConst.cs | 0 .../Yi.Framework.Common/Const/JobConst.cs | 0 .../Yi.Framework.Common/Const/JwtConst.cs | 0 .../Yi.Framework.Common/Const/RabbitConst.cs | 0 .../Yi.Framework.Common/Const/RedisConst.cs | 0 .../Helper/AssemblyHelper.cs | 0 .../Helper/Base32Helper.cs | 0 .../Helper/ConsoleHelper.cs | 0 .../Yi.Framework.Common/Helper/DateHelper.cs | 0 .../Yi.Framework.Common/Helper/EmailHelper.cs | 0 .../Yi.Framework.Common/Helper/ExcelHelper.cs | 0 .../Yi.Framework.Common/Helper/FileHelper.cs | 0 .../Yi.Framework.Common/Helper/HtmlHelper.cs | 0 .../Yi.Framework.Common/Helper/HttpHelper.cs | 0 .../Yi.Framework.Common/Helper/IpHelper.cs | 0 .../Yi.Framework.Common/Helper/JsonHelper.cs | 0 .../Yi.Framework.Common/Helper/MD5Hepler.cs | 0 .../Yi.Framework.Common/Helper/MimeHelper.cs | 0 .../Yi.Framework.Common/Helper/RSAHelper.cs | 0 .../Helper/RandomHelper.cs | 0 .../Helper/SerializeHelper.cs | 0 .../Helper/SnowflakeHelper.cs | 0 .../Helper/StringHelper.cs | 0 .../Helper/UnicodeHelper.cs | 0 .../Yi.Framework.Common/Helper/UrlHelper.cs | 0 .../Yi.Framework.Common/Helper/XmlHelper.cs | 0 .../IOCOptions/ConsulClientOption.cs | 0 .../IOCOptions/ConsulRegisterOption.cs | 0 .../IOCOptions/ElasticSearchOptions.cs | 0 .../IOCOptions/JWTTokenOptions.cs | 0 .../IOCOptions/KafkaOptions.cs | 0 .../IOCOptions/MySqlConnOptions.cs | 0 .../IOCOptions/RabbitMQOptions.cs | 0 .../IOCOptions/RedisConnOptions.cs | 0 .../IOCOptions/SMSOptions.cs | 0 .../IOCOptions/SqliteOptions.cs | 0 .../Models/AxiosUrlsModel.cs | 0 .../Models/Enum/AgrFlagEnum.cs | 0 .../Models/Enum/DelFlagEnum.cs | 0 .../Models/Enum/ShowFlagEnum.cs | 0 .../Models/Enum/TopFlagEnum.cs | 0 .../Models/Enum/WriteAndReadEnum.cs | 0 .../Yi.Framework.Common/Models/JobModel.cs | 0 .../Yi.Framework.Common/Models/LogModel.cs | 0 .../Yi.Framework.Common/Models/PageModel.cs | 0 .../Yi.Framework.Common/Models/Result.cs | 0 .../Models/SwaggerModel.cs | 0 .../QueueModel/OrderCreateQueueModel.cs | 0 .../QueueModel/SKUWarmupQueueModel.cs | 0 .../QueueModel/SMSQueueModel.cs | 0 .../QueueModel/SPUCQRSQueueModel.cs | 0 .../Yi.Framework.Common.csproj | 0 .../Yi.Framework.Core/CacheClientDB.cs | 0 .../ClienExtend/AbstractConsulDispatcher.cs | 0 .../ClienExtend/AverageDispatcher.cs | 0 .../ClienExtend/PollingDispatcher.cs | 0 .../ClienExtend/WeightDispatcher.cs | 0 .../Yi.Framework.Core/ElasticSearchInvoker.cs | 0 .../Library/Microsoft.Bcl.AsyncInterfaces.dll | Bin .../Library/ServiceStack.Common.dll | Bin .../Library/ServiceStack.Interfaces.dll | Bin .../Library/ServiceStack.Redis.dll | Bin .../Library/ServiceStack.Text.dll | Bin .../Yi.Framework.Core/MakeJwt.cs | 0 .../Quartz/MyQuartzFactory.cs | 0 .../Yi.Framework.Core/Quartz/QuartzInvoker.cs | 0 .../Yi.Framework.Core/RabbitMQInvoker.cs | 0 .../Yi.Framework.Core/SMS/AliyunSMSInvoker.cs | 0 .../Yi.Framework.Core/TreeMenuBuild.cs | 0 .../Yi.Framework.Core.csproj | 0 .../Yi.Framework.DTOModel/ChangePwdDto.cs | 0 .../Yi.Framework.DTOModel/ChildrenDto.cs | 0 .../Yi.Framework.DTOModel/IdsDto.cs | 0 .../Yi.Framework.DTOModel/SettingDto.cs | 0 .../Yi.Framework.DTOModel.csproj | 0 .../InitESIndexWorker.cs | 0 .../Log4net.config | 0 .../Program.cs | 0 .../WarmupESIndexWorker.cs | 0 .../Worker.cs | 0 ...Yi.Framework.ElasticSearchProcessor.csproj | 0 .../Yi.Framework.Interface/IBaseService.cs | 0 .../Yi.Framework.Interface/IMenuService.cs | 0 .../Yi.Framework.Interface/IMouldService.cs | 0 .../Yi.Framework.Interface/IRoleService.cs | 0 .../Yi.Framework.Interface/IUserService.cs | 0 .../Yi.Framework.Interface/T4Iservice.cs | 0 .../Yi.Framework.Interface/T4Iservice.tt | 0 .../Yi - Backup.Framework.Interface.csproj | 0 .../Yi.Framework.Interface.csproj | 0 .../Yi.Framework.MSUnitTest/UnitTest1.cs | 0 .../Yi.Framework.MSUnitTest.csproj | 0 .../BaseModels/baseModel.cs | 0 .../BaseModels/loopModel.cs | 0 .../Yi.Framework.Model/DataContext.cs | 0 .../Migrations/20211106080544_ec1.Designer.cs | 0 .../Migrations/20211106080544_ec1.cs | 0 .../Migrations/20211106080646_ec2.Designer.cs | 0 .../Migrations/20211106080646_ec2.cs | 0 .../20211106082100_yi-1.Designer.cs | 0 .../Migrations/20211106082100_yi-1.cs | 0 .../Migrations/20211106084427_ec3.Designer.cs | 0 .../Migrations/20211106084427_ec3.cs | 0 .../Migrations/20211106110713_ec4.Designer.cs | 0 .../Migrations/20211106110713_ec4.cs | 0 .../Migrations/DataContextModelSnapshot.cs | 0 .../ModelFactory/DbContextExtend.cs | 0 .../ModelFactory/DbContextFactory.cs | 0 .../ModelFactory/IDbContextFactory.cs | 0 .../Yi.Framework.Model/Models/menu.cs | 0 .../Yi.Framework.Model/Models/mould.cs | 0 .../Yi.Framework.Model/Models/role.cs | 0 .../Yi.Framework.Model/Models/user.cs | 0 .../Yi.Framework.Model/Models/visit.cs | 0 .../Yi.Framework.Model/Search/PageResult.cs | 0 .../Search/SearchRequest.cs | 0 .../Yi.Framework.Model/T4DataContext.cs | 0 .../Yi.Framework.Model/T4DataContext.tt | 0 .../Yi - Backup (1).Framework.Model.csproj | 0 .../Yi - Backup.Framework.Model.csproj | 0 .../Yi.Framework.Model.csproj | 0 .../Yi.Framework.OcelotGateway/Log4net.config | 0 .../Yi.Framework.OcelotGateway/Program.cs | 0 .../Yi.Framework.OcelotGateway/Startup.cs | 0 .../Yi.Framework.OcelotGateway/SwaggerDoc.xml | 8 + .../Yi.Framework.OcelotGateway.csproj | 0 .../Controllers/PageDetaiController.cs | 0 .../Yi.Framework.PageDetail/Log4net.config | 0 .../Yi.Framework.PageDetail/Program.cs | 0 .../Yi.Framework.PageDetail/Startup.cs | 0 .../Yi.Framework.PageDetail/SwaggerDoc.xml | 8 + .../Views/PageDetai/Index.cshtml | 0 .../Shared/_ValidationScriptsPartial.cshtml | 0 .../Yi.Framework.PageDetail.csproj | 0 .../Yi.Framework.SMSProcessor/Log4net.config | 0 .../Yi.Framework.SMSProcessor/Program.cs | 0 .../Yi.Framework.SMSProcessor/SendWorker.cs | 0 .../Yi.Framework.SMSProcessor/Worker.cs | 0 .../Yi.Framework.SMSProcessor.csproj | 0 .../Yi.Framework.Service/BaseService.cs | 0 .../Yi.Framework.Service/MenuService.cs | 0 .../Yi.Framework.Service/MouldService.cs | 0 .../Yi.Framework.Service/RoleService.cs | 0 .../Yi.Framework.Service/T4Service.cs | 0 .../Yi.Framework.Service/T4Service.tt | 0 .../Yi.Framework.Service/UserService.cs | 0 .../Yi - Backup.Framework.Service.csproj | 0 .../Yi.Framework.Service.csproj | 0 .../InitPageWorker.cs | 0 .../Log4net.config | 0 .../Program.cs | 0 .../WarmupPageWorker.cs | 0 .../Worker.cs | 0 .../Yi.Framework.StaticPageProcessor.csproj | 1 + .../Yi.Framework.Task/HttpJob.cs | 0 .../Yi.Framework.Task/VisitJob.cs | 0 .../Yi.Framework.Task/Yi.Framework.Job.csproj | 0 .../Yi.Framework.WebCore/Appsettings.cs | 0 .../BuilderExtend/ApolloExtension.cs | 0 .../BuilderExtend/JsonExtension.cs | 0 .../BuilderExtend/JsonFileExtension.cs | 0 .../Yi.Framework.WebCore/CommonExtend.cs | 0 .../FilterExtend/CORSFilter.cs | 0 .../CustomAction2CommitFilterAttribute.cs | 0 .../CustomActionCacheFilterAttribute.cs | 0 .../CustomActionCheckFilterAttribute.cs | 0 .../CustomExceptionFilterAttribute.cs | 0 .../CustomIOCFilterFactoryAttribute.cs | 0 .../CustomResourceFilterAttribute.cs | 0 .../FilterExtend/LogActionFilterAttribute.cs | 0 .../Yi.Framework.WebCore/Init/DataSeed.cs | 0 .../Yi.Framework.WebCore/Init/RedisInit.cs | 0 .../MiddlewareExtend/CAPExtend.cs | 0 .../MiddlewareExtend/ConsulRegiterExtend.cs | 0 .../MiddlewareExtend/CorsExtension.cs | 0 .../MiddlewareExtend/DbExtend.cs | 0 .../MiddlewareExtend/DbSeedInitExtend.cs | 0 .../MiddlewareExtend/ElasticSeachExtend.cs | 0 .../MiddlewareExtend/ErrorHandExtension.cs | 0 .../MiddlewareExtend/HealthCheckExtension.cs | 0 .../MiddlewareExtend/IocExtension.cs | 0 .../MiddlewareExtend/JwtExtension.cs | 0 .../PreOptionRequestExtension.cs | 0 .../MiddlewareExtend/QuartzExtensions.cs | 0 .../MiddlewareExtend/RabbitMQExtension.cs | 0 .../MiddlewareExtend/RedisExtension.cs | 0 .../MiddlewareExtend/RedisInitExtend.cs | 0 .../MiddlewareExtend/SMSExtension.cs | 0 .../MiddlewareExtend/StaticPageExtension.cs | 0 .../MiddlewareExtend/SwaggerExtension.cs | 0 .../Utility/CustomAutofacAop.cs | 0 .../Utility/CustomAutofacModule.cs | 0 .../Utility/CustomHostingStartup.cs | 0 .../Yi.Framework.WebCore.csproj | 0 .../Yi.Framework.sln | 0 .../Controllers/AccountController.cs | 222 +++ .../Controllers/FileController.cs | 92 ++ .../Controllers/JobController.cs | 104 ++ .../Controllers/MenuController.cs | 113 ++ .../Controllers/MouldController.cs | 69 + .../Controllers/RoleController.cs | 106 ++ .../Controllers/SettingController.cs | 60 + .../Controllers/UserController.cs | 147 ++ .../Log4net.config | 65 + .../Yi.Framework.ApiMicroservice/Program.cs | 157 ++ .../SwaggerDoc.xml | 278 ++++ .../Yi.Framework.ApiMicroservice.csproj | 40 + .../wwwroot/Excel/Excel_20211102231510.xlsx | Bin 0 -> 3014 bytes .../wwwroot/Excel/Excel_20211102232113.xlsx | Bin 0 -> 3023 bytes .../0a5221e4-dca6-4d4e-8486-acf86822f2e4.jpg | Bin 0 -> 47955 bytes .../1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg | Bin 0 -> 30394 bytes .../3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg | Bin 0 -> 14035 bytes .../6312706b-7013-4aa5-af3c-0bbb6b3f4804.jpg | Bin 0 -> 5869 bytes .../7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg | Bin 0 -> 30394 bytes .../966200f6-265c-4470-ad20-c91c3d84a1cc.jpg | Bin 0 -> 47955 bytes .../feae1964-04ce-464b-848b-86f2245f3f63.jpeg | Bin 0 -> 18821 bytes .../Controllers/WeatherForecastController.cs | 26 + .../Program.cs | 26 + .../Startup.cs | 59 + .../Yi.Framework.AuthenticationCenter.csproj | 11 + .../Yi.Framework.Common/Const/DbConst.cs | 16 + .../Yi.Framework.Common/Const/FileConst.cs | 14 + .../Yi.Framework.Common/Const/JobConst.cs | 17 + .../Yi.Framework.Common/Const/JwtConst.cs | 12 + .../Yi.Framework.Common/Const/RabbitConst.cs | 15 + .../Yi.Framework.Common/Const/RedisConst.cs | 43 + .../Helper/AssemblyHelper.cs | 22 + .../Helper/Base32Helper.cs | 101 ++ .../Helper/ConsoleHelper.cs | 54 + .../Yi.Framework.Common/Helper/DateHelper.cs | 58 + .../Yi.Framework.Common/Helper/EmailHelper.cs | 125 ++ .../Yi.Framework.Common/Helper/ExcelHelper.cs | 60 + .../Yi.Framework.Common/Helper/FileHelper.cs | 395 +++++ .../Yi.Framework.Common/Helper/HtmlHelper.cs | 24 + .../Yi.Framework.Common/Helper/HttpHelper.cs | 76 + .../Yi.Framework.Common/Helper/IpHelper.cs | 51 + .../Yi.Framework.Common/Helper/JsonHelper.cs | 509 +++++++ .../Yi.Framework.Common/Helper/MD5Hepler.cs | 67 + .../Yi.Framework.Common/Helper/MimeHelper.cs | 244 ++++ .../Yi.Framework.Common/Helper/RSAHelper.cs | 390 +++++ .../Helper/RandomHelper.cs | 99 ++ .../Helper/SerializeHelper.cs | 35 + .../Helper/SnowflakeHelper.cs | 99 ++ .../Helper/StringHelper.cs | 111 ++ .../Helper/UnicodeHelper.cs | 47 + .../Yi.Framework.Common/Helper/UrlHelper.cs | 23 + .../Yi.Framework.Common/Helper/XmlHelper.cs | 51 + .../IOCOptions/ConsulClientOption.cs | 16 + .../IOCOptions/ConsulRegisterOption.cs | 44 + .../IOCOptions/ElasticSearchOptions.cs | 14 + .../IOCOptions/JWTTokenOptions.cs | 32 + .../IOCOptions/KafkaOptions.cs | 14 + .../IOCOptions/MySqlConnOptions.cs | 11 + .../IOCOptions/RabbitMQOptions.cs | 90 ++ .../IOCOptions/RedisConnOptions.cs | 18 + .../IOCOptions/SMSOptions.cs | 18 + .../IOCOptions/SqliteOptions.cs | 14 + .../Models/AxiosUrlsModel.cs | 16 + .../Models/Enum/AgrFlagEnum.cs | 12 + .../Models/Enum/DelFlagEnum.cs | 12 + .../Models/Enum/ShowFlagEnum.cs | 14 + .../Models/Enum/TopFlagEnum.cs | 14 + .../Models/Enum/WriteAndReadEnum.cs | 12 + .../Yi.Framework.Common/Models/JobModel.cs | 13 + .../Yi.Framework.Common/Models/LogModel.cs | 18 + .../Yi.Framework.Common/Models/PageModel.cs | 13 + .../Yi.Framework.Common/Models/Result.cs | 77 + .../Models/SwaggerModel.cs | 19 + .../QueueModel/OrderCreateQueueModel.cs | 41 + .../QueueModel/SKUWarmupQueueModel.cs | 13 + .../QueueModel/SMSQueueModel.cs | 14 + .../QueueModel/SPUCQRSQueueModel.cs | 32 + .../Yi.Framework.Common.csproj | 12 + .../Yi.Framework.Core/CacheClientDB.cs | 1074 ++++++++++++++ .../ClienExtend/AbstractConsulDispatcher.cs | 72 + .../ClienExtend/AverageDispatcher.cs | 45 + .../ClienExtend/PollingDispatcher.cs | 45 + .../ClienExtend/WeightDispatcher.cs | 67 + .../Yi.Framework.Core/ElasticSearchInvoker.cs | 53 + .../Library/Microsoft.Bcl.AsyncInterfaces.dll | Bin 0 -> 14920 bytes .../Library/ServiceStack.Common.dll | Bin 0 -> 1039872 bytes .../Library/ServiceStack.Interfaces.dll | Bin 0 -> 259584 bytes .../Library/ServiceStack.Redis.dll | Bin 0 -> 872960 bytes .../Library/ServiceStack.Text.dll | Bin 0 -> 658944 bytes .../Yi.Framework.Core/MakeJwt.cs | 63 + .../Quartz/MyQuartzFactory.cs | 32 + .../Yi.Framework.Core/Quartz/QuartzInvoker.cs | 150 ++ .../Yi.Framework.Core/RabbitMQInvoker.cs | 257 ++++ .../Yi.Framework.Core/SMS/AliyunSMSInvoker.cs | 46 + .../Yi.Framework.Core/TreeMenuBuild.cs | 108 ++ .../Yi.Framework.Core.csproj | 43 + .../Yi.Framework.DTOModel/ChangePwdDto.cs | 15 + .../Yi.Framework.DTOModel/ChildrenDto.cs | 14 + .../Yi.Framework.DTOModel/IdsDto.cs | 23 + .../Yi.Framework.DTOModel/SettingDto.cs | 16 + .../Yi.Framework.DTOModel.csproj | 11 + .../InitESIndexWorker.cs | 84 ++ .../Log4net.config | 65 + .../Program.cs | 68 + .../WarmupESIndexWorker.cs | 79 + .../Worker.cs | 29 + ...Yi.Framework.ElasticSearchProcessor.csproj | 36 + .../Yi.Framework.Interface/IBaseService.cs | 87 ++ .../Yi.Framework.Interface/IMenuService.cs | 43 + .../Yi.Framework.Interface/IMouldService.cs | 22 + .../Yi.Framework.Interface/IRoleService.cs | 47 + .../Yi.Framework.Interface/IUserService.cs | 71 + .../Yi.Framework.Interface/T4Iservice.cs | 40 + .../Yi.Framework.Interface/T4Iservice.tt | 43 + .../Yi - Backup.Framework.Interface.csproj | 19 + .../Yi.Framework.Interface.csproj | 42 + .../Yi.Framework.MSUnitTest/UnitTest1.cs | 13 + .../Yi.Framework.MSUnitTest.csproj | 19 + .../BaseModels/baseModel.cs | 18 + .../BaseModels/loopModel.cs | 15 + .../Yi.Framework.Model/DataContext.cs | 55 + .../Migrations/20211106080544_ec1.Designer.cs | 219 +++ .../Migrations/20211106080544_ec1.cs | 17 + .../Migrations/20211106080646_ec2.Designer.cs | 732 ++++++++++ .../Migrations/20211106080646_ec2.cs | 436 ++++++ .../20211106082100_yi-1.Designer.cs | 248 ++++ .../Migrations/20211106082100_yi-1.cs | 231 +++ .../Migrations/20211106084427_ec3.Designer.cs | 770 ++++++++++ .../Migrations/20211106084427_ec3.cs | 1265 +++++++++++++++++ .../Migrations/20211106110713_ec4.Designer.cs | 799 +++++++++++ .../Migrations/20211106110713_ec4.cs | 161 +++ .../Migrations/DataContextModelSnapshot.cs | 797 +++++++++++ .../ModelFactory/DbContextExtend.cs | 23 + .../ModelFactory/DbContextFactory.cs | 100 ++ .../ModelFactory/IDbContextFactory.cs | 13 + .../Yi.Framework.Model/Models/menu.cs | 23 + .../Yi.Framework.Model/Models/mould.cs | 14 + .../Yi.Framework.Model/Models/role.cs | 18 + .../Yi.Framework.Model/Models/user.cs | 27 + .../Yi.Framework.Model/Models/visit.cs | 14 + .../Yi.Framework.Model/Search/PageResult.cs | 20 + .../Search/SearchRequest.cs | 39 + .../Yi.Framework.Model/T4DataContext.cs | 18 + .../Yi.Framework.Model/T4DataContext.tt | 40 + .../Yi - Backup (1).Framework.Model.csproj | 59 + .../Yi - Backup.Framework.Model.csproj | 23 + .../Yi.Framework.Model.csproj | 59 + .../Yi.Framework.OcelotGateway/Log4net.config | 65 + .../Yi.Framework.OcelotGateway/Program.cs | 42 + .../Yi.Framework.OcelotGateway/Startup.cs | 80 ++ .../Yi.Framework.OcelotGateway/SwaggerDoc.xml | 8 + .../Yi.Framework.OcelotGateway.csproj | 23 + .../Yi.Framework.SMSProcessor/Log4net.config | 65 + .../Yi.Framework.SMSProcessor/Program.cs | 77 + .../Yi.Framework.SMSProcessor/SendWorker.cs | 68 + .../Yi.Framework.SMSProcessor/Worker.cs | 32 + .../Yi.Framework.SMSProcessor.csproj | 38 + .../Yi.Framework.Service/BaseService.cs | 136 ++ .../Yi.Framework.Service/MenuService.cs | 73 + .../Yi.Framework.Service/MouldService.cs | 25 + .../Yi.Framework.Service/RoleService.cs | 65 + .../Yi.Framework.Service/T4Service.cs | 103 ++ .../Yi.Framework.Service/T4Service.tt | 58 + .../Yi.Framework.Service/UserService.cs | 104 ++ .../Yi - Backup.Framework.Service.csproj | 20 + .../Yi.Framework.Service.csproj | 44 + .../Yi.Framework.Task/HttpJob.cs | 44 + .../Yi.Framework.Task/VisitJob.cs | 43 + .../Yi.Framework.Task/Yi.Framework.Job.csproj | 16 + .../Yi.Framework.WebCore/Appsettings.cs | 92 ++ .../BuilderExtend/ApolloExtension.cs | 64 + .../BuilderExtend/JsonExtension.cs | 22 + .../BuilderExtend/JsonFileExtension.cs | 32 + .../Yi.Framework.WebCore/CommonExtend.cs | 61 + .../FilterExtend/CORSFilter.cs | 21 + .../CustomAction2CommitFilterAttribute.cs | 83 ++ .../CustomActionCacheFilterAttribute.cs | 33 + .../CustomActionCheckFilterAttribute.cs | 42 + .../CustomExceptionFilterAttribute.cs | 44 + .../CustomIOCFilterFactoryAttribute.cs | 31 + .../CustomResourceFilterAttribute.cs | 45 + .../FilterExtend/LogActionFilterAttribute.cs | 83 ++ .../Yi.Framework.WebCore/Init/DataSeed.cs | 258 ++++ .../Yi.Framework.WebCore/Init/RedisInit.cs | 31 + .../MiddlewareExtend/CAPExtend.cs | 59 + .../MiddlewareExtend/ConsulRegiterExtend.cs | 61 + .../MiddlewareExtend/CorsExtension.cs | 39 + .../MiddlewareExtend/DbExtend.cs | 24 + .../MiddlewareExtend/DbSeedInitExtend.cs | 36 + .../MiddlewareExtend/ElasticSeachExtend.cs | 27 + .../MiddlewareExtend/ErrorHandExtension.cs | 82 ++ .../MiddlewareExtend/HealthCheckExtension.cs | 39 + .../MiddlewareExtend/IocExtension.cs | 31 + .../MiddlewareExtend/JwtExtension.cs | 39 + .../PreOptionRequestExtension.cs | 47 + .../MiddlewareExtend/QuartzExtensions.cs | 34 + .../MiddlewareExtend/RabbitMQExtension.cs | 27 + .../MiddlewareExtend/RedisExtension.cs | 26 + .../MiddlewareExtend/RedisInitExtend.cs | 37 + .../MiddlewareExtend/SMSExtension.cs | 29 + .../MiddlewareExtend/StaticPageExtension.cs | 156 ++ .../MiddlewareExtend/SwaggerExtension.cs | 124 ++ .../Utility/CustomAutofacAop.cs | 21 + .../Utility/CustomAutofacModule.cs | 88 ++ .../Utility/CustomHostingStartup.cs | 54 + .../Yi.Framework.WebCore.csproj | 34 + Yi.Framework.Net6/Yi.Framework.sln | 129 ++ .../Properties/launchSettings.json | 31 - .../Properties/launchSettings.json | 31 - .../appsettings.Development.json | 9 - .../appsettings.json | 10 - .../configuration.json | 8 - .../Properties/launchSettings.json | 31 - .../appsettings.Development.json | 9 - .../appsettings.json | 21 - .../configuration.json | 432 ------ .../Properties/launchSettings.json | 31 - .../appsettings.Development.json | 9 - .../appsettings.json | 45 - .../appsettings.Development.json | 9 - .../appsettings.json | 36 - 443 files changed, 17839 insertions(+), 712 deletions(-) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Controllers/FileController.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Controllers/JobController.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Controllers/UserController.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Log4net.config (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Program.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Startup.cs (100%) create mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/SwaggerDoc.xml rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/wwwroot/image/0a5221e4-dca6-4d4e-8486-acf86822f2e4.jpg (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/wwwroot/image/1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/wwwroot/image/3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/wwwroot/image/6312706b-7013-4aa5-af3c-0bbb6b3f4804.jpg (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/wwwroot/image/7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/wwwroot/image/966200f6-265c-4470-ad20-c91c3d84a1cc.jpg (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ApiMicroservice/wwwroot/image/feae1964-04ce-464b-848b-86f2245f3f63.jpeg (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.AuthenticationCenter/Program.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.AuthenticationCenter/Startup.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Const/DbConst.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Const/FileConst.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Const/JobConst.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Const/JwtConst.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Const/RabbitConst.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Const/RedisConst.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/AssemblyHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/Base32Helper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/ConsoleHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/DateHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/EmailHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/ExcelHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/FileHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/HtmlHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/HttpHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/IpHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/JsonHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/MD5Hepler.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/MimeHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/RSAHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/RandomHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/SerializeHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/SnowflakeHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/StringHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/UnicodeHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/UrlHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Helper/XmlHelper.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/IOCOptions/KafkaOptions.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/IOCOptions/SMSOptions.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/IOCOptions/SqliteOptions.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/AxiosUrlsModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/JobModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/LogModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/PageModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/Result.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Models/SwaggerModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/QueueModel/SMSQueueModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Common/Yi.Framework.Common.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/CacheClientDB.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/ElasticSearchInvoker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/Library/ServiceStack.Common.dll (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/Library/ServiceStack.Interfaces.dll (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/Library/ServiceStack.Redis.dll (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/Library/ServiceStack.Text.dll (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/MakeJwt.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/Quartz/MyQuartzFactory.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/Quartz/QuartzInvoker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/RabbitMQInvoker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/SMS/AliyunSMSInvoker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/TreeMenuBuild.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Core/Yi.Framework.Core.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.DTOModel/ChangePwdDto.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.DTOModel/ChildrenDto.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.DTOModel/IdsDto.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.DTOModel/SettingDto.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.DTOModel/Yi.Framework.DTOModel.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ElasticSearchProcessor/InitESIndexWorker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ElasticSearchProcessor/Log4net.config (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ElasticSearchProcessor/Program.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ElasticSearchProcessor/WarmupESIndexWorker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ElasticSearchProcessor/Worker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.ElasticSearchProcessor/Yi.Framework.ElasticSearchProcessor.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Interface/IBaseService.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Interface/IMenuService.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Interface/IMouldService.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Interface/IRoleService.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Interface/IUserService.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Interface/T4Iservice.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Interface/T4Iservice.tt (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Interface/Yi - Backup.Framework.Interface.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Interface/Yi.Framework.Interface.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.MSUnitTest/UnitTest1.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.MSUnitTest/Yi.Framework.MSUnitTest.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/BaseModels/baseModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/BaseModels/loopModel.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/DataContext.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/20211106080544_ec1.Designer.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/20211106080544_ec1.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/20211106080646_ec2.Designer.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/20211106080646_ec2.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/20211106082100_yi-1.Designer.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/20211106082100_yi-1.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/20211106084427_ec3.Designer.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/20211106084427_ec3.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/20211106110713_ec4.Designer.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/20211106110713_ec4.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Migrations/DataContextModelSnapshot.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/ModelFactory/DbContextExtend.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/ModelFactory/DbContextFactory.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/ModelFactory/IDbContextFactory.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Models/menu.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Models/mould.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Models/role.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Models/user.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Models/visit.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Search/PageResult.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Search/SearchRequest.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/T4DataContext.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/T4DataContext.tt (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Yi - Backup (1).Framework.Model.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Yi - Backup.Framework.Model.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Model/Yi.Framework.Model.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.OcelotGateway/Log4net.config (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.OcelotGateway/Program.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.OcelotGateway/Startup.cs (100%) create mode 100644 Yi.Framework.Net5/Yi.Framework.OcelotGateway/SwaggerDoc.xml rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.OcelotGateway/Yi.Framework.OcelotGateway.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.PageDetail/Controllers/PageDetaiController.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.PageDetail/Log4net.config (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.PageDetail/Program.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.PageDetail/Startup.cs (100%) create mode 100644 Yi.Framework.Net5/Yi.Framework.PageDetail/SwaggerDoc.xml rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.PageDetail/Views/PageDetai/Index.cshtml (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.PageDetail/Views/Shared/_ValidationScriptsPartial.cshtml (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.PageDetail/Yi.Framework.PageDetail.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.SMSProcessor/Log4net.config (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.SMSProcessor/Program.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.SMSProcessor/SendWorker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.SMSProcessor/Worker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.SMSProcessor/Yi.Framework.SMSProcessor.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Service/BaseService.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Service/MenuService.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Service/MouldService.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Service/RoleService.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Service/T4Service.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Service/T4Service.tt (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Service/UserService.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Service/Yi - Backup.Framework.Service.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Service/Yi.Framework.Service.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.StaticPageProcessor/InitPageWorker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.StaticPageProcessor/Log4net.config (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.StaticPageProcessor/Program.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.StaticPageProcessor/WarmupPageWorker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.StaticPageProcessor/Worker.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj (94%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Task/HttpJob.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Task/VisitJob.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.Task/Yi.Framework.Job.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/Appsettings.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/BuilderExtend/JsonFileExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/CommonExtend.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/FilterExtend/CORSFilter.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/FilterExtend/CustomAction2CommitFilterAttribute.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/FilterExtend/CustomActionCacheFilterAttribute.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/FilterExtend/CustomActionCheckFilterAttribute.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/Init/DataSeed.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/Init/RedisInit.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/CAPExtend.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegiterExtend.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/CorsExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/DbExtend.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/DbSeedInitExtend.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/ElasticSeachExtend.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/ErrorHandExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/HealthCheckExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/IocExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/JwtExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/PreOptionRequestExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/QuartzExtensions.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/RabbitMQExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/RedisExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/RedisInitExtend.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/SMSExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/Utility/CustomAutofacAop.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/Utility/CustomAutofacModule.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/Utility/CustomHostingStartup.cs (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj (100%) rename {Yi.Framework => Yi.Framework.Net5}/Yi.Framework.sln (100%) create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/FileController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/JobController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/UserController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Log4net.config create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/SwaggerDoc.xml create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/0a5221e4-dca6-4d4e-8486-acf86822f2e4.jpg create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/6312706b-7013-4aa5-af3c-0bbb6b3f4804.jpg create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/966200f6-265c-4470-ad20-c91c3d84a1cc.jpg create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/feae1964-04ce-464b-848b-86f2245f3f63.jpeg create mode 100644 Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Program.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Startup.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Const/DbConst.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Const/FileConst.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Const/JobConst.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Const/JwtConst.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Const/RabbitConst.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Const/RedisConst.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/AssemblyHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/Base32Helper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/ConsoleHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/DateHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/EmailHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/ExcelHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/FileHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/HtmlHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/HttpHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/IpHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/JsonHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/MD5Hepler.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/MimeHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/RSAHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/RandomHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/SerializeHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/SnowflakeHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/StringHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/UnicodeHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/UrlHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Helper/XmlHelper.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/KafkaOptions.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/SMSOptions.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/SqliteOptions.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/AxiosUrlsModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/JobModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/LogModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/PageModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/Result.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/SwaggerModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/QueueModel/SMSQueueModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Yi.Framework.Common.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/CacheClientDB.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/ElasticSearchInvoker.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/Library/ServiceStack.Common.dll create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/Library/ServiceStack.Interfaces.dll create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/Library/ServiceStack.Redis.dll create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/Library/ServiceStack.Text.dll create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/MakeJwt.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/Quartz/MyQuartzFactory.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/Quartz/QuartzInvoker.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/RabbitMQInvoker.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/SMS/AliyunSMSInvoker.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/TreeMenuBuild.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Core/Yi.Framework.Core.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.DTOModel/ChangePwdDto.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.DTOModel/ChildrenDto.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.DTOModel/IdsDto.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.DTOModel/SettingDto.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.DTOModel/Yi.Framework.DTOModel.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.ElasticSearchProcessor/InitESIndexWorker.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ElasticSearchProcessor/Log4net.config create mode 100644 Yi.Framework.Net6/Yi.Framework.ElasticSearchProcessor/Program.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ElasticSearchProcessor/WarmupESIndexWorker.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ElasticSearchProcessor/Worker.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ElasticSearchProcessor/Yi.Framework.ElasticSearchProcessor.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/IBaseService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/IMenuService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/IMouldService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/IRoleService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/IUserService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/T4Iservice.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/T4Iservice.tt create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/Yi - Backup.Framework.Interface.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/Yi.Framework.Interface.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.MSUnitTest/UnitTest1.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.MSUnitTest/Yi.Framework.MSUnitTest.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/BaseModels/baseModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/BaseModels/loopModel.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/DataContext.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/20211106080544_ec1.Designer.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/20211106080544_ec1.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/20211106080646_ec2.Designer.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/20211106080646_ec2.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/20211106082100_yi-1.Designer.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/20211106082100_yi-1.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/20211106084427_ec3.Designer.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/20211106084427_ec3.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/20211106110713_ec4.Designer.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/20211106110713_ec4.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Migrations/DataContextModelSnapshot.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/ModelFactory/DbContextExtend.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/ModelFactory/DbContextFactory.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/ModelFactory/IDbContextFactory.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Models/menu.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Models/mould.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Models/role.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Models/user.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Models/visit.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Search/PageResult.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Search/SearchRequest.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/T4DataContext.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/T4DataContext.tt create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Yi - Backup (1).Framework.Model.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Yi - Backup.Framework.Model.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/Yi.Framework.Model.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.OcelotGateway/Log4net.config create mode 100644 Yi.Framework.Net6/Yi.Framework.OcelotGateway/Program.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.OcelotGateway/Startup.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.OcelotGateway/SwaggerDoc.xml create mode 100644 Yi.Framework.Net6/Yi.Framework.OcelotGateway/Yi.Framework.OcelotGateway.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.SMSProcessor/Log4net.config create mode 100644 Yi.Framework.Net6/Yi.Framework.SMSProcessor/Program.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.SMSProcessor/SendWorker.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.SMSProcessor/Worker.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.SMSProcessor/Yi.Framework.SMSProcessor.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/BaseService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/MenuService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/MouldService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/RoleService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/T4Service.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/T4Service.tt create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/UserService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/Yi - Backup.Framework.Service.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/Yi.Framework.Service.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.Task/HttpJob.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Task/VisitJob.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Task/Yi.Framework.Job.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/Appsettings.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/JsonFileExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/CommonExtend.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CORSFilter.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomAction2CommitFilterAttribute.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomActionCacheFilterAttribute.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomActionCheckFilterAttribute.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/Init/DataSeed.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/Init/RedisInit.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/CAPExtend.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegiterExtend.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/CorsExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/DbExtend.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/DbSeedInitExtend.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/ElasticSeachExtend.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/ErrorHandExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/HealthCheckExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/IocExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/JwtExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/PreOptionRequestExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/QuartzExtensions.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/RabbitMQExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/RedisExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/RedisInitExtend.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SMSExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/Utility/CustomAutofacAop.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/Utility/CustomAutofacModule.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/Utility/CustomHostingStartup.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj create mode 100644 Yi.Framework.Net6/Yi.Framework.sln delete mode 100644 Yi.Framework/Yi.Framework.ApiMicroservice/Properties/launchSettings.json delete mode 100644 Yi.Framework/Yi.Framework.AuthenticationCenter/Properties/launchSettings.json delete mode 100644 Yi.Framework/Yi.Framework.AuthenticationCenter/appsettings.Development.json delete mode 100644 Yi.Framework/Yi.Framework.AuthenticationCenter/appsettings.json delete mode 100644 Yi.Framework/Yi.Framework.ElasticSearchProcessor/configuration.json delete mode 100644 Yi.Framework/Yi.Framework.OcelotGateway/Properties/launchSettings.json delete mode 100644 Yi.Framework/Yi.Framework.OcelotGateway/appsettings.Development.json delete mode 100644 Yi.Framework/Yi.Framework.OcelotGateway/appsettings.json delete mode 100644 Yi.Framework/Yi.Framework.OcelotGateway/configuration.json delete mode 100644 Yi.Framework/Yi.Framework.PageDetail/Properties/launchSettings.json delete mode 100644 Yi.Framework/Yi.Framework.SMSProcessor/appsettings.Development.json delete mode 100644 Yi.Framework/Yi.Framework.SMSProcessor/appsettings.json delete mode 100644 Yi.Framework/Yi.Framework.StaticPageProcessor/appsettings.Development.json delete mode 100644 Yi.Framework/Yi.Framework.StaticPageProcessor/appsettings.json diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/FileController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/FileController.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/FileController.cs rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/FileController.cs diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/JobController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/JobController.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/JobController.cs rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/JobController.cs diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/UserController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/UserController.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Controllers/UserController.cs rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/UserController.cs diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Log4net.config b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Log4net.config similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Log4net.config rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Log4net.config diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Program.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Program.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Program.cs rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Program.cs diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Startup.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Startup.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Startup.cs rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Startup.cs diff --git a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/SwaggerDoc.xml b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/SwaggerDoc.xml new file mode 100644 index 00000000..3173de6a --- /dev/null +++ b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/SwaggerDoc.xml @@ -0,0 +1,278 @@ + + + + Yi.Framework.ApiMicroservice + + + + + 登录方法,要返回data:{user,token} token + + + + + + + 不用写,单纯制作日志 + + + + + + code为验证码,从redis中判断一下code是否正确 + + + + + + + + 发送短信,需要将生成的sms+code存入redis + + + + + + + 发送邮箱,需要先到数据库判断该邮箱是否被人注册过,到userservice写mail_exist方法,还有接口别忘了。 + + + + + + + 修改密码 + + + + + + + 该方法不对外暴露 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 这个是要递归的,但是要过滤掉删除的,所以,可以写一个通用过滤掉删除的方法 + + + + + + 更 + + + + + + + 删 + + + + + + + 增 + 现在,top菜单只允许为一个 + + + + + + + 给一个菜单设置一个接口,Id1为菜单id,Id2为接口id + 用于给菜单设置接口 + + + + + + + 给一个菜单添加子节点(注意:添加,不是覆盖) + + + + + + + 获取用户的目录菜单,不包含接口 + 用于账户信息页面,显示这个用户有哪些菜单,需要并列 + + + + + + 更 + + + + + + + 删 + + + + + + + 增 + + + + + + + 更 + + + + + + + 删 + + + + + + + 增 + + + + + + + 根据用户id得到该用户有哪些角色 + 用于显示用户详情中的角色说明 + + + + + + 给角色设置菜单,多个角色与多个菜单,让每一个角色都设置,ids1为角色,ids2为菜单 + 用于设置角色 + + + + + + + 用于给角色设置菜单的时候,点击一个角色,显示这个角色拥有的并列的菜单 + + + + + + + 查 + + + + + + 更 + + + + + + + 查 + + + + + + 更 + + + + + + + 删 + + + + + + + 增 + + + + + + + SetRoleByUser + 给多个用户设置多个角色,ids有用户id与 角色列表ids,多对多,ids1用户,ids2为角色 + 用户设置给用户设置角色 + + + + + + + 根据http上下文的用户得到该用户信息,关联角色 + 用于显示账号信息页中的用户信息和角色信息 + + + + + + 得到登录用户的递归菜单,放到导航栏 + 用户放到导航栏中 + + + + + + 得到请求模型 + + + + + + diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/0a5221e4-dca6-4d4e-8486-acf86822f2e4.jpg b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/0a5221e4-dca6-4d4e-8486-acf86822f2e4.jpg similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/0a5221e4-dca6-4d4e-8486-acf86822f2e4.jpg rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/0a5221e4-dca6-4d4e-8486-acf86822f2e4.jpg diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/6312706b-7013-4aa5-af3c-0bbb6b3f4804.jpg b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/6312706b-7013-4aa5-af3c-0bbb6b3f4804.jpg similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/6312706b-7013-4aa5-af3c-0bbb6b3f4804.jpg rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/6312706b-7013-4aa5-af3c-0bbb6b3f4804.jpg diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/966200f6-265c-4470-ad20-c91c3d84a1cc.jpg b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/966200f6-265c-4470-ad20-c91c3d84a1cc.jpg similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/966200f6-265c-4470-ad20-c91c3d84a1cc.jpg rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/966200f6-265c-4470-ad20-c91c3d84a1cc.jpg diff --git a/Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/feae1964-04ce-464b-848b-86f2245f3f63.jpeg b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/feae1964-04ce-464b-848b-86f2245f3f63.jpeg similarity index 100% rename from Yi.Framework/Yi.Framework.ApiMicroservice/wwwroot/image/feae1964-04ce-464b-848b-86f2245f3f63.jpeg rename to Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/feae1964-04ce-464b-848b-86f2245f3f63.jpeg diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs b/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs similarity index 100% rename from Yi.Framework/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs rename to Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/Program.cs b/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Program.cs similarity index 100% rename from Yi.Framework/Yi.Framework.AuthenticationCenter/Program.cs rename to Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Program.cs diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/Startup.cs b/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Startup.cs similarity index 100% rename from Yi.Framework/Yi.Framework.AuthenticationCenter/Startup.cs rename to Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Startup.cs diff --git a/Yi.Framework/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj b/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj rename to Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj diff --git a/Yi.Framework/Yi.Framework.Common/Const/DbConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/DbConst.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Const/DbConst.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Const/DbConst.cs diff --git a/Yi.Framework/Yi.Framework.Common/Const/FileConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/FileConst.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Const/FileConst.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Const/FileConst.cs diff --git a/Yi.Framework/Yi.Framework.Common/Const/JobConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/JobConst.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Const/JobConst.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Const/JobConst.cs diff --git a/Yi.Framework/Yi.Framework.Common/Const/JwtConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/JwtConst.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Const/JwtConst.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Const/JwtConst.cs diff --git a/Yi.Framework/Yi.Framework.Common/Const/RabbitConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/RabbitConst.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Const/RabbitConst.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Const/RabbitConst.cs diff --git a/Yi.Framework/Yi.Framework.Common/Const/RedisConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/RedisConst.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Const/RedisConst.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Const/RedisConst.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/AssemblyHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/AssemblyHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/AssemblyHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/AssemblyHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/Base32Helper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/Base32Helper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/Base32Helper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/Base32Helper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/ConsoleHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/ConsoleHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/ConsoleHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/ConsoleHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/DateHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/DateHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/DateHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/DateHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/EmailHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/EmailHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/EmailHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/EmailHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/ExcelHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/ExcelHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/ExcelHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/ExcelHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/FileHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/FileHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/FileHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/FileHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/HtmlHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/HtmlHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/HtmlHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/HtmlHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/HttpHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/HttpHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/HttpHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/HttpHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/IpHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/IpHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/IpHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/IpHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/JsonHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/JsonHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/JsonHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/JsonHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/MD5Hepler.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/MD5Hepler.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/MD5Hepler.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/MD5Hepler.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/MimeHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/MimeHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/MimeHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/MimeHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/RSAHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/RSAHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/RSAHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/RSAHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/RandomHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/RandomHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/RandomHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/RandomHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/SerializeHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/SerializeHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/SerializeHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/SerializeHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/SnowflakeHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/SnowflakeHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/SnowflakeHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/SnowflakeHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/StringHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/StringHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/StringHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/StringHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/UnicodeHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/UnicodeHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/UnicodeHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/UnicodeHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/UrlHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/UrlHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/UrlHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/UrlHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/Helper/XmlHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/XmlHelper.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Helper/XmlHelper.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Helper/XmlHelper.cs diff --git a/Yi.Framework/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs rename to Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs diff --git a/Yi.Framework/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs rename to Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs diff --git a/Yi.Framework/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs rename to Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs diff --git a/Yi.Framework/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs rename to Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs diff --git a/Yi.Framework/Yi.Framework.Common/IOCOptions/KafkaOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/KafkaOptions.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/IOCOptions/KafkaOptions.cs rename to Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/KafkaOptions.cs diff --git a/Yi.Framework/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs rename to Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs diff --git a/Yi.Framework/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs rename to Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs diff --git a/Yi.Framework/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs rename to Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs diff --git a/Yi.Framework/Yi.Framework.Common/IOCOptions/SMSOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/SMSOptions.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/IOCOptions/SMSOptions.cs rename to Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/SMSOptions.cs diff --git a/Yi.Framework/Yi.Framework.Common/IOCOptions/SqliteOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/SqliteOptions.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/IOCOptions/SqliteOptions.cs rename to Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/SqliteOptions.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/AxiosUrlsModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/AxiosUrlsModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/AxiosUrlsModel.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/AxiosUrlsModel.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/JobModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/JobModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/JobModel.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/JobModel.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/LogModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/LogModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/LogModel.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/LogModel.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/PageModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/PageModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/PageModel.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/PageModel.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/Result.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Result.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/Result.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/Result.cs diff --git a/Yi.Framework/Yi.Framework.Common/Models/SwaggerModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/SwaggerModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Models/SwaggerModel.cs rename to Yi.Framework.Net5/Yi.Framework.Common/Models/SwaggerModel.cs diff --git a/Yi.Framework/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs rename to Yi.Framework.Net5/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs diff --git a/Yi.Framework/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs rename to Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs diff --git a/Yi.Framework/Yi.Framework.Common/QueueModel/SMSQueueModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SMSQueueModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/QueueModel/SMSQueueModel.cs rename to Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SMSQueueModel.cs diff --git a/Yi.Framework/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs rename to Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs diff --git a/Yi.Framework/Yi.Framework.Common/Yi.Framework.Common.csproj b/Yi.Framework.Net5/Yi.Framework.Common/Yi.Framework.Common.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.Common/Yi.Framework.Common.csproj rename to Yi.Framework.Net5/Yi.Framework.Common/Yi.Framework.Common.csproj diff --git a/Yi.Framework/Yi.Framework.Core/CacheClientDB.cs b/Yi.Framework.Net5/Yi.Framework.Core/CacheClientDB.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/CacheClientDB.cs rename to Yi.Framework.Net5/Yi.Framework.Core/CacheClientDB.cs diff --git a/Yi.Framework/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs b/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs rename to Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs diff --git a/Yi.Framework/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs b/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs rename to Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs diff --git a/Yi.Framework/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs b/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs rename to Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs diff --git a/Yi.Framework/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs b/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs rename to Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs diff --git a/Yi.Framework/Yi.Framework.Core/ElasticSearchInvoker.cs b/Yi.Framework.Net5/Yi.Framework.Core/ElasticSearchInvoker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/ElasticSearchInvoker.cs rename to Yi.Framework.Net5/Yi.Framework.Core/ElasticSearchInvoker.cs diff --git a/Yi.Framework/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll b/Yi.Framework.Net5/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll similarity index 100% rename from Yi.Framework/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll rename to Yi.Framework.Net5/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll diff --git a/Yi.Framework/Yi.Framework.Core/Library/ServiceStack.Common.dll b/Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Common.dll similarity index 100% rename from Yi.Framework/Yi.Framework.Core/Library/ServiceStack.Common.dll rename to Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Common.dll diff --git a/Yi.Framework/Yi.Framework.Core/Library/ServiceStack.Interfaces.dll b/Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Interfaces.dll similarity index 100% rename from Yi.Framework/Yi.Framework.Core/Library/ServiceStack.Interfaces.dll rename to Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Interfaces.dll diff --git a/Yi.Framework/Yi.Framework.Core/Library/ServiceStack.Redis.dll b/Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Redis.dll similarity index 100% rename from Yi.Framework/Yi.Framework.Core/Library/ServiceStack.Redis.dll rename to Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Redis.dll diff --git a/Yi.Framework/Yi.Framework.Core/Library/ServiceStack.Text.dll b/Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Text.dll similarity index 100% rename from Yi.Framework/Yi.Framework.Core/Library/ServiceStack.Text.dll rename to Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Text.dll diff --git a/Yi.Framework/Yi.Framework.Core/MakeJwt.cs b/Yi.Framework.Net5/Yi.Framework.Core/MakeJwt.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/MakeJwt.cs rename to Yi.Framework.Net5/Yi.Framework.Core/MakeJwt.cs diff --git a/Yi.Framework/Yi.Framework.Core/Quartz/MyQuartzFactory.cs b/Yi.Framework.Net5/Yi.Framework.Core/Quartz/MyQuartzFactory.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/Quartz/MyQuartzFactory.cs rename to Yi.Framework.Net5/Yi.Framework.Core/Quartz/MyQuartzFactory.cs diff --git a/Yi.Framework/Yi.Framework.Core/Quartz/QuartzInvoker.cs b/Yi.Framework.Net5/Yi.Framework.Core/Quartz/QuartzInvoker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/Quartz/QuartzInvoker.cs rename to Yi.Framework.Net5/Yi.Framework.Core/Quartz/QuartzInvoker.cs diff --git a/Yi.Framework/Yi.Framework.Core/RabbitMQInvoker.cs b/Yi.Framework.Net5/Yi.Framework.Core/RabbitMQInvoker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/RabbitMQInvoker.cs rename to Yi.Framework.Net5/Yi.Framework.Core/RabbitMQInvoker.cs diff --git a/Yi.Framework/Yi.Framework.Core/SMS/AliyunSMSInvoker.cs b/Yi.Framework.Net5/Yi.Framework.Core/SMS/AliyunSMSInvoker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/SMS/AliyunSMSInvoker.cs rename to Yi.Framework.Net5/Yi.Framework.Core/SMS/AliyunSMSInvoker.cs diff --git a/Yi.Framework/Yi.Framework.Core/TreeMenuBuild.cs b/Yi.Framework.Net5/Yi.Framework.Core/TreeMenuBuild.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Core/TreeMenuBuild.cs rename to Yi.Framework.Net5/Yi.Framework.Core/TreeMenuBuild.cs diff --git a/Yi.Framework/Yi.Framework.Core/Yi.Framework.Core.csproj b/Yi.Framework.Net5/Yi.Framework.Core/Yi.Framework.Core.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.Core/Yi.Framework.Core.csproj rename to Yi.Framework.Net5/Yi.Framework.Core/Yi.Framework.Core.csproj diff --git a/Yi.Framework/Yi.Framework.DTOModel/ChangePwdDto.cs b/Yi.Framework.Net5/Yi.Framework.DTOModel/ChangePwdDto.cs similarity index 100% rename from Yi.Framework/Yi.Framework.DTOModel/ChangePwdDto.cs rename to Yi.Framework.Net5/Yi.Framework.DTOModel/ChangePwdDto.cs diff --git a/Yi.Framework/Yi.Framework.DTOModel/ChildrenDto.cs b/Yi.Framework.Net5/Yi.Framework.DTOModel/ChildrenDto.cs similarity index 100% rename from Yi.Framework/Yi.Framework.DTOModel/ChildrenDto.cs rename to Yi.Framework.Net5/Yi.Framework.DTOModel/ChildrenDto.cs diff --git a/Yi.Framework/Yi.Framework.DTOModel/IdsDto.cs b/Yi.Framework.Net5/Yi.Framework.DTOModel/IdsDto.cs similarity index 100% rename from Yi.Framework/Yi.Framework.DTOModel/IdsDto.cs rename to Yi.Framework.Net5/Yi.Framework.DTOModel/IdsDto.cs diff --git a/Yi.Framework/Yi.Framework.DTOModel/SettingDto.cs b/Yi.Framework.Net5/Yi.Framework.DTOModel/SettingDto.cs similarity index 100% rename from Yi.Framework/Yi.Framework.DTOModel/SettingDto.cs rename to Yi.Framework.Net5/Yi.Framework.DTOModel/SettingDto.cs diff --git a/Yi.Framework/Yi.Framework.DTOModel/Yi.Framework.DTOModel.csproj b/Yi.Framework.Net5/Yi.Framework.DTOModel/Yi.Framework.DTOModel.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.DTOModel/Yi.Framework.DTOModel.csproj rename to Yi.Framework.Net5/Yi.Framework.DTOModel/Yi.Framework.DTOModel.csproj diff --git a/Yi.Framework/Yi.Framework.ElasticSearchProcessor/InitESIndexWorker.cs b/Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/InitESIndexWorker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ElasticSearchProcessor/InitESIndexWorker.cs rename to Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/InitESIndexWorker.cs diff --git a/Yi.Framework/Yi.Framework.ElasticSearchProcessor/Log4net.config b/Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Log4net.config similarity index 100% rename from Yi.Framework/Yi.Framework.ElasticSearchProcessor/Log4net.config rename to Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Log4net.config diff --git a/Yi.Framework/Yi.Framework.ElasticSearchProcessor/Program.cs b/Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Program.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ElasticSearchProcessor/Program.cs rename to Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Program.cs diff --git a/Yi.Framework/Yi.Framework.ElasticSearchProcessor/WarmupESIndexWorker.cs b/Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/WarmupESIndexWorker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ElasticSearchProcessor/WarmupESIndexWorker.cs rename to Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/WarmupESIndexWorker.cs diff --git a/Yi.Framework/Yi.Framework.ElasticSearchProcessor/Worker.cs b/Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Worker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.ElasticSearchProcessor/Worker.cs rename to Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Worker.cs diff --git a/Yi.Framework/Yi.Framework.ElasticSearchProcessor/Yi.Framework.ElasticSearchProcessor.csproj b/Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Yi.Framework.ElasticSearchProcessor.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.ElasticSearchProcessor/Yi.Framework.ElasticSearchProcessor.csproj rename to Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Yi.Framework.ElasticSearchProcessor.csproj diff --git a/Yi.Framework/Yi.Framework.Interface/IBaseService.cs b/Yi.Framework.Net5/Yi.Framework.Interface/IBaseService.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Interface/IBaseService.cs rename to Yi.Framework.Net5/Yi.Framework.Interface/IBaseService.cs diff --git a/Yi.Framework/Yi.Framework.Interface/IMenuService.cs b/Yi.Framework.Net5/Yi.Framework.Interface/IMenuService.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Interface/IMenuService.cs rename to Yi.Framework.Net5/Yi.Framework.Interface/IMenuService.cs diff --git a/Yi.Framework/Yi.Framework.Interface/IMouldService.cs b/Yi.Framework.Net5/Yi.Framework.Interface/IMouldService.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Interface/IMouldService.cs rename to Yi.Framework.Net5/Yi.Framework.Interface/IMouldService.cs diff --git a/Yi.Framework/Yi.Framework.Interface/IRoleService.cs b/Yi.Framework.Net5/Yi.Framework.Interface/IRoleService.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Interface/IRoleService.cs rename to Yi.Framework.Net5/Yi.Framework.Interface/IRoleService.cs diff --git a/Yi.Framework/Yi.Framework.Interface/IUserService.cs b/Yi.Framework.Net5/Yi.Framework.Interface/IUserService.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Interface/IUserService.cs rename to Yi.Framework.Net5/Yi.Framework.Interface/IUserService.cs diff --git a/Yi.Framework/Yi.Framework.Interface/T4Iservice.cs b/Yi.Framework.Net5/Yi.Framework.Interface/T4Iservice.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Interface/T4Iservice.cs rename to Yi.Framework.Net5/Yi.Framework.Interface/T4Iservice.cs diff --git a/Yi.Framework/Yi.Framework.Interface/T4Iservice.tt b/Yi.Framework.Net5/Yi.Framework.Interface/T4Iservice.tt similarity index 100% rename from Yi.Framework/Yi.Framework.Interface/T4Iservice.tt rename to Yi.Framework.Net5/Yi.Framework.Interface/T4Iservice.tt diff --git a/Yi.Framework/Yi.Framework.Interface/Yi - Backup.Framework.Interface.csproj b/Yi.Framework.Net5/Yi.Framework.Interface/Yi - Backup.Framework.Interface.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.Interface/Yi - Backup.Framework.Interface.csproj rename to Yi.Framework.Net5/Yi.Framework.Interface/Yi - Backup.Framework.Interface.csproj diff --git a/Yi.Framework/Yi.Framework.Interface/Yi.Framework.Interface.csproj b/Yi.Framework.Net5/Yi.Framework.Interface/Yi.Framework.Interface.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.Interface/Yi.Framework.Interface.csproj rename to Yi.Framework.Net5/Yi.Framework.Interface/Yi.Framework.Interface.csproj diff --git a/Yi.Framework/Yi.Framework.MSUnitTest/UnitTest1.cs b/Yi.Framework.Net5/Yi.Framework.MSUnitTest/UnitTest1.cs similarity index 100% rename from Yi.Framework/Yi.Framework.MSUnitTest/UnitTest1.cs rename to Yi.Framework.Net5/Yi.Framework.MSUnitTest/UnitTest1.cs diff --git a/Yi.Framework/Yi.Framework.MSUnitTest/Yi.Framework.MSUnitTest.csproj b/Yi.Framework.Net5/Yi.Framework.MSUnitTest/Yi.Framework.MSUnitTest.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.MSUnitTest/Yi.Framework.MSUnitTest.csproj rename to Yi.Framework.Net5/Yi.Framework.MSUnitTest/Yi.Framework.MSUnitTest.csproj diff --git a/Yi.Framework/Yi.Framework.Model/BaseModels/baseModel.cs b/Yi.Framework.Net5/Yi.Framework.Model/BaseModels/baseModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/BaseModels/baseModel.cs rename to Yi.Framework.Net5/Yi.Framework.Model/BaseModels/baseModel.cs diff --git a/Yi.Framework/Yi.Framework.Model/BaseModels/loopModel.cs b/Yi.Framework.Net5/Yi.Framework.Model/BaseModels/loopModel.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/BaseModels/loopModel.cs rename to Yi.Framework.Net5/Yi.Framework.Model/BaseModels/loopModel.cs diff --git a/Yi.Framework/Yi.Framework.Model/DataContext.cs b/Yi.Framework.Net5/Yi.Framework.Model/DataContext.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/DataContext.cs rename to Yi.Framework.Net5/Yi.Framework.Model/DataContext.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/20211106080544_ec1.Designer.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080544_ec1.Designer.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/20211106080544_ec1.Designer.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080544_ec1.Designer.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/20211106080544_ec1.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080544_ec1.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/20211106080544_ec1.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080544_ec1.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/20211106080646_ec2.Designer.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080646_ec2.Designer.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/20211106080646_ec2.Designer.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080646_ec2.Designer.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/20211106080646_ec2.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080646_ec2.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/20211106080646_ec2.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080646_ec2.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/20211106082100_yi-1.Designer.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106082100_yi-1.Designer.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/20211106082100_yi-1.Designer.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106082100_yi-1.Designer.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/20211106082100_yi-1.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106082100_yi-1.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/20211106082100_yi-1.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106082100_yi-1.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/20211106084427_ec3.Designer.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106084427_ec3.Designer.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/20211106084427_ec3.Designer.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106084427_ec3.Designer.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/20211106084427_ec3.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106084427_ec3.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/20211106084427_ec3.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106084427_ec3.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/20211106110713_ec4.Designer.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106110713_ec4.Designer.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/20211106110713_ec4.Designer.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106110713_ec4.Designer.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/20211106110713_ec4.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106110713_ec4.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/20211106110713_ec4.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106110713_ec4.cs diff --git a/Yi.Framework/Yi.Framework.Model/Migrations/DataContextModelSnapshot.cs b/Yi.Framework.Net5/Yi.Framework.Model/Migrations/DataContextModelSnapshot.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Migrations/DataContextModelSnapshot.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Migrations/DataContextModelSnapshot.cs diff --git a/Yi.Framework/Yi.Framework.Model/ModelFactory/DbContextExtend.cs b/Yi.Framework.Net5/Yi.Framework.Model/ModelFactory/DbContextExtend.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/ModelFactory/DbContextExtend.cs rename to Yi.Framework.Net5/Yi.Framework.Model/ModelFactory/DbContextExtend.cs diff --git a/Yi.Framework/Yi.Framework.Model/ModelFactory/DbContextFactory.cs b/Yi.Framework.Net5/Yi.Framework.Model/ModelFactory/DbContextFactory.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/ModelFactory/DbContextFactory.cs rename to Yi.Framework.Net5/Yi.Framework.Model/ModelFactory/DbContextFactory.cs diff --git a/Yi.Framework/Yi.Framework.Model/ModelFactory/IDbContextFactory.cs b/Yi.Framework.Net5/Yi.Framework.Model/ModelFactory/IDbContextFactory.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/ModelFactory/IDbContextFactory.cs rename to Yi.Framework.Net5/Yi.Framework.Model/ModelFactory/IDbContextFactory.cs diff --git a/Yi.Framework/Yi.Framework.Model/Models/menu.cs b/Yi.Framework.Net5/Yi.Framework.Model/Models/menu.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Models/menu.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Models/menu.cs diff --git a/Yi.Framework/Yi.Framework.Model/Models/mould.cs b/Yi.Framework.Net5/Yi.Framework.Model/Models/mould.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Models/mould.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Models/mould.cs diff --git a/Yi.Framework/Yi.Framework.Model/Models/role.cs b/Yi.Framework.Net5/Yi.Framework.Model/Models/role.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Models/role.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Models/role.cs diff --git a/Yi.Framework/Yi.Framework.Model/Models/user.cs b/Yi.Framework.Net5/Yi.Framework.Model/Models/user.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Models/user.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Models/user.cs diff --git a/Yi.Framework/Yi.Framework.Model/Models/visit.cs b/Yi.Framework.Net5/Yi.Framework.Model/Models/visit.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Models/visit.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Models/visit.cs diff --git a/Yi.Framework/Yi.Framework.Model/Search/PageResult.cs b/Yi.Framework.Net5/Yi.Framework.Model/Search/PageResult.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Search/PageResult.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Search/PageResult.cs diff --git a/Yi.Framework/Yi.Framework.Model/Search/SearchRequest.cs b/Yi.Framework.Net5/Yi.Framework.Model/Search/SearchRequest.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Search/SearchRequest.cs rename to Yi.Framework.Net5/Yi.Framework.Model/Search/SearchRequest.cs diff --git a/Yi.Framework/Yi.Framework.Model/T4DataContext.cs b/Yi.Framework.Net5/Yi.Framework.Model/T4DataContext.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Model/T4DataContext.cs rename to Yi.Framework.Net5/Yi.Framework.Model/T4DataContext.cs diff --git a/Yi.Framework/Yi.Framework.Model/T4DataContext.tt b/Yi.Framework.Net5/Yi.Framework.Model/T4DataContext.tt similarity index 100% rename from Yi.Framework/Yi.Framework.Model/T4DataContext.tt rename to Yi.Framework.Net5/Yi.Framework.Model/T4DataContext.tt diff --git a/Yi.Framework/Yi.Framework.Model/Yi - Backup (1).Framework.Model.csproj b/Yi.Framework.Net5/Yi.Framework.Model/Yi - Backup (1).Framework.Model.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Yi - Backup (1).Framework.Model.csproj rename to Yi.Framework.Net5/Yi.Framework.Model/Yi - Backup (1).Framework.Model.csproj diff --git a/Yi.Framework/Yi.Framework.Model/Yi - Backup.Framework.Model.csproj b/Yi.Framework.Net5/Yi.Framework.Model/Yi - Backup.Framework.Model.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Yi - Backup.Framework.Model.csproj rename to Yi.Framework.Net5/Yi.Framework.Model/Yi - Backup.Framework.Model.csproj diff --git a/Yi.Framework/Yi.Framework.Model/Yi.Framework.Model.csproj b/Yi.Framework.Net5/Yi.Framework.Model/Yi.Framework.Model.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.Model/Yi.Framework.Model.csproj rename to Yi.Framework.Net5/Yi.Framework.Model/Yi.Framework.Model.csproj diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/Log4net.config b/Yi.Framework.Net5/Yi.Framework.OcelotGateway/Log4net.config similarity index 100% rename from Yi.Framework/Yi.Framework.OcelotGateway/Log4net.config rename to Yi.Framework.Net5/Yi.Framework.OcelotGateway/Log4net.config diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/Program.cs b/Yi.Framework.Net5/Yi.Framework.OcelotGateway/Program.cs similarity index 100% rename from Yi.Framework/Yi.Framework.OcelotGateway/Program.cs rename to Yi.Framework.Net5/Yi.Framework.OcelotGateway/Program.cs diff --git a/Yi.Framework/Yi.Framework.OcelotGateway/Startup.cs b/Yi.Framework.Net5/Yi.Framework.OcelotGateway/Startup.cs similarity index 100% rename from Yi.Framework/Yi.Framework.OcelotGateway/Startup.cs rename to Yi.Framework.Net5/Yi.Framework.OcelotGateway/Startup.cs diff --git a/Yi.Framework.Net5/Yi.Framework.OcelotGateway/SwaggerDoc.xml b/Yi.Framework.Net5/Yi.Framework.OcelotGateway/SwaggerDoc.xml new file mode 100644 index 00000000..16f3de1b --- /dev/null +++ b/Yi.Framework.Net5/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.Net5/Yi.Framework.OcelotGateway/Yi.Framework.OcelotGateway.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.OcelotGateway/Yi.Framework.OcelotGateway.csproj rename to Yi.Framework.Net5/Yi.Framework.OcelotGateway/Yi.Framework.OcelotGateway.csproj diff --git a/Yi.Framework/Yi.Framework.PageDetail/Controllers/PageDetaiController.cs b/Yi.Framework.Net5/Yi.Framework.PageDetail/Controllers/PageDetaiController.cs similarity index 100% rename from Yi.Framework/Yi.Framework.PageDetail/Controllers/PageDetaiController.cs rename to Yi.Framework.Net5/Yi.Framework.PageDetail/Controllers/PageDetaiController.cs diff --git a/Yi.Framework/Yi.Framework.PageDetail/Log4net.config b/Yi.Framework.Net5/Yi.Framework.PageDetail/Log4net.config similarity index 100% rename from Yi.Framework/Yi.Framework.PageDetail/Log4net.config rename to Yi.Framework.Net5/Yi.Framework.PageDetail/Log4net.config diff --git a/Yi.Framework/Yi.Framework.PageDetail/Program.cs b/Yi.Framework.Net5/Yi.Framework.PageDetail/Program.cs similarity index 100% rename from Yi.Framework/Yi.Framework.PageDetail/Program.cs rename to Yi.Framework.Net5/Yi.Framework.PageDetail/Program.cs diff --git a/Yi.Framework/Yi.Framework.PageDetail/Startup.cs b/Yi.Framework.Net5/Yi.Framework.PageDetail/Startup.cs similarity index 100% rename from Yi.Framework/Yi.Framework.PageDetail/Startup.cs rename to Yi.Framework.Net5/Yi.Framework.PageDetail/Startup.cs diff --git a/Yi.Framework.Net5/Yi.Framework.PageDetail/SwaggerDoc.xml b/Yi.Framework.Net5/Yi.Framework.PageDetail/SwaggerDoc.xml new file mode 100644 index 00000000..f7714016 --- /dev/null +++ b/Yi.Framework.Net5/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.Net5/Yi.Framework.PageDetail/Views/PageDetai/Index.cshtml similarity index 100% rename from Yi.Framework/Yi.Framework.PageDetail/Views/PageDetai/Index.cshtml rename to Yi.Framework.Net5/Yi.Framework.PageDetail/Views/PageDetai/Index.cshtml diff --git a/Yi.Framework/Yi.Framework.PageDetail/Views/Shared/_ValidationScriptsPartial.cshtml b/Yi.Framework.Net5/Yi.Framework.PageDetail/Views/Shared/_ValidationScriptsPartial.cshtml similarity index 100% rename from Yi.Framework/Yi.Framework.PageDetail/Views/Shared/_ValidationScriptsPartial.cshtml rename to Yi.Framework.Net5/Yi.Framework.PageDetail/Views/Shared/_ValidationScriptsPartial.cshtml diff --git a/Yi.Framework/Yi.Framework.PageDetail/Yi.Framework.PageDetail.csproj b/Yi.Framework.Net5/Yi.Framework.PageDetail/Yi.Framework.PageDetail.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.PageDetail/Yi.Framework.PageDetail.csproj rename to Yi.Framework.Net5/Yi.Framework.PageDetail/Yi.Framework.PageDetail.csproj diff --git a/Yi.Framework/Yi.Framework.SMSProcessor/Log4net.config b/Yi.Framework.Net5/Yi.Framework.SMSProcessor/Log4net.config similarity index 100% rename from Yi.Framework/Yi.Framework.SMSProcessor/Log4net.config rename to Yi.Framework.Net5/Yi.Framework.SMSProcessor/Log4net.config diff --git a/Yi.Framework/Yi.Framework.SMSProcessor/Program.cs b/Yi.Framework.Net5/Yi.Framework.SMSProcessor/Program.cs similarity index 100% rename from Yi.Framework/Yi.Framework.SMSProcessor/Program.cs rename to Yi.Framework.Net5/Yi.Framework.SMSProcessor/Program.cs diff --git a/Yi.Framework/Yi.Framework.SMSProcessor/SendWorker.cs b/Yi.Framework.Net5/Yi.Framework.SMSProcessor/SendWorker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.SMSProcessor/SendWorker.cs rename to Yi.Framework.Net5/Yi.Framework.SMSProcessor/SendWorker.cs diff --git a/Yi.Framework/Yi.Framework.SMSProcessor/Worker.cs b/Yi.Framework.Net5/Yi.Framework.SMSProcessor/Worker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.SMSProcessor/Worker.cs rename to Yi.Framework.Net5/Yi.Framework.SMSProcessor/Worker.cs diff --git a/Yi.Framework/Yi.Framework.SMSProcessor/Yi.Framework.SMSProcessor.csproj b/Yi.Framework.Net5/Yi.Framework.SMSProcessor/Yi.Framework.SMSProcessor.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.SMSProcessor/Yi.Framework.SMSProcessor.csproj rename to Yi.Framework.Net5/Yi.Framework.SMSProcessor/Yi.Framework.SMSProcessor.csproj diff --git a/Yi.Framework/Yi.Framework.Service/BaseService.cs b/Yi.Framework.Net5/Yi.Framework.Service/BaseService.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Service/BaseService.cs rename to Yi.Framework.Net5/Yi.Framework.Service/BaseService.cs diff --git a/Yi.Framework/Yi.Framework.Service/MenuService.cs b/Yi.Framework.Net5/Yi.Framework.Service/MenuService.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Service/MenuService.cs rename to Yi.Framework.Net5/Yi.Framework.Service/MenuService.cs diff --git a/Yi.Framework/Yi.Framework.Service/MouldService.cs b/Yi.Framework.Net5/Yi.Framework.Service/MouldService.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Service/MouldService.cs rename to Yi.Framework.Net5/Yi.Framework.Service/MouldService.cs diff --git a/Yi.Framework/Yi.Framework.Service/RoleService.cs b/Yi.Framework.Net5/Yi.Framework.Service/RoleService.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Service/RoleService.cs rename to Yi.Framework.Net5/Yi.Framework.Service/RoleService.cs diff --git a/Yi.Framework/Yi.Framework.Service/T4Service.cs b/Yi.Framework.Net5/Yi.Framework.Service/T4Service.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Service/T4Service.cs rename to Yi.Framework.Net5/Yi.Framework.Service/T4Service.cs diff --git a/Yi.Framework/Yi.Framework.Service/T4Service.tt b/Yi.Framework.Net5/Yi.Framework.Service/T4Service.tt similarity index 100% rename from Yi.Framework/Yi.Framework.Service/T4Service.tt rename to Yi.Framework.Net5/Yi.Framework.Service/T4Service.tt diff --git a/Yi.Framework/Yi.Framework.Service/UserService.cs b/Yi.Framework.Net5/Yi.Framework.Service/UserService.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Service/UserService.cs rename to Yi.Framework.Net5/Yi.Framework.Service/UserService.cs diff --git a/Yi.Framework/Yi.Framework.Service/Yi - Backup.Framework.Service.csproj b/Yi.Framework.Net5/Yi.Framework.Service/Yi - Backup.Framework.Service.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.Service/Yi - Backup.Framework.Service.csproj rename to Yi.Framework.Net5/Yi.Framework.Service/Yi - Backup.Framework.Service.csproj diff --git a/Yi.Framework/Yi.Framework.Service/Yi.Framework.Service.csproj b/Yi.Framework.Net5/Yi.Framework.Service/Yi.Framework.Service.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.Service/Yi.Framework.Service.csproj rename to Yi.Framework.Net5/Yi.Framework.Service/Yi.Framework.Service.csproj diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/InitPageWorker.cs b/Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/InitPageWorker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.StaticPageProcessor/InitPageWorker.cs rename to Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/InitPageWorker.cs diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/Log4net.config b/Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Log4net.config similarity index 100% rename from Yi.Framework/Yi.Framework.StaticPageProcessor/Log4net.config rename to Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Log4net.config diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/Program.cs b/Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Program.cs similarity index 100% rename from Yi.Framework/Yi.Framework.StaticPageProcessor/Program.cs rename to Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Program.cs diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/WarmupPageWorker.cs b/Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/WarmupPageWorker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.StaticPageProcessor/WarmupPageWorker.cs rename to Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/WarmupPageWorker.cs diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/Worker.cs b/Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Worker.cs similarity index 100% rename from Yi.Framework/Yi.Framework.StaticPageProcessor/Worker.cs rename to Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Worker.cs diff --git a/Yi.Framework/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj b/Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj similarity index 94% rename from Yi.Framework/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj rename to Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj index b42904f3..8cb7cd48 100644 --- a/Yi.Framework/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj +++ b/Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj @@ -2,6 +2,7 @@ net5.0 + Exe diff --git a/Yi.Framework/Yi.Framework.Task/HttpJob.cs b/Yi.Framework.Net5/Yi.Framework.Task/HttpJob.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Task/HttpJob.cs rename to Yi.Framework.Net5/Yi.Framework.Task/HttpJob.cs diff --git a/Yi.Framework/Yi.Framework.Task/VisitJob.cs b/Yi.Framework.Net5/Yi.Framework.Task/VisitJob.cs similarity index 100% rename from Yi.Framework/Yi.Framework.Task/VisitJob.cs rename to Yi.Framework.Net5/Yi.Framework.Task/VisitJob.cs diff --git a/Yi.Framework/Yi.Framework.Task/Yi.Framework.Job.csproj b/Yi.Framework.Net5/Yi.Framework.Task/Yi.Framework.Job.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.Task/Yi.Framework.Job.csproj rename to Yi.Framework.Net5/Yi.Framework.Task/Yi.Framework.Job.csproj diff --git a/Yi.Framework/Yi.Framework.WebCore/Appsettings.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/Appsettings.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/Appsettings.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/Appsettings.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/BuilderExtend/JsonFileExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/BuilderExtend/JsonFileExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/BuilderExtend/JsonFileExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/BuilderExtend/JsonFileExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/CommonExtend.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/CommonExtend.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/CommonExtend.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/CommonExtend.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/FilterExtend/CORSFilter.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CORSFilter.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/FilterExtend/CORSFilter.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CORSFilter.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomAction2CommitFilterAttribute.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomAction2CommitFilterAttribute.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomAction2CommitFilterAttribute.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomAction2CommitFilterAttribute.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomActionCacheFilterAttribute.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomActionCacheFilterAttribute.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomActionCacheFilterAttribute.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomActionCacheFilterAttribute.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomActionCheckFilterAttribute.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomActionCheckFilterAttribute.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomActionCheckFilterAttribute.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomActionCheckFilterAttribute.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/Init/DataSeed.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/Init/DataSeed.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/Init/DataSeed.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/Init/DataSeed.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/Init/RedisInit.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/Init/RedisInit.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/Init/RedisInit.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/Init/RedisInit.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/CAPExtend.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/CAPExtend.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/CAPExtend.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/CAPExtend.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegiterExtend.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegiterExtend.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegiterExtend.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegiterExtend.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/CorsExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/CorsExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/CorsExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/CorsExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/DbExtend.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/DbExtend.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/DbExtend.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/DbExtend.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/DbSeedInitExtend.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/DbSeedInitExtend.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/DbSeedInitExtend.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/DbSeedInitExtend.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/ElasticSeachExtend.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/ElasticSeachExtend.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/ElasticSeachExtend.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/ElasticSeachExtend.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/ErrorHandExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/ErrorHandExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/ErrorHandExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/ErrorHandExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/HealthCheckExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/HealthCheckExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/HealthCheckExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/HealthCheckExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/IocExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/IocExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/IocExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/IocExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/JwtExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/JwtExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/JwtExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/JwtExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/PreOptionRequestExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/PreOptionRequestExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/PreOptionRequestExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/PreOptionRequestExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/QuartzExtensions.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/QuartzExtensions.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/QuartzExtensions.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/QuartzExtensions.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/RabbitMQExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/RabbitMQExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/RabbitMQExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/RabbitMQExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/RedisExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/RedisExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/RedisExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/RedisExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/RedisInitExtend.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/RedisInitExtend.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/RedisInitExtend.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/RedisInitExtend.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/SMSExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/SMSExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/SMSExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/SMSExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/Utility/CustomAutofacAop.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/Utility/CustomAutofacAop.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/Utility/CustomAutofacAop.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/Utility/CustomAutofacAop.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/Utility/CustomAutofacModule.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/Utility/CustomAutofacModule.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/Utility/CustomAutofacModule.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/Utility/CustomAutofacModule.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/Utility/CustomHostingStartup.cs b/Yi.Framework.Net5/Yi.Framework.WebCore/Utility/CustomHostingStartup.cs similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/Utility/CustomHostingStartup.cs rename to Yi.Framework.Net5/Yi.Framework.WebCore/Utility/CustomHostingStartup.cs diff --git a/Yi.Framework/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj b/Yi.Framework.Net5/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj similarity index 100% rename from Yi.Framework/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj rename to Yi.Framework.Net5/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj diff --git a/Yi.Framework/Yi.Framework.sln b/Yi.Framework.Net5/Yi.Framework.sln similarity index 100% rename from Yi.Framework/Yi.Framework.sln rename to Yi.Framework.Net5/Yi.Framework.sln diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs new file mode 100644 index 00000000..32d475a2 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs @@ -0,0 +1,222 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common; +using Yi.Framework.Common.Const; +using Yi.Framework.Common.Helper; +using Yi.Framework.Common.Models; +using Yi.Framework.Common.QueueModel; +using Yi.Framework.Core; +using Yi.Framework.DTOModel; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.WebCore; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [ApiController] + [Route("api/[controller]/[action]")] + public class AccountController : Controller + { + private readonly ILogger _logger; + + private IUserService _userService; + private IMenuService _menuService; + private RabbitMQInvoker _rabbitMQInvoker; + private CacheClientDB _cacheClientDB; + private IRoleService _roleService; + private IHttpContextAccessor _httpContext; + public AccountController(ILogger logger, IUserService userService, IMenuService menuService,RabbitMQInvoker rabbitMQInvoker,CacheClientDB cacheClientDB, IRoleService roleService, IHttpContextAccessor httpContext) + { + _logger = logger; + _userService = userService; + _menuService = menuService; + _rabbitMQInvoker = rabbitMQInvoker; + _cacheClientDB = cacheClientDB; + _roleService = roleService; + _httpContext = httpContext; + } + + + /// + /// 登录方法,要返回data:{user,token} token + /// + /// + /// + [HttpPost] + public async Task Login(user _user) + { + var user_data = await _userService.Login(_user); + if (user_data == null) + { + return Result.Error("该用户不存在"); + } + var menuList = await _menuService.GetTopMenuByUserId(user_data.id); + if ( user_data!=null) + { + var token = MakeJwt.app(new jwtUser() {user=user_data,menuIds= menuList}); + + JobModel.visitNum += 1; + return Result.Success().SetData(new { user = new { user_data.id, user_data.username, user_data.introduction, user_data.icon, user_data.nick }, token }); + } + return Result.Error(); + } + + /// + /// 不用写,单纯制作日志 + /// + /// + [HttpPost] + public Result Logout() + { + return Result.Success(); + } + + /// + /// code为验证码,从redis中判断一下code是否正确 + /// + /// + /// + /// + [HttpPost] + public async Task Register(user _user, string code) + { + _user.username=_user.username.Trim(); + if(string.IsNullOrEmpty(_user.username)) + code = code.Trim(); + + string trueCode= _cacheClientDB.Get(RedisConst.keyCode + _user.phone); + if (code == trueCode) + { + //设置默认头像 + var setting = JsonHelper.StrToObj(_cacheClientDB.Get(RedisConst.key)); + _user.icon = setting.InitIcon; + _user.ip = _httpContext.HttpContext.Request.Headers["X-Real-IP"].FirstOrDefault();//通过上下文获取ip + //设置默认角色 + if (string.IsNullOrEmpty(setting.InitRole)) + { + return Result.Error("无默认角色,请初始化数据库"); + } + _user.roles = new List(); + _user.roles.Add(await _roleService.GetEntity(u => u.role_name == setting.InitRole)); + await _userService.Register(_user); + + return Result.Success("恭喜,你已加入我们!"); + } + return Result.Error("验证码有误,请重新输入!"); + } + + + /// + /// 发送短信,需要将生成的sms+code存入redis + /// + /// + /// + [HttpPost] + public async Task SendSMS(string SMSAddress) + { + if (string.IsNullOrEmpty(SMSAddress)) + { + return Result.Error("请输入电话号码"); + } + SMSAddress = SMSAddress.Trim(); + if (!await _userService.PhoneIsExsit(SMSAddress)) + { + SMSQueueModel sMSQueueModel = new SMSQueueModel(); + sMSQueueModel.phone = SMSAddress; + sMSQueueModel.code =RandomHelper.GenerateCheckCodeNum(6); + + //10分钟过期 + _cacheClientDB.Set(RedisConst.keyCode+sMSQueueModel.phone, sMSQueueModel.code, TimeSpan.FromMinutes(10)); + + _rabbitMQInvoker.Send(new Common.IOCOptions.RabbitMQConsumerModel() { ExchangeName = RabbitConst.SMS_Exchange, QueueName = RabbitConst.SMS_Queue_Send }, JsonHelper.ObjToStr(sMSQueueModel)); + return Result.Success("发送短信成功,10分钟后过期,请留意短信接收"); + } + return Result.Error("该号码已被注册"); + } + + /// + /// 发送邮箱,需要先到数据库判断该邮箱是否被人注册过,到userservice写mail_exist方法,还有接口别忘了。 + /// + /// + /// + [HttpPost]//邮箱验证 + public async Task Email(string emailAddress) + { + emailAddress = emailAddress.Trim().ToLower(); + //先判断邮箱是否被注册使用过,如果被使用过,便不让操作 + if (!await _userService.EmailIsExsit(emailAddress)) + { + string code = RandomHelper.GenerateRandomLetter(6); + code = code.ToUpper();//全部转为大写 + EmailHelper.sendMail(code, emailAddress); + + //我要把邮箱和对应的code加进到数据库,还有申请时间 + //设置10分钟过期 + //set不存在便添加,如果存在便替换 + //CacheHelper.SetCache(emailAddress, code, TimeSpan.FromSeconds(10)); + + return Result.Success("发送邮件成功,请查看邮箱(可能在垃圾箱)"); + } + else + { + return Result.Error("该邮箱已被注册"); + } + // 邮箱和验证码都要被记住,然后注册时候比对邮箱和验证码是不是都和现在生成的一样 + } + /// + /// 修改密码 + /// + /// + /// + [HttpPut] + [Authorize] + public async Task ChangePassword(ChangePwdDto pwdDto) + { + var user_data = await _userService.GetUserById(pwdDto.user.id); + string msg = "修改成功"; + if (! string.IsNullOrEmpty( pwdDto.newPassword)) + { + if (user_data.password == pwdDto.user.password) + { + + user_data.password = pwdDto.newPassword; + user_data.phone = pwdDto.user.phone; + user_data.introduction = pwdDto.user.introduction; + user_data.email = pwdDto.user.email; + user_data.age = pwdDto.user.age; + user_data.address = pwdDto.user.address; + user_data.nick = pwdDto.user.nick; + + + await _userService.UpdateAsync(user_data); + user_data.password = null; + return Result.Success(msg); + } + else + { + msg = "密码错误"; + return Result.Error(msg); + } + } + + user_data.phone = pwdDto.user.phone; + user_data.introduction = pwdDto.user.introduction; + user_data.email = pwdDto.user.email; + user_data.age = pwdDto.user.age; + user_data.address = pwdDto.user.address; + user_data.nick = pwdDto.user.nick; + + await _userService.UpdateAsync(user_data); + + + return Result.Success(msg); + } + + } +} \ No newline at end of file diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/FileController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/FileController.cs new file mode 100644 index 00000000..8dcae4c7 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/FileController.cs @@ -0,0 +1,92 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.Interface; +using Yi.Framework.WebCore; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + public class FileController : ControllerBase + { + private IUserService _userService; + private readonly IHostEnvironment _env; + public FileController(IUserService userService, IHostEnvironment env) + { + _userService = userService; + _env = env; + } + [HttpPost] + [Authorize] + public async Task EditIcon(IFormFile file) + { + try + { + var _user = HttpContext.GetCurrentUserInfo(); + var user_data = await _userService.GetUserById(_user.id); + var type = "image"; + var filename = await Upload(type, file); + user_data.icon = filename; + await _userService.UpdateAsync(user_data); + return Result.Success(); + } + catch + { + return Result.Error(); + } + } + + [Route("/api/{type}/{fileName}")] + [HttpGet] + public IActionResult Get(string type, string fileName) + { + try + { + var path = Path.Combine($"wwwroot/{type}", fileName); + var stream = System.IO.File.OpenRead(path); + var MimeType = Common.Helper.MimeHelper.GetMimeMapping(fileName); + return new FileStreamResult(stream, MimeType); + } + catch + { + return new NotFoundResult(); + } + } + + /// + /// 该方法不对外暴露 + /// + /// + /// + /// + private async Task Upload(string type, IFormFile file) + { + string filename = Guid.NewGuid().ToString() + Path.GetExtension(file.FileName); + using (var stream = new FileStream(Path.Combine($"wwwroot/{type}", filename), FileMode.CreateNew, FileAccess.Write)) + { + await file.CopyToAsync(stream); + } + + return filename; + } + + [HttpGet] + public async Task ExportFile() + { + var userdata = await _userService.GetAllEntitiesTrueAsync(); + var userList = userdata.ToList(); + List header = new() { "用户", "密码", "头像", "昵称", "邮箱", "ip", "年龄", "个人介绍", "地址", "手机", "角色" }; + var filename = Common.Helper.ExcelHelper.CreateExcelFromList(userList, header, _env.ContentRootPath.ToString()); + var MimeType = Common.Helper.MimeHelper.GetMimeMapping(filename); + return new FileStreamResult(new FileStream(Path.Combine(_env.ContentRootPath+@"/wwwroot/Excel", filename), FileMode.Open),MimeType); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/JobController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/JobController.cs new file mode 100644 index 00000000..84566713 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/JobController.cs @@ -0,0 +1,104 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common; +using Yi.Framework.Common.Const; +using Yi.Framework.Common.Helper; +using Yi.Framework.Common.Models; +using Yi.Framework.Core; +using Yi.Framework.DTOModel; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [ApiController] + [Route("api/[controller]/[action]")] + public class JobController : Controller + { + private readonly ILogger _logger; + private QuartzInvoker _quartzInvoker; + public JobController(ILogger logger,QuartzInvoker quartzInvoker) + { + _logger = logger; + _quartzInvoker = quartzInvoker; + } + + /// + /// + /// + /// + [HttpPost] + public async Task startJob() + { + //任务1 + //await _quartzInvoker.start("*/1 * * * * ? ", new Quartz.JobKey("test", "my"), "VisitJob"); + + //任务2 + Dictionary data = new Dictionary() + { + {JobConst.method,"get" }, + {JobConst.url,"https://www.baidu.com" } + }; + await _quartzInvoker.start("*/1 * * * * ? ", new Quartz.JobKey("test", "my"), "HttpJob",data: data); + return Result.Success(); + } + + /// + /// + /// + /// + [HttpGet] + public async Task getRunJobList() + { + return Result.Success().SetData(await _quartzInvoker.getRunJobList()); + } + + /// + /// + /// + /// + [HttpGet] + public Result getJobClass() + { + return Result.Success().SetData(_quartzInvoker.getJobClassList()); + } + + /// + /// + /// + /// + [HttpPut] + public async Task stopJob() + { + await _quartzInvoker.Stop(new Quartz.JobKey("test", "my")); + return Result.Success(); + } + + /// + /// + /// + /// + [HttpDelete] + public async Task DeleteJob() + { + await _quartzInvoker.Delete(new Quartz.JobKey("test", "my")); + return Result.Success(); + } + + /// + /// + /// + /// + [HttpPut] + public async Task ResumeJob() + { + await _quartzInvoker.Resume(new Quartz.JobKey("test", "my")); + return Result.Success(); + } + } +} \ No newline at end of file diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs new file mode 100644 index 00000000..ce14e68b --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs @@ -0,0 +1,113 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.DTOModel; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.WebCore; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + [Authorize] + public class MenuController : ControllerBase + { + private IMenuService _menuService; + public MenuController(IMenuService menuService) + { + _menuService = menuService; + } + /// + /// 这个是要递归的,但是要过滤掉删除的,所以,可以写一个通用过滤掉删除的方法 + /// + /// + [HttpGet] + public async Task GetMenuInMould() + { + return Result.Success().SetData(await _menuService.GetMenuInMould()); + } + + /// + /// 更 + /// + /// + /// + [HttpPut] + public async Task UpdateMenu(menu _menu) + { + await _menuService.UpdateAsync(_menu); + return Result.Success(); + + } + + /// + /// 删 + /// + /// + /// + [HttpDelete] + public async Task DelListMenu(List _ids) + { + await _menuService.DelListByUpdateAsync(_ids); + return Result.Success(); + } + + /// + /// 增 + /// 现在,top菜单只允许为一个 + /// + /// + /// + [HttpPost] + public async Task AddTopMenu(menu _menu) + { + await _menuService.AddTopMenu(_menu); + return Result.Success(); + } + + /// + /// 给一个菜单设置一个接口,Id1为菜单id,Id2为接口id + /// 用于给菜单设置接口 + /// + /// + /// + [HttpPost] + public async Task SetMouldByMenu(IdDto idDto) + { + await _menuService.SetMouldByMenu(idDto.id1, idDto.id2); + return Result.Success(); + } + + + /// + /// 给一个菜单添加子节点(注意:添加,不是覆盖) + /// + /// + /// + [HttpPost] + public async Task AddChildrenMenu(ChildrenDto childrenDto) + { + await _menuService.AddChildrenMenu(childrenDto.parentId, childrenDto.data); + return Result.Success(); + } + + /// + /// 获取用户的目录菜单,不包含接口 + /// 用于账户信息页面,显示这个用户有哪些菜单,需要并列 + /// + /// + [HttpGet] + public async Task GetTopMenusByHttpUser() + { + HttpContext.GetCurrentUserInfo(out List menuIds); + + return Result.Success().SetData(await _menuService.GetTopMenusByTopMenuIds(menuIds)); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs new file mode 100644 index 00000000..7c0ee94a --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs @@ -0,0 +1,69 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + [Authorize] + public class MouldController : ControllerBase + { + private IMouldService _mouldService; + public MouldController(IMouldService mouldService) + { + _mouldService = mouldService; + } + [HttpGet] + public async Task GetMould() + { + return Result.Success().SetData(await _mouldService.GetAllEntitiesTrueAsync()); + } + + /// + /// 更 + /// + /// + /// + [HttpPut] + public async Task UpdateMould(mould _mould) + { + await _mouldService.UpdateAsync(_mould); + return Result.Success(); + + } + + /// + /// 删 + /// + /// + /// + [HttpDelete] + public async Task DelListMould(List _ids) + { + await _mouldService.DelListByUpdateAsync(_ids); + return Result.Success(); + } + + /// + /// 增 + /// + /// + /// + [HttpPost] + public async Task AddMould(mould _mould) + { + await _mouldService.AddAsync(_mould); + return Result.Success(); + } + + + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs new file mode 100644 index 00000000..46fe2cc3 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs @@ -0,0 +1,106 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.DTOModel; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.WebCore; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + [Authorize] + public class RoleController : ControllerBase + { + private IRoleService _roleService; + public RoleController(IRoleService roleService) + { + _roleService = roleService; + } + [HttpGet] + public async Task GetRole() + { + return Result.Success().SetData(await _roleService.GetAllEntitiesTrueAsync()); + } + + + /// + /// 更 + /// + /// + /// + [HttpPut] + public async Task UpdateRole(role _role) + { + await _roleService.UpdateAsync(_role); + return Result.Success(); + + } + + /// + /// 删 + /// + /// + /// + [HttpDelete] + public async Task DelListRole(List _ids) + { + await _roleService.DelListByUpdateAsync(_ids); + return Result.Success(); + } + + /// + /// 增 + /// + /// + /// + [HttpPost] + public async Task AddRole(role _role) + { + await _roleService.AddAsync(_role); + return Result.Success(); + } + + /// + /// 根据用户id得到该用户有哪些角色 + /// 用于显示用户详情中的角色说明 + /// + /// + [HttpGet] + public async Task GetRolesByUserId(int userId) + { + + return Result.Success().SetData(await _roleService.GetRolesByUserId(userId)); + } + /// + /// 给角色设置菜单,多个角色与多个菜单,让每一个角色都设置,ids1为角色,ids2为菜单 + /// 用于设置角色 + /// + /// + /// + [HttpPost] + public async Task SetMenuByRole(IdsListDto idsListDto) + { + await _roleService.SetMenusByRolesId(idsListDto.ids2, idsListDto.ids1); + return Result.Success(); + } + /// + /// 用于给角色设置菜单的时候,点击一个角色,显示这个角色拥有的并列的菜单 + /// + /// + /// + [HttpGet] + public async Task GetTopMenusByRoleId(int roleId) + { + + return Result.Success().SetData(await _roleService.GetTopMenusByRoleId(roleId) ); ; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs new file mode 100644 index 00000000..d101bc9d --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs @@ -0,0 +1,60 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Const; +using Yi.Framework.Common.Models; +using Yi.Framework.Core; +using Yi.Framework.DTOModel; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.WebCore; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [ApiController] + [Route("api/[controller]/[action]")] + [Authorize] + public class SettingController : ControllerBase + { + private readonly ILogger _logger; + private readonly CacheClientDB _cacheClientDB; + + public SettingController(ILogger logger, CacheClientDB cacheClientDB) + { + _logger = logger; + _cacheClientDB = cacheClientDB; + } + + + + /// + /// 查 + /// + /// + [HttpGet] + public Result GetSetting() + { + var setDto = Common.Helper.JsonHelper.StrToObj(_cacheClientDB.Get(RedisConst.key)); + return Result.Success().SetData( setDto); + } + + /// + /// 更 + /// + /// + /// + [HttpPut] + public Result UpdateSetting(SettingDto settingDto) + { + var setDto = Common.Helper.JsonHelper.ObjToStr(settingDto); + + _cacheClientDB.Set(RedisConst.key, setDto); + return Result.Success(); + + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/UserController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/UserController.cs new file mode 100644 index 00000000..c552a081 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/UserController.cs @@ -0,0 +1,147 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.DTOModel; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.WebCore; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [ApiController] + [Route("api/[controller]/[action]")] + [Authorize] + public class UserController : ControllerBase + { + private readonly ILogger _logger; + + private IUserService _userService; + public UserController(ILogger logger, IUserService userService) + { + _logger = logger; + _userService = userService; + } + + /// + /// 查 + /// + /// + [HttpGet] + public async Task GetUser() + { + return Result.Success().SetData(await _userService.GetAllEntitiesTrueAsync()); + } + + /// + /// 更 + /// + /// + /// + [HttpPut] + public async Task UpdateUser(user _user) + { + await _userService.UpdateAsync(_user); + return Result.Success(); + + } + + /// + /// 删 + /// + /// + /// + [HttpDelete] + public async Task DelListUser(List _ids) + { + await _userService.DelListByUpdateAsync(_ids); + return Result.Success(); + } + + /// + /// 增 + /// + /// + /// + [HttpPost] + public async Task AddUser(user _user) + { + await _userService.AddAsync(_user); + return Result.Success(); + } + + + /// + /// SetRoleByUser + /// 给多个用户设置多个角色,ids有用户id与 角色列表ids,多对多,ids1用户,ids2为角色 + /// 用户设置给用户设置角色 + /// + /// + /// + [HttpPost] + public async Task SetRoleByUser(IdsListDto idsListDto) + { + await _userService.SetRoleByUser(idsListDto.ids2, idsListDto.ids1); + return Result.Success(); + } + + /// + /// 根据http上下文的用户得到该用户信息,关联角色 + /// 用于显示账号信息页中的用户信息和角色信息 + /// + /// + [HttpGet] + public async Task GetUserInRolesByHttpUser() + { + var _user = HttpContext.GetCurrentUserInfo(); + return Result.Success().SetData( await _userService.GetUserInRolesByHttpUser(_user.id)); + } + + /// + /// 得到登录用户的递归菜单,放到导航栏 + /// 用户放到导航栏中 + /// + /// + [HttpGet] + public async Task GetMenuByHttpUser() + { + HttpContext.GetCurrentUserInfo(out var allMenuIds); + return Result.Success().SetData(await _userService.GetMenuByHttpUser(allMenuIds)); + } + + /// + /// 得到请求模型 + /// + /// + /// + [HttpGet] + public async Task GetAxiosByRouter(string router) + { + + var _user = HttpContext.GetCurrentUserInfo(out List menuIds); + if (menuIds == null) + { + return Result.Error(); + } + var menuList= await _userService.GetAxiosByRouter(router, _user.id, menuIds); + AxiosUrlsModel urlsModel = new(); + menuList.ForEach(u => + { + switch (u.menu_name) + { + case "get":urlsModel.get = u.mould.url;break; + case "del": urlsModel.del = u.mould.url; break; + case "add": urlsModel.add = u.mould.url; break; + case "update": urlsModel.update = u.mould.url; break; + } + }); + + return Result.Success().SetData(urlsModel); + } + + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Log4net.config b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Log4net.config new file mode 100644 index 00000000..958c7e78 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Log4net.config @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs new file mode 100644 index 00000000..6a1ce8a9 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs @@ -0,0 +1,157 @@ +using Autofac.Extensions.DependencyInjection; +using Yi.Framework.WebCore.BuilderExtend; +using Yi.Framework.Core; +using Yi.Framework.Model.ModelFactory; +using Yi.Framework.WebCore.MiddlewareExtend; +using Yi.Framework.WebCore.Utility; +using Autofac; + +var builder = WebApplication.CreateBuilder(args); + +builder.Host.ConfigureAppConfiguration((hostBuilderContext, configurationBuilder) => + { + configurationBuilder.AddCommandLine(args); + configurationBuilder.AddJsonFileService(); + #region + //Apollo + #endregion + configurationBuilder.AddApolloService("Yi"); + }); +builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); +builder.Host.ConfigureContainer(containerBuilder => +{ + #region + //Moduleע + #endregion + containerBuilder.RegisterModule(); +}); +builder.Host.ConfigureLogging(loggingBuilder => + { + loggingBuilder.AddFilter("System", Microsoft.Extensions.Logging.LogLevel.Warning); + loggingBuilder.AddFilter("Microsoft", Microsoft.Extensions.Logging.LogLevel.Warning); + loggingBuilder.AddLog4Net(); + }); +#region +// +//builder.Host.ConfigureWebHostDefaults(webBuilder => +// { +// //webBuilder.UseStartup(); +// }); +#endregion +//----------------------------------------------------------------------------------------------------------- +#region +//Ioc +#endregion +builder.Services.AddIocService(builder.Configuration); + +#region +//Quartz +#endregion +builder.Services.AddQuartzService(); +#region +//+ +#endregion +builder.Services.AddControllers(optios => { + //optios.Filters.Add(typeof(CustomExceptionFilterAttribute)); +}).AddJsonFileService(); +#region +//Swagger +#endregion +builder.Services.AddSwaggerService(); +#region +// +#endregion +builder.Services.AddCorsService(); +#region +//JwtȨ +#endregion +builder.Services.AddJwtService(); +#region +//ݿ +#endregion +builder.Services.AddDbService(); +#region +//Redis +#endregion +builder.Services.AddRedisService(); +#region +//RabbitMQ +#endregion +builder.Services.AddRabbitMQService(); +#region +//ElasticSeach +#endregion +builder.Services.AddElasticSeachService(); +#region +//ŷ +#endregion +builder.Services.AddSMSService(); +#region +//CAP +#endregion +builder.Services.AddCAPService(); +//----------------------------------------------------------------------------------------------------------- +var app = builder.Build(); +//if (app.Environment.IsDevelopment()) +{ + #region + //ҳע + #endregion + app.UseDeveloperExceptionPage(); + #region + //Swaggerע + #endregion + app.UseSwaggerService(); +} +#region +//ץȡע +#endregion +app.UseErrorHandlingService(); +#region +//̬ļע +#endregion +//app.UseStaticFiles(); +#region +//HttpsRedirectionע +#endregion +app.UseHttpsRedirection(); +#region +//·ע +#endregion +app.UseRouting(); +#region +//ע +#endregion +app.UseCorsService(); +#region +//ע +#endregion +app.UseHealthCheckMiddleware(); +#region +//Ȩע +#endregion +app.UseAuthentication(); +#region +//Ȩע +#endregion +app.UseAuthorization(); +#region +//Consulע +#endregion +app.UseConsulService(); +#region +//ݿע +#endregion +app.UseDbSeedInitService(app.Services.GetService()); +#region +//redisע +#endregion +app.UseRedisSeedInitService(app.Services.GetService()); +#region +//Endpointsע +#endregion +app.UseEndpoints(endpoints => +{ + endpoints.MapControllers(); +}); +app.Run(); \ No newline at end of file diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/SwaggerDoc.xml b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/SwaggerDoc.xml new file mode 100644 index 00000000..3173de6a --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/SwaggerDoc.xml @@ -0,0 +1,278 @@ + + + + Yi.Framework.ApiMicroservice + + + + + 登录方法,要返回data:{user,token} token + + + + + + + 不用写,单纯制作日志 + + + + + + code为验证码,从redis中判断一下code是否正确 + + + + + + + + 发送短信,需要将生成的sms+code存入redis + + + + + + + 发送邮箱,需要先到数据库判断该邮箱是否被人注册过,到userservice写mail_exist方法,还有接口别忘了。 + + + + + + + 修改密码 + + + + + + + 该方法不对外暴露 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 这个是要递归的,但是要过滤掉删除的,所以,可以写一个通用过滤掉删除的方法 + + + + + + 更 + + + + + + + 删 + + + + + + + 增 + 现在,top菜单只允许为一个 + + + + + + + 给一个菜单设置一个接口,Id1为菜单id,Id2为接口id + 用于给菜单设置接口 + + + + + + + 给一个菜单添加子节点(注意:添加,不是覆盖) + + + + + + + 获取用户的目录菜单,不包含接口 + 用于账户信息页面,显示这个用户有哪些菜单,需要并列 + + + + + + 更 + + + + + + + 删 + + + + + + + 增 + + + + + + + 更 + + + + + + + 删 + + + + + + + 增 + + + + + + + 根据用户id得到该用户有哪些角色 + 用于显示用户详情中的角色说明 + + + + + + 给角色设置菜单,多个角色与多个菜单,让每一个角色都设置,ids1为角色,ids2为菜单 + 用于设置角色 + + + + + + + 用于给角色设置菜单的时候,点击一个角色,显示这个角色拥有的并列的菜单 + + + + + + + 查 + + + + + + 更 + + + + + + + 查 + + + + + + 更 + + + + + + + 删 + + + + + + + 增 + + + + + + + SetRoleByUser + 给多个用户设置多个角色,ids有用户id与 角色列表ids,多对多,ids1用户,ids2为角色 + 用户设置给用户设置角色 + + + + + + + 根据http上下文的用户得到该用户信息,关联角色 + 用于显示账号信息页中的用户信息和角色信息 + + + + + + 得到登录用户的递归菜单,放到导航栏 + 用户放到导航栏中 + + + + + + 得到请求模型 + + + + + + diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj new file mode 100644 index 00000000..91146868 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj @@ -0,0 +1,40 @@ + + + + net6.0 + enable + + + + D:\CC.Yi\CC.Yi\Yi.Framework\Yi.Framework.ApiMicroservice\SwaggerDoc.xml + 1701;1702;CS1591 + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f1634a6f788bb05251c615f28f2cfc453948c933 GIT binary patch literal 3014 zcmZ`*dpwi-AD_m^b=YA^WSra%wk%E#A%v|uGv<;+V{W6xG`DEC1_1pRNd;Jc6r{{USp6B)a@qWL)pZDkec|LCp8psa;fP{nqQ}uY; zNvn#xP(A=a7YG1I10VorGt#*r!nq(~zUfcRaP9(|!N>4V?B&xKfe2ScX{@a$u(sIiWH2giu?xt|g+odchk!Z6H@Eo1 zME2SZ^vor9BjBLI-2b!Jq4O=+_Txy2I9N(%n+x~sIYriP z)})BJXHaciSpMuhvgj64#V{w8*+2Feh97WBJ}`exM>!pP4Bo3;9b9cc*Ak0Z6*y=d zrBgXS)@#Wc=0NMJeP#Keu=(}6FB<7(1d1tmqQuO=5}}ckw5U`PI(0hxi($*lSP~eQ z6Zv5`W}CRV?1jWio^+}_fkk-Yx&{*b$U548J^xA6xq5?pubZ5+r8ThpcpS~>K^|uHXpLAs#ifJRKkSL$G6wKSyIAH8tc<7^J3de zHKZE@ z{!GSgY8(8P8SFlm79vn!E}3+EG`L|ia&dE|{BR_r=#5Rfm+#rf9VD^;b`OAkdHFc|bZy@(iL+#7G4NV7F6=#gzbd#8&b`8YU>m#rcOj`V4Yb&Qn#_-cr zI0n0Ubh20Wh_jyoF*-tW>Lyr0#HdF%ABS-DXO2j07bOaxUfjzrGXOO$skHTZ?L1AJ@uZbXOC5Lk1PC_$13;8 zov96?d~f_g4g%_3CI=DN>!N4?jN?A-(NvQW6_0~`|w)!n-Z?P zdgnEvh?MotLMvei*%Ciyfakj8m0?UrbDRvZu>`qiu4hg}Zakj2t|+&J$QZWPjw^I# zJ$-y|W13wqvRxtN`$+g(o@K;9008uF+mO8pgdnoce_n_m`X>{8ZWs=+sDqtXu)VHw zLcrQozAxT(uaLoP!A-TqDm7sh?i|}-HoYMRoACCEB7_z{F&@Dgv0PqSG9Kc_*S16n zS%>Ca_LhmJ2IV@`3{Sh=oiG3GysL+$Hl|iJ96z?`5NxZ?5gp8WM>v>)J&er9+EHoRo~}W1;QQ z=riSerr*75Pm8atEdlP!yOe|ftQ!fHYK*v4S{gp`GWLNTSI$3*Iv!O2{-H^J_T-p~ zNgB>h6%N_Wf1A7vE?wZ~uj)LeYOH?v88aA8Zyvv>|4TMbyfrOGya_7SoKOTi#IBnc zG(IBT;Gd~5`64bd9-?uuB{k}#dN*Zx`2#r0B!w-Pv$1qTNH^rwg=Jc9qq&Dvs5_K*vOF0aBN^)vu=9GaLD+)Xw4G7FlBnjZa`sD+5VPb zD9!UC>L1z39Slu;!el1m40W4E!5W0w2>HW@+f)X*43jjZn>bBwd$%=s~^Uz0I}# z{oZH^{3mYa@uXqx?8WuL205LM^+CB&-v;9Qii~gOAk|cp5?5oGOo1k>Lx1XHmFzdb zcC*-dwQ*c{W|`oPlh}8&kb^?~2;?6*BnFG-O%S*_;nkx6d2jW0ij07n{*9~J4O#w7 znb|m`IOT4?MQX36ouYmKN~wI0QFAJ?n=|8Z?>gN?)py@O8DrfuQ4&|N_;4O=xT`Uo zu~~K=E)piMCNR1FEGq;6|J`Yt9fg|EV`HX*b04HrUD-#-9oX*r{pqk_|2hep%IWbk zOv#;}f9;*OF^!M#u>a|Jxk%<){?C&VL9kZkP!DyO&#uDwvE(Vq7gG8%Gg+sv-0u@t zEz%I>E3)s4jLQD%uUErBX*PT|pAZWpF$@MvBoQkb{OCLzMGP|kiEVnd*RZ1D(_htz9gn^NpMaz2aiLI(>@zz2g&|hUh5sJr# zFwReBL~Ck^D!m4CU5x(a@;(!1tLt-tR5HboiTkq0V%#5nQHX}08csS5aQNoJ%%@0i zuB25z_o|58(VIk3cB~t(H`%=2K>phs@3Vmf58I$XpL1S6Y!RXR1iB3l6T%OLuqS|SKrA{vczU}&ExsHeTCJo4)&VT-KbepUs#41Xx$a}`b-m`pBX6g&TZX} zEP56k2szA=K_(AbT+zCTl}M*oAB*t&;4vqQoL+ww=qPzK#YHOv^}=WHD8HJXn2^57 z0kKSK(I>$4*Zo7gXa@RkSK_+58Y=^A2O=jON@m&~KGK|XQDqxTUI_Xmqt7lrxppdG z!NP9RTG!Yh<0a6hZP9jcA%=^3ZJcf3`+k;UiL$9o@-?z~ntVTC9fumXYJ~_kTs6Dr zb{Hxt*+X+mvro(8Xo>3IcEyq*?xU{CxM+$8r`4gXY_%#p}mE=e?b=?jO?MPJ->3W-Gy8 zqq!yF>;!I42wQHvH|bWe3op3xz(3flJ9)P6o2@*T`2Tl^|Jy!0S+@U( uwzAye?J?eI{{AiPgl?actxzkW@6er7gFy@MNC5yr-rdTRcyae%U;hT9Y{@qO literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..428fa1196412c9310c9e52bace461381f3bac677 GIT binary patch literal 3023 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 z zxX+toXWj+53@!$fXKmF|-mE4%3Ei-H>sb?)*xd*nDYJ|Y)xQZ~i%?4X$PCa_Z-D?b zb?YUcezuH%<5c?ffI=!eFeD4NJ;)?LT;>*J!=AX9VAGlFmIGAA6QGVBk3j(0P?E*I zo{@dT_jCAN`-)n-gbDH|{VnJ@VyLH(CN{(*hAF=CqbN^K<$RRz)k6<&J`?z1_P1*5 z-#W>fi)X zteI1DWyGH>M+ay#c7I+yQ0|Bf8`ObhSD4^z8jZ8VsER~Qtx&Ka4K;K7zi!j3)o+vp^Mgz`Ti|HN5pmypyhzIu)LcZ)MB-^X!xNpspG3^q67yIuo(L zdSRCBgOGRlkwsSATKf1RWt+~rjJ#zdeaxhlKo88q6A0TZM`%9Ijf0OV{{j) z@Y*c(K=pWo1Fq&YW6sL)ZZh}pm?1<2is>K5hW~c#{o}zO2AsY#_OSTb?jAsSpi+A5 zHJMhE82wM@+kux%pr)4c8k)@`k4BnyRJg(|Kz{Wd?Z(j9homi$u;TFs1ObV@07j?y zVXoO2hYWogO~|q9k}2wWk{6>dxBq}r4|VP8WK~NxYeGjH{wjtvEbww4#o^O)YilLn zE80j7XP|TV%M>Ie7-vfRnBVt>BT2<8TjiH{ZTSgV}yqi>bQE8knvFDxh= zrj4&~*_ds{2XPC4#_)ROsFlEk2$L28Wxf~Gtj-T+mR9bI8q{DJ#j3xJS&hFU8eIWb zdtzTO-SA))rt%6tzS|m<0Uyi_C$T?$un%seyroTzEx!S+1d1dU41^o`uQ#pwH?~}- z=&x_gow|;#T)il39Yc-QI)uoX7muVPvXmZN!gz|}wwP4g%6dAkaC@v76 zEBOTAB%pTzT8WzTO?jjlnMdmp*~fnwxp)a~>18`wVbd=3$h+WBQq$xKvb`;%@4oUq zfo2=S=(}P%F4=-{Yp)Y8ZIG?wJQU3pQaJ+>zS>gmMwS)syH<20@PyH&Tt|R)^;=&t zA(fNLbBzbo$fs!QwW7Q^%~umpLV>iLwAR^McYr(|Y6B4WX67a>uJxI3=JKc^$1Pnz z7&NWM`PL~itEXkkSV{WH7XPsP*EOZX-TcMcOj!k?B#)&L*~+*fnkN9Qz~`vZBjgX7 zUY$2d42)M4U=G+t-~tsB4eCr+rcmYF%7ImQVT=d^In-TVW)^_-?O|a3GrjejUxv5d z+?jd;B2WObMlEH0rXu@J4pbVze6gy*mLo`_s|a`Xl1XQzKB;RZGm93~blv&J_5azH z?mE})SIi%mGVk?zysi5o3-MM#{86g?^My!AiLuq<%@N=%?p(XT+jjB76x5^`MimDz z>z!sxVC|i3kjocqe)H%@lyu;q$uIZ9_nY`d{JiR%xw1^R5WP5ypmGwHbZ{`U;t(S1 z_&Qe+9$Cobu5bcsa&LH*xU~BIl8I8#aw2XN{mz`HE+sV*tZ)j>dOHSQYuT6_*p6zC z^S5ZzZk`rxw6On3Iji%V5r=$R%N4W>uGds%YsV2zCeU*bsbeAGoOJ$w)RtD3WeDs-_-hOcH7N*(vH)h@Cf;Rctx$rF@2Nk zIbLc>{S>KUpx%1^p5aCpsE51X7MU2lTxmqcNktt7md2m0xgcAc-ftj-NK0|gFkSvd z)3$w-&OO~}+C6ZWp_O@h%DRPxJtXSdDKb?|RCS}mcA+n>9uVd#B;X2csG}cdS1$X> zm^-%%60qE<5uVyzjczTO$>5BWOv#O+@-`Qf)+dYQHAp;AV8nYfNZoe|DInagb0q}A zNZSH~a}pjAlBIlY@n`{24L5bho{(|Glr}3|SgAP1Pxo`4?$F2JW{yM5=UF#Bf;H`z zK7ZKFqS>|!?2;b1#)Y;g>SJxnOI3PDFjCZK-@ce()T;ZNLWlv7Vxw{calbRlQAhS4 zpTb#+F4Ws4JM#`?i`^GSzc0}%$j<3YEjJ-*ihD$mA-ibA>{wr8HYb@+b^S3r4dv9Y=sHi05$`rMmR3xy z7qhgPQDF6X|Hq@Oq#SZmIQl+9zZ4<@*hD*L)^sgP_U1aKb4T4@&D0*s$P1|TH}1x$ zoc=LUwP1-e7$P&0E!-Cu0zcCnpWF1P#TsWik4p>4bbh~NvWC;&0NBOO9UK*NMwChd z=J}lgs^3?vUy_LoS0uvQf;MlrqROU?3BJJ?NIje~x~!|j2@e{SRZ@CutiU*e)sN(Bu`!T68U4v%<9@UYH}r1b+%Q2 zqg6$EG|USazeR;r*cPu0{3K&{o}i|A$2S%2C=+8+7oPO<0|wOs>Hib^Fndsk^A!<; z4`pEbH4>A4z5Bs~eT}R{l9VsB*`T8NgtI)r@6m6ZtyI$VYmKTk9h$1vJpcG5(@Gt) zh^n4e`L{JSQ!(f>eS~ATn97H5rJqTwg_$GIw>D&odpb(*jTm!j0`GTMWbS&6hc~r& zl*`JK%_H`seM+OZ#Pq$yM&Kd*BmYq{|2xyKlR77Cw;=-YqFx-0%8|1I?gW>IKEKy%5-v*wxX~QHeQzM5UinQ=z-*n`->Y-krL(pcrW(^6kA^l0unPV3{ z#~O`CmMb23#`V4quO4H5>F;tO1(_59u7a} z6l*}a6}3yb$@RuJx1^nYLCFm@1C1)oJ-a2eAh||J3{*o5)sl$6S9Uzkqq5)AxO4cv z^VV28WCLpvNzAuyy=G${!GEmxn1R0&_yG!4SIM(It@)N*Z+PBjmLJoHdT8Y032qh= z!@hqH*ZJZyii+G&N2u6c4G|s`6dE;S)DSxUHOtf1$ zKpntDe_XsLkAGSQ+m)L2q6T|+-oM0c4r$xqZ*JwrVp%v! z=Z99N)9&Y}*{Qs&Q>~eBIB{PR#od?bCx55lAlGt>Nx3|OrfB10ESUWm5F+2I-mcSI zh5*J^AILS8i>W!Sm(V<#iySHptuQJl7_>b}({qh#YJ3gn0_dZ|eW7ePDNOsCGIC35 zm4wsiHgh6QTq9~^*J7{L@%OL03@EzRtN{isTtx1-MUIYK1|JBxRr3&Fo>*5BB4 z@W&iBTo?YQg)jeNP+rkJyH{f?i29SCWMuj*ENh;V1~wg*1WE^r{dAz@kT7%N7bxJ% z9iNKxydfJgm%95ohT5DAluGh9Z%X53aQuj%{c}mX7O2oQ=rxDM8`9{R$t8Z>f+k_J zUd`567GB*A3*jGi)wDPNV)9(m-njj9rFnAc0Xl27x`yF6~Qg^OYqLJ_GZ!TZ>`{P88Wms%f4?jZXb}{L~Jn6 z)x?qNV@5T9))sQATU<9Pml(}1DINT^X_>W_CTOyX=(KP0%O98z*Ua3-0<`uAL>{+r~5$0S(5PRsyDl}E%gRx*m#afou24iW+axB zSXgyvJdlMYa`jTp3e!*eH3wT^L36$hVq|q8=M(FSPR|z(jsx9z?8YrS`8f?hSwY^c z^X-sURnN^SRQt3^;?{f@3vfTr zn<&kHUEp<(-fDQa>}!wXa=ZP##W;e8S+F)tL&m24(F^V|XNM}}To^VxE5I1{xu+TO zeZ=RI>F$>(H6i(QFCsr0*qJ|YT(22(3kY?6rvbik<@@d5+FgHTdaoC?rW3s$t&a~> z+Vr|)!lU)RG)m)Sg?(#9G8@BlwC=s!y<~D~-?ycICo=0~wb}e1w4OOh(%C17@;BeXVRG&BHxI4>ggJvFzzb{bq zMI3V>5fb=9g&s0^gK;Q0SRmSu(Au{ zCp$g!)=om=FPXBQj)`Dh9@k6ALM{4>ZQk^}k^Nfh;?&azKejCk(LVyl1@#^@B-%%- zjprzD&i=guKnyxLzywvX%fnTwFKu(Baf{9}YB6PWp7+{#e`hnGZ_4?gM+wPUOqTd# zPuZN+3cbivqc=I~6P>pwICHwVyId98pGPVv6SqDdIprnvl%LZQ=*xV*?L<7i$o=_P z?}e3j?9WEigR=M_&~SYMxxjeYEGJF5pJt%FtU8~}Koh}^9+ggb71eWqX77k}20>U6r+O9<6L3<6dl$t8oe^gy*rZ?eE0} zy7w6*Rd5d_kv4F7%EG?B+4IMci(56{Wh5f+VGr~bzGj_QSFl0oQ(oYmm~}c$E-7*` zF*qvFtRecsoBe|4rWzmBV9TP1bTG1z*-Eo9*H73j-IJVbOGhzCHO_L@lGeqow9)iI zld1yB&b#^iYKtLh@phP^0Os=s#vP)wP?%migNud;2H!evi_MxPn%bapLhKp-35k`< z!&~(Wg!tsFvPN4JSLH{$t$Wq0@d%=gO}qT~{`$95Ej5FcX?A1XntD(}pT*V|*G;Rn z9v_Ru`vsk{Diq-qm!sO|%#9Ho&mCE7!2P^sIj%766y2j$gU|e+M+HsPEKI<>a=iYs zwIV!0QR2z#6}-6tzn8k%gt(*EBh8br6HcB|@)0l>Ya%vvU(Ua1mVoFxtTne1?KW#C8~2XGg%KQ%o9&lo;|i%xIB6X|&!ieR^L(x(>0=aJ7};B+}$ z8YK#-^faSptsK`xAe``D2s)+5X{{dZ$Yeh0c%*T4cMrjZBchh24+gs<<3pD++&}l0 zkuomoqW_k8wO4`ZX|R0o1hgkQJvqK9-eirt)->4NyPW7!4y}>UiyT1a7*$B1yJw;@ z!P!-KoOOEF1(~Q*-1$+1nA-p|3-_ykvM9@$nh+fuS=9(1xEU-Yyd;vwz>f|tP#Py& zAe5ujC#!~)y8nEz`j=X-=%S6?7@SOw^Mq8gRJCHpQhzeiSobgo-xRJ3Q45_6BO+Aw z9yCrQI&AvQjY!zGj4wd}Y^im?{8G@%33jOb1~q22??kLV|1{D@axEQu$4G)-?|Dl( zxVQe>0QA`Kj2%WHUWkZSKn)C&Irl457>5s&3@)}PY)!ze;ym+`sSs|gEqf-FlJ|tM zYyz+F-@arT(du=Ez0vMX=2N_&b!E&xf!LF#OBAy`l}^!Gj4Uk#)`;5T<9Y?p`BLKk znL*qf32sO!4r3{sCyD`IW|nr3#Kx!yw{w_K>+ld~8T*AxCY$bB$EWQ@Cpj&YmL<0S zjdkocP^*|A#x2$==}*TY;C5w4%)}hSjdv}hlJUmwlPqbtJj!>fpGfR0P}X=~oEaR77LaLgF}L3#d_6 zY`lo$a6qMb%ErIdR+uKp{tXa2zBXTNve2b9x#m-6v8EU8**<9#Rgi+DrhgMdxxN}y zbg&B?m zCVc_KZC1v+Gl+tF8^{+8J2d|5tA`9h_7Ac&r=%P(%R3~{Tk4YOM5lG{PY-n@}= zYraa`u}=kSuQmzCH+r8}g?XP>bJk2x2fO`+xw?DG?go411|x8LH(fHt@V33(|F5s6 zB3Lo7LyL*OW=ikU?WlRX9g&!G>BfM~PA4LCDAO|gV$NVsL%DviTP97V&zdvQ5;Se& zRGHM~=+xYTbvGRh1dcX-oC7OXIGSbWn^Xr&mNsSJ0l;RW+Xf0A7GnL_66rqsmG*7P zV2u*iZq)|bt^nQ!4c0V1<5D#q6@?is7>%9y&S~G_!_1<8&g|TOZsi!O>C)(B{lq9j zDxA;Bu9QVJU8EGWL9HEyloh1iG*2#>+21Xr_5|SG?!bG7+S!xIc}Q}II#|OMm^GKZ z^A2t_+u$^c*wf$oa(Do?+tX(QX%*$&@|}~C(|5M@3TSjG;se}qrj~(6Jrk?qQ*}pc zD*D=EwZB$;A8St+8W`{nkCJ6>DG>GazLilKY-o*9Y0uIu8E@b9rvJ4eX{h*(a3K}{ zrK)#HuDtgC{TqbQ{K=^7^_xe!@Eb&h0@B0z=N{CiG|=5om)QpJ=1ZZ$$pbGSs={XfSCmdmOC1^*^KLjV8( literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa4daf73a8242565ffac4469083aa29d20c1cff3 GIT binary patch literal 30394 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 MP(Agz_y2qKf6`TAZ2$lO literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a10702580514d498f4e6ddeb86a7a85f5f203767 GIT binary patch literal 14035 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 literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa4daf73a8242565ffac4469083aa29d20c1cff3 GIT binary patch literal 30394 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 MP(Agz_y2qKf6`TAZ2$lO literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/966200f6-265c-4470-ad20-c91c3d84a1cc.jpg b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/966200f6-265c-4470-ad20-c91c3d84a1cc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e7512eef25af8b74ea259e183fc3f3aeaeea583 GIT binary patch literal 47955 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 z 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 literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/feae1964-04ce-464b-848b-86f2245f3f63.jpeg b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/image/feae1964-04ce-464b-848b-86f2245f3f63.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..76a391b43c32b1450ffb8dc89faa860708a389b6 GIT binary patch literal 18821 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 literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs b/Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs new file mode 100644 index 00000000..3eeeea74 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs @@ -0,0 +1,26 @@ +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; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Program.cs b/Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Program.cs new file mode 100644 index 00000000..e75b3a47 --- /dev/null +++ b/Yi.Framework.Net6/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.Net6/Yi.Framework.AuthenticationCenter/Startup.cs b/Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Startup.cs new file mode 100644 index 00000000..6c28a88d --- /dev/null +++ b/Yi.Framework.Net6/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.Net6/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj b/Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj new file mode 100644 index 00000000..9da1712b --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj @@ -0,0 +1,11 @@ + + + + net6.0 + + + + + + + diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Const/DbConst.cs b/Yi.Framework.Net6/Yi.Framework.Common/Const/DbConst.cs new file mode 100644 index 00000000..99950713 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Const/DbConst.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Const +{ + public class DbConst + { + public const string Mysql = "Mysql"; + public const string Sqlite = "Sqlite"; + public const string Sqlserver = "Sqlserver"; + public const string Oracle = "Oracle"; + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Const/FileConst.cs b/Yi.Framework.Net6/Yi.Framework.Common/Const/FileConst.cs new file mode 100644 index 00000000..a7ae7119 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Const/FileConst.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Const +{ + public class FileConst + { + public const string Image = "Image"; + public const string File = "File"; + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Const/JobConst.cs b/Yi.Framework.Net6/Yi.Framework.Common/Const/JobConst.cs new file mode 100644 index 00000000..ce81cb0a --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Const/JobConst.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Const +{ + public class JobConst + { + + public const string url = nameof(url); + + public const string method = nameof(method); + } + +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Const/JwtConst.cs b/Yi.Framework.Net6/Yi.Framework.Common/Const/JwtConst.cs new file mode 100644 index 00000000..7ea25ea2 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Const/JwtConst.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Yi.Framework.Common.Const +{ + public class JwtConst + { + public const string SecurityKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB"; + public const string Domain = "https://localhost:44329"; + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Const/RabbitConst.cs b/Yi.Framework.Net6/Yi.Framework.Common/Const/RabbitConst.cs new file mode 100644 index 00000000..cb7f294e --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Const/RabbitConst.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Const +{ + public class RabbitConst + { + private const string prefix = "Yi.Framework."; + public const string SMS_Exchange = prefix+"SMS.Exchange"; + public const string SMS_Queue_Send = prefix+ "SMS.Queue.Send"; + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Const/RedisConst.cs b/Yi.Framework.Net6/Yi.Framework.Common/Const/RedisConst.cs new file mode 100644 index 00000000..1c59a4db --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Const/RedisConst.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Const +{ + public class RedisConst + { + ///

+ /// 前缀 + /// + public const string key = "YiFramework:data"; + + public const string keyCode = "YiFramework:code"; + ///// + ///// 初始化角色名 + ///// + //public const string InitRole_key = nameof(InitRole_key); + + ///// + ///// 标题名 + ///// + //public const string Title_key = nameof(Title_key); + + ///// + ///// 图片列表名 + ///// + //public const string ImageList_key = nameof(ImageList_key); + + //public static Dictionary stringData = new Dictionary() + //{ + // {prefix+nameof(InitRole_key), "普通用户"}, + // {prefix+nameof(Title_key), "YiFramework"}, + //}; + + //public static Dictionary> listData = new Dictionary>() + //{ + // {prefix+nameof(ImageList_key), new List(){"图片地址1", "图片地址2", "图片地址3", "图片地址4" } } + //}; + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/AssemblyHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/AssemblyHelper.cs new file mode 100644 index 00000000..ac95e268 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/AssemblyHelper.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Helper +{ + public class AssemblyHelper + { + public static List GetClass(string assemblyFile, string className = null, string spaceName=null) + { + Assembly assembly = Assembly.Load(assemblyFile); + return assembly.GetTypes().Where(m => m.IsClass + && className == null?true:m.Name==className + && spaceName == null ? true :m.Namespace == spaceName + ).ToList(); + } + + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/Base32Helper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/Base32Helper.cs new file mode 100644 index 00000000..3d422caa --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/Base32Helper.cs @@ -0,0 +1,101 @@ +using System; +using System.Text; + +namespace Yi.Framework.Common.Helper +{ + public sealed class Base32Helper + { + + // the valid chars for the encoding + private static string ValidChars = "QAZ2WSX3" + "EDC4RFV5" + "TGB6YHN7" + "UJM8K9LP"; + + /// + /// Converts an array of bytes to a Base32-k string. + /// + public static string ToString(byte[] bytes) + { + StringBuilder sb = new StringBuilder(); // holds the base32 chars + byte index; + int hi = 5; + int currentByte = 0; + + while (currentByte < bytes.Length) + { + // do we need to use the next byte? + if (hi > 8) + { + // get the last piece from the current byte, shift it to the right + // and increment the byte counter + index = (byte)(bytes[currentByte++] >> (hi - 5)); + if (currentByte != bytes.Length) + { + // if we are not at the end, get the first piece from + // the next byte, clear it and shift it to the left + index = (byte)(((byte)(bytes[currentByte] << (16 - hi)) >> 3) | index); + } + + hi -= 3; + } + else if (hi == 8) + { + index = (byte)(bytes[currentByte++] >> 3); + hi -= 3; + } + else + { + + // simply get the stuff from the current byte + index = (byte)((byte)(bytes[currentByte] << (8 - hi)) >> 3); + hi += 5; + } + + sb.Append(ValidChars[index]); + } + + return sb.ToString(); + } + + + /// + /// Converts a Base32-k string into an array of bytes. + /// + /// + /// Input string s contains invalid Base32-k characters. + /// + public static byte[] FromBase32String(string str) + { + int numBytes = str.Length * 5 / 8; + byte[] bytes = new Byte[numBytes]; + + // all UPPERCASE chars + str = str.ToUpper(); + + int bit_buffer; + int currentCharIndex; + int bits_in_buffer; + + if (str.Length < 3) + { + bytes[0] = (byte)(ValidChars.IndexOf(str[0]) | ValidChars.IndexOf(str[1]) << 5); + return bytes; + } + + bit_buffer = (ValidChars.IndexOf(str[0]) | ValidChars.IndexOf(str[1]) << 5); + bits_in_buffer = 10; + currentCharIndex = 2; + for (int i = 0; i < bytes.Length; i++) + { + bytes[i] = (byte)bit_buffer; + bit_buffer >>= 8; + bits_in_buffer -= 8; + while (bits_in_buffer < 8 && currentCharIndex < str.Length) + { + bit_buffer |= ValidChars.IndexOf(str[currentCharIndex++]) << bits_in_buffer; + bits_in_buffer += 5; + } + } + + return bytes; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/ConsoleHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/ConsoleHelper.cs new file mode 100644 index 00000000..50a9688f --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/ConsoleHelper.cs @@ -0,0 +1,54 @@ +using System; + +namespace Yi.Framework.Common.Helper +{ + public static class ConsoleHelper + { + public static void WriteColorLine(string str, ConsoleColor color) + { + ConsoleColor currentForeColor = Console.ForegroundColor; + Console.ForegroundColor = color; + Console.WriteLine(str); + Console.ForegroundColor = currentForeColor; + } + + /// + /// 打印错误信息 + /// + /// 待打印的字符串 + /// 想要打印的颜色 + public static void WriteErrorLine(this string str, ConsoleColor color = ConsoleColor.Red) + { + WriteColorLine(str, color); + } + + /// + /// 打印警告信息 + /// + /// 待打印的字符串 + /// 想要打印的颜色 + public static void WriteWarningLine(this string str, ConsoleColor color = ConsoleColor.Yellow) + { + WriteColorLine(str, color); + } + /// + /// 打印正常信息 + /// + /// 待打印的字符串 + /// 想要打印的颜色 + public static void WriteInfoLine(this string str, ConsoleColor color = ConsoleColor.White) + { + WriteColorLine(str, color); + } + /// + /// 打印成功的信息 + /// + /// 待打印的字符串 + /// 想要打印的颜色 + public static void WriteSuccessLine(this string str, ConsoleColor color = ConsoleColor.Green) + { + WriteColorLine(str, color); + } + + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/DateHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/DateHelper.cs new file mode 100644 index 00000000..0e31e4c7 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/DateHelper.cs @@ -0,0 +1,58 @@ +using System; + +namespace Yi.Framework.Common.Helper +{ + public class DateHelper + { + public static DateTime StampToDateTime(string time) + { + time = time.Substring(0, 10); + double timestamp = Convert.ToInt64(time); + System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); + dateTime = dateTime.AddSeconds(timestamp).ToLocalTime(); + return dateTime; + } + + public static string TimeSubTract(DateTime time1,DateTime time2) + { + TimeSpan subTract = time1.Subtract(time2); + return $"{subTract.Days} 天 {subTract.Hours} 时 {subTract.Minutes} 分 "; + } + /// + /// 时间戳转本地时间-时间戳精确到秒 + /// + public static DateTime ToLocalTimeDateBySeconds(long unix) + { + var dto = DateTimeOffset.FromUnixTimeSeconds(unix); + return dto.ToLocalTime().DateTime; + } + + /// + /// 时间转时间戳Unix-时间戳精确到秒 + /// + public static long ToUnixTimestampBySeconds(DateTime dt) + { + DateTimeOffset dto = new DateTimeOffset(dt); + return dto.ToUnixTimeSeconds(); + } + + + /// + /// 时间戳转本地时间-时间戳精确到毫秒 + /// + public static DateTime ToLocalTimeDateByMilliseconds(long unix) + { + var dto = DateTimeOffset.FromUnixTimeMilliseconds(unix); + return dto.ToLocalTime().DateTime; + } + + /// + /// 时间转时间戳Unix-时间戳精确到毫秒 + /// + public static long ToUnixTimestampByMilliseconds(DateTime dt) + { + DateTimeOffset dto = new DateTimeOffset(dt); + return dto.ToUnixTimeMilliseconds(); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/EmailHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/EmailHelper.cs new file mode 100644 index 00000000..5629592d --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/EmailHelper.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Mail; +using System.Net.Sockets; +using System.Text; + +namespace Yi.Framework.Common.Helper +{ + public class EmailHelper + { + public static string fromMail { get; set; } + public static string pwdMail { get; set; } + public static string senderMail { get; set; } + public static string subjectMail { get; set; } + public static void Init(string fromMail,string pwdMail,string senderMail, string subjectMail) + { + EmailHelper.fromMail = fromMail; + EmailHelper.pwdMail = pwdMail; + EmailHelper.senderMail = senderMail; + EmailHelper.subjectMail = subjectMail; + } + + public static bool sendMail(string body, string toMail) + { + try + { + + //string fromMail = "454313500@qq.com"; + //string pwdMail = "yvjioburildgbhdf"; + MailMessage message = new MailMessage(); + //设置发件人,发件人需要与设置的邮件发送服务器的邮箱一致 + System.Net.Mail.MailAddress fromAddr = new System.Net.Mail.MailAddress(fromMail, EmailHelper.senderMail); + message.From = fromAddr; + + //设置收件人,可添加多个,添加方法与下面的一样 + message.To.Add(toMail); + + + //设置邮件标题 + message.Subject = EmailHelper.subjectMail; + + //设置邮件内容 + message.Body = body; + + //设置邮件发送服务器,服务器根据你使用的邮箱而不同,可以到相应的 邮箱管理后台查看,下面是QQ的 + System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("smtp.qq.com", 25) + ; + //设置发送人的邮箱账号和密码,POP3/SMTP服务要开启, 密码要是POP3/SMTP等服务的授权码 + client.Credentials = new System.Net.NetworkCredential(fromMail, pwdMail);//vtirsfsthwuadjfe fhszmpegwoqnecja + + //启用ssl,也就是安全发送 + client.EnableSsl = true; + + //发送邮件 + client.Send(message); + + return true; + } + catch + { + return false; + } + + } + + public static void 接受邮件() + { + using (TcpClient client = new TcpClient("pop.qq.com", 110)) + using (NetworkStream n = client.GetStream()) + { + GetEmail.ReadLine(n); // Read the welcome message. + GetEmail.SendCommand(n, "USER 1040079213@qq.com"); + GetEmail.SendCommand(n, "PASS odfaizoqdiupbfgi"); + GetEmail.SendCommand(n, "LIST"); // Retrieve message IDs + List messageIDs = new List(); + while (true) + { + string line = GetEmail.ReadLine(n); // e.g., "11876" + if (line == ".") break; + messageIDs.Add(int.Parse(line.Split(' ')[0])); // Message ID + } + foreach (int id in messageIDs) // Retrieve each message. + { + GetEmail.SendCommand(n, "RETR " + id); + string randomFile = Guid.NewGuid().ToString() + ".eml"; + using (StreamWriter writer = File.CreateText(randomFile)) + while (true) + { + string line = GetEmail.ReadLine(n); // Read next line of message. + if (line == ".") break; // Single dot = end of message. + if (line == "..") line = "."; // "Escape out" double dot. + writer.WriteLine(line); // Write to output file. + } + GetEmail.SendCommand(n, "DELE " + id); // Delete message off server. + } + GetEmail.SendCommand(n, "QUIT"); + } + } + } + //接受邮件pop + public class GetEmail + { + public static void SendCommand(Stream stream, string line) + { + byte[] data = Encoding.UTF8.GetBytes(line + "\r\n"); + stream.Write(data, 0, data.Length); + string response = ReadLine(stream); + if (!response.StartsWith("+OK")) + throw new Exception("POP Error: " + response); + } + public static string ReadLine(Stream s) + { + List lineBuffer = new List(); + while (true) + { + int b = s.ReadByte(); + if (b == 10 || b < 0) break; + if (b != 13) lineBuffer.Add((byte)b); + } + return Encoding.UTF8.GetString(lineBuffer.ToArray()); + } + } +} + diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/ExcelHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/ExcelHelper.cs new file mode 100644 index 00000000..8d0f808d --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/ExcelHelper.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OfficeOpenXml; + +namespace Yi.Framework.Common.Helper +{ + public class ExcelHelper + { + /// + /// + /// + /// + /// 数据 + /// 表头 + /// + public static string CreateExcelFromList(List dataList, List headers,string evn) + { + ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + string sWebRootFolder = Path.Combine($"{evn}", "wwwroot/Excel");//如果用浏览器url下载的方式 存放excel的文件夹一定要建在网站首页的同级目录下!!! + if (!Directory.Exists(sWebRootFolder)) + { + Directory.CreateDirectory(sWebRootFolder); + } + string sFileName = $@"Excel_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"; + var path = Path.Combine(sWebRootFolder, sFileName); + FileInfo file = new FileInfo(path); + if (file.Exists) + { + file.Delete(); + file = new FileInfo(path); + } + using (ExcelPackage package = new(file)) + { + //创建sheet + ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("sheet1"); + worksheet.Cells.LoadFromCollection(dataList, true); + //表头字段 + for (int i = 0; i < headers.Count; i++) + { + worksheet.Cells[1, i + 1].Value = headers[i]; + } + for (int i = 0; i < headers.Count + 1; i++) + {//删除不需要的列 + string aa = worksheet.Cells[1, i + 1].Value.ToString(); + if (aa == "总行数") + { + worksheet.DeleteColumn(i + 1); + } + } + package.Save(); + } + //return path;//这是返回文件的方式 + return sFileName; //如果用浏览器url下载的方式 这里直接返回生成的文件名就可以了 + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/FileHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/FileHelper.cs new file mode 100644 index 00000000..2ffc9ba2 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/FileHelper.cs @@ -0,0 +1,395 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; + +namespace Yi.Framework.Common.Helper +{ + public class FileHelper : IDisposable + { + + private bool _alreadyDispose = false; + + #region 构造函数 + public FileHelper() + { + // + // TODO: 在此处添加构造函数逻辑 + // + } + ~FileHelper() + { + Dispose(); ; + } + + protected virtual void Dispose(bool isDisposing) + { + if (_alreadyDispose) return; + _alreadyDispose = true; + } + #endregion + + #region IDisposable 成员 + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + #region 取得文件后缀名 + /**************************************** + * 函数名称:GetPostfixStr + * 功能说明:取得文件后缀名 + * 参 数:filename:文件名称 + * 调用示列: + * string filename = "aaa.aspx"; + * string s = EC.FileObj.GetPostfixStr(filename); + *****************************************/ + /// + /// 取后缀名 + /// + /// 文件名 + /// .gif|.html格式 + public static string GetPostfixStr(string filename) + { + int start = filename.LastIndexOf("."); + int length = filename.Length; + string postfix = filename.Substring(start, length - start); + return postfix; + } + #endregion + + #region 根据文件大小获取指定前缀的可用文件名 + /// + /// 根据文件大小获取指定前缀的可用文件名 + /// + /// 文件夹 + /// 文件前缀 + /// 文件大小(1m) + /// 文件后缀(.log) + /// 可用文件名 + //public static string GetAvailableFileWithPrefixOrderSize(string folderPath, string prefix, int size = 1 * 1024 * 1024, string ext = ".log") + //{ + // var allFiles = new DirectoryInfo(folderPath); + // var selectFiles = allFiles.GetFiles().Where(fi => fi.Name.ToLower().Contains(prefix.ToLower()) && fi.Extension.ToLower() == ext.ToLower() && fi.Length < size).OrderByDescending(d=>d.Name).ToList(); + + // if (selectFiles.Count > 0) + // { + // return selectFiles.FirstOrDefault().FullName; + // } + + // return Path.Combine(folderPath, $@"{prefix}_{DateTime.Now.DateToTimeStamp()}.log"); + //} + //public static string GetAvailableFileNameWithPrefixOrderSize(string _contentRoot, string prefix, int size = 1 * 1024 * 1024, string ext = ".log") + //{ + // var folderPath = Path.Combine(_contentRoot, "Log"); + // if (!Directory.Exists(folderPath)) + // { + // Directory.CreateDirectory(folderPath); + // } + + // var allFiles = new DirectoryInfo(folderPath); + // var selectFiles = allFiles.GetFiles().Where(fi => fi.Name.ToLower().Contains(prefix.ToLower()) && fi.Extension.ToLower() == ext.ToLower() && fi.Length < size).OrderByDescending(d => d.Name).ToList(); + + // if (selectFiles.Count > 0) + // { + // return selectFiles.FirstOrDefault().Name.Replace(".log",""); + // } + + // return $@"{prefix}_{DateTime.Now.DateToTimeStamp()}"; + //} + #endregion + + #region 写文件 + /**************************************** + * 函数名称:WriteFile + * 功能说明:写文件,会覆盖掉以前的内容 + * 参 数:Path:文件路径,Strings:文本内容 + * 调用示列: + * string Path = Server.MapPath("Default2.aspx"); + * string Strings = "这是我写的内容啊"; + * EC.FileObj.WriteFile(Path,Strings); + *****************************************/ + /// + /// 写文件 + /// + /// 文件路径 + /// 文件内容 + public static void WriteFile(string Path, string Strings) + { + if (!File.Exists(Path)) + { + FileStream f = File.Create(Path); + f.Close(); + } + StreamWriter f2 = new StreamWriter(Path, false, System.Text.Encoding.GetEncoding("gb2312")); + f2.Write(Strings); + f2.Close(); + f2.Dispose(); + } + + /// + /// 写文件 + /// + /// 文件路径 + /// 文件内容 + /// 编码格式 + public static void WriteFile(string Path, string Strings, Encoding encode) + { + if (!File.Exists(Path)) + { + FileStream f = File.Create(Path); + f.Close(); + } + StreamWriter f2 = new StreamWriter(Path, false, encode); + f2.Write(Strings); + f2.Close(); + f2.Dispose(); + } + #endregion + + #region 读文件 + /**************************************** + * 函数名称:ReadFile + * 功能说明:读取文本内容 + * 参 数:Path:文件路径 + * 调用示列: + * string Path = Server.MapPath("Default2.aspx"); + * string s = EC.FileObj.ReadFile(Path); + *****************************************/ + /// + /// 读文件 + /// + /// 文件路径 + /// + public static string ReadFile(string Path) + { + string s = ""; + if (!File.Exists(Path)) + s = "不存在相应的目录"; + else + { + StreamReader f2 = new StreamReader(Path, System.Text.Encoding.GetEncoding("gb2312")); + s = f2.ReadToEnd(); + f2.Close(); + f2.Dispose(); + } + + return s; + } + + /// + /// 读文件 + /// + /// 文件路径 + /// 编码格式 + /// + public static string ReadFile(string Path, Encoding encode) + { + string s = ""; + if (!File.Exists(Path)) + s = "不存在相应的目录"; + else + { + StreamReader f2 = new StreamReader(Path, encode); + s = f2.ReadToEnd(); + f2.Close(); + f2.Dispose(); + } + + return s; + } + #endregion + + #region 追加文件 + /**************************************** + * 函数名称:FileAdd + * 功能说明:追加文件内容 + * 参 数:Path:文件路径,strings:内容 + * 调用示列: + * string Path = Server.MapPath("Default2.aspx"); + * string Strings = "新追加内容"; + * EC.FileObj.FileAdd(Path, Strings); + *****************************************/ + /// + /// 追加文件 + /// + /// 文件路径 + /// 内容 + public static void FileAdd(string Path, string strings) + { + StreamWriter sw = File.AppendText(Path); + sw.Write(strings); + sw.Flush(); + sw.Close(); + } + #endregion + + #region 拷贝文件 + /**************************************** + * 函数名称:FileCoppy + * 功能说明:拷贝文件 + * 参 数:OrignFile:原始文件,NewFile:新文件路径 + * 调用示列: + * string orignFile = Server.MapPath("Default2.aspx"); + * string NewFile = Server.MapPath("Default3.aspx"); + * EC.FileObj.FileCoppy(OrignFile, NewFile); + *****************************************/ + /// + /// 拷贝文件 + /// + /// 原始文件 + /// 新文件路径 + public static void FileCoppy(string orignFile, string NewFile) + { + File.Copy(orignFile, NewFile, true); + } + + #endregion + + #region 删除文件 + /**************************************** + * 函数名称:FileDel + * 功能说明:删除文件 + * 参 数:Path:文件路径 + * 调用示列: + * string Path = Server.MapPath("Default3.aspx"); + * EC.FileObj.FileDel(Path); + *****************************************/ + /// + /// 删除文件 + /// + /// 路径 + public static void FileDel(string Path) + { + File.Delete(Path); + } + #endregion + + #region 移动文件 + /**************************************** + * 函数名称:FileMove + * 功能说明:移动文件 + * 参 数:OrignFile:原始路径,NewFile:新文件路径 + * 调用示列: + * string orignFile = Server.MapPath("../说明.txt"); + * string NewFile = Server.MapPath("http://www.cnblogs.com/说明.txt"); + * EC.FileObj.FileMove(OrignFile, NewFile); + *****************************************/ + /// + /// 移动文件 + /// + /// 原始路径 + /// 新路径 + public static void FileMove(string orignFile, string NewFile) + { + File.Move(orignFile, NewFile); + } + #endregion + + #region 在当前目录下创建目录 + /**************************************** + * 函数名称:FolderCreate + * 功能说明:在当前目录下创建目录 + * 参 数:OrignFolder:当前目录,NewFloder:新目录 + * 调用示列: + * string orignFolder = Server.MapPath("test/"); + * string NewFloder = "new"; + * EC.FileObj.FolderCreate(OrignFolder, NewFloder); + *****************************************/ + /// + /// 在当前目录下创建目录 + /// + /// 当前目录 + /// 新目录 + public static void FolderCreate(string orignFolder, string NewFloder) + { + Directory.SetCurrentDirectory(orignFolder); + Directory.CreateDirectory(NewFloder); + } + #endregion + + #region 递归删除文件夹目录及文件 + /**************************************** + * 函数名称:DeleteFolder + * 功能说明:递归删除文件夹目录及文件 + * 参 数:dir:文件夹路径 + * 调用示列: + * string dir = Server.MapPath("test/"); + * EC.FileObj.DeleteFolder(dir); + *****************************************/ + /// + /// 递归删除文件夹目录及文件 + /// + /// + /// + public static void DeleteFolder(string dir) + { + if (Directory.Exists(dir)) //如果存在这个文件夹删除之 + { + foreach (string d in Directory.GetFileSystemEntries(dir)) + { + if (File.Exists(d)) + File.Delete(d); //直接删除其中的文件 + else + DeleteFolder(d); //递归删除子文件夹 + } + Directory.Delete(dir); //删除已空文件夹 + } + + } + #endregion + + #region 将指定文件夹下面的所有内容copy到目标文件夹下面 果目标文件夹为只读属性就会报错。 + /**************************************** + * 函数名称:CopyDir + * 功能说明:将指定文件夹下面的所有内容copy到目标文件夹下面 果目标文件夹为只读属性就会报错。 + * 参 数:srcPath:原始路径,aimPath:目标文件夹 + * 调用示列: + * string srcPath = Server.MapPath("test/"); + * string aimPath = Server.MapPath("test1/"); + * EC.FileObj.CopyDir(srcPath,aimPath); + *****************************************/ + /// + /// 指定文件夹下面的所有内容copy到目标文件夹下面 + /// + /// 原始路径 + /// 目标文件夹 + public static void CopyDir(string srcPath, string aimPath) + { + try + { + // 检查目标目录是否以目录分割字符结束如果不是则添加之 + if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar) + aimPath += Path.DirectorySeparatorChar; + // 判断目标目录是否存在如果不存在则新建之 + if (!Directory.Exists(aimPath)) + Directory.CreateDirectory(aimPath); + // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组 + //如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法 + //string[] fileList = Directory.GetFiles(srcPath); + string[] fileList = Directory.GetFileSystemEntries(srcPath); + //遍历所有的文件和目录 + foreach (string file in fileList) + { + //先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 + + if (Directory.Exists(file)) + CopyDir(file, aimPath + Path.GetFileName(file)); + //否则直接Copy文件 + else + File.Copy(file, aimPath + Path.GetFileName(file), true); + } + + } + catch (Exception ee) + { + throw new Exception(ee.ToString()); + } + } + #endregion + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/HtmlHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/HtmlHelper.cs new file mode 100644 index 00000000..1e1e0086 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/HtmlHelper.cs @@ -0,0 +1,24 @@ +namespace Yi.Framework.Common.Helper +{ + public static class HtmlHelper + { + #region 去除富文本中的HTML标签 + /// + /// 去除富文本中的HTML标签 + /// + /// + /// + /// + public static string ReplaceHtmlTag(string html, int length = 0) + { + string strText = System.Text.RegularExpressions.Regex.Replace(html, "<[^>]+>", ""); + strText = System.Text.RegularExpressions.Regex.Replace(strText, "&[^;]+;", ""); + + if (length > 0 && strText.Length > length) + return strText.Substring(0, length); + + return strText; + } + #endregion + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/HttpHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/HttpHelper.cs new file mode 100644 index 00000000..96b7c4c0 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/HttpHelper.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Helper +{ + public static class HttpHelper + { + public static string HttpGet(string Url, string postDataStr="") + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr); + request.Method = "GET"; + request.ContentType = "text/html;charset=UTF-8"; + + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + Stream myResponseStream = response.GetResponseStream(); + StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); + string retString = myStreamReader.ReadToEnd(); + myStreamReader.Close(); + myResponseStream.Close(); + + return retString; + } + + public static bool HttpIOGet(string Url, string file, string postDataStr="") + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr); + request.Method = "GET"; + request.ContentType = "text/html;charset=UTF-8"; + + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + Stream myResponseStream = response.GetResponseStream(); + FileStream writer = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write); + byte[] buffer = new byte[1024]; + int c; + while ((c = myResponseStream.Read(buffer, 0, buffer.Length)) > 0) + { + writer.Write(buffer, 0, c); + } + writer.Close(); + myResponseStream.Close(); + + return true; + } + + public static string HttpPost(string Url, string postDataStr="") + { + CookieContainer cookie = new CookieContainer(); + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); + request.Method = "POST"; + request.ContentType = "application/x-www-form-urlencoded"; + request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr); + request.CookieContainer = cookie; + Stream myRequestStream = request.GetRequestStream(); + StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312")); + myStreamWriter.Write(postDataStr); + myStreamWriter.Close(); + + HttpWebResponse response = (HttpWebResponse)request.GetResponse(); + + response.Cookies = cookie.GetCookies(response.ResponseUri); + Stream myResponseStream = response.GetResponseStream(); + StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); + string retString = myStreamReader.ReadToEnd(); + myStreamReader.Close(); + myResponseStream.Close(); + + return retString; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/IpHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/IpHelper.cs new file mode 100644 index 00000000..b39d112a --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/IpHelper.cs @@ -0,0 +1,51 @@ +using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; + +namespace Yi.Framework.Common.Helper +{ + public class IpHelper + { + /// + /// 获取当前IP地址 + /// + /// + /// + public static string GetCurrentIp(string preferredNetworks) + { + var instanceIp = "127.0.0.1"; + + try + { + // 获取可用网卡 + var nics = NetworkInterface.GetAllNetworkInterfaces()?.Where(network => network.OperationalStatus == OperationalStatus.Up); + + // 获取所有可用网卡IP信息 + var ipCollection = nics?.Select(x => x.GetIPProperties())?.SelectMany(x => x.UnicastAddresses); + + foreach (var ipadd in ipCollection) + { + if (!IPAddress.IsLoopback(ipadd.Address) && ipadd.Address.AddressFamily == AddressFamily.InterNetwork) + { + if (string.IsNullOrEmpty(preferredNetworks)) + { + instanceIp = ipadd.Address.ToString(); + break; + } + + if (!ipadd.Address.ToString().StartsWith(preferredNetworks)) continue; + instanceIp = ipadd.Address.ToString(); + break; + } + } + } + catch + { + // ignored + } + + return instanceIp; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/JsonHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/JsonHelper.cs new file mode 100644 index 00000000..9b983cbe --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/JsonHelper.cs @@ -0,0 +1,509 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; + +namespace Yi.Framework.Common.Helper +{ + public class JsonHelper + { + + + public static string ObjToStr(T obj) + { + return Newtonsoft.Json.JsonConvert.SerializeObject(obj); + } + + public static T StrToObj(string str) + { + return Newtonsoft.Json.JsonConvert.DeserializeObject(str); + } + /// + /// 转换对象为JSON格式数据 + /// + /// + /// 对象 + /// 字符格式的JSON数据 + public static string GetJSON(object obj) + { + string result = String.Empty; + try + { + JsonSerializer.Serialize(""); + System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = + new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T)); + using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) + { + serializer.WriteObject(ms, obj); + result = System.Text.Encoding.UTF8.GetString(ms.ToArray()); + } + } + catch (Exception) + { + throw; + } + return result; + } + /// + /// 转换List的数据为JSON格式 + /// + /// + /// 列表值 + /// JSON格式数据 + public string JSON(List vals) + { + System.Text.StringBuilder st = new System.Text.StringBuilder(); + try + { + System.Runtime.Serialization.Json.DataContractJsonSerializer s = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T)); + + foreach (T city in vals) + { + using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) + { + s.WriteObject(ms, city); + st.Append(System.Text.Encoding.UTF8.GetString(ms.ToArray())); + } + } + } + catch (Exception) + { + } + + return st.ToString(); + } + /// + /// JSON格式字符转换为T类型的对象 + /// + /// + /// + /// + public static T ParseFormByJson(string jsonStr) + { + T obj = Activator.CreateInstance(); + using (System.IO.MemoryStream ms = + new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(jsonStr))) + { + System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = + new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T)); + return (T)serializer.ReadObject(ms); + } + } + + public string JSON1(List vals) + { + System.Text.StringBuilder st = new System.Text.StringBuilder(); + try + { + System.Runtime.Serialization.Json.DataContractJsonSerializer s = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(SendData)); + + foreach (SendData city in vals) + { + using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) + { + s.WriteObject(ms, city); + st.Append(System.Text.Encoding.UTF8.GetString(ms.ToArray())); + } + } + } + catch (Exception) + { + } + + return st.ToString(); + } + + private static bool IsJsonStart(ref string json) + { + if (!string.IsNullOrEmpty(json)) + { + json = json.Trim('\r', '\n', ' '); + if (json.Length > 1) + { + char s = json[0]; + char e = json[json.Length - 1]; + return (s == '{' && e == '}') || (s == '[' && e == ']'); + } + } + return false; + } + public static bool IsJson(string json) + { + int errIndex; + return IsJson(json, out errIndex); + } + public static bool IsJson(string json, out int errIndex) + { + errIndex = 0; + if (IsJsonStart(ref json)) + { + CharState cs = new CharState(); + char c; + for (int i = 0; i < json.Length; i++) + { + c = json[i]; + if (SetCharState(c, ref cs) && cs.childrenStart)//设置关键符号状态。 + { + string item = json.Substring(i); + int err; + int length = GetValueLength(item, true, out err); + cs.childrenStart = false; + if (err > 0) + { + errIndex = i + err; + return false; + } + i = i + length - 1; + } + if (cs.isError) + { + errIndex = i; + return false; + } + } + + return !cs.arrayStart && !cs.jsonStart; + } + return false; + } + + /// + /// 获取值的长度(当Json值嵌套以"{"或"["开头时) + /// + private static int GetValueLength(string json, bool breakOnErr, out int errIndex) + { + errIndex = 0; + int len = 0; + if (!string.IsNullOrEmpty(json)) + { + CharState cs = new CharState(); + char c; + for (int i = 0; i < json.Length; i++) + { + c = json[i]; + if (!SetCharState(c, ref cs))//设置关键符号状态。 + { + if (!cs.jsonStart && !cs.arrayStart)//json结束,又不是数组,则退出。 + { + break; + } + } + else if (cs.childrenStart)//正常字符,值状态下。 + { + int length = GetValueLength(json.Substring(i), breakOnErr, out errIndex);//递归子值,返回一个长度。。。 + cs.childrenStart = false; + cs.valueStart = 0; + //cs.state = 0; + i = i + length - 1; + } + if (breakOnErr && cs.isError) + { + errIndex = i; + return i; + } + if (!cs.jsonStart && !cs.arrayStart)//记录当前结束位置。 + { + len = i + 1;//长度比索引+1 + break; + } + } + } + return len; + } + + /// + /// 设置字符状态(返回true则为关键词,返回false则当为普通字符处理) + /// + private static bool SetCharState(char c, ref CharState cs) + { + cs.CheckIsError(c); + switch (c) + { + case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}] + #region 大括号 + if (cs.keyStart <= 0 && cs.valueStart <= 0) + { + cs.keyStart = 0; + cs.valueStart = 0; + if (cs.jsonStart && cs.state == 1) + { + cs.childrenStart = true; + } + else + { + cs.state = 0; + } + cs.jsonStart = true;//开始。 + return true; + } + #endregion + break; + case '}': + #region 大括号结束 + if (cs.keyStart <= 0 && cs.valueStart < 2 && cs.jsonStart) + { + cs.jsonStart = false;//正常结束。 + cs.state = 0; + cs.keyStart = 0; + cs.valueStart = 0; + cs.setDicValue = true; + return true; + } + // cs.isError = !cs.jsonStart && cs.state == 0; + #endregion + break; + case '[': + #region 中括号开始 + if (!cs.jsonStart) + { + cs.arrayStart = true; + return true; + } + else if (cs.jsonStart && cs.state == 1) + { + cs.childrenStart = true; + return true; + } + #endregion + break; + case ']': + #region 中括号结束 + if (cs.arrayStart && !cs.jsonStart && cs.keyStart <= 2 && cs.valueStart <= 0)//[{},333]//这样结束。 + { + cs.keyStart = 0; + cs.valueStart = 0; + cs.arrayStart = false; + return true; + } + #endregion + break; + case '"': + case '\'': + #region 引号 + if (cs.jsonStart || cs.arrayStart) + { + if (cs.state == 0)//key阶段,有可能是数组["aa",{}] + { + if (cs.keyStart <= 0) + { + cs.keyStart = (c == '"' ? 3 : 2); + return true; + } + else if ((cs.keyStart == 2 && c == '\'') || (cs.keyStart == 3 && c == '"')) + { + if (!cs.escapeChar) + { + cs.keyStart = -1; + return true; + } + else + { + cs.escapeChar = false; + } + } + } + else if (cs.state == 1 && cs.jsonStart)//值阶段必须是Json开始了。 + { + if (cs.valueStart <= 0) + { + cs.valueStart = (c == '"' ? 3 : 2); + return true; + } + else if ((cs.valueStart == 2 && c == '\'') || (cs.valueStart == 3 && c == '"')) + { + if (!cs.escapeChar) + { + cs.valueStart = -1; + return true; + } + else + { + cs.escapeChar = false; + } + } + + } + } + #endregion + break; + case ':': + #region 冒号 + if (cs.jsonStart && cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 0) + { + if (cs.keyStart == 1) + { + cs.keyStart = -1; + } + cs.state = 1; + return true; + } + // cs.isError = !cs.jsonStart || (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1); + #endregion + break; + case ',': + #region 逗号 //["aa",{aa:12,}] + + if (cs.jsonStart) + { + if (cs.keyStart < 2 && cs.valueStart < 2 && cs.state == 1) + { + cs.state = 0; + cs.keyStart = 0; + cs.valueStart = 0; + //if (cs.valueStart == 1) + //{ + // cs.valueStart = 0; + //} + cs.setDicValue = true; + return true; + } + } + else if (cs.arrayStart && cs.keyStart <= 2) + { + cs.keyStart = 0; + //if (cs.keyStart == 1) + //{ + // cs.keyStart = -1; + //} + return true; + } + #endregion + break; + case ' ': + case '\r': + case '\n'://[ "a",\r\n{} ] + case '\0': + case '\t': + if (cs.keyStart <= 0 && cs.valueStart <= 0) //cs.jsonStart && + { + return true;//跳过空格。 + } + break; + default: //值开头。。 + if (c == '\\') //转义符号 + { + if (cs.escapeChar) + { + cs.escapeChar = false; + } + else + { + cs.escapeChar = true; + return true; + } + } + else + { + cs.escapeChar = false; + } + if (cs.jsonStart || cs.arrayStart) // Json 或数组开始了。 + { + if (cs.keyStart <= 0 && cs.state == 0) + { + cs.keyStart = 1;//无引号的 + } + else if (cs.valueStart <= 0 && cs.state == 1 && cs.jsonStart)//只有Json开始才有值。 + { + cs.valueStart = 1;//无引号的 + } + } + break; + } + return false; + } + } + /// + /// 字符状态 + /// + public class CharState + { + internal bool jsonStart = false;//以 "{"开始了... + internal bool setDicValue = false;// 可以设置字典值了。 + internal bool escapeChar = false;//以"\"转义符号开始了 + /// + /// 数组开始【仅第一开头才算】,值嵌套的以【childrenStart】来标识。 + /// + internal bool arrayStart = false;//以"[" 符号开始了 + internal bool childrenStart = false;//子级嵌套开始了。 + /// + /// 【0 初始状态,或 遇到“,”逗号】;【1 遇到“:”冒号】 + /// + internal int state = 0; + + /// + /// 【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】 + /// + internal int keyStart = 0; + /// + /// 【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】 + /// + internal int valueStart = 0; + internal bool isError = false;//是否语法错误。 + + internal void CheckIsError(char c)//只当成一级处理(因为GetLength会递归到每一个子项处理) + { + if (keyStart > 1 || valueStart > 1) + { + return; + } + //示例 ["aa",{"bbbb":123,"fff","ddd"}] + switch (c) + { + case '{'://[{ "[{A}]":[{"[{B}]":3,"m":"C"}]}] + isError = jsonStart && state == 0;//重复开始错误 同时不是值处理。 + break; + case '}': + isError = !jsonStart || (keyStart != 0 && state == 0);//重复结束错误 或者 提前结束{"aa"}。正常的有{} + break; + case '[': + isError = arrayStart && state == 0;//重复开始错误 + break; + case ']': + isError = !arrayStart || jsonStart;//重复开始错误 或者 Json 未结束 + break; + case '"': + case '\'': + isError = !(jsonStart || arrayStart); //json 或数组开始。 + if (!isError) + { + //重复开始 [""",{"" "}] + isError = (state == 0 && keyStart == -1) || (state == 1 && valueStart == -1); + } + if (!isError && arrayStart && !jsonStart && c == '\'')//['aa',{}] + { + isError = true; + } + break; + case ':': + isError = !jsonStart || state == 1;//重复出现。 + break; + case ',': + isError = !(jsonStart || arrayStart); //json 或数组开始。 + if (!isError) + { + if (jsonStart) + { + isError = state == 0 || (state == 1 && valueStart > 1);//重复出现。 + } + else if (arrayStart)//["aa,] [,] [{},{}] + { + isError = keyStart == 0 && !setDicValue; + } + } + break; + case ' ': + case '\r': + case '\n'://[ "a",\r\n{} ] + case '\0': + case '\t': + break; + default: //值开头。。 + isError = (!jsonStart && !arrayStart) || (state == 0 && keyStart == -1) || (valueStart == -1 && state == 1);// + break; + } + //if (isError) + //{ + + //} + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/MD5Hepler.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/MD5Hepler.cs new file mode 100644 index 00000000..6eb53422 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/MD5Hepler.cs @@ -0,0 +1,67 @@ +using System; +using System.Security.Cryptography; +using System.Text; + +namespace Yi.Framework.Common.Helper +{ + public class MD5Helper + { + /// + /// 16位MD5加密 + /// + /// + /// + public static string MD5Encrypt16(string password) + { + var md5 = new MD5CryptoServiceProvider(); + string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)), 4, 8); + t2 = t2.Replace("-", string.Empty); + return t2; + } + + /// + /// 32位MD5加密 + /// + /// + /// + public static string MD5Encrypt32(string password = "") + { + string pwd = string.Empty; + try + { + if (!string.IsNullOrEmpty(password) && !string.IsNullOrWhiteSpace(password)) + { + MD5 md5 = MD5.Create(); //实例化一个md5对像 + // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择  + byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); + // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 + foreach (var item in s) + { + // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 + pwd = string.Concat(pwd, item.ToString("X2")); + } + } + } + catch + { + throw new Exception($"错误的 password 字符串:【{password}】"); + } + return pwd; + } + + /// + /// 64位MD5加密 + /// + /// + /// + public static string MD5Encrypt64(string password) + { + // 实例化一个md5对像 + // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择  + MD5 md5 = MD5.Create(); + byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); + return Convert.ToBase64String(s); + } + + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/MimeHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/MimeHelper.cs new file mode 100644 index 00000000..bd783d48 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/MimeHelper.cs @@ -0,0 +1,244 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Helper +{ + public static class MimeHelper + { + // 通过自己定义一个静态类 + // 将所有的Content Type都扔进去吧 + // 调用的时候直接调用静态方法即可。 + + private static Hashtable _mimeMappingTable; + + private static void AddMimeMapping(string extension, string MimeType) + { + MimeHelper._mimeMappingTable.Add(extension, MimeType); + } + + public static string GetMimeMapping(string FileName) + { + string text = null; + int num = FileName.LastIndexOf('.'); + if (0 < num && num > FileName.LastIndexOf('\\')) + { + text = (string)MimeHelper._mimeMappingTable[FileName.Substring(num)]; + } + if (text == null) + { + text = (string)MimeHelper._mimeMappingTable[".*"]; + } + return text; + } + + static MimeHelper() + { + MimeHelper._mimeMappingTable = new Hashtable(190, StringComparer.CurrentCultureIgnoreCase); + MimeHelper.AddMimeMapping(".323", "text/h323"); + MimeHelper.AddMimeMapping(".asx", "video/x-ms-asf"); + MimeHelper.AddMimeMapping(".acx", "application/internet-property-stream"); + MimeHelper.AddMimeMapping(".ai", "application/postscript"); + MimeHelper.AddMimeMapping(".aif", "audio/x-aiff"); + MimeHelper.AddMimeMapping(".aiff", "audio/aiff"); + MimeHelper.AddMimeMapping(".axs", "application/olescript"); + MimeHelper.AddMimeMapping(".aifc", "audio/aiff"); + MimeHelper.AddMimeMapping(".asr", "video/x-ms-asf"); + MimeHelper.AddMimeMapping(".avi", "video/x-msvideo"); + MimeHelper.AddMimeMapping(".asf", "video/x-ms-asf"); + MimeHelper.AddMimeMapping(".au", "audio/basic"); + MimeHelper.AddMimeMapping(".application", "application/x-ms-application"); + MimeHelper.AddMimeMapping(".bin", "application/octet-stream"); + MimeHelper.AddMimeMapping(".bas", "text/plain"); + MimeHelper.AddMimeMapping(".bcpio", "application/x-bcpio"); + MimeHelper.AddMimeMapping(".bmp", "image/bmp"); + MimeHelper.AddMimeMapping(".cdf", "application/x-cdf"); + MimeHelper.AddMimeMapping(".cat", "application/vndms-pkiseccat"); + MimeHelper.AddMimeMapping(".crt", "application/x-x509-ca-cert"); + MimeHelper.AddMimeMapping(".c", "text/plain"); + MimeHelper.AddMimeMapping(".css", "text/css"); + MimeHelper.AddMimeMapping(".cer", "application/x-x509-ca-cert"); + MimeHelper.AddMimeMapping(".crl", "application/pkix-crl"); + MimeHelper.AddMimeMapping(".cmx", "image/x-cmx"); + MimeHelper.AddMimeMapping(".csh", "application/x-csh"); + MimeHelper.AddMimeMapping(".cod", "image/cis-cod"); + MimeHelper.AddMimeMapping(".cpio", "application/x-cpio"); + MimeHelper.AddMimeMapping(".clp", "application/x-msclip"); + MimeHelper.AddMimeMapping(".crd", "application/x-mscardfile"); + MimeHelper.AddMimeMapping(".deploy", "application/octet-stream"); + MimeHelper.AddMimeMapping(".dll", "application/x-msdownload"); + MimeHelper.AddMimeMapping(".dot", "application/msword"); + MimeHelper.AddMimeMapping(".doc", "application/msword"); + MimeHelper.AddMimeMapping(".dvi", "application/x-dvi"); + MimeHelper.AddMimeMapping(".dir", "application/x-director"); + MimeHelper.AddMimeMapping(".dxr", "application/x-director"); + MimeHelper.AddMimeMapping(".der", "application/x-x509-ca-cert"); + MimeHelper.AddMimeMapping(".dib", "image/bmp"); + MimeHelper.AddMimeMapping(".dcr", "application/x-director"); + MimeHelper.AddMimeMapping(".disco", "text/xml"); + MimeHelper.AddMimeMapping(".exe", "application/octet-stream"); + MimeHelper.AddMimeMapping(".etx", "text/x-setext"); + MimeHelper.AddMimeMapping(".evy", "application/envoy"); + MimeHelper.AddMimeMapping(".eml", "message/rfc822"); + MimeHelper.AddMimeMapping(".eps", "application/postscript"); + MimeHelper.AddMimeMapping(".flr", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".fif", "application/fractals"); + MimeHelper.AddMimeMapping(".gtar", "application/x-gtar"); + MimeHelper.AddMimeMapping(".gif", "image/gif"); + MimeHelper.AddMimeMapping(".gz", "application/x-gzip"); + MimeHelper.AddMimeMapping(".hta", "application/hta"); + MimeHelper.AddMimeMapping(".htc", "text/x-component"); + MimeHelper.AddMimeMapping(".htt", "text/webviewhtml"); + MimeHelper.AddMimeMapping(".h", "text/plain"); + MimeHelper.AddMimeMapping(".hdf", "application/x-hdf"); + MimeHelper.AddMimeMapping(".hlp", "application/winhlp"); + MimeHelper.AddMimeMapping(".html", "text/html"); + MimeHelper.AddMimeMapping(".htm", "text/html"); + MimeHelper.AddMimeMapping(".hqx", "application/mac-binhex40"); + MimeHelper.AddMimeMapping(".isp", "application/x-internet-signup"); + MimeHelper.AddMimeMapping(".iii", "application/x-iphone"); + MimeHelper.AddMimeMapping(".ief", "image/ief"); + MimeHelper.AddMimeMapping(".ivf", "video/x-ivf"); + MimeHelper.AddMimeMapping(".ins", "application/x-internet-signup"); + MimeHelper.AddMimeMapping(".ico", "image/x-icon"); + MimeHelper.AddMimeMapping(".jpg", "image/jpeg"); + MimeHelper.AddMimeMapping(".jfif", "image/pjpeg"); + MimeHelper.AddMimeMapping(".jpe", "image/jpeg"); + MimeHelper.AddMimeMapping(".jpeg", "image/jpeg"); + MimeHelper.AddMimeMapping(".js", "application/x-javascript"); + MimeHelper.AddMimeMapping(".lsx", "video/x-la-asf"); + MimeHelper.AddMimeMapping(".latex", "application/x-latex"); + MimeHelper.AddMimeMapping(".lsf", "video/x-la-asf"); + MimeHelper.AddMimeMapping(".manifest", "application/x-ms-manifest"); + MimeHelper.AddMimeMapping(".mhtml", "message/rfc822"); + MimeHelper.AddMimeMapping(".mny", "application/x-msmoney"); + MimeHelper.AddMimeMapping(".mht", "message/rfc822"); + MimeHelper.AddMimeMapping(".mid", "audio/mid"); + MimeHelper.AddMimeMapping(".mpv2", "video/mpeg"); + MimeHelper.AddMimeMapping(".man", "application/x-troff-man"); + MimeHelper.AddMimeMapping(".mvb", "application/x-msmediaview"); + MimeHelper.AddMimeMapping(".mpeg", "video/mpeg"); + MimeHelper.AddMimeMapping(".m3u", "audio/x-mpegurl"); + MimeHelper.AddMimeMapping(".mdb", "application/x-msaccess"); + MimeHelper.AddMimeMapping(".mpp", "application/vnd.ms-project"); + MimeHelper.AddMimeMapping(".m1v", "video/mpeg"); + MimeHelper.AddMimeMapping(".mpa", "video/mpeg"); + MimeHelper.AddMimeMapping(".me", "application/x-troff-me"); + MimeHelper.AddMimeMapping(".m13", "application/x-msmediaview"); + MimeHelper.AddMimeMapping(".movie", "video/x-sgi-movie"); + MimeHelper.AddMimeMapping(".m14", "application/x-msmediaview"); + MimeHelper.AddMimeMapping(".mpe", "video/mpeg"); + MimeHelper.AddMimeMapping(".mp2", "video/mpeg"); + MimeHelper.AddMimeMapping(".mov", "video/quicktime"); + MimeHelper.AddMimeMapping(".mp3", "audio/mpeg"); + MimeHelper.AddMimeMapping(".mpg", "video/mpeg"); + MimeHelper.AddMimeMapping(".ms", "application/x-troff-ms"); + MimeHelper.AddMimeMapping(".nc", "application/x-netcdf"); + MimeHelper.AddMimeMapping(".nws", "message/rfc822"); + MimeHelper.AddMimeMapping(".oda", "application/oda"); + MimeHelper.AddMimeMapping(".ods", "application/oleobject"); + MimeHelper.AddMimeMapping(".pmc", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".p7r", "application/x-pkcs7-certreqresp"); + MimeHelper.AddMimeMapping(".p7b", "application/x-pkcs7-certificates"); + MimeHelper.AddMimeMapping(".p7s", "application/pkcs7-signature"); + MimeHelper.AddMimeMapping(".pmw", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".ps", "application/postscript"); + MimeHelper.AddMimeMapping(".p7c", "application/pkcs7-mime"); + MimeHelper.AddMimeMapping(".pbm", "image/x-portable-bitmap"); + MimeHelper.AddMimeMapping(".ppm", "image/x-portable-pixmap"); + MimeHelper.AddMimeMapping(".pub", "application/x-mspublisher"); + MimeHelper.AddMimeMapping(".pnm", "image/x-portable-anymap"); + MimeHelper.AddMimeMapping(".png", "image/png"); + MimeHelper.AddMimeMapping(".pml", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".p10", "application/pkcs10"); + MimeHelper.AddMimeMapping(".pfx", "application/x-pkcs12"); + MimeHelper.AddMimeMapping(".p12", "application/x-pkcs12"); + MimeHelper.AddMimeMapping(".pdf", "application/pdf"); + MimeHelper.AddMimeMapping(".pps", "application/vnd.ms-powerpoint"); + MimeHelper.AddMimeMapping(".p7m", "application/pkcs7-mime"); + MimeHelper.AddMimeMapping(".pko", "application/vndms-pkipko"); + MimeHelper.AddMimeMapping(".ppt", "application/vnd.ms-powerpoint"); + MimeHelper.AddMimeMapping(".pmr", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".pma", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".pot", "application/vnd.ms-powerpoint"); + MimeHelper.AddMimeMapping(".prf", "application/pics-rules"); + MimeHelper.AddMimeMapping(".pgm", "image/x-portable-graymap"); + MimeHelper.AddMimeMapping(".qt", "video/quicktime"); + MimeHelper.AddMimeMapping(".ra", "audio/x-pn-realaudio"); + MimeHelper.AddMimeMapping(".rgb", "image/x-rgb"); + MimeHelper.AddMimeMapping(".ram", "audio/x-pn-realaudio"); + MimeHelper.AddMimeMapping(".rmi", "audio/mid"); + MimeHelper.AddMimeMapping(".ras", "image/x-cmu-raster"); + MimeHelper.AddMimeMapping(".roff", "application/x-troff"); + MimeHelper.AddMimeMapping(".rtf", "application/rtf"); + MimeHelper.AddMimeMapping(".rtx", "text/richtext"); + MimeHelper.AddMimeMapping(".sv4crc", "application/x-sv4crc"); + MimeHelper.AddMimeMapping(".spc", "application/x-pkcs7-certificates"); + MimeHelper.AddMimeMapping(".setreg", "application/set-registration-initiation"); + MimeHelper.AddMimeMapping(".snd", "audio/basic"); + MimeHelper.AddMimeMapping(".stl", "application/vndms-pkistl"); + MimeHelper.AddMimeMapping(".setpay", "application/set-payment-initiation"); + MimeHelper.AddMimeMapping(".stm", "text/html"); + MimeHelper.AddMimeMapping(".shar", "application/x-shar"); + MimeHelper.AddMimeMapping(".sh", "application/x-sh"); + MimeHelper.AddMimeMapping(".sit", "application/x-stuffit"); + MimeHelper.AddMimeMapping(".spl", "application/futuresplash"); + MimeHelper.AddMimeMapping(".sct", "text/scriptlet"); + MimeHelper.AddMimeMapping(".scd", "application/x-msschedule"); + MimeHelper.AddMimeMapping(".sst", "application/vndms-pkicertstore"); + MimeHelper.AddMimeMapping(".src", "application/x-wais-source"); + MimeHelper.AddMimeMapping(".sv4cpio", "application/x-sv4cpio"); + MimeHelper.AddMimeMapping(".tex", "application/x-tex"); + MimeHelper.AddMimeMapping(".tgz", "application/x-compressed"); + MimeHelper.AddMimeMapping(".t", "application/x-troff"); + MimeHelper.AddMimeMapping(".tar", "application/x-tar"); + MimeHelper.AddMimeMapping(".tr", "application/x-troff"); + MimeHelper.AddMimeMapping(".tif", "image/tiff"); + MimeHelper.AddMimeMapping(".txt", "text/plain"); + MimeHelper.AddMimeMapping(".texinfo", "application/x-texinfo"); + MimeHelper.AddMimeMapping(".trm", "application/x-msterminal"); + MimeHelper.AddMimeMapping(".tiff", "image/tiff"); + MimeHelper.AddMimeMapping(".tcl", "application/x-tcl"); + MimeHelper.AddMimeMapping(".texi", "application/x-texinfo"); + MimeHelper.AddMimeMapping(".tsv", "text/tab-separated-values"); + MimeHelper.AddMimeMapping(".ustar", "application/x-ustar"); + MimeHelper.AddMimeMapping(".uls", "text/iuls"); + MimeHelper.AddMimeMapping(".vcf", "text/x-vcard"); + MimeHelper.AddMimeMapping(".wps", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wav", "audio/wav"); + MimeHelper.AddMimeMapping(".wrz", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".wri", "application/x-mswrite"); + MimeHelper.AddMimeMapping(".wks", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wmf", "application/x-msmetafile"); + MimeHelper.AddMimeMapping(".wcm", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wrl", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".wdb", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wsdl", "text/xml"); + MimeHelper.AddMimeMapping(".xap", "application/x-silverlight-app"); + MimeHelper.AddMimeMapping(".xml", "text/xml"); + MimeHelper.AddMimeMapping(".xlm", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xaf", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".xla", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xls", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xlsx", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xof", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".xlt", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xlc", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xsl", "text/xml"); + MimeHelper.AddMimeMapping(".xbm", "image/x-xbitmap"); + MimeHelper.AddMimeMapping(".xlw", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xpm", "image/x-xpixmap"); + MimeHelper.AddMimeMapping(".xwd", "image/x-xwindowdump"); + MimeHelper.AddMimeMapping(".xsd", "text/xml"); + MimeHelper.AddMimeMapping(".z", "application/x-compress"); + MimeHelper.AddMimeMapping(".zip", "application/x-zip-compressed"); + MimeHelper.AddMimeMapping(".*", "application/octet-stream"); + } + } + + + +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/RSAHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/RSAHelper.cs new file mode 100644 index 00000000..f439b544 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/RSAHelper.cs @@ -0,0 +1,390 @@ +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace Yi.Framework.Common.Helper +{ + /// + /// RSA加解密 使用OpenSSL的公钥加密/私钥解密 + /// 公私钥请使用openssl生成 + /// + public class RSAHelper + { + public readonly RSA _privateKeyRsaProvider; + public readonly RSA _publicKeyRsaProvider; + private readonly HashAlgorithmName _hashAlgorithmName; + private readonly Encoding _encoding; + + /// + /// 实例化RSAHelper + /// + /// 加密算法类型 RSA SHA1;RSA2 SHA256 密钥长度至少为2048 + /// 编码类型 + /// 私钥 + /// 公钥 + public RSAHelper(RSAType rsaType, Encoding encoding, string privateKey, string publicKey = null) + { + _encoding = encoding; + if (!string.IsNullOrEmpty(privateKey)) + { + _privateKeyRsaProvider = CreateRsaProviderFromPrivateKey(privateKey); + } + + if (!string.IsNullOrEmpty(publicKey)) + { + _publicKeyRsaProvider = CreateRsaProviderFromPublicKey(publicKey); + } + + _hashAlgorithmName = rsaType == RSAType.RSA ? HashAlgorithmName.SHA1 : HashAlgorithmName.SHA256; + } + + #region 使用私钥签名 + + /// + /// 使用私钥签名 + /// + /// 原始数据 + /// + public string Sign(string data) + { + byte[] dataBytes = _encoding.GetBytes(data); + + var signatureBytes = _privateKeyRsaProvider.SignData(dataBytes, _hashAlgorithmName, RSASignaturePadding.Pkcs1); + + return Convert.ToBase64String(signatureBytes); + } + + #endregion + + #region 使用公钥验签 + + /// + /// 使用公钥验签 + /// + /// 原始数据 + /// 签名 + /// + public bool Verify(string data, string sign) + { + byte[] dataBytes = _encoding.GetBytes(data); + byte[] signBytes = Convert.FromBase64String(sign); + + var verify = _publicKeyRsaProvider.VerifyData(dataBytes, signBytes, _hashAlgorithmName, RSASignaturePadding.Pkcs1); + + return verify; + } + + #endregion + + #region 解密 + /// + /// 私钥解密(原) + /// + /// 解密字符串(base64) + /// + + //public string Decrypt(string cipherText) + //{ + // if (_privateKeyRsaProvider == null) + // { + // throw new Exception("_privateKeyRsaProvider is null"); + // } + // return _encoding.GetString(_privateKeyRsaProvider.Decrypt(Convert.FromBase64String(cipherText), RSAEncryptionPadding.Pkcs1)); + //} + /// + /// 私钥解密(支持大量数据) + /// + /// + /// + public string Decrypt(string cipherText) + { + if (_privateKeyRsaProvider == null) + { + throw new Exception("_privateKeyRsaProvider is null"); + } + var bufferSize = (_privateKeyRsaProvider.KeySize / 8); + byte[] buffer = new byte[bufferSize];//待解密块 + using (MemoryStream msInput = new MemoryStream(Convert.FromBase64String(cipherText))) + { + using (MemoryStream msOutput = new MemoryStream()) + { + int readLen; while ((readLen = msInput.Read(buffer, 0, bufferSize)) > 0) + { + byte[] dataToEnc = new byte[readLen]; + Array.Copy(buffer, 0, dataToEnc, 0, readLen); byte[] encData = _privateKeyRsaProvider.Decrypt(dataToEnc, RSAEncryptionPadding.Pkcs1); + msOutput.Write(encData, 0, encData.Length); + } + byte[] result = msOutput.ToArray(); + return _encoding.GetString(result); + } + } + } + + #endregion + + #region 加密 + + /// + /// 公钥加密(原) + /// + /// + /// + //public string Encrypt(string text) + //{ + // if (_publicKeyRsaProvider == null) + // { + // throw new Exception("_publicKeyRsaProvider is null"); + // } + // return Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.Pkcs1)); + //} + /// + /// 公钥加密(支持大量数据) + /// + /// + /// + public string Encrypt(string text) + { + if (_publicKeyRsaProvider == null) + { + throw new Exception("_publicKeyRsaProvider is null"); + } + var bufferSize = (_publicKeyRsaProvider.KeySize / 8 - 11); + byte[] buffer = new byte[bufferSize];//待加密块 + + using (MemoryStream msInput = new MemoryStream(_encoding.GetBytes(text))) + { + using (MemoryStream msOutput = new MemoryStream()) + { + int readLen; while ((readLen = msInput.Read(buffer, 0, bufferSize)) > 0) + { + byte[] dataToEnc = new byte[readLen]; + Array.Copy(buffer, 0, dataToEnc, 0, readLen); byte[] encData = _publicKeyRsaProvider.Encrypt(dataToEnc, RSAEncryptionPadding.Pkcs1); + msOutput.Write(encData, 0, encData.Length); + } + byte[] result = msOutput.ToArray(); + return Convert.ToBase64String(result); + } + } + } + + #endregion + + #region 使用私钥创建RSA实例 + /// + /// 使用私钥创建RSA实例 + /// + /// + /// + private RSA CreateRsaProviderFromPrivateKey(string privateKey) + { + var privateKeyBits = Convert.FromBase64String(privateKey); + + var rsa = RSA.Create(); + var rsaParameters = new RSAParameters(); + + using (BinaryReader binr = new BinaryReader(new MemoryStream(privateKeyBits))) + { + byte bt = 0; + ushort twobytes = 0; + twobytes = binr.ReadUInt16(); + if (twobytes == 0x8130) + binr.ReadByte(); + else if (twobytes == 0x8230) + binr.ReadInt16(); + else + throw new Exception("Unexpected value read binr.ReadUInt16()"); + + twobytes = binr.ReadUInt16(); + if (twobytes != 0x0102) + throw new Exception("Unexpected version"); + + bt = binr.ReadByte(); + if (bt != 0x00) + throw new Exception("Unexpected value read binr.ReadByte()"); + + rsaParameters.Modulus = binr.ReadBytes(GetIntegerSize(binr)); + rsaParameters.Exponent = binr.ReadBytes(GetIntegerSize(binr)); + rsaParameters.D = binr.ReadBytes(GetIntegerSize(binr)); + rsaParameters.P = binr.ReadBytes(GetIntegerSize(binr)); + rsaParameters.Q = binr.ReadBytes(GetIntegerSize(binr)); + rsaParameters.DP = binr.ReadBytes(GetIntegerSize(binr)); + rsaParameters.DQ = binr.ReadBytes(GetIntegerSize(binr)); + rsaParameters.InverseQ = binr.ReadBytes(GetIntegerSize(binr)); + } + + rsa.ImportParameters(rsaParameters); + return rsa; + } + + #endregion + + #region 使用公钥创建RSA实例 + /// + /// 使用公钥创建RSA实例 + /// + /// + /// + public RSA CreateRsaProviderFromPublicKey(string publicKeyString) + { + // encoded OID sequence for PKCS #1 rsaEncryption szOID_RSA_RSA = "1.2.840.113549.1.1.1" + byte[] seqOid = { 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 }; + byte[] seq = new byte[15]; + + var x509Key = Convert.FromBase64String(publicKeyString); + + // --------- Set up stream to read the asn.1 encoded SubjectPublicKeyInfo blob ------ + using (MemoryStream mem = new MemoryStream(x509Key)) + { + using (BinaryReader binr = new BinaryReader(mem)) //wrap Memory Stream with BinaryReader for easy reading + { + byte bt = 0; + ushort twobytes = 0; + + twobytes = binr.ReadUInt16(); + if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81) + binr.ReadByte(); //advance 1 byte + else if (twobytes == 0x8230) + binr.ReadInt16(); //advance 2 bytes + else + return null; + + seq = binr.ReadBytes(15); //read the Sequence OID + if (!CompareBytearrays(seq, seqOid)) //make sure Sequence for OID is correct + return null; + + twobytes = binr.ReadUInt16(); + if (twobytes == 0x8103) //data read as little endian order (actual data order for Bit String is 03 81) + binr.ReadByte(); //advance 1 byte + else if (twobytes == 0x8203) + binr.ReadInt16(); //advance 2 bytes + else + return null; + + bt = binr.ReadByte(); + if (bt != 0x00) //expect null byte next + return null; + + twobytes = binr.ReadUInt16(); + if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81) + binr.ReadByte(); //advance 1 byte + else if (twobytes == 0x8230) + binr.ReadInt16(); //advance 2 bytes + else + return null; + + twobytes = binr.ReadUInt16(); + byte lowbyte = 0x00; + byte highbyte = 0x00; + + if (twobytes == 0x8102) //data read as little endian order (actual data order for Integer is 02 81) + lowbyte = binr.ReadByte(); // read next bytes which is bytes in modulus + else if (twobytes == 0x8202) + { + highbyte = binr.ReadByte(); //advance 2 bytes + lowbyte = binr.ReadByte(); + } + else + return null; + byte[] modint = { lowbyte, highbyte, 0x00, 0x00 }; //reverse byte order since asn.1 key uses big endian order + int modsize = BitConverter.ToInt32(modint, 0); + + int firstbyte = binr.PeekChar(); + if (firstbyte == 0x00) + { //if first byte (highest order) of modulus is zero, don't include it + binr.ReadByte(); //skip this null byte + modsize -= 1; //reduce modulus buffer size by 1 + } + + byte[] modulus = binr.ReadBytes(modsize); //read the modulus bytes + + if (binr.ReadByte() != 0x02) //expect an Integer for the exponent data + return null; + int expbytes = (int)binr.ReadByte(); // should only need one byte for actual exponent data (for all useful values) + byte[] exponent = binr.ReadBytes(expbytes); + + // ------- create RSACryptoServiceProvider instance and initialize with public key ----- + var rsa = RSA.Create(); + RSAParameters rsaKeyInfo = new RSAParameters + { + Modulus = modulus, + Exponent = exponent + }; + rsa.ImportParameters(rsaKeyInfo); + + return rsa; + } + + } + } + + #endregion + + #region 导入密钥算法 + + private int GetIntegerSize(BinaryReader binr) + { + byte bt = 0; + int count = 0; + bt = binr.ReadByte(); + if (bt != 0x02) + return 0; + bt = binr.ReadByte(); + + if (bt == 0x81) + count = binr.ReadByte(); + else + if (bt == 0x82) + { + var highbyte = binr.ReadByte(); + var lowbyte = binr.ReadByte(); + byte[] modint = { lowbyte, highbyte, 0x00, 0x00 }; + count = BitConverter.ToInt32(modint, 0); + } + else + { + count = bt; + } + + while (binr.ReadByte() == 0x00) + { + count -= 1; + } + binr.BaseStream.Seek(-1, SeekOrigin.Current); + return count; + } + + private bool CompareBytearrays(byte[] a, byte[] b) + { + if (a.Length != b.Length) + return false; + int i = 0; + foreach (byte c in a) + { + if (c != b[i]) + return false; + i++; + } + return true; + } + + #endregion + + } + + /// + /// RSA算法类型 + /// + public enum RSAType + { + /// + /// SHA1 + /// + RSA = 0, + /// + /// RSA2 密钥长度至少为2048 + /// SHA256 + /// + RSA2 + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/RandomHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/RandomHelper.cs new file mode 100644 index 00000000..8c5cd40f --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/RandomHelper.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace Yi.Framework.Common.Helper +{ + public class RandomHelper + { + public static string replaceBianLiang(string content) + { + content = content.Replace("{当前时间}", DateTime.Now.TimeOfDay.ToString()); + string[] bianliang = new string[] { "{随机字母}", "{随机数字}", "{随机汉字}" }; + Regex r; + int count; + string readstr = ""; + foreach (string str in bianliang) + { + count = (content.Length - content.Replace(str, "").Length) / str.Length; + if (str == "{随机汉字}") readstr = RandChina(count); + if (str == "{随机数字}") readstr = GenerateCheckCodeNum(count); + if (str == "{随机字母}") readstr = GenerateRandomLetter(count); + if (count > readstr.Length) count = readstr.Length; + r = new Regex(str.Replace("{", "\\{").Replace("}", "\\}")); + for (int i = 0; i < count; i++) + { + content = r.Replace(content, readstr.Substring(i, 1), 1); + } + } + return content; + } + + + /// + /// 随机生成字母 + /// + /// + /// + public static string GenerateRandomLetter(int Length) + { + char[] Pattern = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; + string result = ""; + int n = Pattern.Length; + Random random = new Random(~unchecked((int)DateTime.Now.Ticks)); + for (int i = 0; i < Length; i++) + { + int rnd = random.Next(0, n); + result += Pattern[rnd]; + } + return result; + } + + /// + /// 随机生成数字 + /// + /// + /// + public static string GenerateCheckCodeNum(int codeCount) + { + int rep = 0; + string str = string.Empty; + long num2 = DateTime.Now.Ticks + rep; + rep++; + Random random = new Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> rep))); + for (int i = 0; i < codeCount; i++) + { + int num = random.Next(); + str = str + ((char)(0x30 + ((ushort)(num % 10)))).ToString(); + } + return str; + } + + /// + /// 此函数为生成指定数目的汉字 + /// + /// 汉字数目 + /// 所有汉字 + public static string RandChina(int charLen) + { + int area, code;//汉字由区位和码位组成(都为0-94,其中区位16-55为一级汉字区,56-87为二级汉字区,1-9为特殊字符区) + StringBuilder strtem = new StringBuilder(); + Random rand = new Random(); + for (int i = 0; i < charLen; i++) + { + area = rand.Next(16, 88); + if (area == 55)//第55区只有89个字符 + { + code = rand.Next(1, 90); + } + else + { + code = rand.Next(1, 94); + } + strtem.Append(Encoding.GetEncoding("GB2312").GetString(new byte[] { Convert.ToByte(area + 160), Convert.ToByte(code + 160) })); + } + return strtem.ToString(); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/SerializeHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/SerializeHelper.cs new file mode 100644 index 00000000..9a5aee9b --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/SerializeHelper.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json; +using System.Text; + +namespace Yi.Framework.Common.Helper +{ + public class SerializeHelper + { + /// + /// 序列化 + /// + /// + /// + public static byte[] Serialize(object item) + { + var jsonString = JsonConvert.SerializeObject(item); + + return Encoding.UTF8.GetBytes(jsonString); + } + /// + /// 反序列化 + /// + /// + /// + /// + public static TEntity Deserialize(byte[] value) + { + if (value == null) + { + return default(TEntity); + } + var jsonString = Encoding.UTF8.GetString(value); + return JsonConvert.DeserializeObject(jsonString); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/SnowflakeHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/SnowflakeHelper.cs new file mode 100644 index 00000000..603acb75 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/SnowflakeHelper.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Helper +{ + public static class SnowflakeHelper + { + public static long Next() + { + SnowflakeTool snowflakeTool = new SnowflakeTool(1); + return snowflakeTool.NextId(); + } + + private class SnowflakeTool + { + //机器ID + private static long nodeId; + private static long twepoch = 687888001020L; //唯一时间,这是一个避免重复的随机量,自行设定不要大于当前时间戳 + private static long sequence = 0L; + private static int workerIdBits = 4; //机器码字节数。4个字节用来保存机器码(定义为Long类型会出现,最大偏移64位,所以左移64位没有意义) + public static long maxWorkerId = -1L ^ -1L << workerIdBits; //最大机器ID + private static int sequenceBits = 10; //计数器字节数,10个字节用来保存计数码 + private static int workerIdShift = sequenceBits; //机器码数据左移位数,就是后面计数器占用的位数 + private static int timestampLeftShift = sequenceBits + workerIdBits; //时间戳左移动位数就是机器码和计数器总字节数 + public static long sequenceMask = -1L ^ -1L << sequenceBits; //一微秒内可以产生计数,如果达到该值则等到下一微妙在进行生成 + private long lastTimestamp = -1L; + + /// + /// 机器码 + /// + /// + public SnowflakeTool(long workerId) + { + if (workerId > maxWorkerId || workerId < 0) + throw new Exception(string.Format("节点id 不能大于 {0} 或者 小于 0 ", workerId)); + SnowflakeTool.nodeId = workerId; + + } + + public long NextId() + { + lock (this) + { + long timestamp = TimeGen(); + if (this.lastTimestamp == timestamp) + { //同一微妙中生成ID + SnowflakeTool.sequence = (SnowflakeTool.sequence + 1) & SnowflakeTool.sequenceMask; //用&运算计算该微秒内产生的计数是否已经到达上限 + if (SnowflakeTool.sequence == 0) + { + //一微妙内产生的ID计数已达上限,等待下一微妙 + timestamp = TillNextMillis(this.lastTimestamp); + } + } + else + { //不同微秒生成ID + SnowflakeTool.sequence = 0; //计数清0 + } + if (timestamp < lastTimestamp) + { //如果当前时间戳比上一次生成ID时时间戳还小,抛出异常,因为不能保证现在生成的ID之前没有生成过 + throw new Exception(string.Format("Clock moved backwards. Refusing to generate id for {0} milliseconds", + this.lastTimestamp - timestamp)); + } + this.lastTimestamp = timestamp; //把当前时间戳保存为最后生成ID的时间戳 + long nextId = (timestamp - twepoch << timestampLeftShift) | SnowflakeTool.nodeId << SnowflakeTool.workerIdShift | SnowflakeTool.sequence; + return nextId; + } + } + + /// + /// 获取下一微秒时间戳 + /// + /// + /// + private long TillNextMillis(long lastTimestamp) + { + long timestamp = TimeGen(); + while (timestamp <= lastTimestamp) + { + timestamp = TimeGen(); + } + return timestamp; + } + + /// + /// 生成当前时间戳 + /// + /// + private long TimeGen() + { + return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; + } + } + } + + +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/StringHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/StringHelper.cs new file mode 100644 index 00000000..b4287ed5 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/StringHelper.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace Yi.Framework.Common.Helper +{ + public class StringHelper + { + /// + /// 根据分隔符返回前n条数据 + /// + /// 数据内容 + /// 分隔符 + /// 前n条 + /// 是否倒序(默认false) + /// + public static List GetTopDataBySeparator(string content, string separator, int top, bool isDesc = false) + { + if (string.IsNullOrEmpty(content)) + { + return new List() { }; + } + + if (string.IsNullOrEmpty(separator)) + { + throw new ArgumentException("message", nameof(separator)); + } + + var dataArray = content.Split(separator).Where(d => !string.IsNullOrEmpty(d)).ToArray(); + if (isDesc) + { + Array.Reverse(dataArray); + } + + if (top > 0) + { + dataArray = dataArray.Take(top).ToArray(); + } + + return dataArray.ToList(); + } + /// + /// 根据字段拼接get参数 + /// + /// + /// + public static string GetPars(Dictionary dic) + { + + StringBuilder sb = new StringBuilder(); + string urlPars = null; + bool isEnter = false; + foreach (var item in dic) + { + sb.Append($"{(isEnter ? "&" : "")}{item.Key}={item.Value}"); + isEnter = true; + } + urlPars = sb.ToString(); + return urlPars; + } + /// + /// 根据字段拼接get参数 + /// + /// + /// + public static string GetPars(Dictionary dic) + { + + StringBuilder sb = new StringBuilder(); + string urlPars = null; + bool isEnter = false; + foreach (var item in dic) + { + sb.Append($"{(isEnter ? "&" : "")}{item.Key}={item.Value}"); + isEnter = true; + } + urlPars = sb.ToString(); + return urlPars; + } + /// + /// 获取一个GUID + /// + /// 格式-默认为N + /// + public static string GetGUID(string format="N") { + return Guid.NewGuid().ToString(format); + } + /// + /// 根据GUID获取19位的唯一数字序列 + /// + /// + public static long GetGuidToLongID() + { + byte[] buffer = Guid.NewGuid().ToByteArray(); + return BitConverter.ToInt64(buffer, 0); + } + /// + /// 获取字符串最后X行 + /// + /// + /// + /// + public static string GetCusLine(string resourceStr, int length) { + string[] arrStr = resourceStr.Split("\r\n"); + return string.Join("", (from q in arrStr select q).Skip(arrStr.Length - length + 1).Take(length).ToArray()); + } + + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/UnicodeHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/UnicodeHelper.cs new file mode 100644 index 00000000..d6d96f75 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/UnicodeHelper.cs @@ -0,0 +1,47 @@ +using System; +using System.Text; +using System.Text.RegularExpressions; + +namespace Yi.Framework.Common.Helper +{ + public static class UnicodeHelper + { + /// + /// 字符串转Unicode码 + /// + /// The to unicode. + /// Value. + public static string StringToUnicode(string value) + { + byte[] bytes = Encoding.Unicode.GetBytes(value); + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < bytes.Length; i += 2) + { + // 取两个字符,每个字符都是右对齐。 + stringBuilder.AppendFormat("u{0}{1}", bytes[i + 1].ToString("x").PadLeft(2, '0'), bytes[i].ToString("x").PadLeft(2, '0')); + } + return stringBuilder.ToString(); + } + + /// + /// Unicode转字符串 + /// + /// The to string. + /// Unicode. + public static string UnicodeToString(string unicode) + { + unicode = unicode.Replace("%", "\\"); + + return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace( + unicode, x => string.Empty + Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16))); + + //string resultStr = ""; + //string[] strList = unicode.Split('u'); + //for (int i = 1; i < strList.Length; i++) + //{ + // resultStr += (char)int.Parse(strList[i], System.Globalization.NumberStyles.HexNumber); + //} + //return resultStr; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/UrlHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/UrlHelper.cs new file mode 100644 index 00000000..6ebd30c0 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/UrlHelper.cs @@ -0,0 +1,23 @@ +namespace Yi.Framework.Common.Helper +{ + public class UrlHelper + { + /// + /// UrlEncode编码 + /// + /// url + /// + public static string UrlEncode(string url) { + return System.Web.HttpUtility.UrlEncode(url, System.Text.Encoding.UTF8); + } + /// + /// UrlEncode解码 + /// + /// 数据 + /// + public static string UrlDecode(string data) + { + return System.Web.HttpUtility.UrlDecode(data, System.Text.Encoding.UTF8); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/XmlHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/XmlHelper.cs new file mode 100644 index 00000000..44133350 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/XmlHelper.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; + +namespace Yi.Framework.Common.Helper +{ + public class XmlHelper + { + /// + /// 转换对象为JSON格式数据 + /// + /// + /// 对象 + /// 字符格式的JSON数据 + public static string GetXML(object obj) + { + try + { + XmlSerializer xs = new XmlSerializer(typeof(T)); + + using (TextWriter tw = new StringWriter()) + { + xs.Serialize(tw, obj); + return tw.ToString(); + } + } + catch (Exception) + { + return string.Empty; + } + } + + /// + /// Xml格式字符转换为T类型的对象 + /// + /// + /// + /// + public static T ParseFormByXml(string xml,string rootName="root") + { + XmlSerializer serializer = new XmlSerializer(typeof(T), new XmlRootAttribute(rootName)); + StringReader reader = new StringReader(xml); + + T res = (T)serializer.Deserialize(reader); + reader.Close(); + reader.Dispose(); + return res; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs new file mode 100644 index 00000000..a9cc27a3 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Yi.Framework.Common.IOCOptions +{ + /// + /// 使用Consul时需要配置 + /// + public class ConsulClientOption + { + public string IP { get; set; } + public int Port { get; set; } + public string Datacenter { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs new file mode 100644 index 00000000..a5c4fa6a --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.IOCOptions +{ + public class ConsulRegisterOption + { + /// + /// 服务自身IP + /// + public string IP { get; set; } + /// + /// 服务自身Port + /// + public int Port { get; set; } + /// + /// 组名称 + /// + public string GroupName { get; set; } + /// + /// 心跳检查地址 + /// + public string HealthCheckUrl { get; set; } + /// + /// 心跳频率 + /// + public int Interval { get; set; } + /// + /// 心跳超时 + /// + public int Timeout { get; set; } + /// + /// 移除延迟时间 + /// + public int DeregisterCriticalServiceAfter { get; set; } + /// + /// 标签,额外信息,用于权重 + /// + public string Tag { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs new file mode 100644 index 00000000..1080aaa6 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.IOCOptions +{ + public class ElasticSearchOptions + { + public string Url { get; set; } + public string IndexName { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs new file mode 100644 index 00000000..89fd0993 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/JWTTokenOptions.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.IOCOptions +{ + public class JWTTokenOptions + { + public string Audience + { + get; + set; + } + public string SecurityKey + { + get; + set; + } + //public SigningCredentials Credentials + //{ + // get; + // set; + //} + public string Issuer + { + get; + set; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/KafkaOptions.cs b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/KafkaOptions.cs new file mode 100644 index 00000000..cfc6955e --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/KafkaOptions.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.IOCOptions +{ + public class KafkaOptions + { + public string BrokerList { get; set; } + public string TopicName { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs new file mode 100644 index 00000000..c5ae46b1 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; + +namespace Yi.Framework.Common.IOCOptions +{ + public class DbConnOptions + { + public string WriteUrl { get; set; } + public List ReadUrl { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs new file mode 100644 index 00000000..bdcb0f13 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.IOCOptions +{ + public class RabbitMQOptions + { + ///// + ///// exchange---queue + ///// + //private static Dictionary RabbitMQ_Mapping = new Dictionary(); + //private static readonly object RabbitMQOptions_Lock = new object(); + //public void Init(string exchangeName, string queueName) + //{ + // lock (RabbitMQOptions_Lock) + // { + // RabbitMQ_Mapping[exchangeName] = queueName; + // } + //} + + public string HostName { get; set; } + public string UserName { get; set; } + public string Password { get; set; } + + public int Port { get; set; } + + } + + public class RabbitMQConsumerModel + { + /// + /// 生产者指定,交换机 + /// + public string ExchangeName { get; set; } + /// + /// 自己起的名字 + /// + public string QueueName { get; set; } + } + + public class RabbitMQExchangeQueueName + { + public static readonly string SKUCQRS_Exchange = "Zhaoxi.MSACormmerce.SKUCQRS.Exchange"; + public static readonly string SKUCQRS_Queue_StaticPage = "Zhaoxi.MSACormmerce.SKUCQRS.Queue.StaticPage"; + public static readonly string SKUCQRS_Queue_ESIndex = "Zhaoxi.MSACormmerce.SKUCQRS.Queue.ESIndex"; + + + public static readonly string SKUWarmup_Exchange = "Zhaoxi.MSACormmerce.Warmup.Exchange"; + public static readonly string SKUWarmup_Queue_StaticPage = "Zhaoxi.MSACormmerce.Warmup.Queue.StaticPage"; + public static readonly string SKUWarmup_Queue_ESIndex = "Zhaoxi.MSACormmerce.Warmup.Queue.ESIndex"; + + /// + /// 订单创建后的交换机 + /// + public static readonly string OrderCreate_Exchange = "Zhaoxi.MSACormmerce.OrderCreate.Exchange"; + public static readonly string OrderCreate_Queue_CleanCart = "Zhaoxi.MSACormmerce.OrderCreate.Queue.CleanCart"; + + /// + /// 订单创建后的交换机,支付状态的 + /// + public static readonly string OrderPay_Exchange = "Zhaoxi.MSACormmerce.OrderPay.Exchange"; + public static readonly string OrderPay_Queue_RefreshPay = "Zhaoxi.MSACormmerce.OrderPay.Queue.RefreshPay"; + + /// + /// 创建订单后的延时队列配置 + /// + public static readonly string OrderCreate_Delay_Exchange = "Zhaoxi.MSACormmerce.OrderCreate.DelayExchange"; + public static readonly string OrderCreate_Delay_Queue_CancelOrder = "Zhaoxi.MSACormmerce.OrderCreate.DelayQueue.CancelOrder"; + + /// + /// 秒杀异步的 + /// + public static readonly string Seckill_Exchange = "Zhaoxi.MSACormmerce.Seckill.Exchange"; + public static readonly string Seckill_Order_Queue = "Zhaoxi.MSACormmerce.Seckill.Order.Queue"; + + + /// + /// CAP队列名称 + /// + public const string Order_Stock_Decrease = "RabbitMQ.MySQL.Order-Stock.Decrease"; + public const string Order_Stock_Resume = "RabbitMQ.MySQL.Order-Stock.Resume"; + public const string Stock_Logistics = "RabbitMQ.MySQL.Stock-Logistics"; + + public const string Pay_Order_UpdateStatus = "RabbitMQ.MySQL.Pay_Order.UpdateStatus"; + } + +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs new file mode 100644 index 00000000..031509a3 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.IOCOptions +{ + public class RedisConnOptions + { + public string Host { get; set; } + public int DB { get; set; } = 0; + public int Prot { get; set; } + public string Password { get; set; } + } + + +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/SMSOptions.cs b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/SMSOptions.cs new file mode 100644 index 00000000..c9f36347 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/SMSOptions.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.IOCOptions +{ + public class SMSOptions + { + + public string ID { get; set; } + public string Secret { get; set; } + public string Sign { get; set; } + public string Template { get; set; } + + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/SqliteOptions.cs b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/SqliteOptions.cs new file mode 100644 index 00000000..bd2caf1e --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/IOCOptions/SqliteOptions.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.IOCOptions +{ + public class SqliteOptions + { + public string WriteUrl { get; set; } + public List ReadUrl { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/AxiosUrlsModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/AxiosUrlsModel.cs new file mode 100644 index 00000000..f5cdacb8 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/AxiosUrlsModel.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Models +{ + public class AxiosUrlsModel + { + public string get { get; set; } + public string update { get; set; } + public string del { get; set; } + public string add { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs new file mode 100644 index 00000000..1a22bf81 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Yi.Framework.Common.Enum +{ + public enum AgrFlagEnum + { + wait = 0, + Agree = 1 + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs new file mode 100644 index 00000000..7433fec5 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Yi.Framework.Common.Enum +{ + public enum DelFlagEnum + { + Normal=0, + Deleted=1 + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs new file mode 100644 index 00000000..cbd8ea1b --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Enum +{ + public enum ShowFlagEnum + { + NoShow=0, + Show=1 + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs new file mode 100644 index 00000000..a9e05013 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Enum +{ + public enum TopFlagEnum + { + Children=0, + Top=1 + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs new file mode 100644 index 00000000..c67de196 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Yi.Framework.Common.Enum +{ + public enum WriteAndReadEnum + { + Write, //主库操作 + Read //从库操作 + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/JobModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/JobModel.cs new file mode 100644 index 00000000..f831ee46 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/JobModel.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.Models +{ + public class JobModel + { + public static int visitNum { get; set; } = 0; + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/LogModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/LogModel.cs new file mode 100644 index 00000000..1c7b779f --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/LogModel.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Models +{ + /// + /// 写入分布式日志需要的字段 + /// + public class LogModel + { + public string OriginalClassName { get; set; } + public string OriginalMethodName { get; set; } + public string Remark { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/PageModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/PageModel.cs new file mode 100644 index 00000000..491f1c7e --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/PageModel.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.Models +{ + public class PageModel + { + + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/Result.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/Result.cs new file mode 100644 index 00000000..890b01f7 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/Result.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Yi.Framework.Common.Models +{ + /// + /// 结果数据 + /// + public class Result + { + public bool status { get; set; } + public int code { get; set; } + public string msg { get; set; } + public object data { get; set; } + public static Result Instance(bool status, string msg) + { + return new Result() { status = status, code = 500, msg = msg }; + } + public static Result Error(string msg = "fail") + { + return new Result() { status = false, code = 500, msg = msg }; + } + public static Result Success(string msg = "succeed") + { + return new Result() { status = true, code = 200, msg = msg }; + } + public static Result UnAuthorize(string msg = "unAuthorize") + { + return new Result() { status = false, code = 401, msg = msg }; + } + + public Result SetData(object obj) + { + this.data = obj; + return this; + } + public Result SetCode(int Code) + { + this.code = Code; + return this; + } + } + public class Result + { + public bool status { get; set; } + public int code { get; set; } + public string msg { get; set; } + public T data { get; set; } + + public static Result Instance(bool status, string msg) + { + return new Result() { status = status, code = 500, msg = msg }; + } + public static Result Error(string msg = "fail") + { + return new Result { status = false, code = 500, msg = msg }; + } + public static Result Success(string msg = "succeed") + { + return new Result { status = true, code = 200, msg = msg }; + } + + public static Result UnAuthorize(string msg = "unAuthorize") + { + return new Result{ status = false, code = 401, msg = msg }; + } + + public Result SetData(T TValue) + { + this.data = TValue; + return this; + } + } + +} \ No newline at end of file diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/SwaggerModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/SwaggerModel.cs new file mode 100644 index 00000000..43d8f300 --- /dev/null +++ b/Yi.Framework.Net6/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.Net6/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs new file mode 100644 index 00000000..fd20b344 --- /dev/null +++ b/Yi.Framework.Net6/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.Net6/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs new file mode 100644 index 00000000..80c926cf --- /dev/null +++ b/Yi.Framework.Net6/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.Net6/Yi.Framework.Common/QueueModel/SMSQueueModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/QueueModel/SMSQueueModel.cs new file mode 100644 index 00000000..242a75c9 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/QueueModel/SMSQueueModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.QueueModel +{ + public class SMSQueueModel + { + public string code { get; set; } + public string phone { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs new file mode 100644 index 00000000..a9a2efba --- /dev/null +++ b/Yi.Framework.Net6/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.Net6/Yi.Framework.Common/Yi.Framework.Common.csproj b/Yi.Framework.Net6/Yi.Framework.Common/Yi.Framework.Common.csproj new file mode 100644 index 00000000..bea37057 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Yi.Framework.Common.csproj @@ -0,0 +1,12 @@ + + + + net6.0 + + + + + + + + diff --git a/Yi.Framework.Net6/Yi.Framework.Core/CacheClientDB.cs b/Yi.Framework.Net6/Yi.Framework.Core/CacheClientDB.cs new file mode 100644 index 00000000..32187406 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Core/CacheClientDB.cs @@ -0,0 +1,1074 @@ +using Microsoft.Extensions.Options; +using ServiceStack; +using ServiceStack.Redis; +using ServiceStack.Redis.Pipeline; +using ServiceStack.Text; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; +using Yi.Framework.Common.IOCOptions; + +namespace Yi.Framework.Core +{ + public class CacheClientDB : IDisposable + { + private readonly RedisConnOptions _RedisOptions; + + #region TestRedisCrack + //static CacheClientDB() + //{ + // try + // { + // Parallel.For(0, 10000, (i) => + // { + // using (RedisClient client = new RedisClient("192.168.3.254")) + // { + // client.Set("name" + i, i); + // client.Incr("name" + i); + // Console.WriteLine(i); + // } + + // }); + // Console.WriteLine("ok"); + + // Console.WriteLine("Hello World!"); + // } + // catch (Exception ex) + // { + // Console.WriteLine(ex.Message); + // } + //} + #endregion + public CacheClientDB(IOptionsMonitor redisConnOptions) + { + this._RedisOptions = redisConnOptions.CurrentValue; + client = new RedisClient(_RedisOptions.Host, _RedisOptions.Prot, _RedisOptions.Password, _RedisOptions.DB); + } + // 管道模式 三种模式 + public IRedisClient GetClient() + { + return client; + } + private IRedisClient client; + + public void Dispose() + { + + this.TryCatchException(delegate + { + this.client.Dispose(); + }, string.Empty); + } + // 为了以后全链路做准备 + private void TryCatchException(Action action, string key) + { + try + { + action(); + } + catch (Exception e) + { + + Console.WriteLine(e.Message); + } + } + + private T TryCatch(Func action, string key) + { + Stopwatch sw = Stopwatch.StartNew(); + //Exception ex = null; + //bool isError = false; + T result; + try + { + result = action(); + } + catch (Exception exinfo) + { + object p=null; + result =(T)p; + //isError = true; + Console.WriteLine(exinfo); + + } + finally + { + + sw.Stop(); + + } + + return result; + } + + private void TryCatch(Action action, string key) + { + + Stopwatch sw = Stopwatch.StartNew(); + //bool isError = false; + //Exception ex = null; + try + { + action(); + } + catch (Exception exinfo) + { + + //isError = true; + Console.WriteLine(exinfo); + } + finally + { + sw.Stop(); + + } + } + public bool Add(string key, T value) + { + + return this.TryCatch(() => this.client.Add(key, value), key); + } + /// + /// 简单模式 事务模式 + /// + /// + /// + /// + /// + /// + public bool Add(string key, T value, DateTime expiresAt) + { + + return this.TryCatch(() => this.client.Add(key, value, expiresAt), key); + } + + public bool Add(string key, T value, TimeSpan expiresIn) + { + return this.TryCatch(() => this.client.Add(key, value, expiresIn), key); + } + + public long Decrement(string key, uint amount) + { + return this.TryCatch(() => this.client.Decrement(key, amount), key); + } + + public void FlushAll() + { + this.TryCatch(delegate + { + this.client.FlushAll(); + }, string.Empty); + } + + public T Get(string key) + { + return this.TryCatch(() => this.client.Get(key), key); + } + + public IDictionary GetAll(IEnumerable keys) + { + return this.TryCatch>(() => this.client.GetAll(keys), keys.FirstOrDefault()); + } + + public long Increment(string key, uint amount) + { + return this.TryCatch(() => this.client.Increment(key, amount), key); + } + + public bool Remove(string key) + { + return this.TryCatch(() => this.client.Remove(key), key); + } + + public void RemoveAll(IEnumerable keys) + { + this.TryCatch(delegate + { + this.client.RemoveAll(keys); + }, keys.FirstOrDefault()); + } + + public bool Replace(string key, T value) + { + return this.TryCatch(() => this.client.Replace(key, value), key); + } + + public bool Replace(string key, T value, DateTime expiresAt) + { + return this.TryCatch(() => this.client.Replace(key, value, expiresAt), key); + } + + public bool Replace(string key, T value, TimeSpan expiresIn) + { + return this.TryCatch(() => this.client.Replace(key, value, expiresIn), key); + } + + public bool Set(string key, T value) + { + return this.TryCatch(() => this.client.Set(key, value), key); + } + + public bool Set(string key, T value, DateTime expiresAt) + { + return this.TryCatch(() => this.client.Set(key, value, expiresAt), key); + } + + public bool Set(string key, T value, TimeSpan expiresIn) + { + return this.TryCatch(() => this.client.Set(key, value, expiresIn), key); + } + + public void SetAll(IDictionary values) + { + this.TryCatch(delegate + { + this.client.SetAll(values); + }, values.Keys.FirstOrDefault()); + } + + + public void Delete(T entity) where T : class, new() + { + this.TryCatch(delegate + { + this.client.Delete(entity); + }, string.Empty); + } + + public void DeleteAll() where TEntity : class, new() + { + this.TryCatch(delegate + { + this.client.DeleteAll(); + }, string.Empty); + } + + public void DeleteById(object id) where T : class, new() + { + this.TryCatch(delegate + { + this.client.DeleteById(id); + }, string.Empty); + } + + public void DeleteByIds(ICollection ids) where T : class, new() + { + this.TryCatch(delegate + { + this.client.DeleteById(ids); + }, string.Empty); + } + + public T GetById(object id) where T : class, new() + { + return this.TryCatch(() => this.client.GetById(id), string.Empty); + } + + public IList GetByIds(ICollection ids) where T : class, new() + { + return this.TryCatch>(() => this.client.GetByIds(ids), string.Empty); + } + + public T Store(T entity) where T : class, new() + { + return this.TryCatch(() => this.client.Store(entity), string.Empty); + } + + public void StoreAll(IEnumerable entities) where TEntity : class, new() + { + this.TryCatch(delegate + { + this.client.StoreAll(entities); + }, string.Empty); + } + + public void AddItemToList(string listId, string value) + { + this.TryCatch(delegate + { + this.client.AddItemToList(listId, value); + }, listId); + } + + public void AddItemToSet(string setId, string item) + { + this.TryCatch(delegate + { + this.client.AddItemToSet(setId, item); + }, setId); + } + + public bool AddItemToSortedSet(string setId, string value) + { + return this.TryCatch(() => this.client.AddItemToSortedSet(setId, value), setId); + } + + public bool AddItemToSortedSet(string setId, string value, double score) + { + return this.TryCatch(() => this.client.AddItemToSortedSet(setId, value, score), setId); + } + + public void AddRangeToList(string listId, List values) + { + this.TryCatch(delegate + { + this.client.AddRangeToList(listId, values); + }, listId); + } + + public void AddRangeToSet(string setId, List items) + { + this.TryCatch(delegate + { + this.client.AddRangeToSet(setId, items); + }, setId); + } + + public bool AddRangeToSortedSet(string setId, List values, double score) + { + return this.TryCatch(() => this.client.AddRangeToSortedSet(setId, values, score), setId); + } + + public bool AddRangeToSortedSet(string setId, List values, long score) + { + return this.TryCatch(() => this.client.AddRangeToSortedSet(setId, values, score), setId); + } + + public long AppendToValue(string key, string value) + { + return this.TryCatch(() => this.client.AppendToValue(key, value), key); + } + + public string BlockingDequeueItemFromList(string listId, TimeSpan? timeOut) + { + return this.TryCatch(() => this.client.BlockingDequeueItemFromList(listId, timeOut), listId); + } + + public KeyValuePair BlockingDequeueItemFromLists(string[] listIds, TimeSpan? timeOut) + { + return this.TryCatch>(delegate + { + ItemRef item = this.client.BlockingDequeueItemFromLists(listIds, timeOut); + return new KeyValuePair(item.Id, item.Item); + }, listIds[0]); + } + + public string BlockingPopAndPushItemBetweenLists(string fromListId, string toListId, TimeSpan? timeOut) + { + return this.TryCatch(() => this.client.BlockingPopAndPushItemBetweenLists(fromListId, toListId, timeOut), fromListId); + } + + public string BlockingPopItemFromList(string listId, TimeSpan? timeOut) + { + return this.TryCatch(() => this.client.BlockingPopItemFromList(listId, timeOut), listId); + } + + public KeyValuePair BlockingPopItemFromLists(string[] listIds, TimeSpan? timeOut) + { + return this.TryCatch>(delegate + { + ItemRef item = this.client.BlockingPopItemFromLists(listIds, timeOut); + return new KeyValuePair(item.Id, item.Item); + }, listIds[0]); + } + + public string BlockingRemoveStartFromList(string listId, TimeSpan? timeOut) + { + return this.TryCatch(() => this.client.BlockingRemoveStartFromList(listId, timeOut), listId); + } + + public KeyValuePair BlockingRemoveStartFromLists(string[] listIds, TimeSpan? timeOut) + { + return this.TryCatch>(delegate + { + ItemRef item = this.client.BlockingRemoveStartFromLists(listIds, timeOut); + return new KeyValuePair(item.Id, item.Item); + }, listIds[0]); + } + + public bool ContainsKey(string key) + { + return this.TryCatch(() => this.client.ContainsKey(key), key); + } + + public long DecrementValue(string key) + { + return this.TryCatch(() => this.client.DecrementValue(key), key); + } + + public long DecrementValueBy(string key, int count) + { + return this.TryCatch(() => this.client.DecrementValueBy(key, count), key); + } + + public string DequeueItemFromList(string listId) + { + return this.TryCatch(() => this.client.DequeueItemFromList(listId), listId); + } + + public void EnqueueItemOnList(string listId, string value) + { + this.TryCatch(delegate + { + this.client.EnqueueItemOnList(listId, value); + }, listId); + } + + public bool ExpireEntryAt(string key, DateTime expireAt) + { + return this.TryCatch(() => this.client.ExpireEntryAt(key, expireAt), key); + } + + public bool ExpireEntryIn(string key, TimeSpan expireIn) + { + return this.TryCatch(() => this.client.ExpireEntryIn(key, expireIn), key); + } + + public Dictionary GetAllEntriesFromHash(string hashId) + { + return this.TryCatch>(() => this.client.GetAllEntriesFromHash(hashId), hashId); + } + + public List GetAllItemsFromList(string listId) + { + return this.TryCatch>(() => this.client.GetAllItemsFromList(listId), listId); + } + + public HashSet GetAllItemsFromSet(string setId) + { + return this.TryCatch>(() => this.client.GetAllItemsFromSet(setId), setId); + } + + public List GetAllItemsFromSortedSet(string setId) + { + return this.TryCatch>(() => this.client.GetAllItemsFromSortedSet(setId), setId); + } + + public List GetAllItemsFromSortedSetDesc(string setId) + { + return this.TryCatch>(() => this.client.GetAllItemsFromSortedSetDesc(setId), setId); + } + + public List GetAllKeys() + { + return this.TryCatch>(() => this.client.GetAllKeys(), string.Empty); + } + + public IDictionary GetAllWithScoresFromSortedSet(string setId) + { + return this.TryCatch>(() => this.client.GetAllWithScoresFromSortedSet(setId), setId); + } + + public string GetAndSetEntry(string key, string value) + { + return this.TryCatch(() => this.client.GetAndSetValue(key, value), key); + } + + public HashSet GetDifferencesFromSet(string fromSetId, params string[] withSetIds) + { + return this.TryCatch>(() => this.client.GetDifferencesFromSet(fromSetId, withSetIds), fromSetId); + } + + public T GetFromHash(object id) + { + return this.TryCatch(() => this.client.GetFromHash(id), string.Empty); + } + + public long GetHashCount(string hashId) + { + return this.TryCatch(() => this.client.GetHashCount(hashId), hashId); + } + + public List GetHashKeys(string hashId) + { + return this.TryCatch>(() => this.client.GetHashKeys(hashId), hashId); + } + + public List GetHashValues(string hashId) + { + return this.TryCatch>(() => this.client.GetHashValues(hashId), hashId); + } + + public HashSet GetIntersectFromSets(params string[] setIds) + { + return this.TryCatch>(() => this.client.GetIntersectFromSets(setIds), setIds[0]); + } + + public string GetItemFromList(string listId, int listIndex) + { + return this.TryCatch(() => this.client.GetItemFromList(listId, listIndex), listId); + } + + public long GetItemIndexInSortedSet(string setId, string value) + { + return this.TryCatch(() => this.client.GetItemIndexInSortedSet(setId, value), setId); + } + + public long GetItemIndexInSortedSetDesc(string setId, string value) + { + return this.TryCatch(() => this.client.GetItemIndexInSortedSetDesc(setId, value), setId); + } + + public double GetItemScoreInSortedSet(string setId, string value) + { + return this.TryCatch(() => this.client.GetItemScoreInSortedSet(setId, value), setId); + } + + public long GetListCount(string listId) + { + return this.TryCatch(() => this.client.GetListCount(listId), listId); + } + + public string GetRandomItemFromSet(string setId) + { + return this.TryCatch(() => this.client.GetRandomItemFromSet(setId), setId); + } + + public List GetRangeFromList(string listId, int startingFrom, int endingAt) + { + return this.TryCatch>(() => this.client.GetRangeFromList(listId, startingFrom, endingAt), listId); + } + + public List GetRangeFromSortedList(string listId, int startingFrom, int endingAt) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedList(listId, startingFrom, endingAt), listId); + } + + public List GetRangeFromSortedSet(string setId, int fromRank, int toRank) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSet(setId, fromRank, toRank), setId); + } + + public List GetRangeFromSortedSetByHighestScore(string setId, double fromScore, double toScore) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByHighestScore(setId, fromScore, toScore), setId); + } + + public List GetRangeFromSortedSetByHighestScore(string setId, long fromScore, long toScore) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByHighestScore(setId, fromScore, toScore), setId); + } + + public List GetRangeFromSortedSetByHighestScore(string setId, string fromStringScore, string toStringScore) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByHighestScore(setId, fromStringScore, toStringScore), setId); + } + + public List GetRangeFromSortedSetByHighestScore(string setId, double fromScore, double toScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByHighestScore(setId, fromScore, toScore, skip, take), setId); + } + + public List GetRangeFromSortedSetByHighestScore(string setId, long fromScore, long toScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByHighestScore(setId, fromScore, toScore, skip, take), setId); + } + + public List GetRangeFromSortedSetByHighestScore(string setId, string fromStringScore, string toStringScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByHighestScore(setId, fromStringScore, toStringScore, skip, take), setId); + } + + public List GetRangeFromSortedSetByLowestScore(string setId, double fromScore, double toScore) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByLowestScore(setId, fromScore, toScore), setId); + } + + public List GetRangeFromSortedSetByLowestScore(string setId, long fromScore, long toScore) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByLowestScore(setId, fromScore, toScore), setId); + } + + public List GetRangeFromSortedSetByLowestScore(string setId, string fromStringScore, string toStringScore) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByLowestScore(setId, fromStringScore, toStringScore), setId); + } + + public List GetRangeFromSortedSetByLowestScore(string setId, double fromScore, double toScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByLowestScore(setId, fromScore, toScore, skip, take), setId); + } + + public List GetRangeFromSortedSetByLowestScore(string setId, long fromScore, long toScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByLowestScore(setId, fromScore, toScore, skip, take), setId); + } + + public List GetRangeFromSortedSetByLowestScore(string setId, string fromStringScore, string toStringScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetByLowestScore(setId, fromStringScore, toStringScore, skip, take), setId); + } + + public List GetRangeFromSortedSetDesc(string setId, int fromRank, int toRank) + { + return this.TryCatch>(() => this.client.GetRangeFromSortedSetDesc(setId, fromRank, toRank), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSet(string setId, int fromRank, int toRank) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSet(setId, fromRank, toRank), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByHighestScore(string setId, double fromScore, double toScore) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByHighestScore(setId, fromScore, toScore), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByHighestScore(string setId, long fromScore, long toScore) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByHighestScore(setId, fromScore, toScore), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByHighestScore(string setId, string fromStringScore, string toStringScore) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByHighestScore(setId, fromStringScore, toStringScore), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByHighestScore(string setId, double fromScore, double toScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByHighestScore(setId, fromScore, toScore, skip, take), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByHighestScore(string setId, long fromScore, long toScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByHighestScore(setId, fromScore, toScore, skip, take), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByHighestScore(string setId, string fromStringScore, string toStringScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByHighestScore(setId, fromStringScore, toStringScore, skip, take), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByLowestScore(string setId, double fromScore, double toScore) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByHighestScore(setId, fromScore, toScore), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByLowestScore(string setId, long fromScore, long toScore) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByLowestScore(setId, fromScore, toScore), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByLowestScore(string setId, string fromStringScore, string toStringScore) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByLowestScore(setId, fromStringScore, toStringScore), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByLowestScore(string setId, double fromScore, double toScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByLowestScore(setId, fromScore, toScore, skip, take), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByLowestScore(string setId, long fromScore, long toScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByLowestScore(setId, fromScore, toScore, skip, take), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetByLowestScore(string setId, string fromStringScore, string toStringScore, int? skip, int? take) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetByLowestScore(setId, fromStringScore, toStringScore, skip, take), setId); + } + + public IDictionary GetRangeWithScoresFromSortedSetDesc(string setId, int fromRank, int toRank) + { + return this.TryCatch>(() => this.client.GetRangeWithScoresFromSortedSetDesc(setId, fromRank, toRank), setId); + } + + public long GetSetCount(string setId) + { + return this.TryCatch(() => this.client.GetSetCount(setId), setId); + } + + public List GetSortedEntryValues(string key, int startingFrom, int endingAt) + { + return this.TryCatch>(() => this.client.GetSortedEntryValues(key, startingFrom, endingAt), key); + } + + public long GetSortedSetCount(string setId) + { + return this.TryCatch(() => this.client.GetSortedSetCount(setId), setId); + } + + public long GetSortedSetCount(string setId, double fromScore, double toScore) + { + return this.TryCatch(() => this.client.GetSortedSetCount(setId, fromScore, toScore), setId); + } + + public long GetSortedSetCount(string setId, long fromScore, long toScore) + { + return this.TryCatch(() => this.client.GetSortedSetCount(setId, fromScore, toScore), setId); + } + + public long GetSortedSetCount(string setId, string fromStringScore, string toStringScore) + { + return this.TryCatch(() => this.client.GetSortedSetCount(setId, fromStringScore, toStringScore), setId); + } + + public string GetSubstring(string key, int fromIndex, int toIndex) + { + return this.TryCatch(delegate + { + byte[] bytes = ((RedisClient)this.client).GetRange(key, fromIndex, toIndex); + if (bytes != null) + { + return StringExtensions.FromUtf8Bytes(bytes); + } + return null; + }, key); + } + + public TimeSpan GetTimeToLive(string key) + { + return this.TryCatch(delegate + { + TimeSpan? t = this.client.GetTimeToLive(key); + if (!t.HasValue) + { + return TimeSpan.Zero; + } + return t.Value; + }, key); + } + + public HashSet GetUnionFromSets(params string[] setIds) + { + return this.TryCatch>(() => this.client.GetUnionFromSets(setIds), setIds[0]); + } + + public string GetValue(string key) + { + return this.TryCatch(() => this.client.GetValue(key), key); + } + + public string GetValueFromHash(string hashId, string key) + { + return this.TryCatch(() => this.client.GetValueFromHash(hashId, key), hashId); + } + + public List GetValues(List keys) + { + return this.TryCatch>(() => this.client.GetValues(keys), keys[0]); + } + + public List GetValues(List keys) + { + return this.TryCatch>(() => this.client.GetValues(keys), keys[0]); + } + + public List GetValuesFromHash(string hashId, params string[] keys) + { + return this.TryCatch>(() => this.client.GetValuesFromHash(hashId, keys), hashId); + } + + public Dictionary GetValuesMap(List keys) + { + return this.TryCatch>(() => this.client.GetValuesMap(keys), keys[0]); + } + + public Dictionary GetValuesMap(List keys) + { + return this.TryCatch>(() => this.client.GetValuesMap(keys), keys[0]); + } + + public bool HashContainsEntry(string hashId, string key) + { + return this.TryCatch(() => this.client.HashContainsEntry(hashId, key), hashId); + } + + public double IncrementItemInSortedSet(string setId, string value, double incrementBy) + { + return this.TryCatch(() => this.client.IncrementItemInSortedSet(setId, value, incrementBy), setId); + } + + public double IncrementItemInSortedSet(string setId, string value, long incrementBy) + { + return this.TryCatch(() => this.client.IncrementItemInSortedSet(setId, value, incrementBy), setId); + } + + public long IncrementValue(string key) + { + return this.TryCatch(() => this.client.IncrementValue(key), key); + } + + public long IncrementValueBy(string key, int count) + { + return this.TryCatch(() => this.client.IncrementValueBy(key, count), key); + } + + public long IncrementValueInHash(string hashId, string key, int incrementBy) + { + return this.TryCatch(() => this.client.IncrementValueInHash(hashId, key, incrementBy), hashId); + } + + public void MoveBetweenSets(string fromSetId, string toSetId, string item) + { + this.TryCatch(delegate + { + this.client.MoveBetweenSets(fromSetId, toSetId, item); + }, fromSetId); + } + + public string PopAndPushItemBetweenLists(string fromListId, string toListId) + { + return this.TryCatch(() => this.client.PopAndPushItemBetweenLists(fromListId, toListId), fromListId); + } + + public string PopItemFromList(string listId) + { + return this.TryCatch(() => this.client.PopItemFromList(listId), listId); + } + + public string PopItemFromSet(string setId) + { + return this.TryCatch(() => this.client.PopItemFromSet(setId), setId); + } + + public string PopItemWithHighestScoreFromSortedSet(string setId) + { + return this.TryCatch(() => this.client.PopItemWithHighestScoreFromSortedSet(setId), setId); + } + + public string PopItemWithLowestScoreFromSortedSet(string setId) + { + return this.TryCatch(() => this.client.PopItemWithLowestScoreFromSortedSet(setId), setId); + } + + public void PrependItemToList(string listId, string value) + { + this.TryCatch(delegate + { + this.client.PrependItemToList(listId, value); + }, listId); + } + + public void PrependRangeToList(string listId, List values) + { + this.TryCatch(delegate + { + this.client.PrependRangeToList(listId, values); + }, listId); + } + + public long PublishMessage(string toChannel, string message) + { + return this.TryCatch(() => this.client.PublishMessage(toChannel, message), string.Empty); + } + + public void PushItemToList(string listId, string value) + { + this.TryCatch(delegate + { + this.client.PushItemToList(listId, value); + }, listId); + } + + public void RemoveAllFromList(string listId) + { + this.TryCatch(delegate + { + this.client.Remove(listId); + }, listId); + } + + public string RemoveEndFromList(string listId) + { + return this.TryCatch(() => this.client.RemoveEndFromList(listId), listId); + } + + public bool RemoveEntry(params string[] args) + { + return this.TryCatch(() => this.client.RemoveEntry(args), args[0]); + } + + public bool RemoveEntryFromHash(string hashId, string key) + { + return this.TryCatch(() => this.client.RemoveEntryFromHash(hashId, key), hashId); + } + + public long RemoveItemFromList(string listId, string value) + { + return this.TryCatch(() => this.client.RemoveItemFromList(listId, value), listId); + } + + public long RemoveItemFromList(string listId, string value, int noOfMatches) + { + return this.TryCatch(() => this.client.RemoveItemFromList(listId, value, noOfMatches), listId); + } + + public void RemoveItemFromSet(string setId, string item) + { + this.TryCatch(delegate + { + this.client.RemoveItemFromSet(setId, item); + }, setId); + } + + public bool RemoveItemFromSortedSet(string setId, string value) + { + return this.TryCatch(() => this.client.RemoveItemFromSortedSet(setId, value), setId); + } + /// + /// 骚操作-- redis 连接池-- 如果出现高并发,客户端的连接数量会上限,为了节省资源,重复利用连接对象,通过线程池去获取连接 + /// + /// + /// + /// + /// + public static IRedisClientsManager GetPoolClient(string host, int port, int db) + { + return new PooledRedisClientManager(db, host + ":" + port); + } + public long RemoveRangeFromSortedSet(string setId, int minRank, int maxRank) + { + return this.TryCatch(() => this.client.RemoveRangeFromSortedSet(setId, minRank, maxRank), setId); + } + + public long RemoveRangeFromSortedSetByScore(string setId, double fromScore, double toScore) + { + return this.TryCatch(() => this.client.RemoveRangeFromSortedSetByScore(setId, fromScore, toScore), setId); + } + + public long RemoveRangeFromSortedSetByScore(string setId, long fromScore, long toScore) + { + return this.TryCatch(() => this.client.RemoveRangeFromSortedSetByScore(setId, fromScore, toScore), setId); + } + + public string RemoveStartFromList(string listId) + { + return this.TryCatch(() => this.client.RemoveStartFromList(listId), listId); + } + + public void RenameKey(string fromName, string toName) + { + this.TryCatch(delegate + { + this.client.RenameKey(fromName, toName); + }, string.Empty); + } + + public List SearchKeys(string pattern) + { + return this.TryCatch>(() => this.client.SearchKeys(pattern), pattern); + } + + public void SetAll(Dictionary map) + { + this.TryCatch(delegate + { + this.client.SetAll(map); + }, string.Empty); + } + + public void SetAll(IEnumerable keys, IEnumerable values) + { + this.TryCatch(delegate + { + this.client.SetAll(keys, values); + }, string.Empty); + } + + public bool SetContainsItem(string setId, string item) + { + return this.TryCatch(() => this.client.SetContainsItem(setId, item), setId); + } + + public void SetEntry(string key, string value) + { + this.TryCatch(delegate + { + this.client.SetValue(key, value); + }, key); + } + + public void SetEntry(string key, string value, TimeSpan expireIn) + { + this.TryCatch(delegate + { + this.client.SetValue(key, value, expireIn); + }, key); + } + + public bool SetEntryIfNotExists(string key, string value) + { + return this.TryCatch(() => this.client.SetValueIfNotExists(key, value), key); + } + + public bool SetEntryInHash(string hashId, string key, string value) + { + return this.TryCatch(() => this.client.SetEntryInHash(hashId, key, value), hashId); + } + + public bool SetEntryInHashIfNotExists(string hashId, string key, string value) + { + return this.TryCatch(() => this.client.SetEntryInHashIfNotExists(hashId, key, value), hashId); + } + + public void SetItemInList(string listId, int listIndex, string value) + { + this.TryCatch(delegate + { + this.client.SetItemInList(listId, listIndex, value); + }, listId); + } + + public void SetRangeInHash(string hashId, IEnumerable> keyValuePairs) + { + this.TryCatch(delegate + { + this.client.SetRangeInHash(hashId, keyValuePairs); + }, hashId); + } + + public bool SortedSetContainsItem(string setId, string value) + { + return this.TryCatch(() => this.client.SortedSetContainsItem(setId, value), setId); + } + + public void StoreAsHash(T entity) + { + this.TryCatch(delegate + { + this.client.StoreAsHash(entity); + }, string.Empty); + } + + + public bool SetEntryInHash(string hashId, string key, T value) + { + return this.TryCatch(() => this.client.SetEntryInHash(hashId, key, TextExtensions.SerializeToString(value)), hashId); + } + + public T GetValueFromHash(string hashId, string key) + { + return this.TryCatch(() => JsonSerializer.DeserializeFromString(this.client.GetValueFromHash(hashId, key)), hashId); + } + + public bool SetEntryInHashIfNotExists(string hashId, string key, T value) + { + return this.TryCatch(() => this.client.SetEntryInHashIfNotExists(hashId, key, TextExtensions.SerializeToString(value)), hashId); + } + + public IDisposable AcquireLock(string key) + { + return this.TryCatch(() => this.client.AcquireLock(key), key); + } + + public IDisposable AcquireLock(string key, TimeSpan timeOut) + { + return this.TryCatch(() => this.client.AcquireLock(key, timeOut), key); + } + + + public DateTime GetServerTime() + { + return this.TryCatch(() => this.client.GetServerTime(), string.Empty); + } + + + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs b/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs new file mode 100644 index 00000000..b603875c --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs @@ -0,0 +1,72 @@ +using Consul; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Common.IOCOptions; + +namespace Yi.Framework.Core.ConsulExtend +{ + public abstract class AbstractConsulDispatcher + { + protected ConsulClientOption _ConsulClientOption = null; + protected KeyValuePair[] _CurrentAgentServiceDictionary = null; + + public AbstractConsulDispatcher(IOptionsMonitor consulClientOption) + { + this._ConsulClientOption = consulClientOption.CurrentValue; + } + + /// + /// 负载均衡获取地址 + /// + /// Consul映射后的地址 + /// + public string GetAddress(string mappingUrl) + { + Uri uri = new Uri(mappingUrl); + string serviceName = uri.Host; + string addressPort = this.ChooseAddress(serviceName); + return $"{uri.Scheme}://{addressPort}{uri.PathAndQuery}"; + } + + protected virtual string ChooseAddress(string serviceName) + { + ConsulClient client = new ConsulClient(c => + { + c.Address = new Uri($"http://{this._ConsulClientOption.IP}:{this._ConsulClientOption.Port}/"); + c.Datacenter = this._ConsulClientOption.Datacenter; + }); + AgentService agentService = null; + //var response = client.Agent.Services().Result.Response; + ////foreach (var item in response) + ////{ + //// Console.WriteLine("***************************************"); + //// Console.WriteLine(item.Key); + //// var service = item.Value; + //// Console.WriteLine($"{service.Address}--{service.Port}--{service.Service}"); + //// Console.WriteLine("***************************************"); + ////} + + //this._CurrentAgentServiceDictionary = response.Where(s => s.Value.Service.Equals(serviceName, StringComparison.OrdinalIgnoreCase)).ToArray(); + + //升级consul实例获取 + var entrys = client.Health.Service(serviceName).Result.Response; + List> serviceList = new List>(); + for (int i = 0; i < entrys.Length; i++) + { + serviceList.Add(new KeyValuePair(i.ToString(), entrys[i].Service)); + } + this._CurrentAgentServiceDictionary = serviceList.ToArray(); + + int index = this.GetIndex(); + agentService = this._CurrentAgentServiceDictionary[index].Value; + + return $"{agentService.Address}:{agentService.Port}"; + } + + protected abstract int GetIndex(); + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs b/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs new file mode 100644 index 00000000..905a6ea7 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Consul; +using Microsoft.Extensions.Options; +using Yi.Framework.Common.IOCOptions; + +namespace Yi.Framework.Core.ConsulExtend +{ + /// + /// 平均 + /// + public class AverageDispatcher : AbstractConsulDispatcher + { + #region Identity + private static int _iTotalCount = 0; + private static int iTotalCount + { + get + { + return _iTotalCount; + } + set + { + _iTotalCount = value >= Int32.MaxValue ? 0 : value; + } + } + + + public AverageDispatcher(IOptionsMonitor consulClientOption) : base(consulClientOption) + { + } + #endregion + + /// + /// 平均 + /// + /// + protected override int GetIndex() + { + return new Random(iTotalCount++).Next(0, base._CurrentAgentServiceDictionary.Length); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs b/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs new file mode 100644 index 00000000..882d7fbc --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Consul; +using Microsoft.Extensions.Options; +using Yi.Framework.Common.IOCOptions; + +namespace Yi.Framework.Core.ConsulExtend +{ + /// + /// 轮询 + /// + public class PollingDispatcher : AbstractConsulDispatcher + { + #region Identity + private static int _iTotalCount = 0; + private static int iTotalCount + { + get + { + return _iTotalCount; + } + set + { + _iTotalCount = value >= Int32.MaxValue ? 0 : value; + } + } + + public PollingDispatcher(IOptionsMonitor consulClientOption) : base(consulClientOption) + { + } + #endregion + + /// + /// 轮询 + /// + /// + /// + protected override int GetIndex() + { + return iTotalCount++ % base._CurrentAgentServiceDictionary.Length; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs b/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs new file mode 100644 index 00000000..41a215f8 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Consul; +using Microsoft.Extensions.Options; +using Yi.Framework.Common.IOCOptions; + +namespace Yi.Framework.Core.ConsulExtend +{ + /// + /// 权重 + /// + public class WeightDispatcher : AbstractConsulDispatcher + { + #region Identity + private static int _iTotalCount = 0; + private static int iTotalCount + { + get + { + return _iTotalCount; + } + set + { + _iTotalCount = value >= Int32.MaxValue ? 0 : value; + } + } + public WeightDispatcher(IOptionsMonitor consulClientOption) : base(consulClientOption) + { + + } + #endregion + + protected override string ChooseAddress(string serviceName) + { + ConsulClient client = new ConsulClient(c => + { + c.Address = new Uri($"http://{base._ConsulClientOption.IP}:{base._ConsulClientOption.Port}/"); + c.Datacenter = base._ConsulClientOption.Datacenter; + }); + AgentService agentService = null; + var response = client.Agent.Services().Result.Response; + + this._CurrentAgentServiceDictionary = response.Where(s => s.Value.Service.Equals(serviceName, StringComparison.OrdinalIgnoreCase)).ToArray(); + + + var serviceDictionaryNew = new List(); + foreach (var service in base._CurrentAgentServiceDictionary) + { + serviceDictionaryNew.AddRange(Enumerable.Repeat(service.Value, int.TryParse(service.Value.Tags?[0], out int iWeight) ? 1 : iWeight)); + } + int index = new Random(DateTime.Now.Millisecond).Next(0, int.MaxValue) % serviceDictionaryNew.Count; + agentService = serviceDictionaryNew[index]; + + return $"{agentService.Address}:{agentService.Port}"; + } + /// + /// 不需要了 + /// + /// + protected override int GetIndex() + { + throw new NotImplementedException(); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Core/ElasticSearchInvoker.cs b/Yi.Framework.Net6/Yi.Framework.Core/ElasticSearchInvoker.cs new file mode 100644 index 00000000..4b4556cc --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Core/ElasticSearchInvoker.cs @@ -0,0 +1,53 @@ +using Microsoft.Extensions.Options; +using Nest; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Common.IOCOptions; + +namespace Yi.Framework.Core +{ + public class ElasticSearchInvoker + { + private readonly ElasticSearchOptions _elasticSearchOptions; + + public ElasticSearchInvoker(IOptionsMonitor optionsMonitor) + { + _elasticSearchOptions = optionsMonitor.CurrentValue; + var settings = new ConnectionSettings(new Uri(_elasticSearchOptions.Url)).DefaultIndex(this._elasticSearchOptions.IndexName); + Client = new ElasticClient(settings); + } + private ElasticClient Client; + public ElasticClient GetElasticClient() + { + return Client; + } + public void Send(List model) where T : class + { + Client.IndexMany(model); + } + + public void InsertOrUpdata(T model) where T : class + { + Client.IndexDocument(model); + } + + public bool Delete(string id) where T : class + { + + var response = Client.Delete(id); + return response.IsValid; + } + public bool DropIndex(string indexName) + { + return Client.Indices.Delete(Indices.Parse(indexName)).IsValid; + } + public void CreateIndex(string indexName) + { + var settings = new ConnectionSettings(new Uri(_elasticSearchOptions.Url)).DefaultIndex(indexName); + this.Client = new ElasticClient(settings); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll b/Yi.Framework.Net6/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll new file mode 100644 index 0000000000000000000000000000000000000000..c695bdd5965b0b687fdee8984d5d36e1a33fb642 GIT binary patch literal 14920 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 literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/Yi.Framework.Core/Library/ServiceStack.Common.dll b/Yi.Framework.Net6/Yi.Framework.Core/Library/ServiceStack.Common.dll new file mode 100644 index 0000000000000000000000000000000000000000..f10b87b43853c83f27dd617a9bfc76bf56150c2a GIT binary patch literal 1039872 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