From c6371ba72ddff6fd05308a4999a2de6bd068c028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Thu, 31 Mar 2022 21:22:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=A1=86=E6=9E=B6=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CC.Yi.Old/CC.Yi.API/CC.Yi.API.csproj | 50 - .../Controllers/StudentController.cs | 175 --- .../CC.Yi.API/Extension/SwaggerExtension.cs | 76 - CC.Yi.Old/CC.Yi.API/Filter/DbContextFilter.cs | 22 - .../Migrations/20210319112041_yi1.Designer.cs | 40 - .../Migrations/20210319112041_yi1.cs | 29 - .../Migrations/20210320082935_yi2.Designer.cs | 40 - .../Migrations/20210320082935_yi2.cs | 31 - .../Migrations/20210325123550_yi3.Designer.cs | 93 -- .../Migrations/20210325123550_yi3.cs | 42 - .../Migrations/20210325124241_yi4.Designer.cs | 301 ---- .../Migrations/20210325124241_yi4.cs | 315 ---- .../Migrations/20210410090937_yi5.Designer.cs | 40 - .../Migrations/20210410090937_yi5.cs | 220 --- .../Migrations/DataContextModelSnapshot.cs | 38 - CC.Yi.Old/CC.Yi.API/Program.cs | 62 - .../CC.Yi.API/Properties/launchSettings.json | 31 - CC.Yi.Old/CC.Yi.API/Startup.cs | 164 --- CC.Yi.Old/CC.Yi.API/T4Startup.cs | 23 - CC.Yi.Old/CC.Yi.API/T4Startup.tt | 40 - .../CC.Yi.API/appsettings.Development.json | 9 - CC.Yi.Old/CC.Yi.API/appsettings.json | 17 - CC.Yi.Old/CC.Yi.API/nlog.config | 35 - CC.Yi.Old/CC.Yi.BLL/BaseBll.cs | 109 -- CC.Yi.Old/CC.Yi.BLL/CC.Yi.BLL.csproj | 32 - CC.Yi.Old/CC.Yi.BLL/T4BLL.cs | 19 - CC.Yi.Old/CC.Yi.BLL/T4BLL.tt | 37 - CC.Yi.Old/CC.Yi.Common/CC.Yi.Common.csproj | 17 - CC.Yi.Old/CC.Yi.Common/Cache/CacheHelper.cs | 51 - CC.Yi.Old/CC.Yi.Common/Cache/ICacheWriter.cs | 18 - CC.Yi.Old/CC.Yi.Common/Cache/RedisCache.cs | 48 - .../CC.Yi.Common/Castle/CustomAutofacAop.cs | 23 - CC.Yi.Old/CC.Yi.Common/HttpHelper.cs | 76 - CC.Yi.Old/CC.Yi.Common/ImageHelper.cs | 167 --- CC.Yi.Old/CC.Yi.Common/JsonHelper.cs | 24 - CC.Yi.Old/CC.Yi.Common/Jwt/JwtConst.cs | 12 - CC.Yi.Old/CC.Yi.Common/Result.cs | 40 - CC.Yi.Old/CC.Yi.DAL/BaseDal.cs | 113 -- CC.Yi.Old/CC.Yi.DAL/CC.Yi.DAL.csproj | 31 - CC.Yi.Old/CC.Yi.DAL/DbContentFactory.cs | 58 - CC.Yi.Old/CC.Yi.DAL/T4DAL.cs | 12 - CC.Yi.Old/CC.Yi.DAL/T4DAL.tt | 30 - .../CC.Yi.DALFactory/CC.Yi.DALFactory.csproj | 40 - CC.Yi.Old/CC.Yi.DALFactory/DbSession.cs | 45 - .../CC.Yi.DALFactory/DbSessionFactory.cs | 35 - .../CC.Yi.DALFactory/StaticDalFactory.cs | 24 - CC.Yi.Old/CC.Yi.DALFactory/T4DbSession.cs | 18 - CC.Yi.Old/CC.Yi.DALFactory/T4DbSession.tt | 36 - .../CC.Yi.DALFactory/T4StaticDalFactory.cs | 25 - .../CC.Yi.DALFactory/T4StaticDalFactory.tt | 43 - CC.Yi.Old/CC.Yi.IBLL/CC.Yi.IBLL.csproj | 32 - CC.Yi.Old/CC.Yi.IBLL/IBaseBll.cs | 78 - CC.Yi.Old/CC.Yi.IBLL/T4IBLL.cs | 11 - CC.Yi.Old/CC.Yi.IBLL/T4IBLL.tt | 29 - CC.Yi.Old/CC.Yi.IDAL/CC.Yi.IDAL.csproj | 40 - CC.Yi.Old/CC.Yi.IDAL/IBaseDal.cs | 69 - CC.Yi.Old/CC.Yi.IDAL/IDbSession.cs | 18 - CC.Yi.Old/CC.Yi.IDAL/T4IDAL.cs | 11 - CC.Yi.Old/CC.Yi.IDAL/T4IDAL.tt | 29 - CC.Yi.Old/CC.Yi.IDAL/T4IDbSession.cs | 15 - CC.Yi.Old/CC.Yi.IDAL/T4IDbSession.tt | 33 - CC.Yi.Old/CC.Yi.Model/CC.Yi.Model.csproj | 43 - CC.Yi.Old/CC.Yi.Model/DataContext.cs | 14 - CC.Yi.Old/CC.Yi.Model/T4DataContext.cs | 11 - CC.Yi.Old/CC.Yi.Model/T4DataContext.tt | 29 - CC.Yi.Old/CC.Yi.Model/result_user.cs | 13 - CC.Yi.Old/CC.Yi.Model/student.cs | 16 - .../CC.Yi.ViewModel/CC.Yi.ViewModel.csproj | 8 - CC.Yi.Old/CC.Yi.sln | 94 -- CC.Yi.Old/T4Model/T4Model.txt | 1 - CC.Yi.Old/T4Model/说明.txt | 5 - CC.Yi/CC.Yi.API/CC.Yi.API.csproj | 51 - .../Controllers/StudentController.cs | 147 -- .../CC.Yi.API/Extension/ErrorHandExtension.cs | 72 - CC.Yi/CC.Yi.API/Extension/SwaggerExtension.cs | 76 - CC.Yi/CC.Yi.API/Filter/DbContextFilter.cs | 21 - CC.Yi/CC.Yi.API/Init/InitDb.cs | 71 - CC.Yi/CC.Yi.API/Program.cs | 60 - .../CC.Yi.API/Properties/launchSettings.json | 31 - CC.Yi/CC.Yi.API/Startup.cs | 167 --- CC.Yi/CC.Yi.API/T4Startup.cs | 23 - CC.Yi/CC.Yi.API/T4Startup.tt | 40 - CC.Yi/CC.Yi.API/YIDB.db | Bin 20480 -> 0 bytes CC.Yi/CC.Yi.API/appsettings.Development.json | 9 - CC.Yi/CC.Yi.API/appsettings.json | 14 - CC.Yi/CC.Yi.API/nlog.config | 35 - CC.Yi/CC.Yi.BLL/BaseBll.cs | 112 -- CC.Yi/CC.Yi.BLL/CC.Yi.BLL.csproj | 32 - CC.Yi/CC.Yi.BLL/T4BLL.cs | 32 - CC.Yi/CC.Yi.BLL/T4BLL.tt | 50 - CC.Yi/CC.Yi.Common/CC.Yi.Common.csproj | 42 - CC.Yi/CC.Yi.Common/Cache/CacheHelper.cs | 51 - CC.Yi/CC.Yi.Common/Cache/ICacheWriter.cs | 18 - CC.Yi/CC.Yi.Common/Cache/RedisCache.cs | 99 -- CC.Yi/CC.Yi.Common/Castle/CustomAutofacAop.cs | 23 - CC.Yi/CC.Yi.Common/EmailHelper.cs | 113 -- CC.Yi/CC.Yi.Common/HttpHelper.cs | 76 - .../Json/DatetimeJsonConverter.cs | 26 - CC.Yi/CC.Yi.Common/Json/DefaultJsonOptions.cs | 24 - CC.Yi/CC.Yi.Common/Json/EnumJsonConverter.cs | 38 - .../Json/LowerCaseNamingPolicy.cs | 16 - .../Json/TimeSpanJsonConverter.cs | 27 - CC.Yi/CC.Yi.Common/JsonHelper.cs | 24 - CC.Yi/CC.Yi.Common/Jwt/JwtConst.cs | 12 - CC.Yi/CC.Yi.Common/LinqHelper.cs | 33 - CC.Yi/CC.Yi.Common/RandomHelper.cs | 99 -- CC.Yi/CC.Yi.Common/Result.cs | 40 - CC.Yi/CC.Yi.Common/T4Vue/T4Api.tt | 58 - CC.Yi/CC.Yi.Common/T4Vue/T4Api.vue | 35 - CC.Yi/CC.Yi.Common/T4Vue/T4Component.tt | 279 ---- CC.Yi/CC.Yi.Common/T4Vue/T4Component.vue | 237 --- CC.Yi/CC.Yi.Common/T4Vue/T4Controller.cs | 59 - CC.Yi/CC.Yi.Common/imageHelper.cs | 167 --- CC.Yi/CC.Yi.Common/mongodb/model/student.cs | 13 - CC.Yi/CC.Yi.Common/mongodb/mongodbContext.cs | 29 - CC.Yi/CC.Yi.Common/settingHelper.cs | 48 - CC.Yi/CC.Yi.DAL/BaseDal.cs | 122 -- CC.Yi/CC.Yi.DAL/CC.Yi.DAL.csproj | 31 - CC.Yi/CC.Yi.DAL/T4DAL.cs | 17 - CC.Yi/CC.Yi.DAL/T4DAL.tt | 35 - CC.Yi/CC.Yi.IBLL/CC.Yi.IBLL.csproj | 32 - CC.Yi/CC.Yi.IBLL/IBaseBll.cs | 82 -- CC.Yi/CC.Yi.IBLL/T4IBLL.cs | 13 - CC.Yi/CC.Yi.IBLL/T4IBLL.tt | 31 - CC.Yi/CC.Yi.IDAL/CC.Yi.IDAL.csproj | 31 - CC.Yi/CC.Yi.IDAL/IBaseDal.cs | 75 - CC.Yi/CC.Yi.IDAL/T4IDAL.cs | 11 - CC.Yi/CC.Yi.IDAL/T4IDAL.tt | 29 - CC.Yi/CC.Yi.Model/CC.Yi.Model.csproj | 34 - CC.Yi/CC.Yi.Model/DataContext.cs | 13 - .../Migrations/20210602114758_yi1.Designer.cs | 36 - .../Migrations/20210602114758_yi1.cs | 29 - .../Migrations/20210602115718_yi2.Designer.cs | 39 - .../Migrations/20210602115718_yi2.cs | 24 - .../Migrations/DataContextModelSnapshot.cs | 37 - CC.Yi/CC.Yi.Model/T4DataContext.cs | 11 - CC.Yi/CC.Yi.Model/T4DataContext.tt | 29 - CC.Yi/CC.Yi.Model/baseModel.cs | 16 - CC.Yi/CC.Yi.Model/student.cs | 13 - CC.Yi/CC.Yi.ViewModel/CC.Yi.ViewModel.csproj | 8 - CC.Yi/CC.Yi.ViewModel/Enum/DelFlagEnum.cs | 12 - CC.Yi/CC.Yi.ViewModel/setByIds.cs | 12 - CC.Yi/CC.Yi.sln | 87 -- CC.Yi/T4Model/T4Model.txt | 1 - CC.Yi/T4Model/T4Vue.txt | 4 - CC.Yi/T4Model/说明.txt | 5 - .../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 | 44 - .../Yi.Framework.ApiMicroservice/Startup.cs | 180 --- .../SwaggerDoc.xml | 278 ---- .../Yi.Framework.ApiMicroservice.csproj | 39 - .../wwwroot/Excel/Excel_20211102231510.xlsx | Bin 3014 -> 0 bytes .../wwwroot/Excel/Excel_20211102232113.xlsx | Bin 3023 -> 0 bytes .../0a5221e4-dca6-4d4e-8486-acf86822f2e4.jpg | Bin 47955 -> 0 bytes .../1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg | Bin 30394 -> 0 bytes .../3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg | Bin 14035 -> 0 bytes .../6312706b-7013-4aa5-af3c-0bbb6b3f4804.jpg | Bin 5869 -> 0 bytes .../7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg | Bin 30394 -> 0 bytes .../966200f6-265c-4470-ad20-c91c3d84a1cc.jpg | Bin 47955 -> 0 bytes .../feae1964-04ce-464b-848b-86f2245f3f63.jpeg | Bin 18821 -> 0 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 14920 -> 0 bytes .../Library/ServiceStack.Common.dll | Bin 1039872 -> 0 bytes .../Library/ServiceStack.Interfaces.dll | Bin 259584 -> 0 bytes .../Library/ServiceStack.Redis.dll | Bin 872960 -> 0 bytes .../Library/ServiceStack.Text.dll | Bin 658944 -> 0 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 | 16 - .../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 - .../Controllers/PageDetaiController.cs | 25 - .../Yi.Framework.PageDetail/Log4net.config | 65 - .../Yi.Framework.PageDetail/Program.cs | 42 - .../Yi.Framework.PageDetail/Startup.cs | 58 - .../Yi.Framework.PageDetail/SwaggerDoc.xml | 8 - .../Views/PageDetai/Index.cshtml | 90 -- .../Shared/_ValidationScriptsPartial.cshtml | 18 - .../Yi.Framework.PageDetail.csproj | 33 - .../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 - .../InitPageWorker.cs | 100 -- .../Log4net.config | 65 - .../Program.cs | 67 - .../WarmupPageWorker.cs | 133 -- .../Worker.cs | 32 - .../Yi.Framework.StaticPageProcessor.csproj | 24 - .../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.Net5/Yi.Framework.sln | 143 -- 368 files changed, 25704 deletions(-) delete mode 100644 CC.Yi.Old/CC.Yi.API/CC.Yi.API.csproj delete mode 100644 CC.Yi.Old/CC.Yi.API/Controllers/StudentController.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Extension/SwaggerExtension.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Filter/DbContextFilter.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/20210319112041_yi1.Designer.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/20210319112041_yi1.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/20210320082935_yi2.Designer.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/20210320082935_yi2.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/20210325123550_yi3.Designer.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/20210325123550_yi3.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/20210325124241_yi4.Designer.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/20210325124241_yi4.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/20210410090937_yi5.Designer.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/20210410090937_yi5.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Migrations/DataContextModelSnapshot.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Program.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/Properties/launchSettings.json delete mode 100644 CC.Yi.Old/CC.Yi.API/Startup.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/T4Startup.cs delete mode 100644 CC.Yi.Old/CC.Yi.API/T4Startup.tt delete mode 100644 CC.Yi.Old/CC.Yi.API/appsettings.Development.json delete mode 100644 CC.Yi.Old/CC.Yi.API/appsettings.json delete mode 100644 CC.Yi.Old/CC.Yi.API/nlog.config delete mode 100644 CC.Yi.Old/CC.Yi.BLL/BaseBll.cs delete mode 100644 CC.Yi.Old/CC.Yi.BLL/CC.Yi.BLL.csproj delete mode 100644 CC.Yi.Old/CC.Yi.BLL/T4BLL.cs delete mode 100644 CC.Yi.Old/CC.Yi.BLL/T4BLL.tt delete mode 100644 CC.Yi.Old/CC.Yi.Common/CC.Yi.Common.csproj delete mode 100644 CC.Yi.Old/CC.Yi.Common/Cache/CacheHelper.cs delete mode 100644 CC.Yi.Old/CC.Yi.Common/Cache/ICacheWriter.cs delete mode 100644 CC.Yi.Old/CC.Yi.Common/Cache/RedisCache.cs delete mode 100644 CC.Yi.Old/CC.Yi.Common/Castle/CustomAutofacAop.cs delete mode 100644 CC.Yi.Old/CC.Yi.Common/HttpHelper.cs delete mode 100644 CC.Yi.Old/CC.Yi.Common/ImageHelper.cs delete mode 100644 CC.Yi.Old/CC.Yi.Common/JsonHelper.cs delete mode 100644 CC.Yi.Old/CC.Yi.Common/Jwt/JwtConst.cs delete mode 100644 CC.Yi.Old/CC.Yi.Common/Result.cs delete mode 100644 CC.Yi.Old/CC.Yi.DAL/BaseDal.cs delete mode 100644 CC.Yi.Old/CC.Yi.DAL/CC.Yi.DAL.csproj delete mode 100644 CC.Yi.Old/CC.Yi.DAL/DbContentFactory.cs delete mode 100644 CC.Yi.Old/CC.Yi.DAL/T4DAL.cs delete mode 100644 CC.Yi.Old/CC.Yi.DAL/T4DAL.tt delete mode 100644 CC.Yi.Old/CC.Yi.DALFactory/CC.Yi.DALFactory.csproj delete mode 100644 CC.Yi.Old/CC.Yi.DALFactory/DbSession.cs delete mode 100644 CC.Yi.Old/CC.Yi.DALFactory/DbSessionFactory.cs delete mode 100644 CC.Yi.Old/CC.Yi.DALFactory/StaticDalFactory.cs delete mode 100644 CC.Yi.Old/CC.Yi.DALFactory/T4DbSession.cs delete mode 100644 CC.Yi.Old/CC.Yi.DALFactory/T4DbSession.tt delete mode 100644 CC.Yi.Old/CC.Yi.DALFactory/T4StaticDalFactory.cs delete mode 100644 CC.Yi.Old/CC.Yi.DALFactory/T4StaticDalFactory.tt delete mode 100644 CC.Yi.Old/CC.Yi.IBLL/CC.Yi.IBLL.csproj delete mode 100644 CC.Yi.Old/CC.Yi.IBLL/IBaseBll.cs delete mode 100644 CC.Yi.Old/CC.Yi.IBLL/T4IBLL.cs delete mode 100644 CC.Yi.Old/CC.Yi.IBLL/T4IBLL.tt delete mode 100644 CC.Yi.Old/CC.Yi.IDAL/CC.Yi.IDAL.csproj delete mode 100644 CC.Yi.Old/CC.Yi.IDAL/IBaseDal.cs delete mode 100644 CC.Yi.Old/CC.Yi.IDAL/IDbSession.cs delete mode 100644 CC.Yi.Old/CC.Yi.IDAL/T4IDAL.cs delete mode 100644 CC.Yi.Old/CC.Yi.IDAL/T4IDAL.tt delete mode 100644 CC.Yi.Old/CC.Yi.IDAL/T4IDbSession.cs delete mode 100644 CC.Yi.Old/CC.Yi.IDAL/T4IDbSession.tt delete mode 100644 CC.Yi.Old/CC.Yi.Model/CC.Yi.Model.csproj delete mode 100644 CC.Yi.Old/CC.Yi.Model/DataContext.cs delete mode 100644 CC.Yi.Old/CC.Yi.Model/T4DataContext.cs delete mode 100644 CC.Yi.Old/CC.Yi.Model/T4DataContext.tt delete mode 100644 CC.Yi.Old/CC.Yi.Model/result_user.cs delete mode 100644 CC.Yi.Old/CC.Yi.Model/student.cs delete mode 100644 CC.Yi.Old/CC.Yi.ViewModel/CC.Yi.ViewModel.csproj delete mode 100644 CC.Yi.Old/CC.Yi.sln delete mode 100644 CC.Yi.Old/T4Model/T4Model.txt delete mode 100644 CC.Yi.Old/T4Model/说明.txt delete mode 100644 CC.Yi/CC.Yi.API/CC.Yi.API.csproj delete mode 100644 CC.Yi/CC.Yi.API/Controllers/StudentController.cs delete mode 100644 CC.Yi/CC.Yi.API/Extension/ErrorHandExtension.cs delete mode 100644 CC.Yi/CC.Yi.API/Extension/SwaggerExtension.cs delete mode 100644 CC.Yi/CC.Yi.API/Filter/DbContextFilter.cs delete mode 100644 CC.Yi/CC.Yi.API/Init/InitDb.cs delete mode 100644 CC.Yi/CC.Yi.API/Program.cs delete mode 100644 CC.Yi/CC.Yi.API/Properties/launchSettings.json delete mode 100644 CC.Yi/CC.Yi.API/Startup.cs delete mode 100644 CC.Yi/CC.Yi.API/T4Startup.cs delete mode 100644 CC.Yi/CC.Yi.API/T4Startup.tt delete mode 100644 CC.Yi/CC.Yi.API/YIDB.db delete mode 100644 CC.Yi/CC.Yi.API/appsettings.Development.json delete mode 100644 CC.Yi/CC.Yi.API/appsettings.json delete mode 100644 CC.Yi/CC.Yi.API/nlog.config delete mode 100644 CC.Yi/CC.Yi.BLL/BaseBll.cs delete mode 100644 CC.Yi/CC.Yi.BLL/CC.Yi.BLL.csproj delete mode 100644 CC.Yi/CC.Yi.BLL/T4BLL.cs delete mode 100644 CC.Yi/CC.Yi.BLL/T4BLL.tt delete mode 100644 CC.Yi/CC.Yi.Common/CC.Yi.Common.csproj delete mode 100644 CC.Yi/CC.Yi.Common/Cache/CacheHelper.cs delete mode 100644 CC.Yi/CC.Yi.Common/Cache/ICacheWriter.cs delete mode 100644 CC.Yi/CC.Yi.Common/Cache/RedisCache.cs delete mode 100644 CC.Yi/CC.Yi.Common/Castle/CustomAutofacAop.cs delete mode 100644 CC.Yi/CC.Yi.Common/EmailHelper.cs delete mode 100644 CC.Yi/CC.Yi.Common/HttpHelper.cs delete mode 100644 CC.Yi/CC.Yi.Common/Json/DatetimeJsonConverter.cs delete mode 100644 CC.Yi/CC.Yi.Common/Json/DefaultJsonOptions.cs delete mode 100644 CC.Yi/CC.Yi.Common/Json/EnumJsonConverter.cs delete mode 100644 CC.Yi/CC.Yi.Common/Json/LowerCaseNamingPolicy.cs delete mode 100644 CC.Yi/CC.Yi.Common/Json/TimeSpanJsonConverter.cs delete mode 100644 CC.Yi/CC.Yi.Common/JsonHelper.cs delete mode 100644 CC.Yi/CC.Yi.Common/Jwt/JwtConst.cs delete mode 100644 CC.Yi/CC.Yi.Common/LinqHelper.cs delete mode 100644 CC.Yi/CC.Yi.Common/RandomHelper.cs delete mode 100644 CC.Yi/CC.Yi.Common/Result.cs delete mode 100644 CC.Yi/CC.Yi.Common/T4Vue/T4Api.tt delete mode 100644 CC.Yi/CC.Yi.Common/T4Vue/T4Api.vue delete mode 100644 CC.Yi/CC.Yi.Common/T4Vue/T4Component.tt delete mode 100644 CC.Yi/CC.Yi.Common/T4Vue/T4Component.vue delete mode 100644 CC.Yi/CC.Yi.Common/T4Vue/T4Controller.cs delete mode 100644 CC.Yi/CC.Yi.Common/imageHelper.cs delete mode 100644 CC.Yi/CC.Yi.Common/mongodb/model/student.cs delete mode 100644 CC.Yi/CC.Yi.Common/mongodb/mongodbContext.cs delete mode 100644 CC.Yi/CC.Yi.Common/settingHelper.cs delete mode 100644 CC.Yi/CC.Yi.DAL/BaseDal.cs delete mode 100644 CC.Yi/CC.Yi.DAL/CC.Yi.DAL.csproj delete mode 100644 CC.Yi/CC.Yi.DAL/T4DAL.cs delete mode 100644 CC.Yi/CC.Yi.DAL/T4DAL.tt delete mode 100644 CC.Yi/CC.Yi.IBLL/CC.Yi.IBLL.csproj delete mode 100644 CC.Yi/CC.Yi.IBLL/IBaseBll.cs delete mode 100644 CC.Yi/CC.Yi.IBLL/T4IBLL.cs delete mode 100644 CC.Yi/CC.Yi.IBLL/T4IBLL.tt delete mode 100644 CC.Yi/CC.Yi.IDAL/CC.Yi.IDAL.csproj delete mode 100644 CC.Yi/CC.Yi.IDAL/IBaseDal.cs delete mode 100644 CC.Yi/CC.Yi.IDAL/T4IDAL.cs delete mode 100644 CC.Yi/CC.Yi.IDAL/T4IDAL.tt delete mode 100644 CC.Yi/CC.Yi.Model/CC.Yi.Model.csproj delete mode 100644 CC.Yi/CC.Yi.Model/DataContext.cs delete mode 100644 CC.Yi/CC.Yi.Model/Migrations/20210602114758_yi1.Designer.cs delete mode 100644 CC.Yi/CC.Yi.Model/Migrations/20210602114758_yi1.cs delete mode 100644 CC.Yi/CC.Yi.Model/Migrations/20210602115718_yi2.Designer.cs delete mode 100644 CC.Yi/CC.Yi.Model/Migrations/20210602115718_yi2.cs delete mode 100644 CC.Yi/CC.Yi.Model/Migrations/DataContextModelSnapshot.cs delete mode 100644 CC.Yi/CC.Yi.Model/T4DataContext.cs delete mode 100644 CC.Yi/CC.Yi.Model/T4DataContext.tt delete mode 100644 CC.Yi/CC.Yi.Model/baseModel.cs delete mode 100644 CC.Yi/CC.Yi.Model/student.cs delete mode 100644 CC.Yi/CC.Yi.ViewModel/CC.Yi.ViewModel.csproj delete mode 100644 CC.Yi/CC.Yi.ViewModel/Enum/DelFlagEnum.cs delete mode 100644 CC.Yi/CC.Yi.ViewModel/setByIds.cs delete mode 100644 CC.Yi/CC.Yi.sln delete mode 100644 CC.Yi/T4Model/T4Model.txt delete mode 100644 CC.Yi/T4Model/T4Vue.txt delete mode 100644 CC.Yi/T4Model/说明.txt delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/FileController.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/JobController.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/UserController.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Log4net.config delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Program.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Startup.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/SwaggerDoc.xml delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/0a5221e4-dca6-4d4e-8486-acf86822f2e4.jpg delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/1b0a926d-ddce-4048-9b09-e2b8ec37c161.jpg delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/3d6ed457-0c20-4ce6-b91c-8c424f2f03bb.jpeg delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/6312706b-7013-4aa5-af3c-0bbb6b3f4804.jpg delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/7ca98a58-8822-40f5-a766-2a2dd21d2431.jpg delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/966200f6-265c-4470-ad20-c91c3d84a1cc.jpg delete mode 100644 Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/image/feae1964-04ce-464b-848b-86f2245f3f63.jpeg delete mode 100644 Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Program.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Startup.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Const/DbConst.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Const/FileConst.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Const/JobConst.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Const/JwtConst.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Const/RabbitConst.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Const/RedisConst.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/AssemblyHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/Base32Helper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/ConsoleHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/DateHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/EmailHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/ExcelHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/FileHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/HtmlHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/HttpHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/IpHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/JsonHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/MD5Hepler.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/MimeHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/RSAHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/RandomHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/SerializeHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/SnowflakeHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/StringHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/UnicodeHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/UrlHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Helper/XmlHelper.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/KafkaOptions.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/SMSOptions.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/SqliteOptions.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/AxiosUrlsModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/JobModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/LogModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/PageModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/Result.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Models/SwaggerModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SMSQueueModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Common/Yi.Framework.Common.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/CacheClientDB.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/ElasticSearchInvoker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Common.dll delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Interfaces.dll delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Redis.dll delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Text.dll delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/MakeJwt.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/Quartz/MyQuartzFactory.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/Quartz/QuartzInvoker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/RabbitMQInvoker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/SMS/AliyunSMSInvoker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/TreeMenuBuild.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Core/Yi.Framework.Core.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.DTOModel/ChangePwdDto.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.DTOModel/ChildrenDto.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.DTOModel/IdsDto.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.DTOModel/SettingDto.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.DTOModel/Yi.Framework.DTOModel.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/InitESIndexWorker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Log4net.config delete mode 100644 Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Program.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/WarmupESIndexWorker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Worker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.ElasticSearchProcessor/Yi.Framework.ElasticSearchProcessor.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.Interface/IBaseService.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Interface/IMenuService.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Interface/IMouldService.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Interface/IRoleService.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Interface/IUserService.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Interface/T4Iservice.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Interface/T4Iservice.tt delete mode 100644 Yi.Framework.Net5/Yi.Framework.Interface/Yi - Backup.Framework.Interface.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.Interface/Yi.Framework.Interface.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.MSUnitTest/UnitTest1.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.MSUnitTest/Yi.Framework.MSUnitTest.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/BaseModels/baseModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/BaseModels/loopModel.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/DataContext.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080544_ec1.Designer.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080544_ec1.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080646_ec2.Designer.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106080646_ec2.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106082100_yi-1.Designer.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106082100_yi-1.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106084427_ec3.Designer.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106084427_ec3.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106110713_ec4.Designer.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/20211106110713_ec4.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Migrations/DataContextModelSnapshot.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/ModelFactory/DbContextExtend.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/ModelFactory/DbContextFactory.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/ModelFactory/IDbContextFactory.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Models/menu.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Models/mould.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Models/role.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Models/user.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Models/visit.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Search/PageResult.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Search/SearchRequest.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/T4DataContext.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/T4DataContext.tt delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Yi - Backup (1).Framework.Model.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Yi - Backup.Framework.Model.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.Model/Yi.Framework.Model.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.OcelotGateway/Log4net.config delete mode 100644 Yi.Framework.Net5/Yi.Framework.OcelotGateway/Program.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.OcelotGateway/Startup.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.OcelotGateway/SwaggerDoc.xml delete mode 100644 Yi.Framework.Net5/Yi.Framework.OcelotGateway/Yi.Framework.OcelotGateway.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.PageDetail/Controllers/PageDetaiController.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.PageDetail/Log4net.config delete mode 100644 Yi.Framework.Net5/Yi.Framework.PageDetail/Program.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.PageDetail/Startup.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.PageDetail/SwaggerDoc.xml delete mode 100644 Yi.Framework.Net5/Yi.Framework.PageDetail/Views/PageDetai/Index.cshtml delete mode 100644 Yi.Framework.Net5/Yi.Framework.PageDetail/Views/Shared/_ValidationScriptsPartial.cshtml delete mode 100644 Yi.Framework.Net5/Yi.Framework.PageDetail/Yi.Framework.PageDetail.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.SMSProcessor/Log4net.config delete mode 100644 Yi.Framework.Net5/Yi.Framework.SMSProcessor/Program.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.SMSProcessor/SendWorker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.SMSProcessor/Worker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.SMSProcessor/Yi.Framework.SMSProcessor.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.Service/BaseService.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Service/MenuService.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Service/MouldService.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Service/RoleService.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Service/T4Service.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Service/T4Service.tt delete mode 100644 Yi.Framework.Net5/Yi.Framework.Service/UserService.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Service/Yi - Backup.Framework.Service.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.Service/Yi.Framework.Service.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/InitPageWorker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Log4net.config delete mode 100644 Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Program.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/WarmupPageWorker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Worker.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.StaticPageProcessor/Yi.Framework.StaticPageProcessor.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.Task/HttpJob.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Task/VisitJob.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.Task/Yi.Framework.Job.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/Appsettings.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/BuilderExtend/JsonFileExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/CommonExtend.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CORSFilter.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomAction2CommitFilterAttribute.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomActionCacheFilterAttribute.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomActionCheckFilterAttribute.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/Init/DataSeed.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/Init/RedisInit.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/CAPExtend.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegiterExtend.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/CorsExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/DbExtend.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/DbSeedInitExtend.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/ElasticSeachExtend.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/ErrorHandExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/HealthCheckExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/IocExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/JwtExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/PreOptionRequestExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/QuartzExtensions.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/RabbitMQExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/RedisExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/RedisInitExtend.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/SMSExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/Utility/CustomAutofacAop.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/Utility/CustomAutofacModule.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/Utility/CustomHostingStartup.cs delete mode 100644 Yi.Framework.Net5/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj delete mode 100644 Yi.Framework.Net5/Yi.Framework.sln diff --git a/CC.Yi.Old/CC.Yi.API/CC.Yi.API.csproj b/CC.Yi.Old/CC.Yi.API/CC.Yi.API.csproj deleted file mode 100644 index 6b3e84cf..00000000 --- a/CC.Yi.Old/CC.Yi.API/CC.Yi.API.csproj +++ /dev/null @@ -1,50 +0,0 @@ - - - - net5.0 - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - Always - - - - - - - - - - True - True - T4Startup.tt - - - - - - TextTemplatingFileGenerator - T4Startup.cs - - - - diff --git a/CC.Yi.Old/CC.Yi.API/Controllers/StudentController.cs b/CC.Yi.Old/CC.Yi.API/Controllers/StudentController.cs deleted file mode 100644 index ecbe8d2f..00000000 --- a/CC.Yi.Old/CC.Yi.API/Controllers/StudentController.cs +++ /dev/null @@ -1,175 +0,0 @@ -using CC.Yi.API.Filter; -using CC.Yi.Common; -using CC.Yi.Common.Cache; -using CC.Yi.Common.Jwt; -using CC.Yi.IBLL; -using CC.Yi.Model; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Logging; -using Microsoft.IdentityModel.Tokens; -using System; -using System.Collections.Generic; -using System.IdentityModel.Tokens.Jwt; -using System.Linq; -using System.Security.Claims; -using System.Text; -using System.Threading.Tasks; - -namespace CC.Yi.API.Controllers -{ - [ApiController] - [Route("[controller]/[action]")] - public class StudentController : Controller - { - private readonly ILogger _logger;//处理日志相关文件 - - //private UserManager _userManager;//处理用户相关逻辑:添加密码,修改密码,添加删除角色等等 - //private SignInManager _signInManager;//处理注册登录的相关逻辑 - - private IstudentBll _studentBll; - public StudentController(ILogger logger, IstudentBll studentBll) - { - - _logger = logger; - _logger.LogInformation("现在你进入了StudentController控制器"); - _studentBll = studentBll; - //_userManager = userManager; - //_signInManager = signInManager; - } - #region - //关于身份认证配置使用: - //在需要身份认证的控制器上打上 [Authorize] 特性标签 - #endregion - //[HttpGet] - //public async Task IdentityTest() - //{ - // //用户登入 - // var data = await _signInManager.PasswordSignInAsync("账号", "密码", false, false); //"是否记住密码","是否登入失败锁定用户" - // //用户登出 - // await _signInManager.SignOutAsync(); - // //创建用户 - // var data2 = await _userManager.CreateAsync(new result_user { UserName="账户",Email="邮箱"},"密码"); - // //获取用户 - // var data3 = _userManager.Users;//这里可以使用Linq表达式Select - // return Ok(); - //} - - #region - //下面,这里是操作reids - #endregion - [HttpGet] - public Result GetReids() - { - var data = CacheHelper.CacheWriter.GetCache("key01"); - return Result.Success(data); - } - - #region - //下面,权限验证 - #endregion - - //发送令牌 - [HttpGet] - public Result Login(string role) - { - string userName = "admin"; - var claims = new[] - { - new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") , - new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds()}"), - new Claim(ClaimTypes.Name, userName), - new Claim(ClaimTypes.Role,role) - - }; - var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtConst.SecurityKey)); - var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); - - var token = new JwtSecurityToken( - issuer: JwtConst.Domain, - audience: JwtConst.Domain, - claims: claims, - expires: DateTime.Now.AddMinutes(30), - signingCredentials: creds); - - var tokenData= new JwtSecurityTokenHandler().WriteToken(token); - return Result.Success("欢迎你!管理员!").SetData(new { token= tokenData }); - } - - [HttpGet] - [Authorize(Policy = "myadmin")]//基于策略的验证 - public Result MyAdmin() - { - return Result.Success("欢迎你!管理员!"); - } - - [HttpGet] - [Authorize(Roles ="user")]//基于角色的验证 - public Result MyUser() - { - return Result.Success("欢迎你!游客!"); - } - - - #region - //下面,经典的 增删改查 即为简易--Yi意框架 - //注意:请确保你的数据库中存在合理的数据 - #endregion - [HttpGet] - [DbContextFilter] - public async Task GetTest()//查 - { - _logger.LogInformation("调用查方法"); - var data =await _studentBll.GetAllEntities().ToListAsync(); - return Result.Success("查询成功").SetData(data); - } - [HttpGet] - [DbContextFilter] - public Result AddTest()//增 - { - _logger.LogInformation("调用增方法"); - List students = new List() {new student { name = "学生a" } ,new student { name="学生d"} }; - if (_studentBll.Add(students)) - { - return Result.Success("增加成功"); - } - else - { - return Result.Error("增加失败"); - } - - - } - [HttpGet] - [DbContextFilter] - public Result RemoveTest()//删 - { - _logger.LogInformation("调用删方法"); - if (_studentBll.Delete(u=>u.name=="学生a")) - { - return Result.Success("删除成功"); - } - else - { - return Result.Error("删除失败"); - } - } - [HttpGet] - [DbContextFilter] - public Result UpdateTest()//改 - { - _logger.LogInformation("调用改方法"); - if (_studentBll.Update(new student { id=2, name = "学生a" }, "name")) - { - return Result.Success("修改成功"); - } - else - { - return Result.Error("修改失败"); - } - - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Extension/SwaggerExtension.cs b/CC.Yi.Old/CC.Yi.API/Extension/SwaggerExtension.cs deleted file mode 100644 index 6db50f61..00000000 --- a/CC.Yi.Old/CC.Yi.API/Extension/SwaggerExtension.cs +++ /dev/null @@ -1,76 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.OpenApi.Models; -using System; -using System.IO; - -namespace CC.Yi.API.Extension -{ - /// - /// Swagger文档扩展方法 - /// - public static class SwaggerExtension - { - public static IServiceCollection AddSwaggerService(this IServiceCollection services) - { - var apiInfo = new OpenApiInfo - { - Title = "Yi意框架-API接口", - Version = "v1", - Contact = new OpenApiContact { Name = "橙子", Email = "454313500@qq.com", Url = new System.Uri("https://jiftcc.com") } - }; - #region 注册Swagger服务 - services.AddSwaggerGen(c => - { - c.SwaggerDoc("v1", apiInfo); - - //添加注释服务 - //为 Swagger JSON and UI设置xml文档注释路径 - //获取应用程序所在目录(绝对路径,不受工作目录影响,建议采用此方法获取路径使用windwos&Linux) - var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location); - var apiXmlPath = Path.Combine(basePath, @"ApiDoc.xml");//控制器层注释 - var entityXmlPath = Path.Combine(basePath, @"Model\ModelDoc.xml");//实体注释 - //c.IncludeXmlComments(apiXmlPath, true);//true表示显示控制器注释 - //c.IncludeXmlComments(entityXmlPath); - - //添加控制器注释 - //c.DocumentFilter(); - - //添加header验证信息 - //c.OperationFilter(); - //var security = new Dictionary> { { "Bearer", new string[] { } }, }; - - c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme() - { - Description = "文本框里输入从服务器获取的Token。格式为:Bearer + 空格+token",//JWT授权(数据将在请求头中进行传输) 参数结构: \"Authorization: Bearer {token}\" - Name = "Authorization",////jwt默认的参数名称 - In = ParameterLocation.Header,////jwt默认存放Authorization信息的位置(请求头中) - Type = SecuritySchemeType.ApiKey, - }); - c.AddSecurityRequirement(new OpenApiSecurityRequirement - { - { new OpenApiSecurityScheme - { - Reference = new OpenApiReference() - { - Id = "Bearer", - Type = ReferenceType.SecurityScheme - } - }, Array.Empty() } - }); - }); - #endregion - - return services; - } - - public static void UseSwaggerService(this IApplicationBuilder app) - { - //在 Startup.Configure 方法中,启用中间件为生成的 JSON 文档和 Swagger UI 提供服务: - // Enable middleware to serve generated Swagger as a JSON endpoint. - app.UseSwagger(); - app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "JwtTest v1")); - } - - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Filter/DbContextFilter.cs b/CC.Yi.Old/CC.Yi.API/Filter/DbContextFilter.cs deleted file mode 100644 index 82fd8aac..00000000 --- a/CC.Yi.Old/CC.Yi.API/Filter/DbContextFilter.cs +++ /dev/null @@ -1,22 +0,0 @@ -using CC.Yi.DAL; -using CC.Yi.Model; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.API.Filter -{ - public class DbContextFilter : ActionFilterAttribute - { - public override void OnActionExecuting(ActionExecutingContext filterContext) - { - var cache = filterContext.HttpContext.RequestServices.GetService(typeof(DataContext)) as DataContext; - DbContentFactory.Initialize(cache); - base.OnActionExecuting(filterContext); - - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/20210319112041_yi1.Designer.cs b/CC.Yi.Old/CC.Yi.API/Migrations/20210319112041_yi1.Designer.cs deleted file mode 100644 index fa669c28..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/20210319112041_yi1.Designer.cs +++ /dev/null @@ -1,40 +0,0 @@ -// -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace CC.Yi.API.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20210319112041_yi1")] - partial class yi1 - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.4") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("CC.Yi.Model.student", b => - { - b.Property("id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("name") - .HasColumnType("int"); - - b.HasKey("id"); - - b.ToTable("student"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/20210319112041_yi1.cs b/CC.Yi.Old/CC.Yi.API/Migrations/20210319112041_yi1.cs deleted file mode 100644 index 03299091..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/20210319112041_yi1.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace CC.Yi.API.Migrations -{ - public partial class yi1 : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "student", - columns: table => new - { - id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - name = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_student", x => x.id); - }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "student"); - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/20210320082935_yi2.Designer.cs b/CC.Yi.Old/CC.Yi.API/Migrations/20210320082935_yi2.Designer.cs deleted file mode 100644 index c9bbf025..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/20210320082935_yi2.Designer.cs +++ /dev/null @@ -1,40 +0,0 @@ -// -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace CC.Yi.API.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20210320082935_yi2")] - partial class yi2 - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.4") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("CC.Yi.Model.student", b => - { - b.Property("id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("id"); - - b.ToTable("student"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/20210320082935_yi2.cs b/CC.Yi.Old/CC.Yi.API/Migrations/20210320082935_yi2.cs deleted file mode 100644 index 6875efa1..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/20210320082935_yi2.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace CC.Yi.API.Migrations -{ - public partial class yi2 : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "name", - table: "student", - type: "nvarchar(max)", - nullable: true, - oldClrType: typeof(int), - oldType: "int"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "name", - table: "student", - type: "int", - nullable: false, - defaultValue: 0, - oldClrType: typeof(string), - oldType: "nvarchar(max)", - oldNullable: true); - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/20210325123550_yi3.Designer.cs b/CC.Yi.Old/CC.Yi.API/Migrations/20210325123550_yi3.Designer.cs deleted file mode 100644 index 2803473c..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/20210325123550_yi3.Designer.cs +++ /dev/null @@ -1,93 +0,0 @@ -// -using System; -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace CC.Yi.API.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20210325123550_yi3")] - partial class yi3 - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.4") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("CC.Yi.Model.result_user", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .HasColumnType("nvarchar(max)"); - - b.Property("EmailConfirmed") - .HasColumnType("bit"); - - b.Property("LockoutEnabled") - .HasColumnType("bit"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("NormalizedEmail") - .HasColumnType("nvarchar(max)"); - - b.Property("NormalizedUserName") - .HasColumnType("nvarchar(max)"); - - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); - - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); - - b.Property("UserName") - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("result_user"); - }); - - modelBuilder.Entity("CC.Yi.Model.student", b => - { - b.Property("id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("id"); - - b.ToTable("student"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/20210325123550_yi3.cs b/CC.Yi.Old/CC.Yi.API/Migrations/20210325123550_yi3.cs deleted file mode 100644 index ba0128cc..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/20210325123550_yi3.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace CC.Yi.API.Migrations -{ - public partial class yi3 : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "result_user", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - UserName = table.Column(type: "nvarchar(max)", nullable: true), - NormalizedUserName = table.Column(type: "nvarchar(max)", nullable: true), - Email = table.Column(type: "nvarchar(max)", nullable: true), - NormalizedEmail = table.Column(type: "nvarchar(max)", nullable: true), - EmailConfirmed = table.Column(type: "bit", nullable: false), - PasswordHash = table.Column(type: "nvarchar(max)", nullable: true), - SecurityStamp = table.Column(type: "nvarchar(max)", nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumber = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumberConfirmed = table.Column(type: "bit", nullable: false), - TwoFactorEnabled = table.Column(type: "bit", nullable: false), - LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), - LockoutEnabled = table.Column(type: "bit", nullable: false), - AccessFailedCount = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_result_user", x => x.Id); - }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "result_user"); - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/20210325124241_yi4.Designer.cs b/CC.Yi.Old/CC.Yi.API/Migrations/20210325124241_yi4.Designer.cs deleted file mode 100644 index dff90a75..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/20210325124241_yi4.Designer.cs +++ /dev/null @@ -1,301 +0,0 @@ -// -using System; -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace CC.Yi.API.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20210325124241_yi4")] - partial class yi4 - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.4") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("CC.Yi.Model.student", b => - { - b.Property("id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("id"); - - b.ToTable("student"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex") - .HasFilter("[NormalizedName] IS NOT NULL"); - - b.ToTable("AspNetRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Discriminator") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("bit"); - - b.Property("LockoutEnabled") - .HasColumnType("bit"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); - - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex") - .HasFilter("[NormalizedUserName] IS NOT NULL"); - - b.ToTable("AspNetUsers"); - - b.HasDiscriminator("Discriminator").HasValue("IdentityUser"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("RoleId") - .HasColumnType("nvarchar(450)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("Name") - .HasColumnType("nvarchar(450)"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens"); - }); - - modelBuilder.Entity("CC.Yi.Model.result_user", b => - { - b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); - - b.HasDiscriminator().HasValue("result_user"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/20210325124241_yi4.cs b/CC.Yi.Old/CC.Yi.API/Migrations/20210325124241_yi4.cs deleted file mode 100644 index 4b105b4d..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/20210325124241_yi4.cs +++ /dev/null @@ -1,315 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace CC.Yi.API.Migrations -{ - public partial class yi4 : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropPrimaryKey( - name: "PK_result_user", - table: "result_user"); - - migrationBuilder.RenameTable( - name: "result_user", - newName: "AspNetUsers"); - - migrationBuilder.AlterColumn( - name: "UserName", - table: "AspNetUsers", - type: "nvarchar(256)", - maxLength: 256, - nullable: true, - oldClrType: typeof(string), - oldType: "nvarchar(max)", - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "NormalizedUserName", - table: "AspNetUsers", - type: "nvarchar(256)", - maxLength: 256, - nullable: true, - oldClrType: typeof(string), - oldType: "nvarchar(max)", - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "NormalizedEmail", - table: "AspNetUsers", - type: "nvarchar(256)", - maxLength: 256, - nullable: true, - oldClrType: typeof(string), - oldType: "nvarchar(max)", - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "Email", - table: "AspNetUsers", - type: "nvarchar(256)", - maxLength: 256, - nullable: true, - oldClrType: typeof(string), - oldType: "nvarchar(max)", - oldNullable: true); - - migrationBuilder.AddColumn( - name: "Discriminator", - table: "AspNetUsers", - type: "nvarchar(max)", - nullable: false, - defaultValue: ""); - - migrationBuilder.AddPrimaryKey( - name: "PK_AspNetUsers", - table: "AspNetUsers", - column: "Id"); - - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - UserId = table.Column(type: "nvarchar(450)", nullable: false), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - ProviderKey = table.Column(type: "nvarchar(450)", nullable: false), - ProviderDisplayName = table.Column(type: "nvarchar(max)", nullable: true), - UserId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(450)", nullable: false), - Value = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - RoleId = table.Column(type: "nvarchar(450)", nullable: false), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - RoleId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true, - filter: "[NormalizedUserName] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true, - filter: "[NormalizedName] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropPrimaryKey( - name: "PK_AspNetUsers", - table: "AspNetUsers"); - - migrationBuilder.DropIndex( - name: "EmailIndex", - table: "AspNetUsers"); - - migrationBuilder.DropIndex( - name: "UserNameIndex", - table: "AspNetUsers"); - - migrationBuilder.DropColumn( - name: "Discriminator", - table: "AspNetUsers"); - - migrationBuilder.RenameTable( - name: "AspNetUsers", - newName: "result_user"); - - migrationBuilder.AlterColumn( - name: "UserName", - table: "result_user", - type: "nvarchar(max)", - nullable: true, - oldClrType: typeof(string), - oldType: "nvarchar(256)", - oldMaxLength: 256, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "NormalizedUserName", - table: "result_user", - type: "nvarchar(max)", - nullable: true, - oldClrType: typeof(string), - oldType: "nvarchar(256)", - oldMaxLength: 256, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "NormalizedEmail", - table: "result_user", - type: "nvarchar(max)", - nullable: true, - oldClrType: typeof(string), - oldType: "nvarchar(256)", - oldMaxLength: 256, - oldNullable: true); - - migrationBuilder.AlterColumn( - name: "Email", - table: "result_user", - type: "nvarchar(max)", - nullable: true, - oldClrType: typeof(string), - oldType: "nvarchar(256)", - oldMaxLength: 256, - oldNullable: true); - - migrationBuilder.AddPrimaryKey( - name: "PK_result_user", - table: "result_user", - column: "Id"); - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/20210410090937_yi5.Designer.cs b/CC.Yi.Old/CC.Yi.API/Migrations/20210410090937_yi5.Designer.cs deleted file mode 100644 index 6038f52c..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/20210410090937_yi5.Designer.cs +++ /dev/null @@ -1,40 +0,0 @@ -// -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace CC.Yi.API.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20210410090937_yi5")] - partial class yi5 - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.4") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("CC.Yi.Model.student", b => - { - b.Property("id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("id"); - - b.ToTable("student"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/20210410090937_yi5.cs b/CC.Yi.Old/CC.Yi.API/Migrations/20210410090937_yi5.cs deleted file mode 100644 index 73cf0845..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/20210410090937_yi5.cs +++ /dev/null @@ -1,220 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace CC.Yi.API.Migrations -{ - public partial class yi5 : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropTable( - name: "AspNetUsers"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), - Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetUsers", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - AccessFailedCount = table.Column(type: "int", nullable: false), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), - Discriminator = table.Column(type: "nvarchar(max)", nullable: false), - Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "bit", nullable: false), - LockoutEnabled = table.Column(type: "bit", nullable: false), - LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), - NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - PasswordHash = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumber = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumberConfirmed = table.Column(type: "bit", nullable: false), - SecurityStamp = table.Column(type: "nvarchar(max)", nullable: true), - TwoFactorEnabled = table.Column(type: "bit", nullable: false), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true), - RoleId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true), - UserId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - ProviderKey = table.Column(type: "nvarchar(450)", nullable: false), - ProviderDisplayName = table.Column(type: "nvarchar(max)", nullable: true), - UserId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - RoleId = table.Column(type: "nvarchar(450)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(450)", nullable: false), - Value = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true, - filter: "[NormalizedName] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true, - filter: "[NormalizedUserName] IS NOT NULL"); - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Migrations/DataContextModelSnapshot.cs b/CC.Yi.Old/CC.Yi.API/Migrations/DataContextModelSnapshot.cs deleted file mode 100644 index 1952adda..00000000 --- a/CC.Yi.Old/CC.Yi.API/Migrations/DataContextModelSnapshot.cs +++ /dev/null @@ -1,38 +0,0 @@ -// -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace CC.Yi.API.Migrations -{ - [DbContext(typeof(DataContext))] - partial class DataContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.4") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("CC.Yi.Model.student", b => - { - b.Property("id") - .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("name") - .HasColumnType("nvarchar(max)"); - - b.HasKey("id"); - - b.ToTable("student"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Program.cs b/CC.Yi.Old/CC.Yi.API/Program.cs deleted file mode 100644 index 9fe2b1eb..00000000 --- a/CC.Yi.Old/CC.Yi.API/Program.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Autofac.Extensions.DependencyInjection; -using CC.Yi.DAL; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using NLog.Web; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.API -{ - public class Program - { - public static void Main(string[] args) - { - var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger(); - try - { - logger.Debug("Yiܡ"); - var host = CreateHostBuilder(args).Build(); - //var scope = host.Services.CreateScope(); - //var services = scope.ServiceProvider; - //var context = services.GetRequiredService();//ȡ - //DbContentFactory.Initialize(context);//þ̬෽ע - host.Run(); - logger.Info("Yiɹ"); - } - catch (Exception exception) - { - //NLog: catch setup errors - logger.Error(exception, "Stopped program because of exception"); - throw; - } - finally - { - // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux) - NLog.LogManager.Shutdown(); - } - - - - - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }).UseServiceProviderFactory(new AutofacServiceProviderFactory()) - .ConfigureLogging(logging => - { - // logging.ClearProviders(); // п̨ - logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); - }).UseNLog();//nlog־ - - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Properties/launchSettings.json b/CC.Yi.Old/CC.Yi.API/Properties/launchSettings.json deleted file mode 100644 index 9942be97..00000000 --- a/CC.Yi.Old/CC.Yi.API/Properties/launchSettings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:55197", - "sslPort": 44334 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "swagger", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "CC.Yi.API": { - "commandName": "Project", - "dotnetRunMessages": "true", - "launchBrowser": true, - "launchUrl": "swagger", - "applicationUrl": "https://localhost:5001;http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/Startup.cs b/CC.Yi.Old/CC.Yi.API/Startup.cs deleted file mode 100644 index 55003dc4..00000000 --- a/CC.Yi.Old/CC.Yi.API/Startup.cs +++ /dev/null @@ -1,164 +0,0 @@ - -using Autofac; -using Autofac.Extras.DynamicProxy; -using CC.Yi.API.Extension; -using CC.Yi.API.Filter; -using CC.Yi.BLL; -using CC.Yi.Common.Cache; -using CC.Yi.Common.Castle; -using CC.Yi.Common.Jwt; -using CC.Yi.DAL; -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using CC.Yi.Model; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.HttpsPolicy; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Microsoft.IdentityModel.Tokens; -using Microsoft.OpenApi.Models; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CC.Yi.API -{ - public partial class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - - public void ConfigureServices(IServiceCollection services) - { - // Jwt - services.AddAuthorization(options => - { - //ûڲԵ֤ - options.AddPolicy("myadmin", policy => - policy.RequireRole("admin")); - }); - - - services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) - .AddJwtBearer(options => { - options.TokenValidationParameters = new TokenValidationParameters - { - ValidateIssuer = true,//Ƿ֤Issuer - ValidateAudience = true,//Ƿ֤Audience - ValidateLifetime = true,//Ƿ֤ʧЧʱ - ClockSkew = TimeSpan.FromSeconds(30), - ValidateIssuerSigningKey = true,//Ƿ֤SecurityKey - ValidAudience = JwtConst.Domain,//Audience - ValidIssuer = JwtConst.Domain,//Issuerǰǩjwtһ - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtConst.SecurityKey))//õSecurityKey - }; - }); - - - services.AddControllers(); - services.AddSwaggerService(); - services.AddSession(); - - - - //ù - Action filters = new Action(r => { - //r.Filters.Add(typeof(DbContextFilter)); - }); - services.AddMvc(filters); - - //ݿ - string connection1 = Configuration["ConnectionStringBySQL"]; - string connection2 = Configuration["ConnectionStringByMySQL"]; - string connection3 = Configuration["ConnectionStringBySQLite"]; - services.AddDbContext(options => - { - options.UseSqlServer(connection1, b => b.MigrationsAssembly("CC.Yi.API"));//ݿ - }); - - - //עתAutofac - //services.AddScoped(typeof(IBaseDal<>), typeof(BaseDal<>)); - //services.AddScoped(typeof(IstudentBll), typeof(studentBll)); - - //reidsע - //services.AddSingleton(typeof(ICacheWriter), new RedisCacheService(new Microsoft.Extensions.Caching.Redis.RedisCacheOptions() - //{ - // Configuration = Configuration.GetSection("Cache.ConnectionString").Value, - // InstanceName = Configuration.GetSection("Cache.InstanceName").Value - //})); - - - //Identity֤ - //services.AddIdentity(options => - // { - // options.Password.RequiredLength = 6;//̳ - // options.Password.RequireDigit = false;// - // options.Password.RequireLowercase = false;//Сдĸ - // options.Password.RequireNonAlphanumeric = false;//ַ - // options.Password.RequireUppercase = false;//дĸ - // //options.User.RequireUniqueEmail = false;//עǷԲظ - // //options.User.AllowedUserNameCharacters="abcd"//ַֻ - //}).AddEntityFrameworkStores().AddDefaultTokenProviders(); - - // - services.AddCors(options => options.AddPolicy("CorsPolicy", - builder => - { - builder.AllowAnyMethod() - .SetIsOriginAllowed(_ => true) - .AllowAnyHeader() - .AllowCredentials(); - })); - } - - //ʼʹú - private void InitData(IServiceProvider serviceProvider) - { - //var serviceScope = serviceProvider.GetRequiredService().CreateScope(); - - //var context = serviceScope.ServiceProvider.GetService(); - //DbContentFactory.Initialize(context);//þ̬෽ע - } - - - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - app.UseSwaggerService(); - } - - //app.UseAuthentication(); - app.UseCors("CorsPolicy"); - app.UseHttpsRedirection(); - app.UseSession(); - app.UseRouting(); - app.UseAuthentication(); - app.UseAuthorization(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - InitData(app.ApplicationServices); - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/T4Startup.cs b/CC.Yi.Old/CC.Yi.API/T4Startup.cs deleted file mode 100644 index 75e8a6fd..00000000 --- a/CC.Yi.Old/CC.Yi.API/T4Startup.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Autofac; -using Autofac.Extras.DynamicProxy; -using CC.Yi.BLL; -using CC.Yi.Common.Castle; -using CC.Yi.DAL; -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using System; - - -namespace CC.Yi.API -{ - public partial class Startup - { - //动态 面向AOP思想的依赖注入 Autofac - public void ConfigureContainer(ContainerBuilder builder) - { - builder.RegisterType(typeof(CustomAutofacAop)); - builder.RegisterGeneric(typeof(BaseDal<>)).As(typeof(IBaseDal<>)); - builder.RegisterType().As().EnableInterfaceInterceptors();//表示注入前后要执行Castle,AOP - } - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.API/T4Startup.tt b/CC.Yi.Old/CC.Yi.API/T4Startup.tt deleted file mode 100644 index 166ebfc5..00000000 --- a/CC.Yi.Old/CC.Yi.API/T4Startup.tt +++ /dev/null @@ -1,40 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using Autofac; -using Autofac.Extras.DynamicProxy; -using CC.Yi.BLL; -using CC.Yi.Common.Castle; -using CC.Yi.DAL; -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using System; - - -namespace CC.Yi.API -{ - public partial class Startup - { - //动态 面向AOP思想的依赖注入 Autofac - public void ConfigureContainer(ContainerBuilder builder) - { - builder.RegisterType(typeof(CustomAutofacAop)); - builder.RegisterGeneric(typeof(BaseDal<>)).As(typeof(IBaseDal<>)); -<# foreach(string k in ModelData){#> - builder.RegisterType<<#=k #>Bll>().AsBll>().EnableInterfaceInterceptors();//表示注入前后要执行Castle,AOP -<# } #> - } - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.API/appsettings.Development.json b/CC.Yi.Old/CC.Yi.API/appsettings.Development.json deleted file mode 100644 index 8983e0fc..00000000 --- a/CC.Yi.Old/CC.Yi.API/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/CC.Yi.Old/CC.Yi.API/appsettings.json b/CC.Yi.Old/CC.Yi.API/appsettings.json deleted file mode 100644 index 429d06ac..00000000 --- a/CC.Yi.Old/CC.Yi.API/appsettings.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "AllowedHosts": "*", - "Cache": { - "InstanceName": "Redis", - "ConnectionString": "127.0.0.1:12345,password=123456" - }, - "ConnectionStringBySQL": "server=.;Database=YIDB;UId=sa;PWD=Qz52013142020.", - "ConnectionStringByMySQL": "Data Source=.;Database=YIDB;User ID=root;Password=Qz52013142020.;pooling=true;port=3306;sslmode=none;CharSet=utf8;", - "ConnectionStringBySQLite": "Filename=YIDB.db" -} diff --git a/CC.Yi.Old/CC.Yi.API/nlog.config b/CC.Yi.Old/CC.Yi.API/nlog.config deleted file mode 100644 index ff359770..00000000 --- a/CC.Yi.Old/CC.Yi.API/nlog.config +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CC.Yi.Old/CC.Yi.BLL/BaseBll.cs b/CC.Yi.Old/CC.Yi.BLL/BaseBll.cs deleted file mode 100644 index 90cd98a0..00000000 --- a/CC.Yi.Old/CC.Yi.BLL/BaseBll.cs +++ /dev/null @@ -1,109 +0,0 @@ -using CC.Yi.DALFactory; -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; - -namespace CC.Yi.BLL -{ - public class BaseBll : IBaseBll where T : class, new() - { - public IBaseDal CurrentDal; - public BaseBll(IBaseDal cd) - { - CurrentDal = cd; - } - - public IQueryable GetAllEntities() - { - return CurrentDal.GetAllEntities(); - } - - public IQueryable GetEntities(Expression> whereLambda) - { - return CurrentDal.GetEntities(whereLambda); - } - - public int GetCount(Expression> whereLambda) //统计数量 - { - return CurrentDal.GetCount(whereLambda); - } - - public IQueryable> GetGroup(Expression> whereLambda, Expression> groupByLambda) //分组 - { - return CurrentDal.GetGroup(whereLambda, groupByLambda); - - } - - - public IQueryable GetPageEntities(int pageSize, int pageIndex, out int total, Expression> whereLambda, Expression> orderByLambda, bool isAsc) - { - return CurrentDal.GetPageEntities(pageSize, pageIndex, out total, whereLambda, orderByLambda, isAsc); - } - - public T Add(T entity) - { - var myEntity=CurrentDal.Add(entity); - DbSession.SaveChanges(); - return myEntity; - } - - public bool Add(IEnumerable entities) - { - CurrentDal.AddRange(entities); - return DbSession.SaveChanges() > 0; - } - - public bool Update(T entity) - { - CurrentDal.Update(entity); - return DbSession.SaveChanges() > 0; - } - - public bool Update(T entity, params string[] propertyNames) - { - CurrentDal.Update(entity,propertyNames); - return DbSession.SaveChanges() > 0; - } - - public bool Delete(T entity) - { - CurrentDal.Delete(entity); - return DbSession.SaveChanges() > 0; - } - public IDbSession DbSession - { - get - { - return DbSessionFactory.GetCurrentDbSession(); - } - } - public bool Delete(int id) - { - CurrentDal.Detete(id); - return DbSession.SaveChanges() > 0; - } - - public bool Delete(IEnumerable ids) - { - foreach (var id in ids) - { - CurrentDal.Detete(id); - } - return DbSession.SaveChanges()>0; - } - public bool Delete(Expression> where) - { - IQueryable entities = CurrentDal.GetEntities(where); - if (entities != null) - { - CurrentDal.DeteteRange(entities); - - return DbSession.SaveChanges()>0; - } - return false; - } - } -} diff --git a/CC.Yi.Old/CC.Yi.BLL/CC.Yi.BLL.csproj b/CC.Yi.Old/CC.Yi.BLL/CC.Yi.BLL.csproj deleted file mode 100644 index ce6c0299..00000000 --- a/CC.Yi.Old/CC.Yi.BLL/CC.Yi.BLL.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - - netcoreapp3.1 - - - - - - - - - - - TextTemplatingFileGenerator - T4BLL.cs - - - - - - - - - - True - True - T4BLL.tt - - - - diff --git a/CC.Yi.Old/CC.Yi.BLL/T4BLL.cs b/CC.Yi.Old/CC.Yi.BLL/T4BLL.cs deleted file mode 100644 index da68edd2..00000000 --- a/CC.Yi.Old/CC.Yi.BLL/T4BLL.cs +++ /dev/null @@ -1,19 +0,0 @@ - -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.BLL -{ - public partial class studentBll : BaseBll, IstudentBll - { - public studentBll(IBaseDal cd):base(cd) - { - CurrentDal = cd; - } - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.BLL/T4BLL.tt b/CC.Yi.Old/CC.Yi.BLL/T4BLL.tt deleted file mode 100644 index dcda0135..00000000 --- a/CC.Yi.Old/CC.Yi.BLL/T4BLL.tt +++ /dev/null @@ -1,37 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> - -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.BLL -{ -<# foreach(string k in ModelData){ - #> - public partial class <#=k #>Bll : BaseBll<<#=k #>>, I<#=k #>Bll - { - public <#=k #>Bll(IBaseDal<<#=k #>> cd):base(cd) - { - CurrentDal = cd; - } - } -<# } #> -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.Common/CC.Yi.Common.csproj b/CC.Yi.Old/CC.Yi.Common/CC.Yi.Common.csproj deleted file mode 100644 index 2d1ddc8f..00000000 --- a/CC.Yi.Old/CC.Yi.Common/CC.Yi.Common.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - netcoreapp3.1 - - - - - - - - - - - - - diff --git a/CC.Yi.Old/CC.Yi.Common/Cache/CacheHelper.cs b/CC.Yi.Old/CC.Yi.Common/Cache/CacheHelper.cs deleted file mode 100644 index e77f8fbc..00000000 --- a/CC.Yi.Old/CC.Yi.Common/Cache/CacheHelper.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Autofac; -using Microsoft.AspNetCore.Http; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common.Cache -{ - public class CacheHelper - { - public static ICacheWriter CacheWriter { get; set; } - static CacheHelper() - { - CacheHelper.CacheWriter = new RedisCache(); - } - - - - - public bool AddCache(string key, T value, DateTime expDate) - { - return CacheWriter.AddCache(key,value,expDate); - } - - public bool AddCache(string key, T value) - { - return CacheWriter.AddCache(key, value); - } - - public bool RemoveCache(string key) - { - return CacheWriter.RemoveCache(key); - } - - public T GetCache(string key) - { - return CacheWriter.GetCache(key); - } - - public bool SetCache(string key, T value, DateTime expDate) - { - return CacheWriter.SetCache(key,value,expDate); - } - - public bool SetCache(string key, T value) - { - return CacheWriter.SetCache(key, value); - } - - } -} diff --git a/CC.Yi.Old/CC.Yi.Common/Cache/ICacheWriter.cs b/CC.Yi.Old/CC.Yi.Common/Cache/ICacheWriter.cs deleted file mode 100644 index 712f6857..00000000 --- a/CC.Yi.Old/CC.Yi.Common/Cache/ICacheWriter.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CC.Yi.Common.Cache -{ - public interface ICacheWriter - { - bool AddCache(string key, T value, DateTime expDate); - bool AddCache(string key, T value); - bool RemoveCache(string key); - T GetCache(string key); - bool SetCache(string key, T value, DateTime expDate); - bool SetCache(string key, T value); - } -} diff --git a/CC.Yi.Old/CC.Yi.Common/Cache/RedisCache.cs b/CC.Yi.Old/CC.Yi.Common/Cache/RedisCache.cs deleted file mode 100644 index 3e695f02..00000000 --- a/CC.Yi.Old/CC.Yi.Common/Cache/RedisCache.cs +++ /dev/null @@ -1,48 +0,0 @@ -using ServiceStack.Redis; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common.Cache -{ - public class RedisCache : ICacheWriter - { - private RedisClient client; - public string redisIp { get; set; } - - public RedisCache() - { - client = new RedisClient("127.0.0.1", 6379, "52013142020."); - } - - public bool AddCache(string key, T value, DateTime expDate) - { - return client.Add(key, value, expDate); - } - - public bool AddCache(string key, T value) - { - return client.Add(key, value); - } - - public bool RemoveCache(string key) - { - return client.Remove(key); - } - - public T GetCache(string key) - { - return client.Get(key); - } - - public bool SetCache(string key,T value, DateTime expDate) - { - return client.Set(key, value, expDate); - } - - public bool SetCache(string key, T value) - { - return client.Set(key, value); - } - } -} diff --git a/CC.Yi.Old/CC.Yi.Common/Castle/CustomAutofacAop.cs b/CC.Yi.Old/CC.Yi.Common/Castle/CustomAutofacAop.cs deleted file mode 100644 index 526d39ef..00000000 --- a/CC.Yi.Old/CC.Yi.Common/Castle/CustomAutofacAop.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Castle.DynamicProxy; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common.Castle -{ - public class CustomAutofacAop : IInterceptor - { - public void Intercept(IInvocation invocation) - { - { - - //这里写执行方法前 - } - invocation.Proceed();//执行具体的实例 - { - - //这里写执行方法后 - } - } - } -} diff --git a/CC.Yi.Old/CC.Yi.Common/HttpHelper.cs b/CC.Yi.Old/CC.Yi.Common/HttpHelper.cs deleted file mode 100644 index 6bfdfb18..00000000 --- a/CC.Yi.Old/CC.Yi.Common/HttpHelper.cs +++ /dev/null @@ -1,76 +0,0 @@ -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 CC.Yi.Common -{ - 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/CC.Yi.Old/CC.Yi.Common/ImageHelper.cs b/CC.Yi.Old/CC.Yi.Common/ImageHelper.cs deleted file mode 100644 index 170aba9c..00000000 --- a/CC.Yi.Old/CC.Yi.Common/ImageHelper.cs +++ /dev/null @@ -1,167 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using System.IO; -using System.IO.Compression; -using System.Drawing; - -namespace CC.Yi.Common -{ - public class SimilarPhoto - { - Image SourceImg; - public SimilarPhoto(string filePath) - { - SourceImg = Image.FromFile(filePath); - } - public SimilarPhoto(Stream stream) - { - SourceImg = Image.FromStream(stream); - } - public String GetHash() - { - Image image = ReduceSize(); - Byte[] grayValues = ReduceColor(image); - Byte average = CalcAverage(grayValues); - String reslut = ComputeBits(grayValues, average); - return reslut; - } - // Step 1 : Reduce size to 8*8 - private Image ReduceSize(int width = 8, int height = 8) - { - Image image = SourceImg.GetThumbnailImage(width, height, () => { return false; }, IntPtr.Zero); - return image; - } - // Step 2 : Reduce Color - private Byte[] ReduceColor(Image image) - { - Bitmap bitMap = new Bitmap(image); - Byte[] grayValues = new Byte[image.Width * image.Height]; - for (int x = 0; x < image.Width; x++) - for (int y = 0; y < image.Height; y++) - { - Color color = bitMap.GetPixel(x, y); - byte grayValue = (byte)((color.R * 30 + color.G * 59 + color.B * 11) / 100); - grayValues[x * image.Width + y] = grayValue; - } - return grayValues; - } - // Step 3 : Average the colors - private Byte CalcAverage(byte[] values) - { - int sum = 0; - for (int i = 0; i < values.Length; i++) - sum += (int)values[i]; - return Convert.ToByte(sum / values.Length); - } - // Step 4 : Compute the bits - private String ComputeBits(byte[] values, byte averageValue) - { - char[] result = new char[values.Length]; - for (int i = 0; i < values.Length; i++) - { - if (values[i] < averageValue) - result[i] = '0'; - else - result[i] = '1'; - } - SourceImg.Dispose(); - return new String(result); - } - // Compare hash - public static Int32 CalcSimilarDegree(string a, string b) - { - if (a.Length != b.Length) - throw new ArgumentException(); - int count = 0; - for (int i = 0; i < a.Length; i++) - { - if (a[i] != b[i]) - count++; - } - return count; - } - } - public static class imageHelper - { - public static int Compare(string filePath1, string filePath2) - { - SimilarPhoto photo1 = new SimilarPhoto(filePath1); - SimilarPhoto photo2 = new SimilarPhoto(filePath2); - return SimilarPhoto.CalcSimilarDegree(photo1.GetHash(), photo2.GetHash()); - } - public static bool ByStringToSave(string name, string iss) - { - iss = iss.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "") - .Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", ""); - byte[] arr = Convert.FromBase64String(iss); - MemoryStream ms = new MemoryStream(arr); - Bitmap bmp = new Bitmap(ms); - string StudentWorkImages = "StudentWorkImages"; - - if (Directory.Exists(@"./wwwroot/" + StudentWorkImages) == false)//如果不存在就创建file文件夹 - { - Directory.CreateDirectory(@"./wwwroot/" + StudentWorkImages); - } - - - - bmp.Save(@"./wwwroot/" + StudentWorkImages + "/" + name + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg); - ms.Close(); - return true; - } - public static bool CreateZip() - { - string file_path = @"./wwwroot/StudentWorkImages.zip"; - string file_path2 = @"./wwwroot/StudentWorkImages/"; - if (File.Exists(file_path)) - { - File.Delete(file_path); - } - - ZipFile.CreateFromDirectory(file_path2, file_path); - return true; - } - public static bool DeleteAll() - { - string file_path = @"./wwwroot/StudentWorkImages/"; - if (Directory.Exists(file_path)) - { - DelectDir(file_path); - return true; - } - else - return false; - } - public static bool DeleteByString(string name) - { - File.Delete(@"./wwwroot/StudentWorkImages/" + name + ".jpg"); - return true; - } - public static void DelectDir(string srcPath) - { - try - { - DirectoryInfo dir = new DirectoryInfo(srcPath); - FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //返回目录中所有文件和子目录 - foreach (FileSystemInfo i in fileinfo) - { - if (i is DirectoryInfo) //判断是否文件夹 - { - DirectoryInfo subdir = new DirectoryInfo(i.FullName); - subdir.Delete(true); //删除子目录和文件 - } - else - { - File.Delete(i.FullName); //删除指定文件 - } - } - } - catch (Exception e) - { - Console.Write(e.ToString()); - } - } - } -} diff --git a/CC.Yi.Old/CC.Yi.Common/JsonHelper.cs b/CC.Yi.Old/CC.Yi.Common/JsonHelper.cs deleted file mode 100644 index bf4c8dfa..00000000 --- a/CC.Yi.Old/CC.Yi.Common/JsonHelper.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -namespace CC.Yi.Common -{ - public static class JsonHelper - { - public static string JsonToString(object data=null, int code = 200, bool flag = true, string message = "成功") - { - return Newtonsoft.Json.JsonConvert.SerializeObject(new { code = code, flag = flag, message = message, data = data }); - } - public static string JsonToString2(object data = null, int code = 200, bool flag = true, string message = "成功",int count=0) - { - return Newtonsoft.Json.JsonConvert.SerializeObject(new { code = code, flag = flag, message = message, count=count,data = data }); - } - public static string ToString(object data) - { - return Newtonsoft.Json.JsonConvert.SerializeObject(data); - } - public static T ToJson(string data) - { - return Newtonsoft.Json.JsonConvert.DeserializeObject(data); - } - } -} diff --git a/CC.Yi.Old/CC.Yi.Common/Jwt/JwtConst.cs b/CC.Yi.Old/CC.Yi.Common/Jwt/JwtConst.cs deleted file mode 100644 index 1e7713ff..00000000 --- a/CC.Yi.Old/CC.Yi.Common/Jwt/JwtConst.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common.Jwt -{ - public class JwtConst - { - public const string SecurityKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB"; - public const string Domain = "http://localhost:5000"; - } -} diff --git a/CC.Yi.Old/CC.Yi.Common/Result.cs b/CC.Yi.Old/CC.Yi.Common/Result.cs deleted file mode 100644 index 6f210764..00000000 --- a/CC.Yi.Old/CC.Yi.Common/Result.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace CC.Yi.Common -{ - /// - /// 结果数据 - /// - 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 Result SetData(object obj) - { - this.data = obj; - return this; - } - public Result SetCode(int Code) - { - this.code = Code; - return this; - } - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.DAL/BaseDal.cs b/CC.Yi.Old/CC.Yi.DAL/BaseDal.cs deleted file mode 100644 index 4839e885..00000000 --- a/CC.Yi.Old/CC.Yi.DAL/BaseDal.cs +++ /dev/null @@ -1,113 +0,0 @@ -using CC.Yi.IDAL; -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; - -namespace CC.Yi.DAL -{ - public class BaseDal : IBaseDal where T : class, new() - { - public DbContext Db - { - get { return DbContentFactory.GetCurrentDbContent(); } - } - public IQueryable GetEntities(Expression> whereLambda) - { - return Db.Set().Where(whereLambda).AsQueryable(); - } - - public IQueryable GetAllEntities() - { - return Db.Set().AsQueryable(); - } - - - public int GetCount(Expression> whereLambda) - { - return Db.Set().Where(whereLambda).Count(); - } - - public IQueryable> GetGroup(Expression> whereLambda, Expression> groupByLambda) //分组 - { - return Db.Set().Where(whereLambda).GroupBy(groupByLambda).AsQueryable(); - - } - - - - public IQueryable GetPageEntities(int pageSize, int pageIndex, out int total, Expression> whereLambda, Expression> orderByLambda, bool isAsc) - { - total = Db.Set().Where(whereLambda).Count(); - if (isAsc) - { - var pageData = Db.Set().Where(whereLambda) - .OrderBy(orderByLambda) - .Skip(pageSize * (pageIndex - 1)) - .Take(pageSize).AsQueryable(); - return pageData; - } - else - { - var pageData = Db.Set().Where(whereLambda) - .OrderByDescending(orderByLambda) - .Skip(pageSize * (pageIndex - 1)) - .Take(pageSize).AsQueryable(); - return pageData; - } - } - - public T Add(T entity) - { - Db.Set().Add(entity); - //Db.SaveChanges(); - return entity; - } - public bool AddRange(IEnumerable entities) - { - Db.Set().AddRange(entities); - return true; - } - - public bool Update(T entity) - { - //所有字段均修改 - Db.Entry(entity).State = EntityState.Modified; - //return Db.SaveChanges() > 0; - return true; - } - public bool Update(T entity, params string[] propertyNames) - { - EntityEntry entry = Db.Entry(entity); - entry.State = EntityState.Unchanged; - foreach (var item in propertyNames) - { - entry.Property(item).IsModified = true; - } - return true; - } - - public bool Delete(T entity) - { - Db.Entry(entity).State = EntityState.Deleted; - //return Db.SaveChanges() > 0; - return true; - } - public bool Detete(int id) - { - var entity = Db.Set().Find(id);//根据id找到实体 - Db.Set().Remove(entity);//由于这里先Find找到了实体,所以这里可以用Remove标记该实体要移除(删除)。如果不是先Find到实体就需要用System.Data.Entity.EntityState.Deleted - return true; - } - public bool DeteteRange(IEnumerable entity) - { - Db.Set().RemoveRange(entity); - return true; - } - - - } -} diff --git a/CC.Yi.Old/CC.Yi.DAL/CC.Yi.DAL.csproj b/CC.Yi.Old/CC.Yi.DAL/CC.Yi.DAL.csproj deleted file mode 100644 index ac766382..00000000 --- a/CC.Yi.Old/CC.Yi.DAL/CC.Yi.DAL.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - netcoreapp3.1 - - - - - - - - - - TextTemplatingFileGenerator - T4DAL.cs - - - - - - - - - - True - True - T4DAL.tt - - - - diff --git a/CC.Yi.Old/CC.Yi.DAL/DbContentFactory.cs b/CC.Yi.Old/CC.Yi.DAL/DbContentFactory.cs deleted file mode 100644 index 73113740..00000000 --- a/CC.Yi.Old/CC.Yi.DAL/DbContentFactory.cs +++ /dev/null @@ -1,58 +0,0 @@ -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using System.Collections.Concurrent; -using System.Threading; - - -namespace CC.Yi.DAL -{ - public class DbContentFactory - { - private static DataContext Webcontext; - private static object myLock = new object(); - - public static void Initialize(DataContext webContext) - { - - Monitor.Enter(myLock); - { - Webcontext = webContext; - } - } - public static DataContext GetCurrentDbContent() - { - - DataContext db = CallContext.GetData("DbContext") as DataContext; - - if (db == null)//线程在数据槽里面没有此上下文 - { - db = Webcontext; - CallContext.SetData("DbContext", db);//放到数据槽中去,DbContext是key,db是value - } - - try - { - Monitor.Exit(myLock); - } - catch - { - } - - - return db; - - - } - - private static class CallContext - { - static ConcurrentDictionary> state = new ConcurrentDictionary>(); - - public static void SetData(string name, object data) => - state.GetOrAdd(name, _ => new AsyncLocal()).Value = data; - - public static object GetData(string name) => - state.TryGetValue(name, out AsyncLocal data) ? data.Value : null; - } - } -} diff --git a/CC.Yi.Old/CC.Yi.DAL/T4DAL.cs b/CC.Yi.Old/CC.Yi.DAL/T4DAL.cs deleted file mode 100644 index ad7c9133..00000000 --- a/CC.Yi.Old/CC.Yi.DAL/T4DAL.cs +++ /dev/null @@ -1,12 +0,0 @@ -using CC.Yi.IDAL; -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.DAL -{ - public partial class studentDal : BaseDal, IstudentDal - { - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.DAL/T4DAL.tt b/CC.Yi.Old/CC.Yi.DAL/T4DAL.tt deleted file mode 100644 index 618fe8e4..00000000 --- a/CC.Yi.Old/CC.Yi.DAL/T4DAL.tt +++ /dev/null @@ -1,30 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using CC.Yi.IDAL; -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.DAL -{ -<# foreach(string k in ModelData){ - #> - public partial class <#=k #>Dal : BaseDal<<#=k #>>, I<#=k #>Dal - { - } -<# } #> -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.DALFactory/CC.Yi.DALFactory.csproj b/CC.Yi.Old/CC.Yi.DALFactory/CC.Yi.DALFactory.csproj deleted file mode 100644 index 7019acb0..00000000 --- a/CC.Yi.Old/CC.Yi.DALFactory/CC.Yi.DALFactory.csproj +++ /dev/null @@ -1,40 +0,0 @@ - - - - netcoreapp3.1 - - - - - - - - - - - - - - True - True - T4DbSession.tt - - - True - True - T4StaticDalFactory.tt - - - - - - TextTemplatingFileGenerator - T4DbSession.cs - - - TextTemplatingFileGenerator - T4StaticDalFactory.cs - - - - diff --git a/CC.Yi.Old/CC.Yi.DALFactory/DbSession.cs b/CC.Yi.Old/CC.Yi.DALFactory/DbSession.cs deleted file mode 100644 index b6de042d..00000000 --- a/CC.Yi.Old/CC.Yi.DALFactory/DbSession.cs +++ /dev/null @@ -1,45 +0,0 @@ -using CC.Yi.DAL; -using CC.Yi.IDAL; -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using System; - -namespace CC.Yi.DALFactory -{ - public partial class DbSession : IDbSession - { - public int SaveChanges() - { - var context = DbContentFactory.GetCurrentDbContent(); - - var saved = false; - while (!saved) - { - try - { - // Attempt to save changes to the database - context.SaveChanges(); - saved = true; - } - catch (DbUpdateConcurrencyException ex) - { - foreach (var entry in ex.Entries) - { - var databaseValues = entry.GetDatabaseValues(); - - // Refresh original values to bypass next concurrency check - entry.OriginalValues.SetValues(databaseValues); - - } - } - } - - return 1; - } - public DataContext GetDbContent() - { - return DbContentFactory.GetCurrentDbContent(); - } - - } -} diff --git a/CC.Yi.Old/CC.Yi.DALFactory/DbSessionFactory.cs b/CC.Yi.Old/CC.Yi.DALFactory/DbSessionFactory.cs deleted file mode 100644 index afa24d06..00000000 --- a/CC.Yi.Old/CC.Yi.DALFactory/DbSessionFactory.cs +++ /dev/null @@ -1,35 +0,0 @@ -using CC.Yi.IDAL; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace CC.Yi.DALFactory -{ - public class DbSessionFactory - { - public static IDbSession GetCurrentDbSession() - { - IDbSession db = CallContext.GetData("DbSession") as IDbSession; - if (db == null) - { - db = new DbSession(); - CallContext.SetData("DbSession", db); - } - return db; - } - - private static class CallContext - { - static ConcurrentDictionary> state = new ConcurrentDictionary>(); - - public static void SetData(string name, object data) => - state.GetOrAdd(name, _ => new AsyncLocal()).Value = data; - - public static object GetData(string name) => - state.TryGetValue(name, out AsyncLocal data) ? data.Value : null; - } - } -} diff --git a/CC.Yi.Old/CC.Yi.DALFactory/StaticDalFactory.cs b/CC.Yi.Old/CC.Yi.DALFactory/StaticDalFactory.cs deleted file mode 100644 index a91adf99..00000000 --- a/CC.Yi.Old/CC.Yi.DALFactory/StaticDalFactory.cs +++ /dev/null @@ -1,24 +0,0 @@ -using CC.Yi.DAL; -using CC.Yi.IDAL; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Text; -using System.Threading; - -namespace CC.Yi.DALFactory -{ - public partial class StaticDalFactory - { - private static class CallContext - { - static ConcurrentDictionary> state = new ConcurrentDictionary>(); - - public static void SetData(string name, object data) => - state.GetOrAdd(name, _ => new AsyncLocal()).Value = data; - - public static object GetData(string name) => - state.TryGetValue(name, out AsyncLocal data) ? data.Value : null; - } - } -} diff --git a/CC.Yi.Old/CC.Yi.DALFactory/T4DbSession.cs b/CC.Yi.Old/CC.Yi.DALFactory/T4DbSession.cs deleted file mode 100644 index 6a94b709..00000000 --- a/CC.Yi.Old/CC.Yi.DALFactory/T4DbSession.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CC.Yi.DAL; -using CC.Yi.IDAL; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.DALFactory -{ - public partial class DbSession : IDbSession - { - public IstudentDal studentDal - { - get { return StaticDalFactory.GetstudentDal(); } - } - - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.DALFactory/T4DbSession.tt b/CC.Yi.Old/CC.Yi.DALFactory/T4DbSession.tt deleted file mode 100644 index 541800d5..00000000 --- a/CC.Yi.Old/CC.Yi.DALFactory/T4DbSession.tt +++ /dev/null @@ -1,36 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using CC.Yi.DAL; -using CC.Yi.IDAL; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.DALFactory -{ - public partial class DbSession : IDbSession - { -<# foreach(string k in ModelData){ - #> - public I<#=k #>Dal <#=k #>Dal - { - get { return StaticDalFactory.Get<#=k #>Dal(); } - } - -<# } #> - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.DALFactory/T4StaticDalFactory.cs b/CC.Yi.Old/CC.Yi.DALFactory/T4StaticDalFactory.cs deleted file mode 100644 index 9b6f14b9..00000000 --- a/CC.Yi.Old/CC.Yi.DALFactory/T4StaticDalFactory.cs +++ /dev/null @@ -1,25 +0,0 @@ -using CC.Yi.DAL; -using CC.Yi.IDAL; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Text; -using System.Threading; - -namespace CC.Yi.DALFactory -{ - public partial class StaticDalFactory - { - public static IstudentDal GetstudentDal() - { - IstudentDal Data = CallContext.GetData("studentDal") as IstudentDal; - if (Data == null) - { - Data = new studentDal(); - CallContext.SetData("studentDal", Data); - } - return Data; - } - - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.DALFactory/T4StaticDalFactory.tt b/CC.Yi.Old/CC.Yi.DALFactory/T4StaticDalFactory.tt deleted file mode 100644 index f6194b8f..00000000 --- a/CC.Yi.Old/CC.Yi.DALFactory/T4StaticDalFactory.tt +++ /dev/null @@ -1,43 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using CC.Yi.DAL; -using CC.Yi.IDAL; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Text; -using System.Threading; - -namespace CC.Yi.DALFactory -{ - public partial class StaticDalFactory - { -<# foreach(string k in ModelData){ - #> - public static I<#=k #>Dal Get<#=k #>Dal() - { - I<#=k #>Dal Data = CallContext.GetData("<#=k #>Dal") as I<#=k #>Dal; - if (Data == null) - { - Data = new <#=k #>Dal(); - CallContext.SetData("<#=k #>Dal", Data); - } - return Data; - } - -<# } #> - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.IBLL/CC.Yi.IBLL.csproj b/CC.Yi.Old/CC.Yi.IBLL/CC.Yi.IBLL.csproj deleted file mode 100644 index 778e1962..00000000 --- a/CC.Yi.Old/CC.Yi.IBLL/CC.Yi.IBLL.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - - Library - netcoreapp3.1 - - - - - - - - - - TextTemplatingFileGenerator - T4IBLL.cs - - - - - - - - - - True - True - T4IBLL.tt - - - - diff --git a/CC.Yi.Old/CC.Yi.IBLL/IBaseBll.cs b/CC.Yi.Old/CC.Yi.IBLL/IBaseBll.cs deleted file mode 100644 index ff781ea7..00000000 --- a/CC.Yi.Old/CC.Yi.IBLL/IBaseBll.cs +++ /dev/null @@ -1,78 +0,0 @@ -using Autofac.Extras.DynamicProxy; -using CC.Yi.Common.Castle; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; - -namespace CC.Yi.IBLL -{ - [Intercept(typeof(CustomAutofacAop))] - public interface IBaseBll where T : class, new() - { - #region - //得到全部实体 - #endregion - IQueryable GetAllEntities(); - - #region - //通过表达式得到实体 - #endregion - IQueryable GetEntities(Expression> whereLambda); - - #region - //通过表达式得到实体,分页版本 - #endregion - IQueryable GetPageEntities(int pageSize, int pageIndex, out int total, Expression> whereLambda, Expression> orderByLambda, bool isAsc); - - #region - //通过表达式统计数量 - #endregion - int GetCount(Expression> whereLambda); - - #region - //通过表达式分组 - #endregion - IQueryable> GetGroup(Expression> whereLambda, Expression> groupByLambda); - - #region - //添加实体 - #endregion - T Add(T entity); - - #region - //添加多个实体 - #endregion - bool Add(IEnumerable entities); - - #region - //更新实体 - #endregion - bool Update(T entity); - - #region - //更新实体部分属性 - #endregion - bool Update(T entity, params string[] propertyNames); - - #region - //删除实体 - #endregion - bool Delete(T entity); - - #region - //通过id删除实体 - #endregion - bool Delete(int id); - - #region - //通过id列表删除多个实体 - #endregion - bool Delete(IEnumerable ids); - - #region - //通过表达式删除实体 - #endregion - bool Delete(Expression> where); - } -} diff --git a/CC.Yi.Old/CC.Yi.IBLL/T4IBLL.cs b/CC.Yi.Old/CC.Yi.IBLL/T4IBLL.cs deleted file mode 100644 index cee3a3ad..00000000 --- a/CC.Yi.Old/CC.Yi.IBLL/T4IBLL.cs +++ /dev/null @@ -1,11 +0,0 @@ -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.IBLL -{ - public partial interface IstudentBll : IBaseBll - { - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.IBLL/T4IBLL.tt b/CC.Yi.Old/CC.Yi.IBLL/T4IBLL.tt deleted file mode 100644 index 9aff10f0..00000000 --- a/CC.Yi.Old/CC.Yi.IBLL/T4IBLL.tt +++ /dev/null @@ -1,29 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.IBLL -{ -<# foreach(string k in ModelData){ - #> - public partial interface I<#=k #>Bll : IBaseBll<<#=k #>> - { - } -<# } #> -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.IDAL/CC.Yi.IDAL.csproj b/CC.Yi.Old/CC.Yi.IDAL/CC.Yi.IDAL.csproj deleted file mode 100644 index 91214ffd..00000000 --- a/CC.Yi.Old/CC.Yi.IDAL/CC.Yi.IDAL.csproj +++ /dev/null @@ -1,40 +0,0 @@ - - - - Library - netcoreapp3.1 - - - - - - - - - TextTemplatingFileGenerator - T4IDAL.cs - - - TextTemplatingFileGenerator - T4IDbSession.cs - - - - - - - - - - True - True - T4IDAL.tt - - - True - True - T4IDbSession.tt - - - - diff --git a/CC.Yi.Old/CC.Yi.IDAL/IBaseDal.cs b/CC.Yi.Old/CC.Yi.IDAL/IBaseDal.cs deleted file mode 100644 index f4daf158..00000000 --- a/CC.Yi.Old/CC.Yi.IDAL/IBaseDal.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; - -namespace CC.Yi.IDAL -{ - public interface IBaseDal where T : class, new() - { - #region - //得到全部实体 - #endregion - IQueryable GetAllEntities(); - - #region - //通过表达式得到实体 - #endregion - IQueryable GetEntities(Expression> whereLambda); - - #region - //通过表达式得到实体,分页版本 - #endregion - IQueryable GetPageEntities(int pageSize, int pageIndex, out int total, Expression> whereLambda, Expression> orderByLambda, bool isAsc); - - #region - //通过表达式统计数量 - #endregion - int GetCount(Expression> whereLambda); - - #region - //通过表达式分组 - #endregion - IQueryable> GetGroup(Expression> whereLambda, Expression> groupByLambda); - - #region - //添加单个实体 - #endregion - T Add(T entity); - - #region - //添加多个实体 - #endregion - bool AddRange(IEnumerable entities); - #region - //更新单个实体 - #endregion - bool Update(T entity); - - #region - //更新单个实体部分属性 - #endregion - bool Update(T entity, params string[] propertyNames); - - #region - //删除单个实体 - #endregion - bool Delete(T entity); - - #region - //通过id删除实体 - #endregion - bool Detete(int id); - - #region - //删除多个实体 - #endregion - bool DeteteRange(IEnumerable entity); - } -} diff --git a/CC.Yi.Old/CC.Yi.IDAL/IDbSession.cs b/CC.Yi.Old/CC.Yi.IDAL/IDbSession.cs deleted file mode 100644 index 633da7f1..00000000 --- a/CC.Yi.Old/CC.Yi.IDAL/IDbSession.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.IDAL -{ - public partial interface IDbSession - { - DataContext GetDbContent(); - int SaveChanges(); - } - - - -} diff --git a/CC.Yi.Old/CC.Yi.IDAL/T4IDAL.cs b/CC.Yi.Old/CC.Yi.IDAL/T4IDAL.cs deleted file mode 100644 index 8b900b8c..00000000 --- a/CC.Yi.Old/CC.Yi.IDAL/T4IDAL.cs +++ /dev/null @@ -1,11 +0,0 @@ -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.IDAL -{ - public partial interface IstudentDal:IBaseDal - { - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.IDAL/T4IDAL.tt b/CC.Yi.Old/CC.Yi.IDAL/T4IDAL.tt deleted file mode 100644 index 7faf648f..00000000 --- a/CC.Yi.Old/CC.Yi.IDAL/T4IDAL.tt +++ /dev/null @@ -1,29 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.IDAL -{ -<# foreach(string k in ModelData){ - #> - public partial interface I<#=k #>Dal:IBaseDal<<#=k #>> - { - } -<# } #> -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.IDAL/T4IDbSession.cs b/CC.Yi.Old/CC.Yi.IDAL/T4IDbSession.cs deleted file mode 100644 index aab497df..00000000 --- a/CC.Yi.Old/CC.Yi.IDAL/T4IDbSession.cs +++ /dev/null @@ -1,15 +0,0 @@ -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.IDAL -{ - public partial interface IDbSession - { - IstudentDal studentDal{get;} - - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.IDAL/T4IDbSession.tt b/CC.Yi.Old/CC.Yi.IDAL/T4IDbSession.tt deleted file mode 100644 index b0d2226a..00000000 --- a/CC.Yi.Old/CC.Yi.IDAL/T4IDbSession.tt +++ /dev/null @@ -1,33 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.IDAL -{ - public partial interface IDbSession - { -<# foreach(string k in ModelData){ - #> - I<#=k #>Dal <#=k #>Dal{get;} - -<# } #> - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.Model/CC.Yi.Model.csproj b/CC.Yi.Old/CC.Yi.Model/CC.Yi.Model.csproj deleted file mode 100644 index f620b157..00000000 --- a/CC.Yi.Old/CC.Yi.Model/CC.Yi.Model.csproj +++ /dev/null @@ -1,43 +0,0 @@ - - - - netcoreapp3.1 - - - - - True - True - T4DataContext.tt - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - TextTemplatingFileGenerator - T4DataContext.cs - - - - - - - - - - True - True - T4DataContext.tt - - - - diff --git a/CC.Yi.Old/CC.Yi.Model/DataContext.cs b/CC.Yi.Old/CC.Yi.Model/DataContext.cs deleted file mode 100644 index 98a047bd..00000000 --- a/CC.Yi.Old/CC.Yi.Model/DataContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using System; - -namespace CC.Yi.Model -{ - public partial class DataContext : DbContext - { - public DataContext(DbContextOptions options) : base(options) - { - - } - //public DbSet result_user { get; set; } - } -} diff --git a/CC.Yi.Old/CC.Yi.Model/T4DataContext.cs b/CC.Yi.Old/CC.Yi.Model/T4DataContext.cs deleted file mode 100644 index 584f6d63..00000000 --- a/CC.Yi.Old/CC.Yi.Model/T4DataContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Text; -namespace CC.Yi.Model -{ - public partial class DataContext :DbContext - { - public DbSet student { get; set; } - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.Model/T4DataContext.tt b/CC.Yi.Old/CC.Yi.Model/T4DataContext.tt deleted file mode 100644 index 2fa74f5b..00000000 --- a/CC.Yi.Old/CC.Yi.Model/T4DataContext.tt +++ /dev/null @@ -1,29 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Text; -namespace CC.Yi.Model -{ - public partial class DataContext :DbContext - { -<# foreach(string k in ModelData){ - #> - public DbSet<<#=k #>> <#=k #> { get; set; } -<# } #> - } -} \ No newline at end of file diff --git a/CC.Yi.Old/CC.Yi.Model/result_user.cs b/CC.Yi.Old/CC.Yi.Model/result_user.cs deleted file mode 100644 index 9c60b1a8..00000000 --- a/CC.Yi.Old/CC.Yi.Model/result_user.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.AspNetCore.Identity; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Model -{ - public class result_user : IdentityUser - { - //你可以在这里添加你额外需要的字段例如 - //public int level { get; set; } - } -} diff --git a/CC.Yi.Old/CC.Yi.Model/student.cs b/CC.Yi.Old/CC.Yi.Model/student.cs deleted file mode 100644 index 90ee09b7..00000000 --- a/CC.Yi.Old/CC.Yi.Model/student.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -using System.Text; - -namespace CC.Yi.Model -{ - public class student - { - [Key] - [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] - public int id { get; set; } - public string name { get; set; } - } -} diff --git a/CC.Yi.Old/CC.Yi.ViewModel/CC.Yi.ViewModel.csproj b/CC.Yi.Old/CC.Yi.ViewModel/CC.Yi.ViewModel.csproj deleted file mode 100644 index cefa80a0..00000000 --- a/CC.Yi.Old/CC.Yi.ViewModel/CC.Yi.ViewModel.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - Library - netcoreapp3.1 - - - diff --git a/CC.Yi.Old/CC.Yi.sln b/CC.Yi.Old/CC.Yi.sln deleted file mode 100644 index 6e606c50..00000000 --- a/CC.Yi.Old/CC.Yi.sln +++ /dev/null @@ -1,94 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30907.101 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DAL", "DAL", "{9D0D4A54-057E-46C3-BBFE-CA01F7ECEDAE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BLL", "BLL", "{CC5F4204-DFB6-4BB5-9E49-BED084063ED8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "API", "API", "{1A509C83-F994-4422-A74F-8FFA4805D849}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.API", "CC.Yi.API\CC.Yi.API.csproj", "{CDB5556F-43FF-44F6-B33D-AC642E5CD30C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.BLL", "CC.Yi.BLL\CC.Yi.BLL.csproj", "{AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.IBLL", "CC.Yi.IBLL\CC.Yi.IBLL.csproj", "{74177F89-72D5-45FE-8A4F-91FAD9E03D36}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.DAL", "CC.Yi.DAL\CC.Yi.DAL.csproj", "{72FD0850-15FA-4A6F-B865-E1B38603307D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.IDAL", "CC.Yi.IDAL\CC.Yi.IDAL.csproj", "{BD77D98A-9F28-4C2D-A260-C3BB919B58E7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{123D1D39-849C-4220-A973-EB9760421CB3}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Model", "Model", "{38B8D898-4BBF-4DDB-8E29-6D6CEB7808C9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.Model", "CC.Yi.Model\CC.Yi.Model.csproj", "{8827547B-E04B-4430-A0DF-E87FCA40E3AB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.ViewModel", "CC.Yi.ViewModel\CC.Yi.ViewModel.csproj", "{32F323F1-E2FA-4186-AC33-263465012D15}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.Common", "CC.Yi.Common\CC.Yi.Common.csproj", "{9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.DALFactory", "CC.Yi.DALFactory\CC.Yi.DALFactory.csproj", "{ACB6D3EE-FADE-4F07-9D12-C9E3A5F72335}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CDB5556F-43FF-44F6-B33D-AC642E5CD30C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CDB5556F-43FF-44F6-B33D-AC642E5CD30C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CDB5556F-43FF-44F6-B33D-AC642E5CD30C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CDB5556F-43FF-44F6-B33D-AC642E5CD30C}.Release|Any CPU.Build.0 = Release|Any CPU - {AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6}.Release|Any CPU.Build.0 = Release|Any CPU - {74177F89-72D5-45FE-8A4F-91FAD9E03D36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {74177F89-72D5-45FE-8A4F-91FAD9E03D36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {74177F89-72D5-45FE-8A4F-91FAD9E03D36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {74177F89-72D5-45FE-8A4F-91FAD9E03D36}.Release|Any CPU.Build.0 = Release|Any CPU - {72FD0850-15FA-4A6F-B865-E1B38603307D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72FD0850-15FA-4A6F-B865-E1B38603307D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72FD0850-15FA-4A6F-B865-E1B38603307D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72FD0850-15FA-4A6F-B865-E1B38603307D}.Release|Any CPU.Build.0 = Release|Any CPU - {BD77D98A-9F28-4C2D-A260-C3BB919B58E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BD77D98A-9F28-4C2D-A260-C3BB919B58E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BD77D98A-9F28-4C2D-A260-C3BB919B58E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BD77D98A-9F28-4C2D-A260-C3BB919B58E7}.Release|Any CPU.Build.0 = Release|Any CPU - {8827547B-E04B-4430-A0DF-E87FCA40E3AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8827547B-E04B-4430-A0DF-E87FCA40E3AB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8827547B-E04B-4430-A0DF-E87FCA40E3AB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8827547B-E04B-4430-A0DF-E87FCA40E3AB}.Release|Any CPU.Build.0 = Release|Any CPU - {32F323F1-E2FA-4186-AC33-263465012D15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32F323F1-E2FA-4186-AC33-263465012D15}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32F323F1-E2FA-4186-AC33-263465012D15}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32F323F1-E2FA-4186-AC33-263465012D15}.Release|Any CPU.Build.0 = Release|Any CPU - {9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC}.Release|Any CPU.Build.0 = Release|Any CPU - {ACB6D3EE-FADE-4F07-9D12-C9E3A5F72335}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ACB6D3EE-FADE-4F07-9D12-C9E3A5F72335}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ACB6D3EE-FADE-4F07-9D12-C9E3A5F72335}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ACB6D3EE-FADE-4F07-9D12-C9E3A5F72335}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {CDB5556F-43FF-44F6-B33D-AC642E5CD30C} = {1A509C83-F994-4422-A74F-8FFA4805D849} - {AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6} = {CC5F4204-DFB6-4BB5-9E49-BED084063ED8} - {74177F89-72D5-45FE-8A4F-91FAD9E03D36} = {CC5F4204-DFB6-4BB5-9E49-BED084063ED8} - {72FD0850-15FA-4A6F-B865-E1B38603307D} = {9D0D4A54-057E-46C3-BBFE-CA01F7ECEDAE} - {BD77D98A-9F28-4C2D-A260-C3BB919B58E7} = {9D0D4A54-057E-46C3-BBFE-CA01F7ECEDAE} - {8827547B-E04B-4430-A0DF-E87FCA40E3AB} = {38B8D898-4BBF-4DDB-8E29-6D6CEB7808C9} - {32F323F1-E2FA-4186-AC33-263465012D15} = {38B8D898-4BBF-4DDB-8E29-6D6CEB7808C9} - {9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC} = {123D1D39-849C-4220-A973-EB9760421CB3} - {ACB6D3EE-FADE-4F07-9D12-C9E3A5F72335} = {9D0D4A54-057E-46C3-BBFE-CA01F7ECEDAE} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {22DD3529-6AD4-413A-B7B3-D8335E6F47C9} - EndGlobalSection -EndGlobal diff --git a/CC.Yi.Old/T4Model/T4Model.txt b/CC.Yi.Old/T4Model/T4Model.txt deleted file mode 100644 index 36227abb..00000000 --- a/CC.Yi.Old/T4Model/T4Model.txt +++ /dev/null @@ -1 +0,0 @@ -student \ No newline at end of file diff --git a/CC.Yi.Old/T4Model/说明.txt b/CC.Yi.Old/T4Model/说明.txt deleted file mode 100644 index 7abbdd18..00000000 --- a/CC.Yi.Old/T4Model/说明.txt +++ /dev/null @@ -1,5 +0,0 @@ -这里存放T4要生成的模型 -使用英文的 , 分隔 -例如: -student,teacher -点击 生成->转换所有t4模板 即可完成生成 \ No newline at end of file diff --git a/CC.Yi/CC.Yi.API/CC.Yi.API.csproj b/CC.Yi/CC.Yi.API/CC.Yi.API.csproj deleted file mode 100644 index 52797948..00000000 --- a/CC.Yi/CC.Yi.API/CC.Yi.API.csproj +++ /dev/null @@ -1,51 +0,0 @@ - - - - net5.0 - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - Always - - - - - - - - - - True - True - T4Startup.tt - - - - - - TextTemplatingFileGenerator - T4Startup.cs - - - - diff --git a/CC.Yi/CC.Yi.API/Controllers/StudentController.cs b/CC.Yi/CC.Yi.API/Controllers/StudentController.cs deleted file mode 100644 index 576f6ccc..00000000 --- a/CC.Yi/CC.Yi.API/Controllers/StudentController.cs +++ /dev/null @@ -1,147 +0,0 @@ -using CC.Yi.Common; -using CC.Yi.Common.Cache; -using CC.Yi.Common.Jwt; -using CC.Yi.IBLL; -using CC.Yi.Model; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Logging; -using Microsoft.IdentityModel.Tokens; -using ServiceStack.Redis; -using System; -using System.Collections.Generic; -using System.IdentityModel.Tokens.Jwt; -using System.Linq; -using System.Security.Claims; -using System.Text; -using System.Threading.Tasks; - -namespace CC.Yi.API.Controllers -{ - [ApiController] - [Route("[controller]/[action]")] - public class StudentController : ControllerBase - { - private readonly ILogger _logger;//处理日志相关文件 - - //private UserManager _userManager;//处理用户相关逻辑:添加密码,修改密码,添加删除角色等等 - //private SignInManager _signInManager;//处理注册登录的相关逻辑 - private IstudentBll _studentBll; - public StudentController(ILogger logger, IstudentBll studentBll) - { - _logger = logger; - _logger.LogInformation("现在你进入了StudentController控制器");//nlog日志模块 - _studentBll = studentBll; - } - #region - //关于身份认证配置使用: - //在需要身份认证的控制器上打上 [Authorize] 特性标签 - #endregion - //[HttpGet] - //public async Task IdentityTest() - //{ - // //用户登入 - // var data = await _signInManager.PasswordSignInAsync("账号", "密码", false, false); //"是否记住密码","是否登入失败锁定用户" - // //用户登出 - // await _signInManager.SignOutAsync(); - // //创建用户 - // var data2 = await _userManager.CreateAsync(new result_user { UserName="账户",Email="邮箱"},"密码"); - // //获取用户 - // var data3 = _userManager.Users;//这里可以使用Linq表达式Select - // return Ok(); - //} - - #region - //redis操作 - #endregion - [HttpGet] - public Result GetReids() - { - var data = CacheHelper.CacheWriter.GetCache("key01"); - return Result.Success(data); - } - - - #region - //下面,权限验证 - #endregion - [HttpGet] - public Result Login(string role) - { - string userName = "admin"; - var claims = new[] - { - new Claim(JwtRegisteredClaimNames.Nbf,$"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}") , - new Claim (JwtRegisteredClaimNames.Exp,$"{new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds()}"), - new Claim(ClaimTypes.Name, userName), - new Claim(ClaimTypes.Role,role) - - }; - var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtConst.SecurityKey)); - var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); - - var token = new JwtSecurityToken( - issuer: JwtConst.Domain, - audience: JwtConst.Domain, - claims: claims, - expires: DateTime.Now.AddMinutes(30), - signingCredentials: creds); - - var tokenData = new JwtSecurityTokenHandler().WriteToken(token); - return Result.Success("欢迎你!管理员!").SetData(new { token = tokenData }); - }//发送令牌 - - [HttpGet] - [Authorize(Policy = "myadmin")]//基于策略的验证 - public Result MyAdmin() - { - return Result.Success("欢迎你!管理员!"); - } - - [HttpGet] - [Authorize(Roles = "user")]//基于角色的验证 - public Result MyUser() - { - return Result.Success("欢迎你!游客!"); - } - - #region - //下面,经典的 增删改查 即为简易--Yi意框架 - //注意:请确保你的数据库中存在合理的数据 - #endregion - [HttpGet] - public async Task GetTest()//查 - { - _logger.LogInformation("调用查方法"); - var data = await _studentBll.GetAllEntities().ToListAsync(); - return Result.Success().SetData(data); - } - [HttpGet] - public Result AddTest()//增 - { - _logger.LogInformation("调用增方法"); - List students = new List() { new student { name = "学生a" } }; - _studentBll.Add(students); - return Result.Success(); - - } - [HttpGet] - public Result RemoveTest()//删 - { - _logger.LogInformation("调用删方法"); - _studentBll.Delete(u => u.id==1); - return Result.Success(); - - } - [HttpGet] - public Result UpdateTest()//改 - { - _logger.LogInformation("调用改方法"); - _studentBll.Update(new student { id = 1, name = "学生b" }, "name"); - return Result.Success(); - } - } -} diff --git a/CC.Yi/CC.Yi.API/Extension/ErrorHandExtension.cs b/CC.Yi/CC.Yi.API/Extension/ErrorHandExtension.cs deleted file mode 100644 index 41c15943..00000000 --- a/CC.Yi/CC.Yi.API/Extension/ErrorHandExtension.cs +++ /dev/null @@ -1,72 +0,0 @@ -using CC.Yi.Common; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.API.Extension -{ - public class ErrorHandExtension - { - private readonly RequestDelegate next; - - public ErrorHandExtension(RequestDelegate next) - { - this.next = next; - } - - public async Task Invoke(HttpContext context) - { - try - { - await next(context); - } - catch (Exception ex) - { - var statusCode = context.Response.StatusCode; - if (ex is ArgumentException) - { - statusCode = 200; - } - await HandleExceptionAsync(context, statusCode, ex.Message); - } - finally - { - var statusCode = context.Response.StatusCode; - var msg = ""; - - switch (statusCode) - { - - case 401: msg = "未授权";break; - case 403: msg = "未授权"; break; - case 404: msg = "未找到服务"; break; - case 502: msg = "请求错误"; break; - - } - if (!string.IsNullOrWhiteSpace(msg)) - { - await HandleExceptionAsync(context, statusCode, msg); - } - } - } - //异常错误信息捕获,将错误信息用Json方式返回 - private static Task HandleExceptionAsync(HttpContext context, int statusCode, string msg) - { - var result = JsonConvert.SerializeObject( Result.Error(msg).SetCode(statusCode)); - context.Response.ContentType = "application/json;charset=utf-8"; - return context.Response.WriteAsync(result); - } - } - //扩展方法 - public static class ErrorHandlingExtensions - { - public static IApplicationBuilder UseErrorHandling(this IApplicationBuilder builder) - { - return builder.UseMiddleware(); - } - } -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.API/Extension/SwaggerExtension.cs b/CC.Yi/CC.Yi.API/Extension/SwaggerExtension.cs deleted file mode 100644 index f9a46ab2..00000000 --- a/CC.Yi/CC.Yi.API/Extension/SwaggerExtension.cs +++ /dev/null @@ -1,76 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.OpenApi.Models; -using System; -using System.IO; - -namespace CC.Yi.API.Extension -{ - /// - /// Swagger文档扩展方法 - /// - public static class SwaggerExtension - { - public static IServiceCollection AddSwaggerService(this IServiceCollection services) - { - var apiInfo = new OpenApiInfo - { - Title = "Yi意框架-API接口", - Version = "v1", - Contact = new OpenApiContact { Name = "橙子", Email = "454313500@qq.com", Url = new System.Uri("https://jiftcc.com") } - }; - #region 注册Swagger服务 - services.AddSwaggerGen(c => - { - c.SwaggerDoc("v1", apiInfo); - - //添加注释服务 - //为 Swagger JSON and UI设置xml文档注释路径 - //获取应用程序所在目录(绝对路径,不受工作目录影响,建议采用此方法获取路径使用windwos&Linux) - var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location); - var apiXmlPath = Path.Combine(basePath, @"ApiDoc.xml");//控制器层注释 - var entityXmlPath = Path.Combine(basePath, @"Model\ModelDoc.xml");//实体注释 - //c.IncludeXmlComments(apiXmlPath, true);//true表示显示控制器注释 - //c.IncludeXmlComments(entityXmlPath); - - //添加控制器注释 - //c.DocumentFilter(); - - //添加header验证信息 - //c.OperationFilter(); - //var security = new Dictionary> { { "Bearer", new string[] { } }, }; - - c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme() - { - Description = "文本框里输入从服务器获取的Token。格式为:Bearer + 空格+token",//JWT授权(数据将在请求头中进行传输) 参数结构: \"Authorization: Bearer {token}\" - Name = "Authorization",////jwt默认的参数名称 - In = ParameterLocation.Header,////jwt默认存放Authorization信息的位置(请求头中) - Type = SecuritySchemeType.ApiKey, - }); - c.AddSecurityRequirement(new OpenApiSecurityRequirement - { - { new OpenApiSecurityScheme - { - Reference = new OpenApiReference() - { - Id = "Bearer", - Type = ReferenceType.SecurityScheme - } - }, Array.Empty() } - }); - }); - #endregion - - return services; - } - - public static void UseSwaggerService(this IApplicationBuilder app) - { - //在 Startup.Configure 方法中,启用中间件为生成的 JSON 文档和 Swagger UI 提供服务: - // Enable middleware to serve generated Swagger as a JSON endpoint. - app.UseSwagger(); - app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Yi")); - } - - } -} diff --git a/CC.Yi/CC.Yi.API/Filter/DbContextFilter.cs b/CC.Yi/CC.Yi.API/Filter/DbContextFilter.cs deleted file mode 100644 index fc1bc2d1..00000000 --- a/CC.Yi/CC.Yi.API/Filter/DbContextFilter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using CC.Yi.DAL; -using CC.Yi.Model; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.API.Filter -{ - public class DbContextFilter : ActionFilterAttribute - { - public override void OnActionExecuting(ActionExecutingContext filterContext) - { - - base.OnActionExecuting(filterContext); - - } - } -} diff --git a/CC.Yi/CC.Yi.API/Init/InitDb.cs b/CC.Yi/CC.Yi.API/Init/InitDb.cs deleted file mode 100644 index 0064690e..00000000 --- a/CC.Yi/CC.Yi.API/Init/InitDb.cs +++ /dev/null @@ -1,71 +0,0 @@ -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.API.Init -{ - public static class InitDb - { - public static bool Init(DataContext Db) - { - //if (!Db.Set().Any()) - //{ - // user initUser = new user - // { - // username = "cc", - // password = "123", - // user_extra = new user_extra(), - // time = DateTime.Now, - // roles = new List{ - // new role{ - // role_name="管理员", - // actions=new List{ - // new action{ action_name="首页",router="/index",icon="mdi-view-dashboard"}, - // new action{action_name="用户管理",router="/user",icon="mdi-account-box"}, - // new action{ action_name="角色管理",router="/role",icon="mdi-gavel"}, - // new action{ action_name="权限管理",router="/action",icon="mdi-lock"} - // } - // }, - // new role{ role_name="l-1"}, - // new role{ role_name="l-2"}, - // new role{ role_name="l-3"}, - // new role{ role_name="l-4"}, - // new role{ role_name="l-5"}, - // new role{ role_name="l-6"}, - // new role{ role_name="l-7"}, - // new role{ role_name="l-8"}, - // new role{ role_name="l-9"}, - // new role{ role_name="l-10"}, - // new role{ role_name="l-11"}, - // new role{ role_name="l-12"}, - // new role{ role_name="普通用户"} - // } - // }; - // Db.Set().Update(initUser); - // //-------------------------------------------------------------------------------------添加管理员账户 - // List levels = new List - // { - // new level{num=0, name="小白0",max_char=50,experience=0}, - // new level{num=1, name="小白1",max_char=100,experience=5}, - // new level{num=2, name="小白2",max_char=200,experience=10}, - // new level{num=3, name="小白3",max_char=300,experience=15}, - // new level{num=4, name="小白4",max_char=400,experience=20}, - // new level{num=5, name="小白5",max_char=500,experience=25}, - // new level{num=6, name="小白6",max_char=600,experience=30}, - // new level{num=7, name="小白7",max_char=700,experience=35}, - // new level{num=8, name="小白8",max_char=800,experience=40}, - // new level{num=9, name="小白9",max_char=900,experience=45}, - // new level{num=10, name="小白10",max_char=1000,experience=50}, - // new level{num=11, name="小白11",max_char=1100,experience=55} - // }; - // Db.Set().AddRange(levels); - // //---------------------------------------------------------------------------------------添加等级表 - - // return Db.SaveChanges()>0; - //} - return false; - } - } -} diff --git a/CC.Yi/CC.Yi.API/Program.cs b/CC.Yi/CC.Yi.API/Program.cs deleted file mode 100644 index b2ac3042..00000000 --- a/CC.Yi/CC.Yi.API/Program.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Autofac.Extensions.DependencyInjection; -using CC.Yi.DAL; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using NLog.Web; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace CC.Yi.API -{ - public class Program - { - public static void Main(string[] args) - { - //һݿ⣬޸ݿļ - //ģ࣬ģͲУʹAdd-Migration xxxǨƣʹUpdate-Databaseݿ - //T4ModelģһתT4 - //캯עֱʹ - - var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger(); - try - { - logger.Debug("Yiܡ"); - var host = CreateHostBuilder(args).Build(); - host.Run(); - logger.Info("Yiɹ"); - } - catch (Exception exception) - { - //NLog: catch setup errors - logger.Error(exception, "Stopped program because of exception"); - throw; - } - finally - { - // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux) - NLog.LogManager.Shutdown(); - } - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - - webBuilder.UseUrls("http://*:19000").UseStartup(); - }).UseServiceProviderFactory(new AutofacServiceProviderFactory()) - .ConfigureLogging(logging => - { - // logging.ClearProviders(); // п̨ - logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); - }).UseNLog();//nlog־ - - } -} diff --git a/CC.Yi/CC.Yi.API/Properties/launchSettings.json b/CC.Yi/CC.Yi.API/Properties/launchSettings.json deleted file mode 100644 index 9942be97..00000000 --- a/CC.Yi/CC.Yi.API/Properties/launchSettings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:55197", - "sslPort": 44334 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "swagger", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "CC.Yi.API": { - "commandName": "Project", - "dotnetRunMessages": "true", - "launchBrowser": true, - "launchUrl": "swagger", - "applicationUrl": "https://localhost:5001;http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/CC.Yi/CC.Yi.API/Startup.cs b/CC.Yi/CC.Yi.API/Startup.cs deleted file mode 100644 index f4b14aad..00000000 --- a/CC.Yi/CC.Yi.API/Startup.cs +++ /dev/null @@ -1,167 +0,0 @@ -using Autofac; -using Autofac.Extras.DynamicProxy; -using CC.Yi.API.Extension; -using CC.Yi.BLL; -using CC.Yi.Common.Castle; -using CC.Yi.Common.Json; -using CC.Yi.Common.Jwt; -using CC.Yi.DAL; -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using CC.Yi.Model; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.HttpsPolicy; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Microsoft.IdentityModel.Tokens; -using Microsoft.OpenApi.Models; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CC.Yi.API -{ - public partial 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.AddAuthorization(options => - { - //ûڲԵ֤ - options.AddPolicy("myadmin", policy =>policy.RequireRole("admin")); - - }); - - - services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) - .AddJwtBearer(options => - { - options.TokenValidationParameters = new TokenValidationParameters - { - ValidateIssuer = true,//Ƿ֤Issuer - ValidateAudience = true,//Ƿ֤Audience - ValidateLifetime = true,//Ƿ֤ʧЧʱ - ClockSkew = TimeSpan.FromDays(1), - - - ValidateIssuerSigningKey = true,//Ƿ֤SecurityKey - ValidAudience = JwtConst.Domain,//Audience - ValidIssuer = JwtConst.Domain,//Issuerǰǩjwtһ - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtConst.SecurityKey))//õSecurityKey - }; - }); - - //עĶ - services.AddSingleton(); - - //ù - Action filters = new Action(r => - { - //r.Filters.Add(typeof(DbContextFilter)); - }); - - services.AddControllers(filters).AddJsonOptions(options => { - - options.JsonSerializerOptions.Converters.Add(new DatetimeJsonConverter()); - options.JsonSerializerOptions.Converters.Add(new TimeSpanJsonConverter()); - - }); - services.AddSwaggerService(); - - - //ݿ - string connection1 = Configuration["ConnectionStringBySQL"]; - string connection2 = Configuration["ConnectionStringByMySQL"]; - string connection3 = Configuration["ConnectionStringBySQLite"]; - string connection4 = Configuration["ConnectionStringByOracle"]; - - //var serverVersion = new MySqlServerVersion(new Version(8, 0, 21));//mysql汾 - - services.AddDbContext(options => - { - //options.UseSqlServer(connection1);//sqlserver - //options.UseMySql(connection2, serverVersion);//mysql - options.UseSqlite(connection3);//sqlite - //options.UseOracle(connection4);//oracle - }); - - - - services.AddCors(options => options.AddPolicy("CorsPolicy",// - builder => - { - builder.AllowAnyMethod() - .SetIsOriginAllowed(_ => true) - .AllowAnyHeader() - .AllowCredentials(); - })); - } - - //ʼʹú - private void InitData(IServiceProvider serviceProvider) - { - using (var serviceScope = serviceProvider.GetRequiredService().CreateScope()) - { - var Db = serviceScope.ServiceProvider.GetService(); - var log = serviceScope.ServiceProvider.GetService>(); - if (Init.InitDb.Init(Db)) - { - log.LogInformation("ݿʼɹ"); - } - } - } - - // 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.UseSwaggerService(); - } - //þ̬ļ - app.UseStaticFiles(); - - //쳣׽ - app.UseErrorHandling(); - - //ÿ - app.UseCors("CorsPolicy"); - app.UseHttpsRedirection(); - - app.UseRouting(); - - //֤ - app.UseAuthentication(); - app.UseAuthorization(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - - //ʼ - InitData(app.ApplicationServices); - } - } -} diff --git a/CC.Yi/CC.Yi.API/T4Startup.cs b/CC.Yi/CC.Yi.API/T4Startup.cs deleted file mode 100644 index 75e8a6fd..00000000 --- a/CC.Yi/CC.Yi.API/T4Startup.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Autofac; -using Autofac.Extras.DynamicProxy; -using CC.Yi.BLL; -using CC.Yi.Common.Castle; -using CC.Yi.DAL; -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using System; - - -namespace CC.Yi.API -{ - public partial class Startup - { - //动态 面向AOP思想的依赖注入 Autofac - public void ConfigureContainer(ContainerBuilder builder) - { - builder.RegisterType(typeof(CustomAutofacAop)); - builder.RegisterGeneric(typeof(BaseDal<>)).As(typeof(IBaseDal<>)); - builder.RegisterType().As().EnableInterfaceInterceptors();//表示注入前后要执行Castle,AOP - } - } -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.API/T4Startup.tt b/CC.Yi/CC.Yi.API/T4Startup.tt deleted file mode 100644 index 166ebfc5..00000000 --- a/CC.Yi/CC.Yi.API/T4Startup.tt +++ /dev/null @@ -1,40 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using Autofac; -using Autofac.Extras.DynamicProxy; -using CC.Yi.BLL; -using CC.Yi.Common.Castle; -using CC.Yi.DAL; -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using System; - - -namespace CC.Yi.API -{ - public partial class Startup - { - //动态 面向AOP思想的依赖注入 Autofac - public void ConfigureContainer(ContainerBuilder builder) - { - builder.RegisterType(typeof(CustomAutofacAop)); - builder.RegisterGeneric(typeof(BaseDal<>)).As(typeof(IBaseDal<>)); -<# foreach(string k in ModelData){#> - builder.RegisterType<<#=k #>Bll>().AsBll>().EnableInterfaceInterceptors();//表示注入前后要执行Castle,AOP -<# } #> - } - } -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.API/YIDB.db b/CC.Yi/CC.Yi.API/YIDB.db deleted file mode 100644 index 2916a446ba88ea55b6404cd0edc328ed38278a9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI)J!{)Q7zgk>NqMP_qAsl=hHz+#i7}R2#~rJrN@`-ut|OP2QiKw#Mc~-PlA#%s z&(O7WD_!zEI&^BM&V7TfSvvM)Td|!uflhVdf1s1@PP&)hgNBpAyH849;IbE;?x7Q~ zd*n6|1oDtELWsnVIetV*Tp8$*v8C5b7R#op(tKiVjWz~LIBN0zp6$Cw zJ-2<}`jf@Ei6vcXTn(p?=1-=S-{ei7B|dvBsgpgrkSG-BX{A3o+cvh!-pj5Nc%8QY z*zOG_AUi4YyVIG9#niyZx(OATz7+1TUX73<)>UMoT*-PEZu~bo* zPdqPB;^jf1d_j9)AA7lcCYxDbrW0-V3;D23>$k=Dss!aTQGW3Z z2?7v+00bZa0SG_<0uX=z1Rwx`|3%=gsL`um0)#uFc574}eFO-9|Cf}HL^)S}C|~#m z5(FRs0SG_<0uX=z1Rwwb2tWV=Gc6F8B$8bGe)jI?>$gr^94`pt1v)D1hx>o3ob&zv mOfL - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CC.Yi/CC.Yi.BLL/BaseBll.cs b/CC.Yi/CC.Yi.BLL/BaseBll.cs deleted file mode 100644 index 10918f6b..00000000 --- a/CC.Yi/CC.Yi.BLL/BaseBll.cs +++ /dev/null @@ -1,112 +0,0 @@ -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Threading.Tasks; - -namespace CC.Yi.BLL -{ - public class BaseBll : IBaseBll where T : class, new() - { - public IBaseDal CurrentDal; - public DbContext Db; - public BaseBll(IBaseDal cd, DataContext _Db) - { - CurrentDal = cd; - Db = _Db; - } - - public async Task GetEntityById(int id) - { - return await CurrentDal.GetEntityById(id); - } - - - public IQueryable GetAllEntities() - { - return CurrentDal.GetAllEntities(); - } - - public IQueryable GetEntities(Expression> whereLambda) - { - return CurrentDal.GetEntities(whereLambda); - } - - public int GetCount(Expression> whereLambda) //统计数量 - { - return CurrentDal.GetCount(whereLambda); - } - - public IQueryable> GetGroup(Expression> whereLambda, Expression> groupByLambda) //分组 - { - return CurrentDal.GetGroup(whereLambda, groupByLambda); - - } - - public IQueryable GetPageEntities(int pageSize, int pageIndex, out int total, Expression> whereLambda, Expression> orderByLambda, bool isAsc) - { - return CurrentDal.GetPageEntities(pageSize, pageIndex, out total, whereLambda, orderByLambda, isAsc); - } - - public T Add(T entity) - { - T entityData= CurrentDal.Add(entity); - Db.SaveChanges(); - return entityData; - } - - public bool Add(IEnumerable entities) - { - CurrentDal.AddRange(entities); - return Db.SaveChanges() > 0; - } - - public bool Update(T entity) - { - CurrentDal.Update(entity); - return Db.SaveChanges() > 0; - } - - public bool Update(T entity, params string[] propertyNames) - { - CurrentDal.Update(entity,propertyNames); - return Db.SaveChanges() > 0; - } - - public bool Delete(T entity) - { - CurrentDal.Delete(entity); - return Db.SaveChanges() > 0; - } - public bool Delete(int id) - { - CurrentDal.Detete(id); - return Db.SaveChanges() > 0; - } - - public bool Delete(IEnumerable ids) - { - foreach (var id in ids) - { - CurrentDal.Detete(id); - } - return Db.SaveChanges()>0; - } - public bool Delete(Expression> where) - { - IQueryable entities = CurrentDal.GetEntities(where); - if (entities != null) - { - CurrentDal.DeteteRange(entities); - - return Db.SaveChanges()>0; - } - return false; - } - - } -} diff --git a/CC.Yi/CC.Yi.BLL/CC.Yi.BLL.csproj b/CC.Yi/CC.Yi.BLL/CC.Yi.BLL.csproj deleted file mode 100644 index cafa597d..00000000 --- a/CC.Yi/CC.Yi.BLL/CC.Yi.BLL.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - - netcoreapp3.1 - - - - - - - - - - - TextTemplatingFileGenerator - T4BLL.cs - - - - - - - - - - True - True - T4BLL.tt - - - - diff --git a/CC.Yi/CC.Yi.BLL/T4BLL.cs b/CC.Yi/CC.Yi.BLL/T4BLL.cs deleted file mode 100644 index 65c25e89..00000000 --- a/CC.Yi/CC.Yi.BLL/T4BLL.cs +++ /dev/null @@ -1,32 +0,0 @@ - -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; - -namespace CC.Yi.BLL -{ - public partial class studentBll : BaseBll, IstudentBll - { - public studentBll(IBaseDal cd,DataContext _Db):base(cd,_Db) - { - CurrentDal = cd; - Db = _Db; - } - - public async Task DelListByUpdateList(List Ids) - { - var entitys = await CurrentDal.GetEntities(u => Ids.Contains(u.id)).ToListAsync(); - foreach (var entity in entitys) - { - entity.is_delete = (short)ViewModel.Enum.DelFlagEnum.Deleted; - } - return Db.SaveChanges() > 0; - } - - } -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.BLL/T4BLL.tt b/CC.Yi/CC.Yi.BLL/T4BLL.tt deleted file mode 100644 index bd101937..00000000 --- a/CC.Yi/CC.Yi.BLL/T4BLL.tt +++ /dev/null @@ -1,50 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> - -using CC.Yi.IBLL; -using CC.Yi.IDAL; -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; - -namespace CC.Yi.BLL -{ -<# foreach(string k in ModelData){ - #> - public partial class <#=k #>Bll : BaseBll<<#=k #>>, I<#=k #>Bll - { - public <#=k #>Bll(IBaseDal<<#=k #>> cd,DataContext _Db):base(cd,_Db) - { - CurrentDal = cd; - Db = _Db; - } - - public async Task DelListByUpdateList(List Ids) - { - var entitys = await CurrentDal.GetEntities(u => Ids.Contains(u.id)).ToListAsync(); - foreach (var entity in entitys) - { - entity.is_delete = (short)ViewModel.Enum.DelFlagEnum.Deleted; - } - return Db.SaveChanges() > 0; - } - - } -<# } #> -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.Common/CC.Yi.Common.csproj b/CC.Yi/CC.Yi.Common/CC.Yi.Common.csproj deleted file mode 100644 index c811cfb7..00000000 --- a/CC.Yi/CC.Yi.Common/CC.Yi.Common.csproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - netcoreapp3.1 - - - - - - - - - - - - - - - TextTemplatingFileGenerator - T4Api.vue - - - True - True - T4Api.tt - - - TextTemplatingFileGenerator - T4Component.vue - - - True - True - T4Component.tt - - - - - - - - diff --git a/CC.Yi/CC.Yi.Common/Cache/CacheHelper.cs b/CC.Yi/CC.Yi.Common/Cache/CacheHelper.cs deleted file mode 100644 index 4a5efec9..00000000 --- a/CC.Yi/CC.Yi.Common/Cache/CacheHelper.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Autofac; -using Microsoft.AspNetCore.Http; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common.Cache -{ - public class CacheHelper - { - public static ICacheWriter CacheWriter { get; set; } - static CacheHelper() - { - CacheHelper.CacheWriter = new RedisCache(); - } - - - - - public static bool AddCache(string key, T value, DateTime expDate) - { - return CacheWriter.AddCache(key,value,expDate); - } - - public static bool AddCache(string key, T value) - { - return CacheWriter.AddCache(key, value); - } - - public static bool RemoveCache(string key) - { - return CacheWriter.RemoveCache(key); - } - - public static T GetCache(string key) - { - return CacheWriter.GetCache(key); - } - - public static bool SetCache(string key, T value, DateTime expDate) - { - return CacheWriter.SetCache(key,value,expDate); - } - - public static bool SetCache(string key, T value) - { - return CacheWriter.SetCache(key, value); - } - - } -} diff --git a/CC.Yi/CC.Yi.Common/Cache/ICacheWriter.cs b/CC.Yi/CC.Yi.Common/Cache/ICacheWriter.cs deleted file mode 100644 index 712f6857..00000000 --- a/CC.Yi/CC.Yi.Common/Cache/ICacheWriter.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CC.Yi.Common.Cache -{ - public interface ICacheWriter - { - bool AddCache(string key, T value, DateTime expDate); - bool AddCache(string key, T value); - bool RemoveCache(string key); - T GetCache(string key); - bool SetCache(string key, T value, DateTime expDate); - bool SetCache(string key, T value); - } -} diff --git a/CC.Yi/CC.Yi.Common/Cache/RedisCache.cs b/CC.Yi/CC.Yi.Common/Cache/RedisCache.cs deleted file mode 100644 index f2d84a52..00000000 --- a/CC.Yi/CC.Yi.Common/Cache/RedisCache.cs +++ /dev/null @@ -1,99 +0,0 @@ -using ServiceStack.Redis; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common.Cache -{ - public class RedisCache : ICacheWriter - { - private RedisClient client; - private string ip = "49.235.212.122"; - private int port = 6379; - private string pwd = "Qz52013142020."; - public RedisCache() - { - } - - public void Dispose() - { - client.Dispose(); - } - - public bool AddCache(string key, T value, DateTime expDate) - { - try - { - using (client = new RedisClient(ip, port, pwd)) - { - return client.Add(key, value, expDate); - } - } - catch - { - - return false; - } - } - - public bool AddCache(string key, T value) - { - return client.Add(key, value); - } - - public bool RemoveCache(string key) - { - return client.Remove(key); - } - - public T GetCache(string key) - { - try - { - using (client = new RedisClient(ip, port, pwd)) - { - return client.Get(key); - } - } - catch - { - object p = new object(); - return (T)p; - } - } - - - - public bool SetCache(string key, T value, DateTime expDate) - { - try - { - using (client = new RedisClient(ip, port, pwd)) - { - return client.Set(key, value, expDate); - } - } - catch - { - return false; - } - } - - public bool SetCache(string key, T value) - { - try - { - using (client = new RedisClient(ip, port, pwd)) - { - return client.Set(key, value); - } - } - catch - { - object p = new object(); - return false; - } - - } - } -} diff --git a/CC.Yi/CC.Yi.Common/Castle/CustomAutofacAop.cs b/CC.Yi/CC.Yi.Common/Castle/CustomAutofacAop.cs deleted file mode 100644 index 526d39ef..00000000 --- a/CC.Yi/CC.Yi.Common/Castle/CustomAutofacAop.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Castle.DynamicProxy; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common.Castle -{ - public class CustomAutofacAop : IInterceptor - { - public void Intercept(IInvocation invocation) - { - { - - //这里写执行方法前 - } - invocation.Proceed();//执行具体的实例 - { - - //这里写执行方法后 - } - } - } -} diff --git a/CC.Yi/CC.Yi.Common/EmailHelper.cs b/CC.Yi/CC.Yi.Common/EmailHelper.cs deleted file mode 100644 index bb92ef52..00000000 --- a/CC.Yi/CC.Yi.Common/EmailHelper.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Net.Mail; -using System.Net.Sockets; -using System.Text; - -namespace CC.Yi.Common -{ - public class EmailHelper - { - public static bool sendMail(string subject, 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, "江西服装学院论坛"); - message.From = fromAddr; - - //设置收件人,可添加多个,添加方法与下面的一样 - message.To.Add(toMail); - - - //设置邮件标题 - message.Subject = subject; - - //设置邮件内容 - 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/CC.Yi/CC.Yi.Common/HttpHelper.cs b/CC.Yi/CC.Yi.Common/HttpHelper.cs deleted file mode 100644 index 6bfdfb18..00000000 --- a/CC.Yi/CC.Yi.Common/HttpHelper.cs +++ /dev/null @@ -1,76 +0,0 @@ -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 CC.Yi.Common -{ - 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/CC.Yi/CC.Yi.Common/Json/DatetimeJsonConverter.cs b/CC.Yi/CC.Yi.Common/Json/DatetimeJsonConverter.cs deleted file mode 100644 index 8786801c..00000000 --- a/CC.Yi/CC.Yi.Common/Json/DatetimeJsonConverter.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace CC.Yi.Common.Json -{ - public class DatetimeJsonConverter: JsonConverter - { - public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - if (reader.TokenType == JsonTokenType.String) - { - if (DateTime.TryParse(reader.GetString(), out DateTime date)) - return date; - } - return reader.GetDateTime(); - } - - public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) - { - writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss")); - } - } -} diff --git a/CC.Yi/CC.Yi.Common/Json/DefaultJsonOptions.cs b/CC.Yi/CC.Yi.Common/Json/DefaultJsonOptions.cs deleted file mode 100644 index 7b83bea1..00000000 --- a/CC.Yi/CC.Yi.Common/Json/DefaultJsonOptions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.Encodings.Web; -using System.Text.Json; - -namespace CC.Yi.Common.Json -{ - /// - /// https://blog.csdn.net/sD7O95O/article/details/103797885 - /// - public class DefaultJsonOptions - { - public static JsonSerializerOptions Get() - { - var options = new JsonSerializerOptions(); - //options.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping; - options.IgnoreNullValues = true;//排除所有属性值为 null 属性 - //// 自定义名称策略 - //options.PropertyNamingPolicy = new LowerCaseNamingPolicy(); - return options; - } - } -} diff --git a/CC.Yi/CC.Yi.Common/Json/EnumJsonConverter.cs b/CC.Yi/CC.Yi.Common/Json/EnumJsonConverter.cs deleted file mode 100644 index 7a95432e..00000000 --- a/CC.Yi/CC.Yi.Common/Json/EnumJsonConverter.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Text; -using System.Text.Json; -using System.Text.Json.Serialization; -namespace CC.Yi.Common.Json -{ - public class EnumJsonConverter : JsonConverter - { - public override bool CanConvert(Type typeToConvert) - { - return typeToConvert.IsEnum; - } - //未实现 - public override Enum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - if (reader.TokenType == JsonTokenType.Number) - { - int num; - reader.TryGetInt32(out num); - return (Enum)Enum.Parse(typeToConvert,num.ToString()); - } - if (reader.TokenType == JsonTokenType.String) - { - string str = reader.GetString(); - return (Enum)Enum.Parse(typeToConvert, str); - } - return null; - } - - public override void Write(Utf8JsonWriter writer, Enum value, JsonSerializerOptions options) - { - writer.WriteStringValue(value.ToString()); - } - } -} diff --git a/CC.Yi/CC.Yi.Common/Json/LowerCaseNamingPolicy.cs b/CC.Yi/CC.Yi.Common/Json/LowerCaseNamingPolicy.cs deleted file mode 100644 index 0c429ba3..00000000 --- a/CC.Yi/CC.Yi.Common/Json/LowerCaseNamingPolicy.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.Json; - -namespace CC.Yi.Common.Json -{ - /// - /// 自定义名称策略 - /// - public class LowerCaseNamingPolicy : JsonNamingPolicy - { - public override string ConvertName(string name) => name.ToLower(); - } - -} diff --git a/CC.Yi/CC.Yi.Common/Json/TimeSpanJsonConverter.cs b/CC.Yi/CC.Yi.Common/Json/TimeSpanJsonConverter.cs deleted file mode 100644 index 9effd629..00000000 --- a/CC.Yi/CC.Yi.Common/Json/TimeSpanJsonConverter.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace CC.Yi.Common.Json -{ - public class TimeSpanJsonConverter : JsonConverter - { - public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - - //if (TimeSpan.TryParse(reader.GetString(), out TimeSpan date)) - // return date; - - TimeSpan.TryParse(reader.GetString(), out TimeSpan date); - return date; - } - - public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options) - { - // writer.WriteStringValue(value.ToString("HH:mm:ss")); - writer.WriteStringValue(value.ToString()); - } - } -} diff --git a/CC.Yi/CC.Yi.Common/JsonHelper.cs b/CC.Yi/CC.Yi.Common/JsonHelper.cs deleted file mode 100644 index ea9b4c2d..00000000 --- a/CC.Yi/CC.Yi.Common/JsonHelper.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -namespace CC.Yi.Common -{ - public static class JsonHelper - { - public static string JsonToString(object data = null, int code = 200, bool flag = true, string message = "成功") - { - return Newtonsoft.Json.JsonConvert.SerializeObject(new { code = code, flag = flag, message = message, data = data }); - } - public static string JsonToString2(object data = null, int code = 200, bool flag = true, string message = "成功", int count = 0) - { - return Newtonsoft.Json.JsonConvert.SerializeObject(new { code = code, flag = flag, message = message, count = count, data = data }); - } - public static string ToString(object data) - { - return Newtonsoft.Json.JsonConvert.SerializeObject(data); - } - public static T ToJson(string data) - { - return Newtonsoft.Json.JsonConvert.DeserializeObject(data); - } - } -} diff --git a/CC.Yi/CC.Yi.Common/Jwt/JwtConst.cs b/CC.Yi/CC.Yi.Common/Jwt/JwtConst.cs deleted file mode 100644 index 1e7713ff..00000000 --- a/CC.Yi/CC.Yi.Common/Jwt/JwtConst.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common.Jwt -{ - public class JwtConst - { - public const string SecurityKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB"; - public const string Domain = "http://localhost:5000"; - } -} diff --git a/CC.Yi/CC.Yi.Common/LinqHelper.cs b/CC.Yi/CC.Yi.Common/LinqHelper.cs deleted file mode 100644 index 6c9470f5..00000000 --- a/CC.Yi/CC.Yi.Common/LinqHelper.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; - -namespace CC.Yi.Common -{ - public static class LinqHelper - { - //T是列表类型,S是排序的属性 - public static IQueryable GetPageEntities(IQueryable myData, int pageSize, int pageIndex, out int total, Expression> whereLambda=null, Expression> orderByLambda=null, bool isAsc=false) - { - total = myData.Where(whereLambda).Count(); - if (isAsc) - { - var pageData = myData.Where(whereLambda) - .OrderBy(orderByLambda) - .Skip(pageSize * (pageIndex - 1)) - .Take(pageSize).AsQueryable(); - return pageData; - } - else - { - var pageData = myData.Where(whereLambda) - .OrderByDescending(orderByLambda) - .Skip(pageSize * (pageIndex - 1)) - .Take(pageSize).AsQueryable(); - return pageData; - } - } - } -} diff --git a/CC.Yi/CC.Yi.Common/RandomHelper.cs b/CC.Yi/CC.Yi.Common/RandomHelper.cs deleted file mode 100644 index edfa8836..00000000 --- a/CC.Yi/CC.Yi.Common/RandomHelper.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; - -namespace CC.Yi.Common -{ - 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/CC.Yi/CC.Yi.Common/Result.cs b/CC.Yi/CC.Yi.Common/Result.cs deleted file mode 100644 index 400df0f8..00000000 --- a/CC.Yi/CC.Yi.Common/Result.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace CC.Yi.Common -{ - /// - /// 结果数据 - /// - 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 Result SetData(object obj) - { - this.data = obj; - return this; - } - public Result SetCode(int Code) - { - this.code = Code; - return this; - } - } -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.Common/T4Vue/T4Api.tt b/CC.Yi/CC.Yi.Common/T4Vue/T4Api.tt deleted file mode 100644 index 0216062f..00000000 --- a/CC.Yi/CC.Yi.Common/T4Vue/T4Api.tt +++ /dev/null @@ -1,58 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".vue" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - List ModelData=new List(); - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Vue.txt"); - string p; - while((p =sr.ReadLine())!=null) - { - ModelData.Add(p); - } - sr.Close(); - string Model= ModelData[0]; - string BModel=Model.Substring(0,1).ToUpper()+Model.Substring(1); - string[] Data=ModelData[1].Split(','); - string[] Name=ModelData[2].Split(','); - string[] Default=ModelData[3].Split(','); - #> - - - -/* -import myaxios from '@/utils/myaxios' -export default { - get<#=BModel#>s() { - return myaxios({ - url: '/<#=BModel#>/get<#=BModel#>s', - method: 'get' - }) - }, - add<#=BModel#>(<#=Model#>) { - return myaxios({ - url: '/<#=BModel#>/add<#=BModel#>', - method: 'post', - data: <#=Model#> - }) - }, - update<#=BModel#>(<#=BModel#>) { - return myaxios({ - url: '/<#=BModel#>/Update<#=BModel#>', - method: 'post', - data: <#=BModel#> - }) - }, - del<#=BModel#>List(Ids) { - return myaxios({ - url: '/<#=BModel#>/Del<#=BModel#>List', - method: 'post', - data: Ids - }) - }, -} -*/ \ No newline at end of file diff --git a/CC.Yi/CC.Yi.Common/T4Vue/T4Api.vue b/CC.Yi/CC.Yi.Common/T4Vue/T4Api.vue deleted file mode 100644 index 1b78e4a1..00000000 --- a/CC.Yi/CC.Yi.Common/T4Vue/T4Api.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - -/* -import myaxios from '@/utils/myaxios' -export default { - getStudents() { - return myaxios({ - url: '/Student/getStudents', - method: 'get' - }) - }, - addStudent(student) { - return myaxios({ - url: '/Student/addStudent', - method: 'post', - data: student - }) - }, - updateStudent(Student) { - return myaxios({ - url: '/Student/UpdateStudent', - method: 'post', - data: Student - }) - }, - delStudentList(Ids) { - return myaxios({ - url: '/Student/DelStudentList', - method: 'post', - data: Ids - }) - }, -} -*/ \ No newline at end of file diff --git a/CC.Yi/CC.Yi.Common/T4Vue/T4Component.tt b/CC.Yi/CC.Yi.Common/T4Vue/T4Component.tt deleted file mode 100644 index 25dafb24..00000000 --- a/CC.Yi/CC.Yi.Common/T4Vue/T4Component.tt +++ /dev/null @@ -1,279 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".vue" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - List ModelData=new List(); - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Vue.txt"); - string p; - while((p =sr.ReadLine())!=null) - { - ModelData.Add(p); - } - sr.Close(); - string Model= ModelData[0]; - string BModel=Model.Substring(0,1).ToUpper()+Model.Substring(1); - string[] Data=ModelData[1].Split(','); - string[] Name=ModelData[2].Split(','); - string[] Default=ModelData[3].Split(','); - #> - - - -/* - - -*/ \ No newline at end of file diff --git a/CC.Yi/CC.Yi.Common/T4Vue/T4Component.vue b/CC.Yi/CC.Yi.Common/T4Vue/T4Component.vue deleted file mode 100644 index 26b98ce6..00000000 --- a/CC.Yi/CC.Yi.Common/T4Vue/T4Component.vue +++ /dev/null @@ -1,237 +0,0 @@ - - - -/* - - -*/ \ No newline at end of file diff --git a/CC.Yi/CC.Yi.Common/T4Vue/T4Controller.cs b/CC.Yi/CC.Yi.Common/T4Vue/T4Controller.cs deleted file mode 100644 index 954ca2a6..00000000 --- a/CC.Yi/CC.Yi.Common/T4Vue/T4Controller.cs +++ /dev/null @@ -1,59 +0,0 @@ -//using CC.Yi.Common; -//using CC.Yi.IBLL; -//using CC.Yi.Model; -//using Microsoft.AspNetCore.Authorization; -//using Microsoft.AspNetCore.Mvc; -//using Microsoft.EntityFrameworkCore; -//using Microsoft.Extensions.Logging; -//using System; -//using System.Collections.Generic; -//using System.Linq; -//using System.Threading.Tasks; - -//namespace CC.Yi.API.Controllers -//{ -// [Route("[controller]/[action]")] -// [ApiController] -// public class PlateController : Controller -// { -// private IplateBll _plateBll; -// private ILogger _logger; -// short delFlagNormal = (short)ViewModel.Enum.DelFlagEnum.Normal; -// public PlateController(IplateBll plateBll, ILogger logger) -// { -// _plateBll = plateBll; -// _logger = logger; -// } - -// [HttpGet] -// public async Task GetPlates() -// { -// var data =await _plateBll.GetEntities(u=>u.is_delete==delFlagNormal).AsNoTracking().ToListAsync(); -// return Result.Success().SetData(data); -// } - -// [Authorize(Policy = "板块管理")] -// [HttpPost] -// public Result AddPlate(plate myPlate) -// { -// _plateBll.Add(myPlate); -// return Result.Success(); -// } - -// [Authorize(Policy = "板块管理")] -// [HttpPost] -// public Result UpdatePlate(plate myPlate) -// { -// _plateBll.Update(myPlate); -// return Result.Success(); -// } - -// [Authorize(Policy = "板块管理")] -// [HttpPost] -// public Result delPlateList(List Ids) -// { -// _plateBll.DelListByUpdateList(Ids); -// return Result.Success(); -// } -// } -//} diff --git a/CC.Yi/CC.Yi.Common/imageHelper.cs b/CC.Yi/CC.Yi.Common/imageHelper.cs deleted file mode 100644 index 170aba9c..00000000 --- a/CC.Yi/CC.Yi.Common/imageHelper.cs +++ /dev/null @@ -1,167 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using System.IO; -using System.IO.Compression; -using System.Drawing; - -namespace CC.Yi.Common -{ - public class SimilarPhoto - { - Image SourceImg; - public SimilarPhoto(string filePath) - { - SourceImg = Image.FromFile(filePath); - } - public SimilarPhoto(Stream stream) - { - SourceImg = Image.FromStream(stream); - } - public String GetHash() - { - Image image = ReduceSize(); - Byte[] grayValues = ReduceColor(image); - Byte average = CalcAverage(grayValues); - String reslut = ComputeBits(grayValues, average); - return reslut; - } - // Step 1 : Reduce size to 8*8 - private Image ReduceSize(int width = 8, int height = 8) - { - Image image = SourceImg.GetThumbnailImage(width, height, () => { return false; }, IntPtr.Zero); - return image; - } - // Step 2 : Reduce Color - private Byte[] ReduceColor(Image image) - { - Bitmap bitMap = new Bitmap(image); - Byte[] grayValues = new Byte[image.Width * image.Height]; - for (int x = 0; x < image.Width; x++) - for (int y = 0; y < image.Height; y++) - { - Color color = bitMap.GetPixel(x, y); - byte grayValue = (byte)((color.R * 30 + color.G * 59 + color.B * 11) / 100); - grayValues[x * image.Width + y] = grayValue; - } - return grayValues; - } - // Step 3 : Average the colors - private Byte CalcAverage(byte[] values) - { - int sum = 0; - for (int i = 0; i < values.Length; i++) - sum += (int)values[i]; - return Convert.ToByte(sum / values.Length); - } - // Step 4 : Compute the bits - private String ComputeBits(byte[] values, byte averageValue) - { - char[] result = new char[values.Length]; - for (int i = 0; i < values.Length; i++) - { - if (values[i] < averageValue) - result[i] = '0'; - else - result[i] = '1'; - } - SourceImg.Dispose(); - return new String(result); - } - // Compare hash - public static Int32 CalcSimilarDegree(string a, string b) - { - if (a.Length != b.Length) - throw new ArgumentException(); - int count = 0; - for (int i = 0; i < a.Length; i++) - { - if (a[i] != b[i]) - count++; - } - return count; - } - } - public static class imageHelper - { - public static int Compare(string filePath1, string filePath2) - { - SimilarPhoto photo1 = new SimilarPhoto(filePath1); - SimilarPhoto photo2 = new SimilarPhoto(filePath2); - return SimilarPhoto.CalcSimilarDegree(photo1.GetHash(), photo2.GetHash()); - } - public static bool ByStringToSave(string name, string iss) - { - iss = iss.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "") - .Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", ""); - byte[] arr = Convert.FromBase64String(iss); - MemoryStream ms = new MemoryStream(arr); - Bitmap bmp = new Bitmap(ms); - string StudentWorkImages = "StudentWorkImages"; - - if (Directory.Exists(@"./wwwroot/" + StudentWorkImages) == false)//如果不存在就创建file文件夹 - { - Directory.CreateDirectory(@"./wwwroot/" + StudentWorkImages); - } - - - - bmp.Save(@"./wwwroot/" + StudentWorkImages + "/" + name + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg); - ms.Close(); - return true; - } - public static bool CreateZip() - { - string file_path = @"./wwwroot/StudentWorkImages.zip"; - string file_path2 = @"./wwwroot/StudentWorkImages/"; - if (File.Exists(file_path)) - { - File.Delete(file_path); - } - - ZipFile.CreateFromDirectory(file_path2, file_path); - return true; - } - public static bool DeleteAll() - { - string file_path = @"./wwwroot/StudentWorkImages/"; - if (Directory.Exists(file_path)) - { - DelectDir(file_path); - return true; - } - else - return false; - } - public static bool DeleteByString(string name) - { - File.Delete(@"./wwwroot/StudentWorkImages/" + name + ".jpg"); - return true; - } - public static void DelectDir(string srcPath) - { - try - { - DirectoryInfo dir = new DirectoryInfo(srcPath); - FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //返回目录中所有文件和子目录 - foreach (FileSystemInfo i in fileinfo) - { - if (i is DirectoryInfo) //判断是否文件夹 - { - DirectoryInfo subdir = new DirectoryInfo(i.FullName); - subdir.Delete(true); //删除子目录和文件 - } - else - { - File.Delete(i.FullName); //删除指定文件 - } - } - } - catch (Exception e) - { - Console.Write(e.ToString()); - } - } - } -} diff --git a/CC.Yi/CC.Yi.Common/mongodb/model/student.cs b/CC.Yi/CC.Yi.Common/mongodb/model/student.cs deleted file mode 100644 index fd86bf5f..00000000 --- a/CC.Yi/CC.Yi.Common/mongodb/model/student.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common.mongodb.model -{ - public class student - { - public string sname { get; set; } - - public string sex { get; set; } - } -} diff --git a/CC.Yi/CC.Yi.Common/mongodb/mongodbContext.cs b/CC.Yi/CC.Yi.Common/mongodb/mongodbContext.cs deleted file mode 100644 index c499d740..00000000 --- a/CC.Yi/CC.Yi.Common/mongodb/mongodbContext.cs +++ /dev/null @@ -1,29 +0,0 @@ -using CC.Yi.Common.mongodb.model; -using MongoDB.Driver; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common.mongodb -{ - public class mongodbContext - { - private readonly IMongoDatabase _database = null; - public mongodbContext() - { - //连接服务器名称 mongo的默认端口27017 - var client = new MongoClient("mongodb://.......:27017"); - if (client != null) - //连接数据库 - _database = client.GetDatabase("数据库名"); - } - - public IMongoCollection Province - { - get - { - return _database.GetCollection("Province"); - } - } - } -} diff --git a/CC.Yi/CC.Yi.Common/settingHelper.cs b/CC.Yi/CC.Yi.Common/settingHelper.cs deleted file mode 100644 index 01bfa939..00000000 --- a/CC.Yi/CC.Yi.Common/settingHelper.cs +++ /dev/null @@ -1,48 +0,0 @@ -using CC.Yi.Common.Cache; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.Common -{ - public static class settingHelper - { - public static ICacheWriter CacheWriter { get; set; } - - static settingHelper() - { - settingHelper.CacheWriter = new RedisCache(); - } - - public static int commentPage() - { - return CacheWriter.GetCache("commentPage"); - } - public static int discussPage() - { - return CacheWriter.GetCache("discussPage"); - } - public static int commentExperience() - { - return CacheWriter.GetCache("commentExperience"); - } - public static int discussExperience() - { - return CacheWriter.GetCache("discussExperience"); - } - public static string title() - { - return CacheWriter.GetCache("title"); - } - - //配置设置 - //public static void update(setting data) - //{ - // CacheWriter.SetCache("commentPage", data.commentPage); - // CacheWriter.SetCache("discussPage", data.discussPage); - // CacheWriter.SetCache("commentExperience", data.commentExperience); - // CacheWriter.SetCache("discussExperience", data.discussExperience); - // CacheWriter.SetCache("title", data.title); - //} - } -} diff --git a/CC.Yi/CC.Yi.DAL/BaseDal.cs b/CC.Yi/CC.Yi.DAL/BaseDal.cs deleted file mode 100644 index 43ce2ef8..00000000 --- a/CC.Yi/CC.Yi.DAL/BaseDal.cs +++ /dev/null @@ -1,122 +0,0 @@ -using CC.Yi.IDAL; -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Threading.Tasks; - -namespace CC.Yi.DAL -{ - public class BaseDal : IBaseDal where T : class, new() - { - public DbContext Db; - public BaseDal(DataContext _Db) - { - Db = _Db; - } - - public async Task GetEntityById(int id) - { - return await Db.Set().FindAsync(id); - } - - public IQueryable GetEntities(Expression> whereLambda) - { - - return Db.Set().Where(whereLambda).AsQueryable(); - } - - public IQueryable GetAllEntities() - { - return Db.Set().AsQueryable(); - } - - - public int GetCount(Expression> whereLambda) - { - return Db.Set().Where(whereLambda).Count(); - } - - public IQueryable> GetGroup(Expression> whereLambda, Expression> groupByLambda) //分组 - { - return Db.Set().Where(whereLambda).GroupBy(groupByLambda).AsQueryable(); - - } - - - - public IQueryable GetPageEntities(int pageSize, int pageIndex, out int total, Expression> whereLambda, Expression> orderByLambda, bool isAsc) - { - total = Db.Set().Where(whereLambda).Count(); - if (isAsc) - { - var pageData = Db.Set().Where(whereLambda) - .OrderBy(orderByLambda) - .Skip(pageSize * (pageIndex - 1)) - .Take(pageSize).AsQueryable(); - return pageData; - } - else - { - var pageData = Db.Set().Where(whereLambda) - .OrderByDescending(orderByLambda) - .Skip(pageSize * (pageIndex - 1)) - .Take(pageSize).AsQueryable(); - return pageData; - } - } - - public T Add(T entity) - { - Db.Set().Add(entity); - //Db.SaveChanges(); - return entity; - } - public bool AddRange(IEnumerable entities) - { - Db.Set().AddRange(entities); - return true; - } - - public bool Update(T entity) - { - //所有字段均修改 - Db.Entry(entity).State = EntityState.Modified; - //return Db.SaveChanges() > 0; - return true; - } - public bool Update(T entity, params string[] propertyNames) - { - EntityEntry entry = Db.Entry(entity); - entry.State = EntityState.Unchanged; - foreach (var item in propertyNames) - { - entry.Property(item).IsModified = true; - } - return true; - } - - public bool Delete(T entity) - { - Db.Entry(entity).State = EntityState.Deleted; - //return Db.SaveChanges() > 0; - return true; - } - public bool Detete(int id) - { - var entity = Db.Set().Find(id);//根据id找到实体 - Db.Set().Remove(entity);//由于这里先Find找到了实体,所以这里可以用Remove标记该实体要移除(删除)。如果不是先Find到实体就需要用System.Data.Entity.EntityState.Deleted - return true; - } - public bool DeteteRange(IEnumerable entity) - { - Db.Set().RemoveRange(entity); - return true; - } - - - } -} diff --git a/CC.Yi/CC.Yi.DAL/CC.Yi.DAL.csproj b/CC.Yi/CC.Yi.DAL/CC.Yi.DAL.csproj deleted file mode 100644 index ac766382..00000000 --- a/CC.Yi/CC.Yi.DAL/CC.Yi.DAL.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - netcoreapp3.1 - - - - - - - - - - TextTemplatingFileGenerator - T4DAL.cs - - - - - - - - - - True - True - T4DAL.tt - - - - diff --git a/CC.Yi/CC.Yi.DAL/T4DAL.cs b/CC.Yi/CC.Yi.DAL/T4DAL.cs deleted file mode 100644 index 7f13bb7a..00000000 --- a/CC.Yi/CC.Yi.DAL/T4DAL.cs +++ /dev/null @@ -1,17 +0,0 @@ -using CC.Yi.IDAL; -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; -using Microsoft.EntityFrameworkCore; - -namespace CC.Yi.DAL -{ - public partial class studentDal : BaseDal, IstudentDal - { - public studentDal(DataContext _Db):base(_Db) - { - Db = _Db; - } - } -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.DAL/T4DAL.tt b/CC.Yi/CC.Yi.DAL/T4DAL.tt deleted file mode 100644 index c5f32512..00000000 --- a/CC.Yi/CC.Yi.DAL/T4DAL.tt +++ /dev/null @@ -1,35 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using CC.Yi.IDAL; -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; -using Microsoft.EntityFrameworkCore; - -namespace CC.Yi.DAL -{ -<# foreach(string k in ModelData){ - #> - public partial class <#=k #>Dal : BaseDal<<#=k #>>, I<#=k #>Dal - { - public <#=k #>Dal(DataContext _Db):base(_Db) - { - Db = _Db; - } - } -<# } #> -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.IBLL/CC.Yi.IBLL.csproj b/CC.Yi/CC.Yi.IBLL/CC.Yi.IBLL.csproj deleted file mode 100644 index 778e1962..00000000 --- a/CC.Yi/CC.Yi.IBLL/CC.Yi.IBLL.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - - Library - netcoreapp3.1 - - - - - - - - - - TextTemplatingFileGenerator - T4IBLL.cs - - - - - - - - - - True - True - T4IBLL.tt - - - - diff --git a/CC.Yi/CC.Yi.IBLL/IBaseBll.cs b/CC.Yi/CC.Yi.IBLL/IBaseBll.cs deleted file mode 100644 index d2551b08..00000000 --- a/CC.Yi/CC.Yi.IBLL/IBaseBll.cs +++ /dev/null @@ -1,82 +0,0 @@ -using Autofac.Extras.DynamicProxy; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Threading.Tasks; - -namespace CC.Yi.IBLL -{ - public interface IBaseBll where T : class, new() - { - #region - //通过id得到实体 - #endregion - Task GetEntityById(int id); - - #region - //得到全部实体 - #endregion - IQueryable GetAllEntities(); - - #region - //通过表达式得到实体 - #endregion - IQueryable GetEntities(Expression> whereLambda); - - #region - //通过表达式得到实体,分页版本 - #endregion - IQueryable GetPageEntities(int pageSize, int pageIndex, out int total, Expression> whereLambda, Expression> orderByLambda, bool isAsc); - - #region - //通过表达式统计数量 - #endregion - int GetCount(Expression> whereLambda); - - #region - //通过表达式分组 - #endregion - IQueryable> GetGroup(Expression> whereLambda, Expression> groupByLambda); - - #region - //添加实体 - #endregion - T Add(T entity); - - #region - //添加多个实体 - #endregion - bool Add(IEnumerable entities); - - #region - //更新实体 - #endregion - bool Update(T entity); - - #region - //更新实体部分属性 - #endregion - bool Update(T entity, params string[] propertyNames); - - #region - //删除实体 - #endregion - bool Delete(T entity); - - #region - //通过id删除实体 - #endregion - bool Delete(int id); - - #region - //通过id列表删除多个实体 - #endregion - bool Delete(IEnumerable ids); - - #region - //通过表达式删除实体 - #endregion - bool Delete(Expression> where); - } -} diff --git a/CC.Yi/CC.Yi.IBLL/T4IBLL.cs b/CC.Yi/CC.Yi.IBLL/T4IBLL.cs deleted file mode 100644 index 829ba58c..00000000 --- a/CC.Yi/CC.Yi.IBLL/T4IBLL.cs +++ /dev/null @@ -1,13 +0,0 @@ -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; - -namespace CC.Yi.IBLL -{ - public partial interface IstudentBll : IBaseBll - { - Task DelListByUpdateList(List Ids); - } -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.IBLL/T4IBLL.tt b/CC.Yi/CC.Yi.IBLL/T4IBLL.tt deleted file mode 100644 index 6e362ea5..00000000 --- a/CC.Yi/CC.Yi.IBLL/T4IBLL.tt +++ /dev/null @@ -1,31 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; - -namespace CC.Yi.IBLL -{ -<# foreach(string k in ModelData){ - #> - public partial interface I<#=k #>Bll : IBaseBll<<#=k #>> - { - Task DelListByUpdateList(List Ids); - } -<# } #> -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.IDAL/CC.Yi.IDAL.csproj b/CC.Yi/CC.Yi.IDAL/CC.Yi.IDAL.csproj deleted file mode 100644 index bfba3015..00000000 --- a/CC.Yi/CC.Yi.IDAL/CC.Yi.IDAL.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - Library - netcoreapp3.1 - - - - - - - - - TextTemplatingFileGenerator - T4IDAL.cs - - - - - - - - - - True - True - T4IDAL.tt - - - - diff --git a/CC.Yi/CC.Yi.IDAL/IBaseDal.cs b/CC.Yi/CC.Yi.IDAL/IBaseDal.cs deleted file mode 100644 index abadabb1..00000000 --- a/CC.Yi/CC.Yi.IDAL/IBaseDal.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Threading.Tasks; - -namespace CC.Yi.IDAL -{ - public interface IBaseDal where T : class, new() - { - #region - //通过Id得到实体 - #endregion - Task GetEntityById(int id); - - #region - //得到全部实体 - #endregion - IQueryable GetAllEntities(); - - #region - //通过表达式得到实体 - #endregion - IQueryable GetEntities(Expression> whereLambda); - - #region - //通过表达式得到实体,分页版本 - #endregion - IQueryable GetPageEntities(int pageSize, int pageIndex, out int total, Expression> whereLambda, Expression> orderByLambda, bool isAsc); - - #region - //通过表达式统计数量 - #endregion - int GetCount(Expression> whereLambda); - - #region - //通过表达式分组 - #endregion - IQueryable> GetGroup(Expression> whereLambda, Expression> groupByLambda); - - #region - //添加单个实体 - #endregion - T Add(T entity); - - #region - //添加多个实体 - #endregion - bool AddRange(IEnumerable entities); - #region - //更新单个实体 - #endregion - bool Update(T entity); - - #region - //更新单个实体部分属性 - #endregion - bool Update(T entity, params string[] propertyNames); - - #region - //删除单个实体 - #endregion - bool Delete(T entity); - - #region - //通过id删除实体 - #endregion - bool Detete(int id); - - #region - //删除多个实体 - #endregion - bool DeteteRange(IEnumerable entity); - } -} diff --git a/CC.Yi/CC.Yi.IDAL/T4IDAL.cs b/CC.Yi/CC.Yi.IDAL/T4IDAL.cs deleted file mode 100644 index 8b900b8c..00000000 --- a/CC.Yi/CC.Yi.IDAL/T4IDAL.cs +++ /dev/null @@ -1,11 +0,0 @@ -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.IDAL -{ - public partial interface IstudentDal:IBaseDal - { - } -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.IDAL/T4IDAL.tt b/CC.Yi/CC.Yi.IDAL/T4IDAL.tt deleted file mode 100644 index 7faf648f..00000000 --- a/CC.Yi/CC.Yi.IDAL/T4IDAL.tt +++ /dev/null @@ -1,29 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using CC.Yi.Model; -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.IDAL -{ -<# foreach(string k in ModelData){ - #> - public partial interface I<#=k #>Dal:IBaseDal<<#=k #>> - { - } -<# } #> -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.Model/CC.Yi.Model.csproj b/CC.Yi/CC.Yi.Model/CC.Yi.Model.csproj deleted file mode 100644 index 35ed7c71..00000000 --- a/CC.Yi/CC.Yi.Model/CC.Yi.Model.csproj +++ /dev/null @@ -1,34 +0,0 @@ - - - - netcoreapp3.1 - - - - - - - - - - - - - - - - - True - True - T4DataContext.tt - - - - - - TextTemplatingFileGenerator - T4DataContext.cs - - - - diff --git a/CC.Yi/CC.Yi.Model/DataContext.cs b/CC.Yi/CC.Yi.Model/DataContext.cs deleted file mode 100644 index df55c3b5..00000000 --- a/CC.Yi/CC.Yi.Model/DataContext.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using System; - -namespace CC.Yi.Model -{ - public partial class DataContext : DbContext - { - public DataContext(DbContextOptions options) : base(options) - { - - } - } -} diff --git a/CC.Yi/CC.Yi.Model/Migrations/20210602114758_yi1.Designer.cs b/CC.Yi/CC.Yi.Model/Migrations/20210602114758_yi1.Designer.cs deleted file mode 100644 index 92f2565c..00000000 --- a/CC.Yi/CC.Yi.Model/Migrations/20210602114758_yi1.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -// -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace CC.Yi.Model.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20210602114758_yi1")] - partial class yi1 - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "5.0.6"); - - modelBuilder.Entity("CC.Yi.Model.student", b => - { - b.Property("id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("name") - .HasColumnType("TEXT"); - - b.HasKey("id"); - - b.ToTable("student"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/CC.Yi/CC.Yi.Model/Migrations/20210602114758_yi1.cs b/CC.Yi/CC.Yi.Model/Migrations/20210602114758_yi1.cs deleted file mode 100644 index b5530482..00000000 --- a/CC.Yi/CC.Yi.Model/Migrations/20210602114758_yi1.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace CC.Yi.Model.Migrations -{ - public partial class yi1 : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "student", - columns: table => new - { - id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - name = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_student", x => x.id); - }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "student"); - } - } -} diff --git a/CC.Yi/CC.Yi.Model/Migrations/20210602115718_yi2.Designer.cs b/CC.Yi/CC.Yi.Model/Migrations/20210602115718_yi2.Designer.cs deleted file mode 100644 index 31ba04bf..00000000 --- a/CC.Yi/CC.Yi.Model/Migrations/20210602115718_yi2.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -// -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace CC.Yi.Model.Migrations -{ - [DbContext(typeof(DataContext))] - [Migration("20210602115718_yi2")] - partial class yi2 - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "5.0.6"); - - modelBuilder.Entity("CC.Yi.Model.student", b => - { - b.Property("id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("is_delete") - .HasColumnType("INTEGER"); - - b.Property("name") - .HasColumnType("TEXT"); - - b.HasKey("id"); - - b.ToTable("student"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/CC.Yi/CC.Yi.Model/Migrations/20210602115718_yi2.cs b/CC.Yi/CC.Yi.Model/Migrations/20210602115718_yi2.cs deleted file mode 100644 index 0c0f1c35..00000000 --- a/CC.Yi/CC.Yi.Model/Migrations/20210602115718_yi2.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace CC.Yi.Model.Migrations -{ - public partial class yi2 : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "is_delete", - table: "student", - type: "INTEGER", - nullable: false, - defaultValue: 0); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "is_delete", - table: "student"); - } - } -} diff --git a/CC.Yi/CC.Yi.Model/Migrations/DataContextModelSnapshot.cs b/CC.Yi/CC.Yi.Model/Migrations/DataContextModelSnapshot.cs deleted file mode 100644 index 9021b7f0..00000000 --- a/CC.Yi/CC.Yi.Model/Migrations/DataContextModelSnapshot.cs +++ /dev/null @@ -1,37 +0,0 @@ -// -using CC.Yi.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace CC.Yi.Model.Migrations -{ - [DbContext(typeof(DataContext))] - partial class DataContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "5.0.6"); - - modelBuilder.Entity("CC.Yi.Model.student", b => - { - b.Property("id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("is_delete") - .HasColumnType("INTEGER"); - - b.Property("name") - .HasColumnType("TEXT"); - - b.HasKey("id"); - - b.ToTable("student"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/CC.Yi/CC.Yi.Model/T4DataContext.cs b/CC.Yi/CC.Yi.Model/T4DataContext.cs deleted file mode 100644 index 584f6d63..00000000 --- a/CC.Yi/CC.Yi.Model/T4DataContext.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Text; -namespace CC.Yi.Model -{ - public partial class DataContext :DbContext - { - public DbSet student { get; set; } - } -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.Model/T4DataContext.tt b/CC.Yi/CC.Yi.Model/T4DataContext.tt deleted file mode 100644 index 2fa74f5b..00000000 --- a/CC.Yi/CC.Yi.Model/T4DataContext.tt +++ /dev/null @@ -1,29 +0,0 @@ -<#@ template debug="false" hostspecific="true" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ import namespace="System.IO" #> -<#@ output extension=".cs" #> -<# - string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");//获取解决方案路径 - string txt; - StreamReader sr = new StreamReader(solutionsPath+@"\T4Model\T4Model.txt"); - txt=sr.ReadToEnd(); - sr.Close(); - string[] ModelData= txt.Split(','); - #> -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Text; -namespace CC.Yi.Model -{ - public partial class DataContext :DbContext - { -<# foreach(string k in ModelData){ - #> - public DbSet<<#=k #>> <#=k #> { get; set; } -<# } #> - } -} \ No newline at end of file diff --git a/CC.Yi/CC.Yi.Model/baseModel.cs b/CC.Yi/CC.Yi.Model/baseModel.cs deleted file mode 100644 index 72aefd7b..00000000 --- a/CC.Yi/CC.Yi.Model/baseModel.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -using System.Text; - -namespace CC.Yi.Model -{ - public class baseModel - { - [Key] - [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] - public int id { get; set; } - public int is_delete { get; set; } - } -} diff --git a/CC.Yi/CC.Yi.Model/student.cs b/CC.Yi/CC.Yi.Model/student.cs deleted file mode 100644 index 78c9326c..00000000 --- a/CC.Yi/CC.Yi.Model/student.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -using System.Text; - -namespace CC.Yi.Model -{ - public class student:baseModel - { - public string name { get; set; } - } -} diff --git a/CC.Yi/CC.Yi.ViewModel/CC.Yi.ViewModel.csproj b/CC.Yi/CC.Yi.ViewModel/CC.Yi.ViewModel.csproj deleted file mode 100644 index cefa80a0..00000000 --- a/CC.Yi/CC.Yi.ViewModel/CC.Yi.ViewModel.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - Library - netcoreapp3.1 - - - diff --git a/CC.Yi/CC.Yi.ViewModel/Enum/DelFlagEnum.cs b/CC.Yi/CC.Yi.ViewModel/Enum/DelFlagEnum.cs deleted file mode 100644 index 20f26792..00000000 --- a/CC.Yi/CC.Yi.ViewModel/Enum/DelFlagEnum.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.ViewModel.Enum -{ - public enum DelFlagEnum - { - Normal=0, - Deleted=1 - } -} diff --git a/CC.Yi/CC.Yi.ViewModel/setByIds.cs b/CC.Yi/CC.Yi.ViewModel/setByIds.cs deleted file mode 100644 index 5a41de04..00000000 --- a/CC.Yi/CC.Yi.ViewModel/setByIds.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace CC.Yi.ViewModel -{ - public class setByIds - { - public int id { get; set; } - public List ids { get; set; } - } -} diff --git a/CC.Yi/CC.Yi.sln b/CC.Yi/CC.Yi.sln deleted file mode 100644 index 0a085b83..00000000 --- a/CC.Yi/CC.Yi.sln +++ /dev/null @@ -1,87 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30907.101 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DAL", "DAL", "{9D0D4A54-057E-46C3-BBFE-CA01F7ECEDAE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BLL", "BLL", "{CC5F4204-DFB6-4BB5-9E49-BED084063ED8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "API", "API", "{1A509C83-F994-4422-A74F-8FFA4805D849}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.API", "CC.Yi.API\CC.Yi.API.csproj", "{CDB5556F-43FF-44F6-B33D-AC642E5CD30C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.BLL", "CC.Yi.BLL\CC.Yi.BLL.csproj", "{AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.IBLL", "CC.Yi.IBLL\CC.Yi.IBLL.csproj", "{74177F89-72D5-45FE-8A4F-91FAD9E03D36}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.DAL", "CC.Yi.DAL\CC.Yi.DAL.csproj", "{72FD0850-15FA-4A6F-B865-E1B38603307D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.IDAL", "CC.Yi.IDAL\CC.Yi.IDAL.csproj", "{BD77D98A-9F28-4C2D-A260-C3BB919B58E7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{123D1D39-849C-4220-A973-EB9760421CB3}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Model", "Model", "{38B8D898-4BBF-4DDB-8E29-6D6CEB7808C9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.Model", "CC.Yi.Model\CC.Yi.Model.csproj", "{8827547B-E04B-4430-A0DF-E87FCA40E3AB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.ViewModel", "CC.Yi.ViewModel\CC.Yi.ViewModel.csproj", "{32F323F1-E2FA-4186-AC33-263465012D15}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CC.Yi.Common", "CC.Yi.Common\CC.Yi.Common.csproj", "{9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CDB5556F-43FF-44F6-B33D-AC642E5CD30C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CDB5556F-43FF-44F6-B33D-AC642E5CD30C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CDB5556F-43FF-44F6-B33D-AC642E5CD30C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CDB5556F-43FF-44F6-B33D-AC642E5CD30C}.Release|Any CPU.Build.0 = Release|Any CPU - {AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6}.Release|Any CPU.Build.0 = Release|Any CPU - {74177F89-72D5-45FE-8A4F-91FAD9E03D36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {74177F89-72D5-45FE-8A4F-91FAD9E03D36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {74177F89-72D5-45FE-8A4F-91FAD9E03D36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {74177F89-72D5-45FE-8A4F-91FAD9E03D36}.Release|Any CPU.Build.0 = Release|Any CPU - {72FD0850-15FA-4A6F-B865-E1B38603307D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72FD0850-15FA-4A6F-B865-E1B38603307D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72FD0850-15FA-4A6F-B865-E1B38603307D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72FD0850-15FA-4A6F-B865-E1B38603307D}.Release|Any CPU.Build.0 = Release|Any CPU - {BD77D98A-9F28-4C2D-A260-C3BB919B58E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BD77D98A-9F28-4C2D-A260-C3BB919B58E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BD77D98A-9F28-4C2D-A260-C3BB919B58E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BD77D98A-9F28-4C2D-A260-C3BB919B58E7}.Release|Any CPU.Build.0 = Release|Any CPU - {8827547B-E04B-4430-A0DF-E87FCA40E3AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8827547B-E04B-4430-A0DF-E87FCA40E3AB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8827547B-E04B-4430-A0DF-E87FCA40E3AB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8827547B-E04B-4430-A0DF-E87FCA40E3AB}.Release|Any CPU.Build.0 = Release|Any CPU - {32F323F1-E2FA-4186-AC33-263465012D15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32F323F1-E2FA-4186-AC33-263465012D15}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32F323F1-E2FA-4186-AC33-263465012D15}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32F323F1-E2FA-4186-AC33-263465012D15}.Release|Any CPU.Build.0 = Release|Any CPU - {9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {CDB5556F-43FF-44F6-B33D-AC642E5CD30C} = {1A509C83-F994-4422-A74F-8FFA4805D849} - {AE9B4D8A-0CED-49D1-81C7-EBD221E41AB6} = {CC5F4204-DFB6-4BB5-9E49-BED084063ED8} - {74177F89-72D5-45FE-8A4F-91FAD9E03D36} = {CC5F4204-DFB6-4BB5-9E49-BED084063ED8} - {72FD0850-15FA-4A6F-B865-E1B38603307D} = {9D0D4A54-057E-46C3-BBFE-CA01F7ECEDAE} - {BD77D98A-9F28-4C2D-A260-C3BB919B58E7} = {9D0D4A54-057E-46C3-BBFE-CA01F7ECEDAE} - {8827547B-E04B-4430-A0DF-E87FCA40E3AB} = {38B8D898-4BBF-4DDB-8E29-6D6CEB7808C9} - {32F323F1-E2FA-4186-AC33-263465012D15} = {38B8D898-4BBF-4DDB-8E29-6D6CEB7808C9} - {9D6E5DD7-FA02-4532-8BAC-406FB80AFEAC} = {123D1D39-849C-4220-A973-EB9760421CB3} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {22DD3529-6AD4-413A-B7B3-D8335E6F47C9} - EndGlobalSection -EndGlobal diff --git a/CC.Yi/T4Model/T4Model.txt b/CC.Yi/T4Model/T4Model.txt deleted file mode 100644 index 36227abb..00000000 --- a/CC.Yi/T4Model/T4Model.txt +++ /dev/null @@ -1 +0,0 @@ -student \ No newline at end of file diff --git a/CC.Yi/T4Model/T4Vue.txt b/CC.Yi/T4Model/T4Vue.txt deleted file mode 100644 index 9b429e0a..00000000 --- a/CC.Yi/T4Model/T4Vue.txt +++ /dev/null @@ -1,4 +0,0 @@ -student -id,name -id,姓名 -"0","张三" \ No newline at end of file diff --git a/CC.Yi/T4Model/说明.txt b/CC.Yi/T4Model/说明.txt deleted file mode 100644 index 7abbdd18..00000000 --- a/CC.Yi/T4Model/说明.txt +++ /dev/null @@ -1,5 +0,0 @@ -这里存放T4要生成的模型 -使用英文的 , 分隔 -例如: -student,teacher -点击 生成->转换所有t4模板 即可完成生成 \ No newline at end of file diff --git a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs deleted file mode 100644 index 32d475a2..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs +++ /dev/null @@ -1,222 +0,0 @@ -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.Net5/Yi.Framework.ApiMicroservice/Controllers/FileController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/FileController.cs deleted file mode 100644 index 8dcae4c7..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/FileController.cs +++ /dev/null @@ -1,92 +0,0 @@ -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.Net5/Yi.Framework.ApiMicroservice/Controllers/JobController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/JobController.cs deleted file mode 100644 index 84566713..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/JobController.cs +++ /dev/null @@ -1,104 +0,0 @@ -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.Net5/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs deleted file mode 100644 index ce14e68b..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs +++ /dev/null @@ -1,113 +0,0 @@ -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.Net5/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs deleted file mode 100644 index 7c0ee94a..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/MouldController.cs +++ /dev/null @@ -1,69 +0,0 @@ -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.Net5/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs deleted file mode 100644 index 46fe2cc3..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs +++ /dev/null @@ -1,106 +0,0 @@ -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.Net5/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs deleted file mode 100644 index d101bc9d..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/SettingController.cs +++ /dev/null @@ -1,60 +0,0 @@ -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.Net5/Yi.Framework.ApiMicroservice/Controllers/UserController.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/UserController.cs deleted file mode 100644 index c552a081..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Controllers/UserController.cs +++ /dev/null @@ -1,147 +0,0 @@ -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.Net5/Yi.Framework.ApiMicroservice/Log4net.config b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Log4net.config deleted file mode 100644 index 958c7e78..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Log4net.config +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Program.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Program.cs deleted file mode 100644 index b9a68835..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Program.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Autofac.Extensions.DependencyInjection; -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; -using Yi.Framework.WebCore.BuilderExtend; - -namespace Yi.Framework.ApiMicroservice -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - - .ConfigureAppConfiguration((hostBuilderContext, configurationBuilder) => - { - configurationBuilder.AddCommandLine(args); - configurationBuilder.AddJsonFileService(); - #region - //Apollo - #endregion - configurationBuilder.AddApolloService("Yi"); - }) - .ConfigureLogging(loggingBuilder => - { - loggingBuilder.AddFilter("System", Microsoft.Extensions.Logging.LogLevel.Warning); - loggingBuilder.AddFilter("Microsoft", Microsoft.Extensions.Logging.LogLevel.Warning); - loggingBuilder.AddLog4Net(); - }) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }).UseServiceProviderFactory(new AutofacServiceProviderFactory()); - } -} diff --git a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Startup.cs b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Startup.cs deleted file mode 100644 index bde35395..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Startup.cs +++ /dev/null @@ -1,180 +0,0 @@ -using Autofac; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Yi.Framework.Core; -using Yi.Framework.Model.ModelFactory; -using Yi.Framework.WebCore.BuilderExtend; -using Yi.Framework.WebCore.MiddlewareExtend; -using Yi.Framework.WebCore.Utility; - -namespace Yi.Framework.ApiMicroservice -{ - 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) - { - #region - //Ioc - #endregion - services.AddIocService(Configuration); - - #region - //Quartz - #endregion - services.AddQuartzService(); - - #region - //+ - #endregion - services.AddControllers(optios=> { - //optios.Filters.Add(typeof(CustomExceptionFilterAttribute)); - }).AddJsonFileService(); - - #region - //Swagger - #endregion - services.AddSwaggerService(); - - #region - // - #endregion - services.AddCorsService(); - - #region - //JwtȨ - #endregion - services.AddJwtService(); - - #region - //ݿ - #endregion - services.AddDbService(); - - #region - //Redis - #endregion - services.AddRedisService(); - - #region - //RabbitMQ - #endregion - services.AddRabbitMQService(); - - #region - //ElasticSeach - #endregion - services.AddElasticSeachService(); - - #region - //ŷ - #endregion - services.AddSMSService(); - - #region - //CAP - #endregion - services.AddCAPService(); - } - - #region Autofacע - public void ConfigureContainer(ContainerBuilder containerBuilder) - { - #region - //Moduleע - #endregion - containerBuilder.RegisterModule(); - } - #endregion - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env,IDbContextFactory _DbFactory, CacheClientDB _cacheClientDB) - { - //if (env.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(_DbFactory); - - #region - //redisע - #endregion - app.UseRedisSeedInitService(_cacheClientDB); - - #region - //Endpointsע - #endregion - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - - }); - } - } -} diff --git a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/SwaggerDoc.xml b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/SwaggerDoc.xml deleted file mode 100644 index 3173de6a..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/SwaggerDoc.xml +++ /dev/null @@ -1,278 +0,0 @@ - - - - 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.Net5/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj deleted file mode 100644 index 2290e099..00000000 --- a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj +++ /dev/null @@ -1,39 +0,0 @@ - - - - net5.0 - - - - 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.Net5/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102231510.xlsx deleted file mode 100644 index f1634a6f788bb05251c615f28f2cfc453948c933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3014 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 diff --git a/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx b/Yi.Framework.Net5/Yi.Framework.ApiMicroservice/wwwroot/Excel/Excel_20211102232113.xlsx deleted file mode 100644 index 428fa1196412c9310c9e52bace461381f3bac677..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3023 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 z 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 diff --git a/Yi.Framework.Net5/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 deleted file mode 100644 index aa4daf73a8242565ffac4469083aa29d20c1cff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30394 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 MP(Agz_y2qKf6`TAZ2$lO diff --git a/Yi.Framework.Net5/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 deleted file mode 100644 index a10702580514d498f4e6ddeb86a7a85f5f203767..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14035 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 diff --git a/Yi.Framework.Net5/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 deleted file mode 100644 index aa4daf73a8242565ffac4469083aa29d20c1cff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30394 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 MP(Agz_y2qKf6`TAZ2$lO diff --git a/Yi.Framework.Net5/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 deleted file mode 100644 index 0e7512eef25af8b74ea259e183fc3f3aeaeea583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47955 zcmd?RcU+U*vM3y|p@<67q^k5TC3H|x0-;4hClu)ah-&VBdyJKwqIe!sKNKi{N0^Q<;&*34R2Yi6GO`u=N{Tt?XkZVLc_ z!TbOU003|u03f>zAR}RaUIGB_kdXsO7l4ouDfutyxBrq35Bq!h7*aVJvP*xfOF{u+ zq%yRmtKaXN)c@TMSNPw{%l{@q0bP*Ys`lk_5c2q32>yF^X)>kEM8 zcQ>#6?(V+>8Tq9vSFc^BAmu9G0g#hjBENj;%9ShEE?v4zQhQSFW$G&ruF{A;y{m0; z?V*_KAGAu)xNJIl4joGd@n>%F3FXgUf98}J-~#GeRc!B&nqeljPk!m2iCq306;h@+ zH7Sz>WS7YCocA0!&ommiQQT)F#Dn^p{J!J+hrxNG*n?DkbU%eeAij3zd)Fjhy?ar}GZr_mEbsgd)$&6~ zZ7yArkMqLF`7pH9b^h67B9qi@RUv^$H>2pS6wV`~fd{m^8K)0sGWn<%gz%*DZE;V?*VI&3>rTPyy3q9JgSHG2 z$4%W~8%bir^57t;%L+O9Z#fRMlWJR<%lCcfv9ub+OkqhMb+KC*(C zne8reHfDolicgDgDrr8bw8;HjWratSLVvy;6j6UuT(1T{?M!Qq5)%J9WQzIX*T#_Q z7ur5mJC-q|fLWtA3^llc^K_rq$S=D(1V0A)nwJ`d)z8+i>7PIglRfV;yXM~;Qk;7B z{4gaSAzxKm>8N*r&b%viLyFdkkDpM;Hq~&|#Qq^R?$oTk~J%y{atpPeVWiWoUZLUG1T*YsWtXNLE&dJ7p;Jr|swo;08AotrDhLUVh!xSy%^BW8NE zsx8#}zLkaTgUxk!obKvc9{$Yr!l=>j4@(OhcG!e?KKc=HxU|@P>RY_ujilJs$#3%M z+*ow9kbmh^ZR#IViwRA-pmuM6KMV1y+UJ@m;yi#3ITZ;GVNcf0FT#SO3*o;2lgLah z=_9`Fs`4*_yA2j)+_8F&io}_-F356)uZef>V+B;X-?Z$*>LPak+;MZ|UjQnQqo+ip z!SgcgaGwC0!9B-aD&uEp-63JqzRojQ!gzV~nZAarP-3^JLhW=)p()%TuC}INZm1i) z-aFB94t^G1wd$#xjH1G_>!8;BG^)D8WPLp_{Y7u_6R5kos2-V5L;kvE_KS-hMLu=X z&WpFRvnyLC>#VA}m(9nawHVHM==F7LG2N6c^%n)yaqrN7TjT%5!X~E#RwG%}I}%?LxEe22U=yD%V3Q%6PKXpXoDL-kOPMhZlBc&<`K($dId!vke z%FjC$FEDaA5#RMDWo#dsm z5G1c(pLioRss${fq$@f^Q5$l4=c8Wn#H_95yBb;7c!c`;%#7UkeL?> z?oP;}9W-MFbuo-2WGj9;3cT05HjvoZrUulPF&Fu^QUTRGO%0u^-_2JA9zPyaeeJ0o+6p z%!%Q%n(y<}F)kVb<5V*?`HF@3I5S| z99NYrV>&a>&CfpW@v9C*t#Z8UytiF#Ce*aMEdR5TNYHXwA`4^8RLW)}FC@9ZP{38w zNvD%mYmu66)RvlA#d9E$GknpMB1$7)YCA$1*bG96nBdP8_Aw}I|CDPbFo-)+4{n!F z8K79P0*fo7>NfWw_GO38$to%)3e`k)rX+P{QW*sDFP(=WW)g+ivHTfEy~~nCE!sXu z2^Wx@edAvM_#iK&=56wFz~a?e>D`lzUw}8Ob?HE)pyQjcgo%>ap_gxF+$sp-AtuV6 z;kprgrfL!Y14}F-Xkeu-ox_u{xZAc_+(DE@#qMx}X)es9ZCx|)V>7n*qZ9CMvhIk{ zphPF`J2ZZI&ONd`ksp75M3fsf|5n&EP*Suv;Ia2Lg9tmhxSInXw;OGGWNqs*VG84> zGv7Do1viBAf0_p12AkQYC7rcrxOzKMLm~A1+DScjJQ$}67oe!{u$?EFG#`BiH{b^I z+LpybTaWM+16zcNx{+=jmhOluspK1c2)%G(MQcBLL{ry<(@7IuH<=x@{Rzc%H~6fw z`Fh0fiKh0L-&QYfrqxJ;mzgjv(M=WVYh&1BOtnWk6(v$GYLC|z?cb(B&f16zf!A89 zrr22VQKlT}EVs4r8N_VRbfyUw_-1*Hi6527XmvwkuK8I+lE0Uz3go##u-F`L#p*tW@RwaCDy(OgBYzF?Z?s#Kk70>ZSyWZY+K^62lGM7UBhCV` z$u2WCHC$C%*rMsj+#6TYPvC18i$|GwbjHqYUaK7_)M~6U^@qzZii8ba#i*62`{G(O z!H?qx+P)4ZX)t?o)&zW(n(;s|In(KepoK>zf@y49kwr#kT(iTGq)kjdVq!dWdz=T` z{Buw|vmjJoXm_ve6dU*cFg{qvS~-YuHAs)UA>8eN*ORYf4##+*JzGCg?2xv@U-rD_ zp>5(}>U`CyHOn9@DE}^Oj!9o)Q7wtfph=D~P$d#+K*S=?r5h`WFM}hD%bI)mQRlmQ z-CxVj^vi$LoJB?M)fKMkIqr#n@K>C@ZZaH$^@SX}{9G0CmOp3xQx7j&UQghdg|+SR z;t6YB)r1XuB@`p?V1BhK(YkY?IVLr9m3sNa6&1BuaOk`Cy}{o3UoXqw6ez4;@d**4 zl0iFD44^M?CSOE9);KLx4WYa6aY#jWF4h)ZTBtU!e#EbEE)lN+5z;Jm96CvPzH-;J z$&Dbvs-jk~GHKic9BvmX`_{pyMdSYozYr+uYUSt)iEm`o4NCxJeMx7{ZtrUBk-hU_ zo@G&(xN4J>W*Nqg!OduoGl)f=BnLarl%3*gR{J>PiD;-M2tu>3AVn`$ldCn)*ADg+ z(jR%hsz=1fBKQ$fiFZ}^#f2I%c?BC4?UChigR~HS$UPOiA!&wZ0# zvq5MpcFsDsoW>G-94MaoPDddQQZi=kg<`j)r&N> z-g#p`vVP*@_GS^>mNyP+&L7-y#)+&NNo5#M=?$zx)$LVyS1qv6CF^FFf&Ic68^T86 z(k;5X-HK7=$x#*{$MY8&Cxwa|hRxh5Gslt#GcJpG{oVLQ-o=T)_FxeUL0c$Wp3$Y#qh&pJYa^at!USpRq!W+x#x+T-M6U& zU1s7rGVcT(K>DmDoY>NHWRg>U6ye4P`xJT@=X;UdVoT9g0{X+SZ}?+zHK+;2X))*#W3p8xFG9A5`@13Kufxpnlr z&0bgOW<2wvYZ?D7BVC=((Xs5VlA>p7;PbdY2+pORa-EaY1W!bFaWoEcZzFW$leLd! zR7qiRnU|=4TARK51OXdOl$OC`F8rC&_xbA_GyA4BbsVO^#k1=kd`b9HG?sSU&!=>D z)^s?`lcVHJpmC=P3u|^Y-}EaUWfp=|^X=dV?6Ifz;*2*GZ}onMviF z3iaQZAVT{h?jqvo{=<5izT-NR2Xr$Tl>*2O1C8XL#H`StCKb)7B>C+A-Ebl(*Li~@ z3^^-M7zwG&9~2vz1Y=A)BsNzTe{#pMiDhwHbaEvrrP?JiBpoO+?PD_2D>aiXw<~+n zPvXYCDJQ$7IWlEFJ4zn<`{n2d-&vm&Uc8CsuKlPB`m%WQ-PJGgN}TBbex>4DGHU(q zE*x6D!&Ch%c6w&{ibS^4uN5X!eJZ(mF!Gh5Pwu~KLL1)f5h|pW13x8NMUp)RUA0! zZaiz6&YrDnV{0Y446HElD&Ah>c ztPTGHJd-j&3F%}$DARBHR3?lVw&A`|7wR$<``sLYFC0M!*5N`WLkIQ~ zEc&7q(jC4@NVf$*x{|H-5s+sWXP{M<1{A^@-Dd+a`Ld^K0` zUCXXrwo7R)@O?Ywst6%5m-#+%|P{Fns93M@(FL#&EGJiW8cHOll-u&4s zZ6#9?P_^`Vxcq|nv$*P5b}LPOB~bHwUdQnbY|~wo&r=aIZTQ%yY`P z7IVAywNs*M_mI2hr@=9naEI|=d>VS5xn9++tdV75%wr4gCp4j*j?seD8>(;=<(T*P z+G`n}3s|*E>*k*zco-IX=;yyl8AzxvuW5Q~)T_5NHJV)@(Jc~+x zyv)Kxf~0^jHBKArs;InRw;{pI{JdOK&CEFR z5%ImxFxN4JL*2ej*_YFxdz!0mXN_&RB-19Ma<-mXFOkjr!as#cpTJwJlS|R8`lEqr zAm-z+WQtC#7*svi`i=D?CJiq@0*IP%m-CWp2kt(}G4+c44&Y{h#eKln$6`zx@9uEE z`wp-NTv9~}P;vC>K&lI~6dGmhn)y3du8JEbX~W-=Z-ol3*}AxeWLY0R8kOhr21{M% zQ>loQ@=910U4>WQ=yS*w$}wr5YuOy$9nR$~dn`7^G|UTDLocZz8_ezv6>4MjqzRGn z2O#dfw+>DT==<|hGh8rNeO%UI+lstzG2BhP%`>O&IIYruKmofl>h!2FDqDMS?;cC#s-beDv=|Q&anxhV$dVO&B>q~{p z-{Kejo8B@d`TNPdRkJ+gj2SG5XHfcYFvZi>TD)6&PvnJ^x+dvVj;)`+%JdA)Yzn0* z%uOEilxNDs!SeT*AI7h*EmVD)lpmq(q;Xn_<-DJiM4$#LBe$(-*5*@RO%z+0odW5(eXv{ayqd+Xo@iA5iSJ zaVBeciRhp(a&|8Tebho}G43KX5U*76suJFb&mc4hi!Z|;ZlC7pZ1=b&XI!cQ-&>z_ zyuW;i0Q}9+{rBA|ImxR9_zPHgKf^vD>pxmmn#jJ7Dt{IO5$a8I^uESK$QjLE`>k(! zRjoP%X_Ykb>SV2Vz=<^GG_bTm-iTb@%&N!a76I?-tVYb@GIou(jrtK`Sn4R#mV|M~ z4(mCtcBLn4hzHNkz;{D(RSdMij&mo0H-)h+?+P;1_2+&8t`|>@nT&VGS8>J4JGk$< z66trACYDiBMiqo*P)UhTuaIxvF963BQzV2rOKK&xXEV_ZD7eXWU3oKMEJOTlBW9ps zv4)USK!CZI?CtUOaMR~<#o;vf<9$Wi%?{71Uye6`FTeT= z_y2b&89?z5z-1axe?GLOS1rJ_E}#EgLCnfiL4QcKCegnxEBGbfw3*W+Z!prx zabKc|>oC*~)9&H0#B{_e&N?Wu$$J>)jdOvJ) zNxahl$Rz;ePe@)WtTtktnW7i3W2X^PU89At(KM@c1>~8toC*3hlC3i(YLDJ+vzZZVaIZ|(dglEjf zNL2RQf8uM$v@3k)>7TFbpf*R==-}M-)nvvMlKZz!O-7nNB^vK}@@p=3R&wRp({1Gy z_DBzz!jy}Byk!lVOrN#dVMm$@v(HuC!LQItf2cbH?rDzSTx4Q(dLkAp_WOHt(WFJ#kl-adSjQC*{9E?G7>3- z-jsG`m4fk>gWEFSk5p6}kqD7h$U5wx`AyBYtoqoq*qY!CABC+4%_$p6$=z9icgY|0Q`cc~}gYSrO6kD7Jw4D2A*~=14H)LAlLAlFc2L8W>UcLjd1W1L9sr8v8(jK*N z*v9d{Hx)A~bH71rr(dE>q2kT`wV^)SMoG_!A9N?O+cDia`gpFo$V@*8$VF+reRNzS zR^lxvxht zVu1!kk4HO)*kpm$9G5;x0n^r?0ozeV5OuT#i^a>L>h8#zSHu$x5YB zWOmGN-0uMHkT@fMLRwME3ieZqb#H%QmAyMttKz;w88n-pL~o?ar{z2um9Ps^8U@vU zYIWTn#TAaN>FahNMI*(w1R3aLfZ;^Q05faz&8L=n2uT~qs(SwbOSIXPk=pr%C#CM} zw=;N^$643bot&AX?_Z&_6P?Zy$(?BqaIWpPTPkB!dNop<#iJ3bNP>^00zxlXkZqjh zv2|r17((c>3<~wg8F91E)PiZ{!`3=F%w`v`x!;G(HYjrT9USKe(Gb;Tl??1+R%o!g zxh>}W(@$kJ6mXDoSKz9gO@T_-wXxeb6qTPay;ymAL4bMfXHA;N1-$m=P5sg^WBs?{ zG#_(;TRJMmcNYcaIriK7K$S_b53#JKc~$(?_!UX48u(NwR+7bRwyDLEUIs(-v0qH~f)H+oB9ie!=errDn2=`{Uvp(pi6&y>)nU|%q;HNqf@V>{=0dbeLpp2$=kkzT#Wj@wOFOH&|-rY6pFhZlysp=wu|YN7qSoR$qLZ?rb;_v*2sk zdq}Y9-I=Kr{=9_4I!1Orr-@J_Dc^q;?q3Ixv4(TL3Q?CYV}(#HZZK2&j(#edZJ`vZ z_7mQO8ygeKj1iAQ+$QX(=h?(+M>dxnL0a^L3E1N(LRaEsc_aS%ydtoyWHhm{9xe1? zr}DVTwgicU?iS`!)bK2RFCCdK*|1SVyNxx#nG{%Mr{wwcg6|&4GP*e9S!#8c>saM( z@asW6{i~xpwD+doVAXtDGbGbg0g@y+{2Q!Q+y}XC;t!tBSNJICr#ki!8ox?3j7w6o zv0~I`ichlQAUpzWyiRQ$_@(N4rFP=VTq4g;2M60?AGn|zF`%!D+b@wq+Yn1fxA>aK zkrCI``K>cPm|ZJTdcbgFDH}UJv2jD&x$j!3#NZn3-55z_ZP>wNnYeS(GRA7q7j*q* zM|)u9_#*&&{Np<+MP#1VU;4T%9~c5U??1Uu+Erq&D9hY`^hiwXvX$i{y^KiJERhfd z&)6$KtOz=Y7s(}@8W?$G@zAsC%g>}m2=$&|9lThLFL!LhZ8AG<(ogopa?_&-_8#~( z=X`Lo)zoFm*f*o9Hg{1te~904t3R7(@r~@R*g)a2=v20THZ-~x@$^g8;gt1^z}Ud2 zC_O%$-;WkEm$hk3)yIaE!PcIVy85hyFuz{_b+hQ&2;tEhoUlNjKrF%LG(P&}WGa|@ zVqZq8>Xz8f!hZdYrUf&8u(w!A045X*xy`bZVQNgoBxV>eBmAXUYf+LTBPEMp><5j| z^>J$GHG=L+TNlLUjdy>Qp`o@OLU1_PXW624JjtPGToI+N^&#_a(NX5jeDbco0@-2I zvo!IhKgs^SXT0f2JvPtQf1Opo)$Mt0jnMd}lCqVF%950o3aY)D&TTE8_!m*i)u^|DkY$&an5Q&OAjpwbc~vpx^DwuK+o zs-a|E)E=oXM4o7i9)kr+b1A>Nb$l%#gYffQes!M)@Jf}O>^>=+?>Aijx7&Zqx%Vta zt^G+QuY~rV0=rU#&Q~^pG&Lz|7u@9@uU~+t87zdFqhy~GW}R4D9j?T%IXbAyh$Z_o^2j`FBPScj9o34QVY zZs4O!LAlv}++60y0CGPKea^q{J+IK+CuwHh&}w9t%@C)Cb9RC2t=G#~Z%3B41Jyr` zCPyl3QGPlu>1J*zLkN&~SG(m1lSJl&{;3QjlR-#JAXMeCB-_Zg%@EE7LN_?-kPE6h zapEhsdQAQ4DR9PtT@o&v*q-dKwHY#L%I9G^FfDBmzHx9NNjJ|~STN_>+1+WXj#b~t zTBrEht0`yu?$z@aC~5uwFTm5wXm{nt_s{e2e8qUwD0DvFs2gY|I*0J13aPbWaMcD< zM7DQkJfrHEv@EvohLmR_!9YHq?UUR%BF1l}af#<7xm0+~+)VdV3HPE@lNqtC)sNq& zzU(GuJKwA|3NK#^yzPA3zHl(UwzxS;II5HRnk70@6x9`j7ofhSS0agi_(U@GAFCvV z^X+>)O*aF*c}Gq|cx%C%X4y&@zjU86$fP55^f(O`8F!^a~b_FCV1Us zv|~q+@1=*Fov)^3>wHL5&kBO%?24m*d?=3={)&61aJOrZe=*R8umIyKldHsdTLP`6cQg{p_qo&#oQoF@~iMA zFI`K|3Co--7hPTr#5?Ld^O!80D7BeZ_$CmwJi@e^(r-i2Ewr_4ffu3&&aG;jRP35| zp9h(ISv5JIbbgQcP-`5$tn0C=LZi&u+v7|hCW{1S{$uh{3x~YDBFbBvOBs19L-~E@ z%TI5n7{572Yka9a#OL*Cm2oH8cYAa~%A7Jqwl|uGWFK^AR3E7{9j!ce-^=hpjc=zJEI8)u)mbse#H*XH}tL*74E-u=%TGvR%iV)p^vBQ5GGX{%#(_F zzPpPyFlh>hGfi|CA9T`!uYXVX-zJ=^%QaOm@jr}ux;_&))e`qYmc7h&q?KZwhpy2=)5U#Z_`I)f7}3_iZ*y`w*dRxxvksN zu?v6yr|=Z4ccdO8UuO2LVw&w%kC<|LZSkJ~DLC`r`tab8EM30zEri{iPy zMh9s7nPV$U5n(jGNpFb1FM6Y!ALN1L5^QTbT<x@j#Roei$^KFxGr5jPY#fRR=3nC8%w}+n7H;x)NX$0qZ1xNYV#b8S?5;9~Pb4RE z4^~PwO?6V$k}vQB$f2ZRq?nHTcym+EI+jXH zYN;Qqm-?r9QhI{ov5XkH0hUq&p2p{OECF}-Zfq2^hbpQHat$yHXy}&LO52IMD|BP1 zshL7m?^LMnb9r$75fA+v^Ey3rlQEvFS6*V&IWp`3x;K2^K_MUL$i@D%{lt^6G!$RI z(kd)`MSF2!(-SS?Hg1b|vFb0bv|5f_i{?T#57|!-ppCyI?Ig$HCMUE;DzSPNrLo_p z7q1?fYB=HY1;&k9mel!9=s%4SD~tG+KHp`JdT~XMPc4yT{L7EjS`_*;kzk+Nn+LeJ zNxcl9A#D-ff~l+@>aS^|+U_YK`PCU^4lDD!A&suVl+%LCC3ZL4kmDwv%u<_kE=HQ( z0=8|7%ua2A>ePP*s3@=-XyfExl%81E+iWD%!n%Ms5JtvU4EFLQ^+h7nWSJ=1>qNZ# zOlr=4mC3_Ffbdg+cRkC)wZZ_pHeWs4Bm%|sR}(ArG4V|kiR5Bps()9T|2OM0v@6{D z##2tIKdSjYt3OxEiJT18mKt&vqrp9#(%j1m4GQh`s9Q%)nwLQbJd6)2w|d;#c$&<- z#lq3gzsURoR0VN*OF`7Cap%(V1o)8zO0n0V#--+Ucf#62l;>J6v0+WKRx7tVD1WwP z99r{Xv#@Lq>~KMO9$*H=q;aRD2_U?@K4PwHm;AKL3ptDTLNbMk_`d`E?YQ#`z#IGW z-k%!@?14E}P47NV%i7g$3>EYEnt}u-O^qza#|`xKq)QvmQA3cAp&1R9@x%_DjPAa} z3*ncoizjLq8I5uXMHYG*1=Z@zF##3!pul>%(ri~!KqV4Ua=c*2P;tuO4HhDYrO04Sf4Xyh==d@7^mBj`~}rbw5RuY zham!ADL>TAiKJ1dqCX~U{V@5D7SStW$$U3*Uh3bF8FlOkFJD`@@+4aqlEZRLnld$W z#rvo6*mnY)81OCUCtRg%sc{`jJ5)AgOAn6t;}@+Nzn!N}K9cQyU-Wq-mqj<$#2biZ zGsV=T9>`wKP8wGoIp`5-NvOrLX6brJ2V@)wJ9FGRd->`stlG=(=$38$I^ZsAv3z^QIqZCr^BoEsd&l)@Gef+a~ZXII>_J^ zUxW5)?~rY(PQ(xjIxX4_Pg$lxLSD^pM2rLJ@@KRO#eAkZ@OH3#nfMGtVnXybgjHui z$j&YZBdhLXk+zXl#d>RT&VU;8)7CA&E?G%v2*J5yj7akSs8d~bqdag(LCqKDAxfx> zKnZZ-d$TmV<_;h5alQusai9Fje>9YD!Ot<>O_JnlTp_2k?^g2?*1uh&+0jdSXUn+^c7>Y zE3+a>Ycc+rUZd#=wfh_MdHNDL0+w?Ro)&KrGR<{ZH6WUiaa^}dGQ3$PJj9hg!aQjL za85oz1*aiZd`8=pvX&@}`!u8xSbkm2Jw96h!Ue&ivT;eRKbsdCUuL?|&CuWPQ#0;J zERjvB3$h;wWIFpgU<37B?15@Q17R;6nU<=A%ncHv`MXexT_Vg(ZN|e$NGje)3(}AY zQBF$nF3{H%Dp1QyTW{X=P-Hz+*RQgI>1DmGJ2vb-|C3m?qF*Gal#a>bN)Uj59-o?n z=3<8nvXVOd2S3TF48nOQ##;p%l5RE#!H14H7z5t1KYnay@?_-~U_CD@4%IYkYNr|F zAKVV&f^KSBZg2r$2bSC-}#1al#wdbWY5Pm@MbCm{*hJp{sMC5@s{)3T1fl zu5k3c-p1<0a0Y+BYdRa-lVwsHjv3*g%0kFHI6LHFvPG@YCjTLh7&dmZB}mTWBWlFrX_5}QUDI2JQ}9HlwP zD_fI%=dGNb$gWH;e#2J{ip9X1xeOj3UnbeWSiR9hn1qHhqIc2+|L#&YU)=)8|}(~2s&&po)j ze@rS%LyGJKTK9IckU#xO35IJ7)pw&eHW5!dHuoHy&&4++p@<0`GxaZ~)TJ{n7#SVU z;>ECI`5vdaX-tN}jdw1td(XJ!N=t)<_lHSd zLV6*rbBp2oMygh&W09dw9X>vt$;fD05R3RGtnYm@MIlNXmtw{2o9xe+PxH6OPyb2H zNH=`wTKy*lInKzd0;ed|hb@=!v7%^1~+PSE|(ZRo1em2Xl9 zip$m~2=EoRr*57xhvugsv4d^=u5Rrnv3mTp8!Mm;>4G-L5G(xJ*2k5-)-Q`yTE!M6 z$l4d_)m5uZne~AJJ)qo>N(x6>3Fd2o!IwvCHTNE;ipHjNR_}46mfkwh;X@ErC#!-D ziK0Qi-a;pjnLK)0L=CkKm7fYa+)DR%pLd^pb&2y8iD71M#=iOma-ygBQpF>Dj$8t4 zf8TJtzWe=92+VXQyB-E>nGUhI65htRaS5W!dmJCb#c50H;v!>|KT43DH1R84bh~HM z+g699N~U5OoV@&sCI>8)q+%XNXV=vT`y4xr_hV8nVJF!onT)DZwTt z1S9pS$knkH>9j~^pZK48{94+1X^Z&{Vf3yFeRmLUMKUC(!vnejM*10X-m7 zPw#Cq%=(vdG>7s(Lc|AuNp@hPVpc0FUZpLuZ|m&DCXTT`-Jbpf`2qeh8+2VuTPv@; zA%$Gx7SqtN--yIUfyiA(w|4hcyN9)YfocS~1-CraV)7?<4xhg}>?ZGdzEC$Sj`G)= zUH(4R@uKGSi?XWtWiPvkB}bIpxJ@3v3#v`OV#TQu@IzT>zS^xT%#y}|INoKyI^82Z zqS*m%Dx6r+()=05tA5+^BBMtgR$zeTx%YYTC0a30T_jCT>|Bja?GpFuinuv*fD3GSv$I`ofcYg{4z^Nj|lY*WDkC%Fdl>P z#*KJxZu00m7dh+w+jSWB_L8YiLt(N$Sz?a zg)|sDME@Y8=)Mtouk;ll{c zve5(^HXAcHjFPU7n6U>i8~&bgS04NK7og6(MA1Mqp&^qUZ%yYxb56v&G?Z$W2$lR# z6|IJv(BTp_owETM%v3{(6IM&zr!wPf@!-!F^{)fwp)(T5MQ^Jc5p#yEA_zY{R;6_G zTy1$(T(L{zlF;Z_-bJTiS|T5oMQrM!*pTBrZr2$t*I+AXOHC+LXsZep_S&a3|BnKt zP~RH3zF}%#>*TjJCS4%2Jg>0NCW;)-10w1YQy2YnGqPw~h%EJiJdXMdv@0Vd555*( zej~(k+3gp=HXTBGW_NJ2(AIT4Auvcq9R(Vdlw5!Dekhyr&unl-&hMk;KLf=}uv5OI znT-)&(ppf6gK_UqjYTtpbm(x=8F%y^bpqF9*L4+r; zK)?%&r(_;WimGx0ILSFY2) znZq8LXyYySUbM}shC}EaLpkjeNS(K1vlZ*h?9(k8QDZhGASas$Yk%mDOfAKKS?yd3 z$Ys+cK4yfl)lX%XaDSdb&@Ol6`8CH4;MyO(4xy)6Mg}~viSqUuVW|s1rEvYx(N^fZ z7^9IOo;R!Toyx|EQV;d)2|$d*Hbq}Ue`W|K;X%%rT=&;n5x1)fd=^$-(^TD{a{X#o zpD)CUUT<;XT)8UIzrqw?Ye3M-^pX*mcQHM=Gr8Zp&U9<=kwh){{7+T&qBDV6 z3_QP4Yc7*tPdz~(M^-|9R97222CXW`fKtC$(SG#Plg@dOIOGO;L{9n%rSJh)gEc-5 z^*s@)2@OF64GJhFUo#y_n9ebj#D;R8S!H(zmLj#c;qd;f=Bz-G`!c+MkUz*phx*Y{ z&bH&{RgG?v6`8z~{$&a=2Ou?9VxL)9*T`^2;}`y?b1&datATti-r$jlsr(Zf{#Bt_Y1du-w z2|j)iv?y^1g2eh%mo^skqWIre=Z%BCZBr{o48B}0b*LU}6$?id3GV#(E5B0HH+QSVKo%e9-(0f}$}9OU@GDg}J-#OByJtVB8(654nJ$**|6(~y#C z7+CW#wY$Sw|3{YBPZpCecwHUYEGLO2=BeRjYg}eT2?OhE_C~O+?)$3CJnb2H^vs;ya zT}sGd&P>X8orzMN&43c5D|B!*(ND)UL#l_xH%oc@Z7r+2Qno2r2Gh;8%S9FH@!83> zRrp5)XFokf@>9Wl>gWU07KQ!Ku2&L@oQgjC@A#ji?DEPNoDbljV$RfFeJUPpyw|9E zjA)akM^jdEpi$4F)u_uJ`Q0Oz(}cHKI%NwV05@L&0MWC}P}Qw?GNDFI@u+oqxlfZi zFkM53Da9Sss1V(Bnx2(dWS7JOHW4WFzGPlF(An5SpankL4z5}DkP`?s4wW647K`Y$ zyGE5|@?*lsc!N-#cwOBONv&)`pW64v3*oCTIL`KS->k2^V8<*K*J%cQ+cRf74Dtp0 zdJ4_Jlr~2&*Nbu7-M+}XOz^fqucdM215I&ljHi~S8cpXuTU;BA9Ke-zciw#4ZJd6SI7d4> z0yQ#w`?;eoc7u(xm{55or16pAEbK8mG!eeVMxuNSBBRPf5Zipg^-JjYM$DlxB_U^=AVEb z0Lj}#{gAV9^bfX(3MG?nr>TZ-j?NwM@W~2UF6@Mef!NVQr>eoliJWCi4@!!O2|nqw zAtQ$#-n{ZRe{^;(Io6%~A;M#R0hB7x@u!J&g%uC|@6;uH{~Aii_UOfq@qPtBpOGkT>!E{%XDBo<)S{2XsjjtJk6o3CnPOI;TyZnCIhW zc75_siwGll<55qxUH<^oo0#MA{CZCTq}M!BbKZ%VGT?Odfd2{L(%SO14|l7@iC#0- zOkuG(x|O}ARKEa{t}LwL-+P8~1AU*#>4IP0>ZgP^9IWdxpw<5Ue?nfdD}_v({Q}(Q zHoe!|h;6u)n~p-d?5zN!OmlfX z9hKr{!(8Kuu)fD4MQKR3GRda1X~w5o@LP!~-N%-`=4h&k1US~}DWhK=XTfqmEFWwZ z0{gndJL)f?&NK+Qg|T#GY>=SSr4q`Z@scusS%xLsq52 z)Nx|9a;Q)pajb2oL5h74?A)Ht6_PTou6?s2QK7~TDGg8V-y0_dq~dzi`L!YY!Z^w4 zCpq>t=?qyd-G*#yISRO>Zs(McIm*X0GaJ;g4bhvF3?7Lv_)v#lg;=X^hYzABwyUDQ zJiT-|Jb%cc*&U>hUj>=d_y`JBE70>rfhGl>k9fQz!~fRi%c?q@sjf)4pjeJ-!bt$m>54)b1w^Dd7lU@~+eszF>eQ%QIbsSFSM&8Xy%)$B z#L{??n>}tSW2^U|hvz_?M>4REdU+FKDVOj){{L}CrLaaru!IO2tAnDiE2o-mgiJzi zl7HnJjl-0Jz}V1L?cO7q$Wx01a|cIZpugUv=}1}no+kdlcBUn%H|Bp4_TF(#ZQa^v zRBR|BUAj`FgOt#VQYDcDLhm9?KtOs2w}MCsNSDy0Bq2aRdWS7lLKQ*{MLLAuJAQG0 z=f3BC&pr2d#~;aDE17ex*~Xe{jAuMEYYy0GK91Cd=)Sk~!^R|_ex4~H`F+P#*LEB* zgp?l{9ht>ZE}aRwC5Hjzm8PpKC8=vpx0}T+=GM@l7KxmT)ou!Z`sIQbg)n(6g>2CY z5ohkccOa!mU9R`W+-FDM^>GR)tLc0=}WN876xbQf&SdAvBe}cqEJdB5-%qe`Li)~$74PoIHhU_TDQgNgClVW7>r+ldTq#^ z$3kL0wO7rr>gLyoK*7Hq<<0XPDhSvht;!>7q26ns6tI1co}M+*8!-+=Ph{yU+hkp$ zocXK0<{8*N_idzGM)~e;eJaF--IkU7xk`5wSL`TTxr8-sudhkJ;Ob}361ZwPYff&l z+f7t{n=wVgl_ki_4`c`LdwR3A2np}BP6r3!HLOhp4SJA^qE{sdNaWn1_Z6D zi~t1geq`TP$q!1kjb3J1YAgxs^#?>r87p0drgDr&tD}VS8`S(Vr)3ZSGBm{quqx`J z-!$tQ9Zq_6vXG2U=mIlxQzCsqYa8j}_HOA*?AvxZ zCn=)&XOboT->W{K^Zf>NRexW42s2G-v($W94J>8apkdAD01MzbEMQ|MUgl+o!@eJf z3qOsTEAE7KFxIZo7c|13AAujI4$2+Ku?W_eL`C6HCEoy+Mdt$0bpYc#z(c;|u^?Qe z=_KXjLYLwq$DxifoJ>*9tc<$3NA0jJo3Hetz09c4R8xtu`gvI_Umuoqa zKTP8FiMpVO|9~U$IXs_55RRTx(oKEM6je~pa)`r^%M-4)=={1HK4p0cOG ze^?vP@8xWr^?~~Q=dej9WSRUhJmhebr%+-S)2_0M6VLM=cChl43#oA2&l!1D=IQ8k zUlU<}OJ}J*<3->N;wftnRY9!`$r`>ewC=!S`j+TOe&25~hGM)TA#J0!_rSln7-M04 z)=%axG|vRNWjQ->Z(c8#tNaJabMPQ9xdZ*()5D;$HKtF#IYDx9pg-1JpAp>%xZ3^n z&kbK;JPNLPM4iMSnNz>+%B0pjzJIK{6^$s4RoP&IOV9I*q^1o^^J?5=P7CUfLbjrE zyPlYyM}>*{+1e|z-v5Jb&T*v*5x>?xGUG5ysPR+l-hI&zMM3G2qyn6Kfg?y6k=`r2 z2T=Gqj?x9|xb7u;xZ!%c!uJy?Yi+fu>(D^GtDnW7U$%kgQq#V%gP>-Y*KH}G8EtWi znsPHFi-va5Z$Pi43APQ<+ZrsK`}RU+Ji22mI8?HHH1ST73%>!T*T6mPfC!t3AIl4T z7vWMmU}ePxc9>@kNK(FC8Br$v!LvNnd$tdB^GKgV<`O2tt)P#BpDU1ZWw8@Vg6tTI0XqN0)AWKFQ zHw8endlfWe-*FI_b63?_m4-zgS7L4TBN0FO*_(++E1;vCs>!R)2RF+hgCYl}N$P!} z1zjhcfrA%u7L!9eBEr_nmfcQ*i83`(#hi!s`3@4?788z3={_mKW9o2VIB&Oo){k4a zGR+jGb?!slTTH9p$!(R>#ZZ6UA^ZkBUWVE@S@dJ4ns1B^xwU;GocAJ_zw-0NAAvrs z+)Q1E9FJ*Py%%DJ-=TYjO6Q((aX^GMk8cuHm}P94>rJ~5qtvFAFyN^meNC#oGg4Sf zmT-NHwsXptKY(@2{p%mqcIEbBJRl5@m+lxZ7^nr?AnblwN$1RLFj+^MVmz3{M?DF4 ze0Y*WF$bNmjaWgIdGeFuCBeDIGDX~7!d`o_6w&x~2dLaGrv{Uc!L+I)BM^_T>6j5t z@-2>7AaESQ_Mc2bHQEN3x!@;Gb(OC&9I)Hi`O;Br;j`J={0nBqPf<%#>|(~l+b$0J z=i<-<#i*Yy!Na*GllEsgM|(;^NAp0BA+EZlWW)CNJ2}jMUwKFxYX1^l#V|Fom7B>+ z1=ZQI*mJ6`JyfOs=&%b>snH~a)Pg>JoP~!$H%`lc1MWrH_v;gnhZjZKAO8l3d-F~f zE)bbRZtG~5W#~1DTdyThwR)bjav*|HmP(k(PNv+1gnIev%0L1B!9G!X50kRxLcW6~ zKdEVs!e0(R`K3XLduC^arKU+I7LS@^FT{n`!g!BOASSKuZ~BD86JDU1{DXLp7NGkI zwiD`w_pyFcRe-x=??@1S&+E*4zypCt^71E$5=GH+)77k5f2H<}H{LCF_)LQ(=J5Pu zZ@#A8F2tta`Qfx?d1YtGss9WAq(eS6bNG`PQgF>@z;!X9-2)uXcHm}z=HNaWwF5MX zcm=#ztm?@05phIZ!+R$AfmnulH@E9K!@H+&PF{F&clwKKPIvHJC-JfFjAH)6Vfjue zBsv=&8KJaJ73bitO3T~x^I++I58p$}JXqN*!q8Emy~a4jaucfN1AZ zo(fb~p`Fzwtmq!7S#g!VU-v(cs(FNbuWgU7Hpz3)Nn9A=DBBxDcFmWlKo9?Fi~A`7 zs<7tT6cE-cZ(_WburpG4X85VF7o4h_pdI|NW_M`sl}AE4`tfq_65o(VAf};f{WBQY zQYU|qVHegw;|7Ch{HzPQWoptAO;5{_OhGfAMULff-8j16?pT;>PBpNam%GPJ-u15$ zc*{0baDUw*=niaUXX&Qc;dh%wQsi8xW`4TwDfkuwAf@58wIYWd5GmQJtS3 zfQ);JT3P$@neCg4#pMOjthnGLY(Q9~1X8DX$M|XoY)Y`Sr+hmTF=A-21H-z)?)2$& z+>tNrSK`o)aX!7c)i3$>L|v+zjGHz2gl9or>NnthJ_^|#y?D5HmD*LBfG7BB{N;N5 zzJXt2)s!by&uLEV{LbIh!${^0(7g<@y$8S@R`0$Mc+z$C>G&||H#v12+Pf=(3g{K@ z9i)@8Xs0o--cDzzyW29(J99_vrS%qu6f)@OMV-jP^!lXS1ch-*NqiX}?N~{-62y!( zZ|T;m$MWFjwHhxqdQHOGic5%7N;^C~fA3W`i6;!B2>3eu>p>*TlG7!WD_BO$(;U7$ z?j0qhVgYZ#)b6}bl?*!v zXPaBL9sL`XDD`X2ky2dt#|G7x@tzH3IF^u(J^dz)#aQQ@%c#Llq&?=^9U)%3f zak)DB#PXcM-G30Jq`g>kw6jQBjm}83&2PwyIMMzF)Q3O%zV^MNV)TW0S%7E(@$KZr z`7V?_yS0B9Io7_~piy8uI3*HVqaO=?_@7`hzGTr_ofjk8Ouqq)vu`tzDKU;h>`Ll< z?p=z@1M;?%G@+GTBPKc9ffo#A7RYF};oVbDXEvn^F+`{J6anA4vgba;2VAgWP`$Xf zskG`YbfM)MMf?p|%?2yH?KNo0g6Hd?PC>qQ0nv_gOJTrixl20%B2)2Zd<n zEIso5xP=tF;>b795?cwaXC+hR#V!J(mL0aAj&mC zX_5V@GY+prO_zDPC9A!#!hECEfn}&&-_K?J>ZdkF4W6-#UZ~Vu8>{>E{EkiCU6^Uyct8PgBTRO|K zq>U+kb4_d4o_2mA((CeZ^V}VbL2V%q%LYV&Dtuw7#W*48^W7rnAteLXrhebYO@%(J z>YHf>_-SiKkx%HqYRH?gZg=V@AoSl_HA_BiR7q9{l3OSgigvp685 z{n+w7r(6u~|2I~Yxvh!FJ zYB0*TtEVyl?I__*GDbPmN!K?Xy!ls0X?Gb{ss?pXR!STh_eyD1(&D1PYt)o6?*`GQ zk7-s&Np%PVOQMq<>p_2r-u7H={j_2J!aCJUF(L{g8owG7n!V64u)jtWmZH~NW*E;+ z+X*k1)pcp0r`=nuk0=62nv*Yja4o0C5@bz>M2Y3v)U;e4p(3`x1Ck1$Rs zBjlWk^<}ZQDTvVY(DhQWJmB!hayVca#U!a zRgwg2qa8e=_x~ml;v}z*b+*nMK_+`Vdj+HwFM(2v*l3|At61@cw<*y zKtN`S1Q$a?^d0&2zAnnhbH#qGxf!1O^>yOO{JDQO!gZ+h>ltwNw)wP*K?C|+HlRhw z%icQoBO+#uK$cA;6At~0OEL8G>6I6C^rXPLQl(EF)1RKb7%@;F|CFL?E1n-=#k$F) zh}LMq7i#o-{IHddyvG!kWlzH}Xe4*;$YV60T2SdBhB~gVpIP6{ErSe)Wh4o zi68TjY-JGvVLZP9Mc5mM3(x}*H#qx+8h_Il(FO(m!C@=Pr6%313mJpu-L@H_y)8O? zNDC&TDr8&dSwpEiUdRyw-Bdajp7z&6*LVa>22~YHnRV(Pst?VsHJ~dy7#7?$p>2t2 zXFVHiJ=lhO%GE&Fm)7R4r=yUY z^-#2~_j*9yB;jDkDweElDVvh! z_l6KNk({11DV8qeF}GU!(S3fHv8r+SgX%0CyzY}8pHi#yYdV*A7nSMV2bpGx1G>8# zyfWdT#V-$YrA3Vzrw1PzD+y zaXjD|N72!zfW&vC7v66Q6F?Cf7`j>`p(VQHo<^Gfi7FOX(ZTno)hPY*WOn*u(gI3E z=4M7Lp?1@=SOFAiO~Ne3KLx1xa;Dzi=X?H_g*J}w@9z&sY*%!+#z|;XrWxw(#w;om zSt;81{FHhfZ)r63TZ`P*;l+NCZcgSf=fEj{p8MVqYYFU`+_(th<(vVA2yz%^mi0YqD7m zR6)?qmA38^qW3d!i~eBu+_w|vr@g2uHb`6cElatkVx<4hb$*1a=ve(7QYds6NcTiA z)WP27tPD*upns4k&X9xdp3%3&{E5 z)2n>#b!ORZL_#SN%naI;L>U{$*j_1aZW@vOcds8En7M$J}8?8PIwpj)mMq7G>%`$L3HE zW1afK+60DD1TkHj;S&W?|?^o9rV5W3i++63RUwoTSUuMN&3<}jjdds|8KF}+a zm}~>-?(|?do6`oQuVvbYL4Wp^hKP6ImP({o9o0hE{&vIoa^r}|0mWu9kJLimHg%U< z$^GDMCof^n3%mvAK5))L{>MX5OECKRp=rCPL|wv=Z~?C_R`_+-$qCEPMTyZLH6)0^ z{1+TEDuP`fRtUFu6&bbYTeAw6bRC>bUV(YG!}a@Ao`u)1+kaK#hb2z18o|wD0we9roW~`3R;%3!(H>t8jVEiqiP?VCtt=pOPLz&w~KyY)5pP zxoutJ^DmQBgYUT;fgA1$Vl8522Lnyke}$10ot zGXNXOs6-UDhR=J}J9ucUCNQ_9WZ4fPZ*|iocd@PcmxkpO%Bw3fg=FWgnM5DlS(>|O zn~10f9#|kmb$5Mvb-aqLKzHQ(ZwEoY*4TB8y{1n-uW>{ypQNX}t6+4JUFQc$XKVO@ zPwP2rIw{=Stys)PrbvrLrqCfR?)V+$pvYeBiO*LalJ5Ioq9ZXeR)jJKl+HGu=Q#!s z_<9_6g!5O-rbPwfq=~&<^u*at3R^#_M$Sn^+ax}M!Q!#~&AJ0Ag`39k;UX-tqCi=M z;>bwB;-@rtT}o_N5VMqcDUtkBf?wa!q*pI=qGRkN<=es+SU229Hw$>t*07vl^K0xk zfIP2Z@dGS<3KXMDJd#qRh`h*xS?Inl4c{$?SQL!QRj!cvS5e`Qwcq{UI3>nRCQ`JQ zw))g=3FqzXL3V3IwN#Me z%{Z^r!uU7-VJcV+f=z?qNI9+u&-@MeY|&L=vsYW&vD{P7G?3y}MPvLC?YiC_?hxYl zxDI)tZJi@SW3Uv+ows)dhBY#m_zxP^6b4;(j5H zBme$a|NU3u{waMTcdUd3z+{2&W6yj{r?EPTe4q4+ZRDs?aRpa{9#>;3AhB1}oF1FU zSm&?!C#M)_*H&TZv)a2$53WDQsNCH)Uo}V>@Z8*(H4)i)sA%ElOyb?2vdWm(Jv7gr zsajc@w$S@oI1|8H7ZqYvt7~364OpUdt}WA$%B~+h)NRvSYVXuKMfdUhVo^|h|C}9YX#7SgpGc)X`c{bQyJZJSvuszBMhHkdNn;@y z(uqEMIFw(5udOYVtZTh3>r#pBtbUx5=Hr)-6-da{qRRc`*< zt?~^K)piXn!=k41dU2;{TJLB*!yg#=4YsyhdOLIv@^X@&=waqPcb4?(XsSPhbX6C! zIdZhq-vQ#;Rz6?nuFC*tbbH;3d*gp)5}Kz%SKO{38~ibQ^zLM3Wrl3Yk0FK@uVe9{ zl~c=PjrUvn^%5 zOF8Q-QFm&ciZ`6*G8V6TPgI71oe&NkIt%Ia@t_;q(C>d!1TY-S}i!J%^!g(emH__onXlQ)mf{ z3kD6{we|JdCHk(vp!c)y-c|bDBU|q3(L;0=rD|v+6#CeM?v?5y!lHeF0+gb`44p7_>sKG$*2Y_a&ENku;r{)Lv<4sp#y`;mWPkU5 z9(E(@-JL-A!FM)hwSnvDR$KV=gT8jUCCu5hM$#lGcmGk6li2?8b`()#VsSLt7e7(cd`^0AeMNb@dl{xf@o{5wC8 zJ*&mo^s_@@^*PGg7$a`ra?Nfs4Lm`gW(DFcx=*ZW>^GN9-w}^+MDz$RR4a*94pb|? z4-(Y|a7-mxS7u#K87??vz&p(X>w=(q4qMiRe@~}3Sylk&}_ zEPX(=zX6YW+062i`*}daqspo&Gy?*19YI~NW=FVeTYV88uFFwr!>$PW5=q>d%c#Liq+J=<9s?20cT`#^8?@XxjWL--Q)k{PwH zhOr3JujzWk^4rd(dfm!`W*+y&XSdfSQXd5d#oFI&@Wpucy@gho`e;OM+MjpT(n~8B zix8jfzm;Xt+)#;Ql@e)4nLchm2(qoK!h3aqNqjVsgdCi>GA z%OwfCKC*64Ukp#Q9ylm`O^TmW7bs;D44!X~eHN=S^{dTSlu2>^`##sqf0)TJ;54MiS?a6O;7|EciTGLq>c`v43J;zk-t5q0Lyt4GlwQO5IDy@;i^<{je07mAPo| zSYG3f9{UHU3AkE7CokK?uRy8r~ z)%*s$`Ne4Q+*YdY#{TJ*0LR%7x!A+5%ZVD(deVG;^NUKy21;&Dbt__~b%lMSFsxxy ziNH=O!*4RAD)1y};iF+Zj|0Bx!=D^|^B1KT72C}j{b%<5srwObyuUbnwzr!9xnxL{ zQdKd-xuMcV`MV}qdS}vH`<6-BD&Lm;lWm-IFMba*6yK8yG$j2}&Y2eg znZ0mak~};>-|l{W9JkoD_bOm(VBbU!1KP|0>C4!Ys2!dt)`VHS5y98JJT@U>r^B2K z${`TMi{8H;{xd%K+`3r8o^pcx?k}jRhGG^~lIQ@O*T~-SwUBrxco&|va=#>}rN8=- z%9!%&{V07!j(K0TR2Q=Q(^T9vzA?|?J*&}u*+o0t_WV1@jM9W#nbYWcL+m_}<}xFe z(xbUGmdT-G0kZWCVEX#c^=|ocA&bg*1|I}-=VKh=XNo(*A@?lS{nNr947Vd?H8+P(`7_icKXp7^-+ z5f?1v05>}RxmpxKvHo70hV2LD;8^qW25~Q5Gf*fA{(YfU3AWB!JvhHJ;YG4Ur%jPZ zB6+of7T)?L?vxj{RVNwF3#qj~kOCRlq!N z4F(syYkbOjWAv}}N8u)B>pzBOv6A8S)uORDn)6EZ*PH%>aTb5M3KC~Fp zZtym;$68|H`Kglf*ZkKbo`bD$Ui1m0*f1}@j&`i7#s6sfKZnn_6yNDcZ6?<})|YA` z_uiyZOsv}e=2ud1ESbbF+=;FYodcKL82t|QQ|KwxNZKDx4tzc0h~IIi&F* zCKqd2(LaJ}#54hiqQq;*0Ft7A3clrf$0hIcM5JrigZ>uX@9%5qdXxi}i^vU5hNZmcopQhEg~j;YH@k#k`0Eb0m61-QcsSL3O^RLl;)HvrI8W)dc5#IQs9=5$ zJB@(Y|C}RNsnpc*?hQB`|M{cn14`Cmpoc3gYE{R*Sue1)onEYTP5^gLNQ7>8xtj<7 zMXP8dCY^THM(gt~pN95jr~4FC+!0d5UbH!AqX zP2=Ni8P{H*(GL5|xCWCbVe_6zdIwaU;yOBkr*&XQS|^5MBurve7fts-SrptwCym-A zPf^ju(iQnD8?ESF`S8T%%GdrMF?pXKu6)18*ZA{cvN)9p#b&I12z{ZBaR-ellX`WF z?zg2vjpNS&v)-~IJ(bexemx#+aB*7^jLw3aKmuNR9`$v?VHv-g+3A_8pk8^N`-KT~M`iNjn22$|;p&DI8ctH4usyAwj1$&0rTcr^ia=@lHZ@(ThCEhYGAw z5+iFr8pkA*pI&+R9|Pse-FS9o#p`@!ELB7XW&9%i)2B(%X(TmKN2l`U`wG=$9mVX- z`U!l2`?Fe4@Z+q)sf%KwRztg|IAZfFi60C?c^p3;2-o+LHIrvPU+h`5IS%8ayAP5* zn{n}c4&Z(W2nAfxwVKDf&{e`6V=GK7#mAh?%>8Bw0yal!OQ%d_ec2hDIFlgbx=J3M zW`FZwKRLs41<~=h>-GlH8OAd9L#3S+^*kZ@1C^2e5fc455{3Gn{2@Hq zN4Vn_Ug0xXW=}ZT%qQkfcaDVMznL5Vt+r&eKk`xL$~=SAv2o#ZaADcvC^uIeQtIZ9 ztkhIBnj3Y2{a$K>VGPKL8qGtuZ@1Vo5k4U}#n>F2LiD@Hd2LyCP*O1z>OKQrZ~(6G0mxqD zs=L*gqS)0{y+yz5hN==xDJh9*h5qHi(c{*Fo6{FD0a|tL%O8%Cm&S7)bsF<>b>{N? zIU~BiV|K%J;VD>gzJ_0g*ZGZ&gEU`co3Dm+F6!y%yZ}WMIZ}UqD)!$Fqkk%`s}!1# zg5IK(H?XZO+F6RFfT}IOg(cnWi>o*ioYsY#+!Hf~7VOb)($GgVfRkDhNG7+|lSu2(Cd?g8CClC5MCt*nNVhuo#7 z-USxZmcwB6=`yz4ox{u)9LfF*jWIw~3EaaSu2_v%J+ErZPE+8K<)Yi40Z;#} zGf6wtYTms+O=IKqijYjD0b{BCvH}E#I=KtlyZ0`(Ij=wp1Jr0>Iqwsfc4!^z`p^QH zI=#GeAb#e<-G$`nlR#@I#Rk4anA-q`GpAbmxRtuGq8IO)y1%YG)sQi%Gs`9n+>lIs zM^VbO`VX-n;8wteY`iY~Lhj4f3$NN2d5J8UI03V6rIfw znP8;;;ks-JON0l=^}!zRu5kT(IAJ^{W(yc$j(@+M-zge`_x3GOG5V!N<-l~EhkI)T z$Ow&WX;-L)!)cVv9l z({92PHtf5~B96Hz9{M}I+$1Z@(>}%lWvO4<0B>VkojsB81cSd=m?~FFBI5h{vkCJH z5#a(rIZFV2MKR#&Q_{`dpQdkLbBatp&^MAST`+cf!|`$(ZkT5RB$(0L7#gi>~Zu&;~J@yrgqx` zs9aU`u5fWp7uaLBwkAvSp{-x|-s8vIG!<>}Uy`W*L!pseZ*=!huc)`zmEr_8)l^S{ zRG2%>ft!y8hZoD!InSSOesjPA6EC^TWnsu(!LDkCu~F#+RWlrMS~|gE_xaD{gyIY+ zdUvjTHbl$R@6D6>QUj(w1FpIp8dnU&&Kl!yLU60u2Yad-&@U|d#iz=`os;ZH-jtVs zSDAlb-G9u%GcG%7WvAl;X6yvMOPPadp#14XttA$9(|wUwItS?_r;>fAFcg(tOVC-y;rGj`S)bU)OP-$)^_-jg@l zhwy62N4U*lIS@6HNW8|qDh$|FJ)jebn>1N(q@VR} z@f{#@jD>g{+s`K_{pN#fud5G)_@5ye1F%OL)#1PhBLjnB?sJ)qlrdtuL(At;&l3YA zSurUH-NK%_L>Y^0%QpzkmX?>t4hdUzi}I(sZL%r~f%rO%`%VOa5SCG0P~VbK{IN|h zMq(#CJtN(4H(cxhpLf0a>6_^>z}2S!fc-1>XY9I+B>_@wpK-G?YH0f1PeE6mJvn|Z zGQ~f(9+E*j4dt8&1S)+R+t|byzR!@cAAS56Pf~60kamd^*J@YEs!VN7oC0ZMFx63v z=k<@(R?E!tU%(XpVS3r7Q)z1pwyXL`ZiI)Hzj(?UgS?}AaIuk}8!O?;IiElxx%{|2 zinNKZx;=F^=_OCNsFIe%Nc+Ybep#}3`J7WRm-jYVkOuxXnT;)g!~BLyz*Q^AEmyL* z=mYL(NFB+T?J@^WxyMH`)xS?2(v9IN`!xA@Cf~7cl+t&+w!$dOkh0AQh#`?2Gq$&w z@0AXjOXh}F$ul4n8rO%gAo;Q5dW36?@Tyx=cA$b~jmM^bU4o|K0(TWfxb`eR-lyE9 zH~{+Q0b;`TfT2syPbLJ^Wif_o$|#a2+HCpzm5+G~*UNqB6wih!N$4;EEsxzpR4CcE zE00#sNbV1(fX~yiOG-lhpz?Yr{*l6i1$)$tD!!Nl33`vJuN4%fO?BwP<*6Ut^|ZM> z?Aj0N_s+;Ovov#8rq(;_J(Royp+T~Ns^)m!+|H15yN(hNak~ zPpvC@`C|~Z)Jth+$3(mM@i*Gp856?J??)}~aic~uCNzew%VX*6F`$G;Y$mIGXJf*& zT;=f%ryorxp0VpBlD!uTCpE6^-LG7q&LVx`x$7{E==o&(Xfoe+VJ+X^707fHi-6t_ihcZ~ zYMiFIZDt_4dWTis6RV&chLt=F8z_9_$yr-&n(=MA?m3|MA>bk4WoW2m(~+{p6jbP7 zLxBGt(t)eA%*JE_9%qgl!C-WUglu83o`uFAC*_%wQ}~A343ktB=&ph+D%TWN>&0~l zJ$CA1w4j_tOkASbUe^qKfWSIe+{+gUx#2W6hfXcQ3WkLiLq~>3I!+~+5$kPiEH|=J zfcdp{Hr)eVqev2eg$K&J*=X=B;CmDoHQ@h?<%gsT$Y{HRB5_PJypJAez0#0A4EtWN zO9zyDuvB+ESD(S2l7_KED%!(K;iF$71|LgNBFuQyO9Zs^W3#LsW-o%p9VdupWvh(h zcJndUcWMuWWV0Ga^ahFU#LtE5_0dD2zm6=_CXF{NLB?-4@VOFmjs6mPj!f*-vJTqy z0YZtXRWJU@M#9`$uKbSvh_$Jdu?=*sEtmSwu!fbFd2KQxk06#CnWq`0i#W@w5n@XfDgL`m4=RScQ6DNaoK<5FS z$huttMFPhZwKcXfivOFY0SH>IP+9^4^E+H<(a^`fEu}9yO;VF4*W9=HqE)#`gUN#B z$J20Sw7j?%YGX@NqnRw$p*`-yz6~eEfC|3%U>6gsrvOO-w4$S9hH5StgH^G6@iGxw zK1@>0VJg>nZQyy|o!jlRJ-9_=_NnrO@VSs8H|Y+iuH+PMsJ-@l4iU02Tr{Eg#Gz4w9nJ~$5Y9DmN?wfpkrXP`~6(pRbhTMEq@$nzh# zhgrwa^8zT>x;BD`vn0V1`4pWhlqzFHe5jiI{CPMqGdII8uIYkP_e?(&0u$^jvfk0; zXm?uk7XS)yHQBViIQ`&%B%-?faav3#CHi1rl)>zoGsLphrC?vQ@;H7j_mWnR0aMiw zKp?1Jg*bht_2IsZMwjw}6 zB(@`dF={jVO##RikvEyP$ESt-2HoK}l&9^$yea1c&`VY2rvk|G0AzrxWYnJ+X%skX zGV*d@Znh4K;>-n3^b=l!eGa`P-U2->&UEncj91PgYKsRXjD~)RM6#rMcoDJEi>VJb z5r3?so?Bq%Nash|OYAV#dbIUi!KcJhIY}BE*X(aJ&Y6}HCw`%rQfhUgac}!zx-o#9 z_SN=Gvo5nbkJnF6Cue$GMrES}!eT#uYqGTUT**1xNWjTg*rsuHe$LKLG+8$NJbAKY zq)xd7bbWXrH-!>qnQG?GG+WB`kL{K;=l*xOuL-yV^G!ApCb`!t$K&#N-5^5ldmZMw z62fA?nEcc21JKWuXN6Wvnp}w#_U8%|M(zUmlgWN3}UFn0NnY;#%>}g`0CWZ1>yryLL^JX*hl69QuHDlIf^}3>*aow=$ zCKMV}9;I7#oASgOoB!E`^E;Y(9bY1doIy;I`V6utUtp}i5a&|adIR%l*& znnaJ8)GfKr?+&wwuHO?H`Kg%XZ2XRF^z%uoXas=F`7?m6ckL@cX5b(jqhAt5u?Bj`T9fYBdQl7Q;oZ#hbxQ%gshv&cz}c{LA??EE`cL=FhuCRL1Y| zW9T9Vmrf*{aD4K=3cn1=n;9OvMxO}mPOQ2qG+gr5TtM}JXN*Y1s-y#BR;o;#g|F!L zI7_$G3Q=-*)kLtK86no$RCWOg>gSmT6JOX$Hx$Hc`6JLDlqll5vr<%bKWsLOZZ^e= zEWOso3tMdu$N9_l?)w{D+zt7VaM&mF!)jmX)6Xbkvl$5GVd9< zb$6aR6D>kz6bXnt-}ptZ7*Mm{non*P2IZTY+9?c2iv>kQttA+l=}1&pTc!#`qDU^Y zU^~(FUK)bPBFx{JTooO&R8fNjZfS#w(5)ASAd&*RR3Om{UaBcMC!`I$>2*CqDRq$s zk}oP#f#`c0cOIBEq3$0{xW`EpUvc^kXryhv#&eVt`-{D^>jFK4-pK0zx@2LAd3Ujz zef<1lIrmse=TDxX(_q34!#GB0>AQbU!q{m^+XK@4`6+}WtLl6C`raO=*!km%<6_N? zXG$3GTtU{4i|3b;#>X1Fd=yz?o1b8Q9a`2$sFGbJSV}ux+T|*v1_R$YLJ~FO{b>nY zis_FKsNC$lTPhTMu%Ap3*U~M>lN6)KoF(s8&za!`-IGYc5-HC^22duA>&e{ushu}@ zHlp`LFVl(&TNDOQa|n&d>kacK2*FJOJyKk-5(XNfxSQ}BP=k{;m~r;#xlr-I7EKIx zD)?S%WTKiKu7ANV@2evpFHT*kFCEXSnC%IUIlAfTw!K!$gbG{&34uls?PEb5M1XS*9{Z!*Fi%B zm^lY$OJS~J^(I7GPqR2-m08ZX-HmdA=(p8RhDcf}^xf5`|GSR**IBZw&#z|obWV?x zir`jXigs)<4d~8}6WVo6k7MP8=(jcXptW$z8UZd-GV$p<)>peoW^Ljcm!AG8_T^2$3r^k{|JJhL3-v-$iBalXA^l%>w{8-n{## z1MWt@Q@%?|-X4?$+<?!zJ)# z;r#K}v$n$1VIVncu68RXJMSqfr0UoA|C{^hzZ>OWsVii0?;gH?tA15ZWkn~`9D%d# zWGSMW-8UYm%ERJBlIF7`@W-x@;g`e170e;Q0v^CFBCEt%Lalmwp~;~xuvbB{x_&g? z)!Tt7oWim0MP6~yQv9ksySi_HHFrUko5 zBdhhzL1oU}^$PR|^QjSeCL#1x?xU}-A-g#xrt%RR43kq1I$^g8Jm(*@`#my~>^d>3 zoQo@{_^}r*jat8G61S&XojKd-elp%WrX>xE`Z zoQg}ePE3KF!dwjk@#wOCYlSu@HRf*PQE+mR6pp|^NGwib5Ti_O{f9#|K*}@bq^bC8;Qt3vTyNs zDCsg*T8SE`6jFEvP@Lvj6-(zrP$$;98O2?hOy{;N?mw&J50=zv5T(0)q9(!2lJ2U= z2b&Wy6dcubL^|eZ8S8z~qyvGvjk+Xc%CQB7!9r)Nts7x~Mqo|SV0^iRHQV%MxFGbseBZn8a zh7$>UlccijWP1saIs?qXvauAaz_>-KW3Iq>-2sEI6s=)ZP_^NW^hg4_Vo`BE7?Gl|?22AAe-7m7D!NaCssMw&IJh9_1zD4Xs*$KJE}OATXRdi%D@H8Ka* z(Cl|0*uUoG|8L^i!&{_1A3g(e(5lavpo_Y4AcE2P-(PJ zVruU~f8u_9XY7NGFN4RCCSJ{9zmBtX1;Eh`n@HELEZys8SAPRivRa~`_);OUrL@42 zUDuytoSSN1chB8=tA&bL3~go_OIO2b9m{I|sa9M!52v_b;W%Z6_~H9Ig#Df0$^t5wI7msIh=8_N)mrxNIDD z9fnfJ!FFRx)5&Z{U zBhnb#b;)FL&Y;Rfdn-ANe`u$PoU)fg&0U#EDe1e<1l$Ibs$aV*sP--LS;NK%`vNU$ zIL4PMpWHovul1!#0@%!{N(oJ{a6OQRrMPa%V9!@h8MlCwv5#l|Seb7jr|;#hYKPUz zu4oS>Q=W+Z_<{0&H^T&35BaWLea0{!JwjX1123*^DgDRauuz`3|M=nAU-i-Yf1VBC zVXAbWf=E5QF+IO$SK#a0i&&jbXHNUgKs|S&7 zd2i}oay}R+9cZ3@Ve<8&I{I|RcwgYF76G%@6?IJaQ2TW5?`jnY@(oEo2g%2|IuXk4 zIf5z*3j(&OW@N5Vn-tGCcKra)QkXKp*JW6ymI|{-3X`dZWeW7=4WIj5G+7-O zKb5BS>`4KgD`OqLt|Vd3fqS>)*HG>nrNGbU;XQ=tJhruz*$KkFL2jhIr@-cP`q0R^ z>fzhGUiNNsOB=TW>@Z{Sc{PpeBAz~N3V2x9WEOCm%fM^fI9k?IPpYpmt8HRB>hs3r z_iMmidSlzU_ni}?H-Q;~$fR6ywr%u$qliEe!w){fynMVaIzz51RuYU+mf`s3tDy&8 zQt!DoCoTf*iQlyO2(DN}@K z|5>AcTg4H^8Uj^SK$iJT7vjxvKj&GqH*T7llhyB7jo*&MB5i&_@1DmcTUfEJTEFUL zJ@O%gH`lHmEZzq7W^z z5M|_R8SF#Ct?&x*_(jRb1ztp$r(Nu4!6S9^6*xbU{`1}4coe45Qsi-m0XT7ig*@hOnC@xbHq5A@hV z7Cv

u@EsZ2Vvz#UWC&$QWC$xG(?y9pd}@v!Dx6X(_1&Z(zW&kU)xV1E9mA4-$2I zlT}6T%=$w9Ed8Q(YC9O2cT}C+doOy~!F{HwG%vpjLV2h);QcKTm5i!5LmOW*ea&0d zZBSA<0{5Pim9p==)9xv8PXYOAH&)T1w783b^gZ$^2GSjlB)D^RCTRr?))PP^U4ljW zHCq_72OYw}ux0;v$&|@*z!Mv{Y=q~Hd^)iZdvwW!S}h7YM&+I51fPGsWGaqco`oq1 z(3J1n+}gU=R2e1uK5HR4?~*Al(JAhLS?5S?{Un7^2XHaiME8J^Aafe`=i>x?aOYp) zf6y7!ua0P<*cqd+OxpPW^c?ulp6x!dp!~xo@D}GKQ~sGJZ?x?pk?xSb89cEkL@y|Q z5$th6E8SD7sIznpO|I41;T&k#*}IK__cBCwbO+*Q&?OVM(2*K0JmZ8%mb|bGoc;}t z5Df5NR6|WJ1QaPRPPl*G>1lNdJ7JGrvDk8frR1G?MBw&hElY2<-`?%7oM*m}^z8iF z!&B?+x;ugSTnC4`;D*@^-aKETYZ~n7e@P|Sb>H~xD>w3+MSyG6C%FZ6&I4p&o8H&$ z!5o3@lQy4$pw-(;?AlKgQF$l{4ecTWdMexL{bvPhmB-KV75Q6YDuUpr#|CLdQ7xr_ z>ex=m_4AaM_ryED#fk??epPB2Mt;#@5hrH`1|`hKJqDoP&bf_qIdtBFrYP`u-p>f! z{B=~TGknJKMee%0&}ZJqXDoKOMbi@YJgFs$ckqCwtAn9zlBArsRte4slipzx5=N7ed$+;%p{EGTu=M^m){-; zKfC)1#Pk;%+m&DcSxEkiZ9in{$6UL-a)1$hUuFS_xTAu}?KpCYp{)t$NlWt7|#Ws^r8 z{1GiF427ogvegq84_zH` zJIOEVT^1fc(}#cWyq4u*~j6?dI6 zcLeUu^xCc0@*@4XJGb6gW28dteR`8Mg@WzM3vA7N6--Zsc=6WN=)}b(kzsTWcg?y% zmb@uHvqOjSJrPBLFlZ&}j*SCl(^|3*4V)tI8Q<4$D!)4Yr8(Usn1LffZ%h?=-0dT} zPj81Q5&(>3;*9o^=Pax!;wjT=xIa{#)WP-ZErkqH{>jRXu)j*4MDeUFr?QZbUySUoeX!4$OR= z_Oja@n(2gtT6-$0Xtpv>{66tpu%Y94syr1jI_M~xJpKu8kU@*e%2DQBN3IPkbyV8Awd`)vuE9r1mi)c*@wl4isVdVg(1|in+V>;z0P_ex zpPh?GC(ghY$5Q{B=F!3<#+8)zvEO{NL4>Sm{no%>8=9X*c3!^weE~wFQ)hRZD~&-H z0!KE&S^7K2TJiqMM2#xaJ?v&TbM+J$Yg0C%sin7^P+O$&Vr_!|Hfwu&EDGpzAQ{sN zYSBkTHz-ADa+6>8ry>sIf58B5&Aiqx-Ie6eFE~Gm8*@NDYQ{?yKa0SE9A)E0tL zUG(H}9Q1p>NhY-hYK%Eeq=(OKVt_+Tyf3mnFmpi}m>7R&fh#e>2z+dI6?TGXrn z!HBfP$l@C4GP}>wXnht=Y=BEcR>uv}r_tt}032R(JR3ctPDFPb+|Y{Am=c6E1ugH& z-mhCH)oMCSk!OtzBdS(yLAG7EWFf`UsqRIx1(jgz?ofxslR_g)ReUz1BoX*`8Z)ef z1>%u4!r4$9cE>EiySBVwY(|46cA+A}>aj2vYv-QozHhH=#B*Lc+ShE^j*40_ zCW(jES-X$b1UfXv7^S3Ji<(ioE7+P}hnTAAr)l2>U`2+%9CEtcFJD^oRh`T2_Joic z4R>QAy354}<+pX5hW%k-&r+EYr{Fm(QSnUK6K@rN?Ac;p6Y+42uc%Veka!%7fLZo* zb8M$ww>7hWH;_e-3siS@7%vkc#HRrH?Nw&tqb={?_@{A*HO}(~#d{88);>@CQC65r zCy$w|=PRf13Y*CM$W#WeO5}esLH%cp-4xxfN`ahJ_04OVN8C6Ny48DyQlXy{?#KSy z0KieDEs?4L`8(}-3E+|mfL%1p>$+MWHzB$sLUAl*H#cHuLyCSn6jgKg{i3s+>x(+D zm2p=&a)y`cFNXH&kMC@ey@=iXME4gfQCJb~6hh9UI`4;gfR%*eBV@sL>UToJ?wZAM zk^76aed>)aqijTiy{SCr_mR-}DvtJ&9HSL(;WWF1z$Qom>$Uc4G~fP3 z*4;`hhwsf7ef-}JlDeobCVtlsYyGv1o>$@=`)He5hSZc0jk8Ai8EqXD8(w6>z3T#u zpn}RGL7UO&*y9<)mb1JI`*?HzSjml{@+Fn4+FC2=N8ihi9?-~xY!6RA7U7rSToH5L zIGdI;#cRSx5!|(gs-zv^X=(qpIVvondpA#97b|W!XyNz#z<%vuGuO#qKw+wIEq;l; z;N87vh5_B;vbuHySwcH8Nd__vOB-X0)g!CZ3k~8=51Sxi!cK-Vo%n&)4SA{y zG;EI4EvNT8>urs;ALLKvAFCV5t&?JmBtuBWtV((B6xw4X`PjM*lWj78?N%Zxt@(KMEi;+rATu6PL&`_1yJ}1z<1%g>CD7%7Y>$ z`B>}0yBjngmXO?y>^YO3RL06ytf%L^EoQ;7*yRN^2k@NO;WVB3ULF zAbK*sLpa0f;U+#tCIODv*2%einsTdFmI7~!b^hCQ@^4@MlohAkZo;uNd?Z;KBTSEB zTivPah!>MgU+TCWUo@maw8=xT*ioDi`H^J zh~b%S)@^IiS~cLjDaKvjbytf@DTg?uu4MDN(Hlj{yNlz#L6mP3I-s1Jfyt8b5$^f% zEyIT^g-1$@)WI{Ke`ql8_8w(TnFuzXvmV0OSecdy=a~;+knm3QU6^ ztqIud_O&W$a}}yhNMmJDNQW!tn7mwjHD0qRiLrj*yv(+zFn)Be^rLUEyYQ)>^GCa? z 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 diff --git a/Yi.Framework.Net5/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 deleted file mode 100644 index 76a391b43c32b1450ffb8dc89faa860708a389b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18821 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 diff --git a/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs b/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs deleted file mode 100644 index 3eeeea74..00000000 --- a/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Controllers/WeatherForecastController.cs +++ /dev/null @@ -1,26 +0,0 @@ -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.Net5/Yi.Framework.AuthenticationCenter/Program.cs b/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Program.cs deleted file mode 100644 index e75b3a47..00000000 --- a/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Program.cs +++ /dev/null @@ -1,26 +0,0 @@ -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.Net5/Yi.Framework.AuthenticationCenter/Startup.cs b/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Startup.cs deleted file mode 100644 index 6c28a88d..00000000 --- a/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Startup.cs +++ /dev/null @@ -1,59 +0,0 @@ -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.Net5/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj b/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj deleted file mode 100644 index 28847161..00000000 --- a/Yi.Framework.Net5/Yi.Framework.AuthenticationCenter/Yi.Framework.AuthenticationCenter.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - net5.0 - - - - - - - diff --git a/Yi.Framework.Net5/Yi.Framework.Common/Const/DbConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/DbConst.cs deleted file mode 100644 index 99950713..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Const/DbConst.cs +++ /dev/null @@ -1,16 +0,0 @@ -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.Net5/Yi.Framework.Common/Const/FileConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/FileConst.cs deleted file mode 100644 index a7ae7119..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Const/FileConst.cs +++ /dev/null @@ -1,14 +0,0 @@ -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.Net5/Yi.Framework.Common/Const/JobConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/JobConst.cs deleted file mode 100644 index ce81cb0a..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Const/JobConst.cs +++ /dev/null @@ -1,17 +0,0 @@ -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.Net5/Yi.Framework.Common/Const/JwtConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/JwtConst.cs deleted file mode 100644 index 7ea25ea2..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Const/JwtConst.cs +++ /dev/null @@ -1,12 +0,0 @@ -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.Net5/Yi.Framework.Common/Const/RabbitConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/RabbitConst.cs deleted file mode 100644 index cb7f294e..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Const/RabbitConst.cs +++ /dev/null @@ -1,15 +0,0 @@ -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.Net5/Yi.Framework.Common/Const/RedisConst.cs b/Yi.Framework.Net5/Yi.Framework.Common/Const/RedisConst.cs deleted file mode 100644 index 1c59a4db..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Const/RedisConst.cs +++ /dev/null @@ -1,43 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/AssemblyHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/AssemblyHelper.cs deleted file mode 100644 index ac95e268..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/AssemblyHelper.cs +++ /dev/null @@ -1,22 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/Base32Helper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/Base32Helper.cs deleted file mode 100644 index 3d422caa..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/Base32Helper.cs +++ /dev/null @@ -1,101 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/ConsoleHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/ConsoleHelper.cs deleted file mode 100644 index 50a9688f..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/ConsoleHelper.cs +++ /dev/null @@ -1,54 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/DateHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/DateHelper.cs deleted file mode 100644 index 0e31e4c7..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/DateHelper.cs +++ /dev/null @@ -1,58 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/EmailHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/EmailHelper.cs deleted file mode 100644 index 5629592d..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/EmailHelper.cs +++ /dev/null @@ -1,125 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/ExcelHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/ExcelHelper.cs deleted file mode 100644 index 8d0f808d..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/ExcelHelper.cs +++ /dev/null @@ -1,60 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/FileHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/FileHelper.cs deleted file mode 100644 index 2ffc9ba2..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/FileHelper.cs +++ /dev/null @@ -1,395 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/HtmlHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/HtmlHelper.cs deleted file mode 100644 index 1e1e0086..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/HtmlHelper.cs +++ /dev/null @@ -1,24 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/HttpHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/HttpHelper.cs deleted file mode 100644 index 96b7c4c0..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/HttpHelper.cs +++ /dev/null @@ -1,76 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/IpHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/IpHelper.cs deleted file mode 100644 index b39d112a..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/IpHelper.cs +++ /dev/null @@ -1,51 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/JsonHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/JsonHelper.cs deleted file mode 100644 index 9b983cbe..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/JsonHelper.cs +++ /dev/null @@ -1,509 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/MD5Hepler.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/MD5Hepler.cs deleted file mode 100644 index 6eb53422..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/MD5Hepler.cs +++ /dev/null @@ -1,67 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/MimeHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/MimeHelper.cs deleted file mode 100644 index bd783d48..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/MimeHelper.cs +++ /dev/null @@ -1,244 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/RSAHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/RSAHelper.cs deleted file mode 100644 index f439b544..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/RSAHelper.cs +++ /dev/null @@ -1,390 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/RandomHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/RandomHelper.cs deleted file mode 100644 index 8c5cd40f..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/RandomHelper.cs +++ /dev/null @@ -1,99 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/SerializeHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/SerializeHelper.cs deleted file mode 100644 index 9a5aee9b..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/SerializeHelper.cs +++ /dev/null @@ -1,35 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/SnowflakeHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/SnowflakeHelper.cs deleted file mode 100644 index 603acb75..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/SnowflakeHelper.cs +++ /dev/null @@ -1,99 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/StringHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/StringHelper.cs deleted file mode 100644 index b4287ed5..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/StringHelper.cs +++ /dev/null @@ -1,111 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/UnicodeHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/UnicodeHelper.cs deleted file mode 100644 index d6d96f75..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/UnicodeHelper.cs +++ /dev/null @@ -1,47 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/UrlHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/UrlHelper.cs deleted file mode 100644 index 6ebd30c0..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/UrlHelper.cs +++ /dev/null @@ -1,23 +0,0 @@ -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.Net5/Yi.Framework.Common/Helper/XmlHelper.cs b/Yi.Framework.Net5/Yi.Framework.Common/Helper/XmlHelper.cs deleted file mode 100644 index 44133350..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Helper/XmlHelper.cs +++ /dev/null @@ -1,51 +0,0 @@ -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.Net5/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs deleted file mode 100644 index a9cc27a3..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ConsulClientOption.cs +++ /dev/null @@ -1,16 +0,0 @@ -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.Net5/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs deleted file mode 100644 index a5c4fa6a..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ConsulRegisterOption.cs +++ /dev/null @@ -1,44 +0,0 @@ -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.Net5/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs deleted file mode 100644 index 1080aaa6..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/ElasticSearchOptions.cs +++ /dev/null @@ -1,14 +0,0 @@ -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.Net5/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs deleted file mode 100644 index 89fd0993..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/JWTTokenOptions.cs +++ /dev/null @@ -1,32 +0,0 @@ -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.Net5/Yi.Framework.Common/IOCOptions/KafkaOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/KafkaOptions.cs deleted file mode 100644 index cfc6955e..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/KafkaOptions.cs +++ /dev/null @@ -1,14 +0,0 @@ -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.Net5/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs deleted file mode 100644 index c5ae46b1..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/MySqlConnOptions.cs +++ /dev/null @@ -1,11 +0,0 @@ -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.Net5/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs deleted file mode 100644 index bdcb0f13..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/RabbitMQOptions.cs +++ /dev/null @@ -1,90 +0,0 @@ -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.Net5/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs deleted file mode 100644 index 031509a3..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/RedisConnOptions.cs +++ /dev/null @@ -1,18 +0,0 @@ -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.Net5/Yi.Framework.Common/IOCOptions/SMSOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/SMSOptions.cs deleted file mode 100644 index c9f36347..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/SMSOptions.cs +++ /dev/null @@ -1,18 +0,0 @@ -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.Net5/Yi.Framework.Common/IOCOptions/SqliteOptions.cs b/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/SqliteOptions.cs deleted file mode 100644 index bd2caf1e..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/IOCOptions/SqliteOptions.cs +++ /dev/null @@ -1,14 +0,0 @@ -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.Net5/Yi.Framework.Common/Models/AxiosUrlsModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/AxiosUrlsModel.cs deleted file mode 100644 index f5cdacb8..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/AxiosUrlsModel.cs +++ /dev/null @@ -1,16 +0,0 @@ -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.Net5/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs deleted file mode 100644 index 1a22bf81..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/AgrFlagEnum.cs +++ /dev/null @@ -1,12 +0,0 @@ -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.Net5/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs deleted file mode 100644 index 7433fec5..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/DelFlagEnum.cs +++ /dev/null @@ -1,12 +0,0 @@ -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.Net5/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs deleted file mode 100644 index cbd8ea1b..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/ShowFlagEnum.cs +++ /dev/null @@ -1,14 +0,0 @@ -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.Net5/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs deleted file mode 100644 index a9e05013..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/TopFlagEnum.cs +++ /dev/null @@ -1,14 +0,0 @@ -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.Net5/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs deleted file mode 100644 index c67de196..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/Enum/WriteAndReadEnum.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Yi.Framework.Common.Enum -{ - public enum WriteAndReadEnum - { - Write, //主库操作 - Read //从库操作 - } -} diff --git a/Yi.Framework.Net5/Yi.Framework.Common/Models/JobModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/JobModel.cs deleted file mode 100644 index f831ee46..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/JobModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -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.Net5/Yi.Framework.Common/Models/LogModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/LogModel.cs deleted file mode 100644 index 1c7b779f..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/LogModel.cs +++ /dev/null @@ -1,18 +0,0 @@ -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.Net5/Yi.Framework.Common/Models/PageModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/PageModel.cs deleted file mode 100644 index 491f1c7e..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/PageModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -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.Net5/Yi.Framework.Common/Models/Result.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/Result.cs deleted file mode 100644 index 890b01f7..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/Result.cs +++ /dev/null @@ -1,77 +0,0 @@ -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.Net5/Yi.Framework.Common/Models/SwaggerModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/Models/SwaggerModel.cs deleted file mode 100644 index 43d8f300..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Models/SwaggerModel.cs +++ /dev/null @@ -1,19 +0,0 @@ -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.Net5/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs deleted file mode 100644 index fd20b344..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs +++ /dev/null @@ -1,41 +0,0 @@ -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.Net5/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs deleted file mode 100644 index 80c926cf..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SKUWarmupQueueModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -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.Net5/Yi.Framework.Common/QueueModel/SMSQueueModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SMSQueueModel.cs deleted file mode 100644 index 242a75c9..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SMSQueueModel.cs +++ /dev/null @@ -1,14 +0,0 @@ -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.Net5/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs b/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs deleted file mode 100644 index a9a2efba..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/QueueModel/SPUCQRSQueueModel.cs +++ /dev/null @@ -1,32 +0,0 @@ -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.Net5/Yi.Framework.Common/Yi.Framework.Common.csproj b/Yi.Framework.Net5/Yi.Framework.Common/Yi.Framework.Common.csproj deleted file mode 100644 index 74a4b17a..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Common/Yi.Framework.Common.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - net5.0 - - - - - - - - diff --git a/Yi.Framework.Net5/Yi.Framework.Core/CacheClientDB.cs b/Yi.Framework.Net5/Yi.Framework.Core/CacheClientDB.cs deleted file mode 100644 index 32187406..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Core/CacheClientDB.cs +++ /dev/null @@ -1,1074 +0,0 @@ -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.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs b/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs deleted file mode 100644 index b603875c..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AbstractConsulDispatcher.cs +++ /dev/null @@ -1,72 +0,0 @@ -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.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs b/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs deleted file mode 100644 index 905a6ea7..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/AverageDispatcher.cs +++ /dev/null @@ -1,45 +0,0 @@ -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.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs b/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs deleted file mode 100644 index 882d7fbc..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/PollingDispatcher.cs +++ /dev/null @@ -1,45 +0,0 @@ -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.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs b/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs deleted file mode 100644 index 41a215f8..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Core/ConsulExtend/ClienExtend/WeightDispatcher.cs +++ /dev/null @@ -1,67 +0,0 @@ -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.Net5/Yi.Framework.Core/ElasticSearchInvoker.cs b/Yi.Framework.Net5/Yi.Framework.Core/ElasticSearchInvoker.cs deleted file mode 100644 index 4b4556cc..00000000 --- a/Yi.Framework.Net5/Yi.Framework.Core/ElasticSearchInvoker.cs +++ /dev/null @@ -1,53 +0,0 @@ -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.Net5/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll b/Yi.Framework.Net5/Yi.Framework.Core/Library/Microsoft.Bcl.AsyncInterfaces.dll deleted file mode 100644 index c695bdd5965b0b687fdee8984d5d36e1a33fb642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14920 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 diff --git a/Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Common.dll b/Yi.Framework.Net5/Yi.Framework.Core/Library/ServiceStack.Common.dll deleted file mode 100644 index f10b87b43853c83f27dd617a9bfc76bf56150c2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1039872 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