diff --git a/aspnet-core/LINGYUN.MicroService.All.sln b/aspnet-core/LINGYUN.MicroService.All.sln index 01b61ee50..6703f7ee7 100644 --- a/aspnet-core/LINGYUN.MicroService.All.sln +++ b/aspnet-core/LINGYUN.MicroService.All.sln @@ -1,1042 +1,1035 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30011.22 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{C5CAD011-DF84-4914-939C-0C029DCEF26F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{672E1170-7B18-474B-85C7-1961BF2A48AE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "settings", "settings", "{BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application.Contracts", "modules\settings\LINGYUN.Abp.SettingManagement.Application.Contracts\LINGYUN.Abp.SettingManagement.Application.Contracts.csproj", "{77BDEF2B-1A30-4E64-BC35-0DFC21091327}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application", "modules\settings\LINGYUN.Abp.SettingManagement.Application\LINGYUN.Abp.SettingManagement.Application.csproj", "{573B7B0E-3065-42DE-A391-EE026CE7A366}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.HttpApi", "modules\settings\LINGYUN.Abp.SettingManagement.HttpApi\LINGYUN.Abp.SettingManagement.HttpApi.csproj", "{FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apigateway", "apigateway", "{68ADC230-B563-4948-BBF1-2112DFE93BC1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Domain.Shared", "modules\apigateway\LINGYUN.ApiGateway.Domain.Shared\LINGYUN.ApiGateway.Domain.Shared.csproj", "{40E217A9-46EA-48DE-BE0B-6CC824240E97}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Domain", "modules\apigateway\LINGYUN.ApiGateway.Domain\LINGYUN.ApiGateway.Domain.csproj", "{1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Application.Contracts", "modules\apigateway\LINGYUN.ApiGateway.Application.Contracts\LINGYUN.ApiGateway.Application.Contracts.csproj", "{269FF49F-97A3-4502-B424-D8CD55FC5727}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Application", "modules\apigateway\LINGYUN.ApiGateway.Application\LINGYUN.ApiGateway.Application.csproj", "{87049236-4808-4C33-88BA-D3CA6BB1F786}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.EntityFrameworkCore", "modules\apigateway\LINGYUN.ApiGateway.EntityFrameworkCore\LINGYUN.ApiGateway.EntityFrameworkCore.csproj", "{3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi.Client", "modules\apigateway\LINGYUN.ApiGateway.HttpApi.Client\LINGYUN.ApiGateway.HttpApi.Client.csproj", "{089BE2D2-D579-47DA-B135-449C1153F27E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi", "modules\apigateway\LINGYUN.ApiGateway.HttpApi\LINGYUN.ApiGateway.HttpApi.csproj", "{D137106D-DCD5-455B-A297-44831DF38EE8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apigateway", "apigateway", "{19E6BD61-062B-4FAD-A51A-B55F5CE88B7A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identityServer", "identityServer", "{E2408063-FB1F-4513-B4A7-1FE50667C6E8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Host", "services\apigateway\LINGYUN.ApiGateway.Host\LINGYUN.ApiGateway.Host.csproj", "{7DF65FB1-AFA3-4D50-83D6-A37318296E6D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi.Host", "services\apigateway\LINGYUN.ApiGateway.HttpApi.Host\LINGYUN.ApiGateway.HttpApi.Host.csproj", "{9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuthServer.Host", "services\account\AuthServer.Host\AuthServer.Host.csproj", "{C1F56ED5-E898-45F1-97B5-61F4AB30FB58}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identityServer", "identityServer", "{0439B173-F41E-4CE0-A44A-CCB70328F272}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application.Contracts", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application.Contracts\LINGYUN.Abp.IdentityServer.Application.Contracts.csproj", "{3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application\LINGYUN.Abp.IdentityServer.Application.csproj", "{A584D040-95AC-4422-93FF-7B80532213F0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.HttpApi", "modules\identityServer\LINGYUN.Abp.IdentityServer.HttpApi\LINGYUN.Abp.IdentityServer.HttpApi.csproj", "{76249548-4344-4CD0-A0AC-12AC54184B58}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tenants", "tenants", "{A5543E56-DA53-494D-A531-DA75091D46FF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.Application.Contracts", "modules\tenants\LINGYUN.Abp.TenantManagement.Application.Contracts\LINGYUN.Abp.TenantManagement.Application.Contracts.csproj", "{FF4A3402-8DE2-4494-8F2B-614356DA72EA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.Application", "modules\tenants\LINGYUN.Abp.TenantManagement.Application\LINGYUN.Abp.TenantManagement.Application.csproj", "{EAE87281-4C33-4E8B-A489-480C55BA9E89}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.HttpApi", "modules\tenants\LINGYUN.Abp.TenantManagement.HttpApi\LINGYUN.Abp.TenantManagement.HttpApi.csproj", "{51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{E5D1B78A-1A8F-4D52-BF99-A4A863ADE898}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackendAdmin.HttpApi.Host", "services\admin\LINGYUN.Abp.BackendAdmin.HttpApi.Host\LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj", "{85090598-6B03-43D3-BE61-1E9777252D50}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{8AC72641-30D3-4ACF-89FA-808FADC55C2E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EventBus.CAP", "modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj", "{AEC1E6D3-DC23-41BD-B456-3AAD26E34978}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.SmsValidator", "modules\identityServer\LINGYUN.Abp.IdentityServer.SmsValidator\LINGYUN.Abp.IdentityServer.SmsValidator.csproj", "{E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{9E72FEB9-A626-4312-892B-CDD043879758}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application.Contracts", "modules\account\LINGYUN.Abp.Account.Application.Contracts\LINGYUN.Abp.Account.Application.Contracts.csproj", "{8B09385A-719C-4B83-B61E-0ECD5D2734BD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application", "modules\account\LINGYUN.Abp.Account.Application\LINGYUN.Abp.Account.Application.csproj", "{8E569C1C-2637-4D89-804C-50FBC83948FB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.HttpApi", "modules\account\LINGYUN.Abp.Account.HttpApi\LINGYUN.Abp.Account.HttpApi.csproj", "{5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Sms.Aliyun", "modules\common\LINGYUN.Abp.Sms.Aliyun\LINGYUN.Abp.Sms.Aliyun.csproj", "{FF1839EA-FB6B-4ED5-9804-E40427046D35}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location", "modules\common\LINGYUN.Abp.Location\LINGYUN.Abp.Location.csproj", "{9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Baidu", "modules\common\LINGYUN.Abp.Location.Baidu\LINGYUN.Abp.Location.Baidu.csproj", "{6E4A0D87-C3CE-430F-A475-A6B68C116D96}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "message", "message", "{3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain.Shared", "modules\message\LINGYUN.Abp.MessageService.Domain.Shared\LINGYUN.Abp.MessageService.Domain.Shared.csproj", "{A5851F0F-CB0D-4E29-A829-D1BDEADB807B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain", "modules\message\LINGYUN.Abp.MessageService.Domain\LINGYUN.Abp.MessageService.Domain.csproj", "{FDEECE0D-6F66-4053-948E-9AC021B97C8D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM.SignalR", "modules\common\LINGYUN.Abp.IM.SignalR\LINGYUN.Abp.IM.SignalR.csproj", "{B9FA1A02-A2BF-480D-914E-0780DAE442FC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM", "modules\common\LINGYUN.Abp.IM\LINGYUN.Abp.IM.csproj", "{59619184-02E7-4C61-8F96-89320CD7A3AE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications", "modules\common\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj", "{865A2AE3-864B-4425-8FA6-AFD62F6466DB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DistributedLock", "modules\common\LINGYUN.Abp.DistributedLock\LINGYUN.Abp.DistributedLock.csproj", "{35A23613-85BA-4E1B-835C-DB33AB4A2751}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DistributedLock.Redis", "modules\common\LINGYUN.Abp.DistributedLock.Redis\LINGYUN.Abp.DistributedLock.Redis.csproj", "{F6776BF7-5F73-4224-8915-C017F4EEDD28}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.SignalR", "modules\common\LINGYUN.Abp.Notifications.SignalR\LINGYUN.Abp.Notifications.SignalR.csproj", "{81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime", "modules\common\LINGYUN.Abp.RealTime\LINGYUN.Abp.RealTime.csproj", "{4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.EntityFrameworkCore", "modules\message\LINGYUN.Abp.MessageService.EntityFrameworkCore\LINGYUN.Abp.MessageService.EntityFrameworkCore.csproj", "{371B293B-0CA9-4385-8EBB-5224332066D2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "message", "message", "{608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi.Host", "services\messages\LINGYUN.Abp.MessageService.HttpApi.Host\LINGYUN.Abp.MessageService.HttpApi.Host.csproj", "{0D1DB712-B48D-4FB7-9A47-694C668A62E3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi", "modules\message\LINGYUN.Abp.MessageService.HttpApi\LINGYUN.Abp.MessageService.HttpApi.csproj", "{9E12ADBF-713B-4FE7-B71F-52B5078A57CE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Storage.MySql", "modules\common\LINGYUN.Abp.Hangfire.MySqlStorage\LINGYUN.Abp.Hangfire.Storage.MySql.csproj", "{47CC8F7A-681D-42B9-AE04-78453782C1B6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Storage.SqlServer", "modules\common\LINGYUN.Abp.Hangfire.Storage.SqlServer\LINGYUN.Abp.Hangfire.Storage.SqlServer.csproj", "{F595CB9F-B117-4D62-A1AE-48599927DB36}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundJobs.Hangfire", "modules\common\LINGYUN.Abp.BackgroundJobs.Hangfire\LINGYUN.Abp.BackgroundJobs.Hangfire.csproj", "{5CF403B2-47C9-4E4E-8856-0294BDD64884}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Aliyun", "modules\common\LINGYUN.Abp.BlobStoring.Aliyun\LINGYUN.Abp.BlobStoring.Aliyun.csproj", "{059473BA-FAF9-405F-9985-33DDCA2E9F0D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TestsBase", "tests\LINGYUN.Abp.TestBase\LINGYUN.Abp.TestsBase.csproj", "{B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Aliyun.Tests", "tests\LINGYUN.Abp.BlobStoring.Aliyun.Tests\LINGYUN.Abp.BlobStoring.Aliyun.Tests.csproj", "{C8A00439-5B8D-4923-8FAA-AB75E2A786ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application.Contracts", "modules\message\LINGYUN.Abp.MessageService.Application.Contracts\LINGYUN.Abp.MessageService.Application.Contracts.csproj", "{31B03DCB-ED12-4412-867A-61E347D40D8C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application", "modules\message\LINGYUN.Abp.MessageService.Application\LINGYUN.Abp.MessageService.Application.csproj", "{AB984240-EF03-416F-A9B2-F5CF169E04B7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi.Client", "modules\message\LINGYUN.Abp.MessageService.HttpApi.Client\LINGYUN.Abp.MessageService.HttpApi.Client.csproj", "{EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling", "modules\common\LINGYUN.Abp.ExceptionHandling\LINGYUN.Abp.ExceptionHandling.csproj", "{65DDA934-B76B-4018-A565-CF6CEF0D6BB0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Notifications", "modules\common\LINGYUN.Abp.ExceptionHandling.Notifications\LINGYUN.Abp.ExceptionHandling.Notifications.csproj", "{0F14C850-7F4C-4791-9C6C-7E56F985C71D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing", "modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj", "{376D8343-DF83-41D2-BF6E-2F5DC8DBF259}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing.Tests", "tests\LINGYUN.Abp.ExceptionHandling.Emailing.Tests\LINGYUN.Abp.ExceptionHandling.Emailing.Tests.csproj", "{6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.HttpApi.Client", "modules\tenants\LINGYUN.Abp.TenantManagement.HttpApi.Client\LINGYUN.Abp.TenantManagement.HttpApi.Client.csproj", "{87C7DDCF-F80D-4A15-9044-71552DCB5550}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.RemoteService", "modules\tenants\LINGYUN.Abp.MultiTenancy.RemoteService\LINGYUN.Abp.MultiTenancy.RemoteService.csproj", "{7208C9AB-AB76-43E7-95FA-A0E463E82A3C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.DbFinder", "modules\tenants\LINGYUN.Abp.MultiTenancy.DbFinder\LINGYUN.Abp.MultiTenancy.DbFinder.csproj", "{9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy", "modules\tenants\LINGYUN.Abp.MultiTenancy\LINGYUN.Abp.MultiTenancy.csproj", "{A2B4ECAE-DABE-40F7-9335-496A79EDE671}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Tencent", "modules\common\LINGYUN.Abp.Location.Tencent\LINGYUN.Abp.Location.Tencent.csproj", "{1DA91161-8757-4A68-A0A1-8C94C36C9240}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{F4923692-D343-4318-AECA-96F580B1A563}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain.Shared", "modules\platform\LINGYUN.Platform.Domain.Shared\LINGYUN.Platform.Domain.Shared.csproj", "{F135B9E8-3FFE-44E9-835B-7B6A928F4823}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain", "modules\platform\LINGYUN.Platform.Domain\LINGYUN.Platform.Domain.csproj", "{75A6D078-C19D-4030-88CC-C2A8608FF604}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.EntityFrameworkCore", "modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj", "{2D895594-3FF5-4507-853A-CB65F2DB72ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application.Contracts", "modules\platform\LINGYUN.Platform.Application.Contracts\LINGYUN.Platform.Application.Contracts.csproj", "{AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application", "modules\platform\LINGYUN.Platform.Application\LINGYUN.Platform.Application.csproj", "{0655A0FB-59E8-4A9F-BAF5-47A89377F747}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi", "modules\platform\LINGYUN.Platform.HttpApi\LINGYUN.Platform.HttpApi.csproj", "{5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "admin", "admin", "{F4615BCE-D5C1-407A-8681-8EEE92DEF9D0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EntityFrameworkCore.Tests", "tests\LINGYUN.Abp.EntityFrameworkCore.Tests\LINGYUN.Abp.EntityFrameworkCore.Tests.csproj", "{F3D9B137-32DE-4018-8058-78AB17FCDF9C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{52B5D4F7-237B-4E0A-A167-68442164F70A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application.Contracts", "modules\identity\LINGYUN.Abp.Identity.Application.Contracts\LINGYUN.Abp.Identity.Application.Contracts.csproj", "{F19C8B0F-A332-4190-9ABE-95790E0AE864}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application", "modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj", "{BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi", "modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj", "{72DCA4CF-8B95-47C9-B02A-2671953B7987}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi.Client", "modules\identity\LINGYUN.Abp.Identity.HttpApi.Client\LINGYUN.Abp.Identity.HttpApi.Client.csproj", "{7DDEAEA9-E392-469C-ACB6-908C5BAD669E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "oss-management", "oss-management", "{B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6}" - ProjectSection(SolutionItems) = preProject - modules\oss-management\README.md = modules\oss-management\README.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application", "modules\oss-management\LINGYUN.Abp.OssManagement.Application\LINGYUN.Abp.OssManagement.Application.csproj", "{F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application.Contracts", "modules\oss-management\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj", "{86A67B8C-EFA0-4103-B60F-312F07C15A7A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.HttpApi", "modules\oss-management\LINGYUN.Abp.OssManagement.HttpApi\LINGYUN.Abp.OssManagement.HttpApi.csproj", "{854E1A42-FEA4-420E-9E83-0A39EE03F1ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain.Shared", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain.Shared\LINGYUN.Abp.OssManagement.Domain.Shared.csproj", "{21FCEF89-9A3F-476E-833A-A9C2131B2AE6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain\LINGYUN.Abp.OssManagement.Domain.csproj", "{14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi.Host", "services\platform\LINGYUN.Platform.HttpApi.Host\LINGYUN.Platform.HttpApi.Host.csproj", "{372123C3-3AFD-42C8-BB80-778322EA72C3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Domain", "modules\identityServer\LINGYUN.Abp.IdentityServer.Domain\LINGYUN.Abp.IdentityServer.Domain.csproj", "{F359AAA1-C854-444A-88F2-1C0D8A07F864}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.EntityFrameworkCore", "modules\identityServer\LINGYUN.Abp.IdentityServer.EntityFrameworkCore\LINGYUN.Abp.IdentityServer.EntityFrameworkCore.csproj", "{5D0ED1FC-3A7C-4531-9512-832E73AD9555}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain", "modules\identity\LINGYUN.Abp.Identity.Domain\LINGYUN.Abp.Identity.Domain.csproj", "{2BF7FB73-0C62-4ECF-99F0-0583855D2777}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.EntityFrameworkCore", "modules\identity\LINGYUN.Abp.Identity.EntityFrameworkCore\LINGYUN.Abp.Identity.EntityFrameworkCore.csproj", "{6FE7E243-2D99-4567-8786-6C9283D608EF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{685188AC-A145-4A27-BF5F-9C970A59AA9C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer4.HttpApi.Host", "services\identity-server\LINGYUN.Abp.IdentityServer4.HttpApi.Host\LINGYUN.Abp.IdentityServer4.HttpApi.Host.csproj", "{F85552D4-D22E-483A-B1F8-3DFB840F6F7C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Settings", "modules\common\LINGYUN.Abp.Settings\LINGYUN.Abp.Settings.csproj", "{6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation", "modules\common\LINGYUN.Abp.Features.LimitValidation\LINGYUN.Abp.Features.LimitValidation.csproj", "{65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis", "modules\common\LINGYUN.Abp.Features.LimitValidation.Redis\LINGYUN.Abp.Features.LimitValidation.Redis.csproj", "{D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis.Tests", "tests\LINGYUN.Abp.Features.LimitValidation.Redis.Tests\LINGYUN.Abp.Features.LimitValidation.Redis.Tests.csproj", "{F12F4645-C0FE-4129-8C71-65B4039DC445}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Tests", "tests\LINGYUN.Abp.Features.LimitValidation.Tests\LINGYUN.Abp.Features.LimitValidation.Tests.csproj", "{C457FA70-8732-44B8-A018-C96D14025D4B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "features", "features", "{08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Client", "modules\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj", "{7071E78B-755B-410A-830B-AA05D7168944}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.Client", "modules\features\LINGYUN.Abp.Features.Client\LINGYUN.Abp.Features.Client.csproj", "{87B65CBD-0FF4-4FB5-9ABC-161911A71179}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "auditing", "auditing", "{67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application.Contracts", "modules\auditing\LINGYUN.Abp.Auditing.Application.Contracts\LINGYUN.Abp.Auditing.Application.Contracts.csproj", "{F40F88F1-CA90-4A79-B772-80E287E25982}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application", "modules\auditing\LINGYUN.Abp.Auditing.Application\LINGYUN.Abp.Auditing.Application.csproj", "{AC3C8985-73C2-472A-8E76-A0B8786FEC3F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.HttpApi", "modules\auditing\LINGYUN.Abp.Auditing.HttpApi\LINGYUN.Abp.Auditing.HttpApi.csproj", "{07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "permission-management", "permission-management", "{CC362C67-6FC1-42B3-A130-8120AA8D790C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Domain\LINGYUN.Abp.PermissionManagement.Domain.csproj", "{B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain.Identity", "modules\identity\LINGYUN.Abp.PermissionManagement.Domain.Identity\LINGYUN.Abp.PermissionManagement.Domain.Identity.csproj", "{2D377D3A-70EC-4BB3-9F4C-6C933693DA98}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.SignalR.JwtToken", "modules\common\LINGYUN.Abp.AspNetCore.SignalR\LINGYUN.Abp.AspNetCore.SignalR.JwtToken.csproj", "{A66D48C9-F141-4111-9169-CEB64AFFF61D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime.SignalR", "modules\common\LINGYUN.Abp.RealTime.SignalR\LINGYUN.Abp.RealTime.SignalR.csproj", "{524276E1-053D-4191-ABF7-4CDA01BFFBC3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json", "modules\common\LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json\LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json.csproj", "{43083268-74DE-4C68-824A-FB0CEC77358D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wechat", "wechat", "{DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat", "modules\wechat\LINGYUN.Abp.WeChat\LINGYUN.Abp.WeChat.csproj", "{BAE74ABC-1096-495F-A624-BEBFBC1896F2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain.Shared", "modules\identity\LINGYUN.Abp.Identity.Domain.Shared\LINGYUN.Abp.Identity.Domain.Shared.csproj", "{E92A1CAA-5758-41EF-B67E-C0D394E85417}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.MiniProgram", "modules\wechat\LINGYUN.Abp.WeChat.MiniProgram\LINGYUN.Abp.WeChat.MiniProgram.csproj", "{F18DE651-A3E4-478F-A2B5-686429729EB8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official", "modules\wechat\LINGYUN.Abp.WeChat.Official\LINGYUN.Abp.WeChat.Official.csproj", "{42309C06-C0F2-490F-931B-CF41FA1970FF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.SettingManagement", "modules\wechat\LINGYUN.Abp.WeChat.SettingManagement\LINGYUN.Abp.WeChat.SettingManagement.csproj", "{EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.WeChat", "modules\identityServer\LINGYUN.Abp.IdentityServer.WeChat\LINGYUN.Abp.IdentityServer.WeChat.csproj", "{7356FC4B-CAB2-4808-8C97-9AF74583F3A4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.WeChat.MiniProgram", "modules\wechat\LINGYUN.Abp.Notifications.WeChat.MiniProgram\LINGYUN.Abp.Notifications.WeChat.MiniProgram.csproj", "{DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cloud-aliyun", "cloud-aliyun", "{14CDBAD1-10C8-464A-B445-1F727C988010}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cloud-tencent", "cloud-tencent", "{3B96F4D8-4993-419B-BCEB-AFE4ED39449F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun", "modules\cloud-aliyun\LINGYUN.Abp.Aliyun\LINGYUN.Abp.Aliyun.csproj", "{FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Tencent", "modules\cloud-tencent\LINGYUN.Abp.Tencent\LINGYUN.Abp.Tencent.csproj", "{97B4A37E-B93E-48C9-95D5-689CB9495D8B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Sms", "modules\common\LINGYUN.Abp.Notifications.Sms\LINGYUN.Abp.Notifications.Sms.csproj", "{8C3312E7-F51E-4780-A893-CE0E0B80B579}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.SettingManagement", "modules\cloud-aliyun\LINGYUN.Abp.Aliyun.SettingManagement\LINGYUN.Abp.Aliyun.SettingManagement.csproj", "{FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.Tests", "tests\LINGYUN.Abp.Aliyun.Tests\LINGYUN.Abp.Aliyun.Tests.csproj", "{B86EBB6F-A27F-4277-8265-937951A9DCB0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Aliyun", "modules\oss-management\LINGYUN.Abp.OssManagement.Aliyun\LINGYUN.Abp.OssManagement.Aliyun.csproj", "{35B17218-9FB6-439E-AF73-9A1454BC923C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.FileSystem", "modules\oss-management\LINGYUN.Abp.OssManagement.FileSystem\LINGYUN.Abp.OssManagement.FileSystem.csproj", "{D5036D3F-1C53-47EE-BA50-AD290AE062D7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.FileSystem.ImageSharp", "modules\oss-management\LINGYUN.Abp.OssManagement.FileSystem.ImageSharp\LINGYUN.Abp.OssManagement.FileSystem.ImageSharp.csproj", "{3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.SettingManagement", "modules\oss-management\LINGYUN.Abp.OssManagement.SettingManagement\LINGYUN.Abp.OssManagement.SettingManagement.csproj", "{BD74BE00-54E4-4979-8797-E8027695F396}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis.Client", "modules\common\LINGYUN.Abp.Features.LimitValidation.Redis.Client\LINGYUN.Abp.Features.LimitValidation.Redis.Client.csproj", "{48DE251A-3482-4934-BC26-F99D2235AC9F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Tencent.Tests", "tests\LINGYUN.Abp.Location.Tencent.Tests\LINGYUN.Abp.Location.Tencent.Tests.csproj", "{94B47385-E47F-4FD7-A3A9-A7AA122EFC93}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Baidu.Tests", "tests\LINGYUN.Abp.Location.Baidu.Tests\LINGYUN.Abp.Location.Baidu.Tests.csproj", "{C892CD81-50AE-49E5-BF44-A0C28A1614CC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Client", "modules\common\LINGYUN.Abp.AspNetCore.Mvc.Client\LINGYUN.Abp.AspNetCore.Mvc.Client.csproj", "{EEF03CC6-1013-4AAF-BEED-BB4BA5021039}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{90E88EAC-4291-4406-8D88-EFDF61B11292}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Xml", "modules\localization\LINGYUN.Abp.Localization.Xml\LINGYUN.Abp.Localization.Xml.csproj", "{84868710-ECBB-4025-900A-EEB99EC49534}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Xml.Tests", "tests\LINGYUN.Abp.Localization.Xml.Tests\LINGYUN.Abp.Localization.Xml.Tests.csproj", "{A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Dynamic", "modules\common\LINGYUN.Abp.Localization.Dynamic\LINGYUN.Abp.Localization.Dynamic.csproj", "{4A9043FD-24A3-4A4A-956B-9CB71876F415}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization-management", "localization-management", "{D3BAA44E-8395-4E8A-AA96-6B463356C537}" - ProjectSection(SolutionItems) = preProject - modules\lt\README.md = modules\lt\README.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain.Shared", "modules\lt\LINGYUN.Abp.LocalizationManagement.Domain.Shared\LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj", "{5BE18D72-0D02-4854-966E-745CE5DAF77F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain", "modules\lt\LINGYUN.Abp.LocalizationManagement.Domain\LINGYUN.Abp.LocalizationManagement.Domain.csproj", "{73EAD4FE-B44F-44A7-904E-FFA5096D91BD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application.Contracts", "modules\lt\LINGYUN.Abp.LocalizationManagement.Application.Contracts\LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj", "{06D34108-01BA-4C77-A704-4DD9E6F7E32C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application", "modules\lt\LINGYUN.Abp.LocalizationManagement.Application\LINGYUN.Abp.LocalizationManagement.Application.csproj", "{A98C939C-9F48-414A-A2D3-853BE4447397}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore", "modules\lt\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj", "{A94BE05F-7DAB-461C-93E7-914CBDF4FA93}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi", "modules\lt\LINGYUN.Abp.LocalizationManagement.HttpApi\LINGYUN.Abp.LocalizationManagement.HttpApi.csproj", "{FBE91498-D83B-4873-A67E-0FB9D1C366F0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi.Host", "services\localization\LINGYUN.Abp.LocalizationManagement.HttpApi.Host\LINGYUN.Abp.LocalizationManagement.HttpApi.Host.csproj", "{6FFC14FE-F659-4B23-9746-4B767CE520D2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rules", "rules", "{6084D52D-775B-4A39-8CD5-AA2F362B5A61}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules", "modules\rules\LINGYUN.Abp.Rules\LINGYUN.Abp.Rules.csproj", "{D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.NRules", "modules\rules\LINGYUN.Abp.Rules.NRules\LINGYUN.Abp.Rules.NRules.csproj", "{34BB9810-2983-4E55-A96A-132D32310145}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.RulesEngine", "modules\rules\LINGYUN.Abp.Rules.RulesEngine\LINGYUN.Abp.Rules.RulesEngine.csproj", "{4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.RulesEngine.Tests", "tests\LINGYUN.Abp.Rules.RulesEngine.Tests\LINGYUN.Abp.Rules.RulesEngine.Tests.csproj", "{8EF31071-3521-409D-9740-BBFBFC04C50E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.HttpOverrides", "modules\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN.Abp.AspNetCore.HttpOverrides.csproj", "{13219C1C-23E1-4EBA-93FB-86830C93A800}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ApiGateway.Host", "services\apigateway\LINGYUN.Abp.ApiGateway.Host\LINGYUN.Abp.ApiGateway.Host.csproj", "{A320E23E-792D-4736-B963-381F9D7AF605}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundWorkers.Hangfire", "modules\common\LINGYUN.Abp.BackgroundWorkers.Hangfire\LINGYUN.Abp.BackgroundWorkers.Hangfire.csproj", "{60D0BEF2-FEAF-4066-8377-6C873CB24858}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Dashboard", "modules\common\LINGYUN.Abp.Hangfire.Dashboard\LINGYUN.Abp.Hangfire.Dashboard.csproj", "{340BE5AC-68EC-41A5-9D0D-266037C58F13}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Debug|Any CPU.Build.0 = Debug|Any CPU - {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Release|Any CPU.ActiveCfg = Release|Any CPU - {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Release|Any CPU.Build.0 = Release|Any CPU - {573B7B0E-3065-42DE-A391-EE026CE7A366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {573B7B0E-3065-42DE-A391-EE026CE7A366}.Debug|Any CPU.Build.0 = Debug|Any CPU - {573B7B0E-3065-42DE-A391-EE026CE7A366}.Release|Any CPU.ActiveCfg = Release|Any CPU - {573B7B0E-3065-42DE-A391-EE026CE7A366}.Release|Any CPU.Build.0 = Release|Any CPU - {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Release|Any CPU.Build.0 = Release|Any CPU - {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Debug|Any CPU.Build.0 = Debug|Any CPU - {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Release|Any CPU.ActiveCfg = Release|Any CPU - {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Release|Any CPU.Build.0 = Release|Any CPU - {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Release|Any CPU.Build.0 = Release|Any CPU - {269FF49F-97A3-4502-B424-D8CD55FC5727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {269FF49F-97A3-4502-B424-D8CD55FC5727}.Debug|Any CPU.Build.0 = Debug|Any CPU - {269FF49F-97A3-4502-B424-D8CD55FC5727}.Release|Any CPU.ActiveCfg = Release|Any CPU - {269FF49F-97A3-4502-B424-D8CD55FC5727}.Release|Any CPU.Build.0 = Release|Any CPU - {87049236-4808-4C33-88BA-D3CA6BB1F786}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87049236-4808-4C33-88BA-D3CA6BB1F786}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87049236-4808-4C33-88BA-D3CA6BB1F786}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87049236-4808-4C33-88BA-D3CA6BB1F786}.Release|Any CPU.Build.0 = Release|Any CPU - {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Release|Any CPU.Build.0 = Release|Any CPU - {089BE2D2-D579-47DA-B135-449C1153F27E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {089BE2D2-D579-47DA-B135-449C1153F27E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {089BE2D2-D579-47DA-B135-449C1153F27E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {089BE2D2-D579-47DA-B135-449C1153F27E}.Release|Any CPU.Build.0 = Release|Any CPU - {D137106D-DCD5-455B-A297-44831DF38EE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D137106D-DCD5-455B-A297-44831DF38EE8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D137106D-DCD5-455B-A297-44831DF38EE8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D137106D-DCD5-455B-A297-44831DF38EE8}.Release|Any CPU.Build.0 = Release|Any CPU - {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Release|Any CPU.Build.0 = Release|Any CPU - {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Release|Any CPU.Build.0 = Release|Any CPU - {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Release|Any CPU.Build.0 = Release|Any CPU - {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Release|Any CPU.Build.0 = Release|Any CPU - {A584D040-95AC-4422-93FF-7B80532213F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A584D040-95AC-4422-93FF-7B80532213F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A584D040-95AC-4422-93FF-7B80532213F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A584D040-95AC-4422-93FF-7B80532213F0}.Release|Any CPU.Build.0 = Release|Any CPU - {76249548-4344-4CD0-A0AC-12AC54184B58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {76249548-4344-4CD0-A0AC-12AC54184B58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {76249548-4344-4CD0-A0AC-12AC54184B58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {76249548-4344-4CD0-A0AC-12AC54184B58}.Release|Any CPU.Build.0 = Release|Any CPU - {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Release|Any CPU.Build.0 = Release|Any CPU - {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Release|Any CPU.Build.0 = Release|Any CPU - {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Release|Any CPU.Build.0 = Release|Any CPU - {85090598-6B03-43D3-BE61-1E9777252D50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {85090598-6B03-43D3-BE61-1E9777252D50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {85090598-6B03-43D3-BE61-1E9777252D50}.Release|Any CPU.ActiveCfg = Release|Any CPU - {85090598-6B03-43D3-BE61-1E9777252D50}.Release|Any CPU.Build.0 = Release|Any CPU - {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Release|Any CPU.Build.0 = Release|Any CPU - {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Release|Any CPU.Build.0 = Release|Any CPU - {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Release|Any CPU.Build.0 = Release|Any CPU - {8E569C1C-2637-4D89-804C-50FBC83948FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8E569C1C-2637-4D89-804C-50FBC83948FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8E569C1C-2637-4D89-804C-50FBC83948FB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8E569C1C-2637-4D89-804C-50FBC83948FB}.Release|Any CPU.Build.0 = Release|Any CPU - {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Release|Any CPU.Build.0 = Release|Any CPU - {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Release|Any CPU.Build.0 = Release|Any CPU - {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Release|Any CPU.Build.0 = Release|Any CPU - {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Release|Any CPU.Build.0 = Release|Any CPU - {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Release|Any CPU.Build.0 = Release|Any CPU - {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Release|Any CPU.Build.0 = Release|Any CPU - {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Release|Any CPU.Build.0 = Release|Any CPU - {59619184-02E7-4C61-8F96-89320CD7A3AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {59619184-02E7-4C61-8F96-89320CD7A3AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59619184-02E7-4C61-8F96-89320CD7A3AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {59619184-02E7-4C61-8F96-89320CD7A3AE}.Release|Any CPU.Build.0 = Release|Any CPU - {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Release|Any CPU.Build.0 = Release|Any CPU - {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Debug|Any CPU.Build.0 = Debug|Any CPU - {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Release|Any CPU.ActiveCfg = Release|Any CPU - {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Release|Any CPU.Build.0 = Release|Any CPU - {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Release|Any CPU.Build.0 = Release|Any CPU - {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Release|Any CPU.Build.0 = Release|Any CPU - {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Release|Any CPU.Build.0 = Release|Any CPU - {371B293B-0CA9-4385-8EBB-5224332066D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {371B293B-0CA9-4385-8EBB-5224332066D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {371B293B-0CA9-4385-8EBB-5224332066D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {371B293B-0CA9-4385-8EBB-5224332066D2}.Release|Any CPU.Build.0 = Release|Any CPU - {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Release|Any CPU.Build.0 = Release|Any CPU - {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Release|Any CPU.Build.0 = Release|Any CPU - {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Release|Any CPU.Build.0 = Release|Any CPU - {F595CB9F-B117-4D62-A1AE-48599927DB36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F595CB9F-B117-4D62-A1AE-48599927DB36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F595CB9F-B117-4D62-A1AE-48599927DB36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F595CB9F-B117-4D62-A1AE-48599927DB36}.Release|Any CPU.Build.0 = Release|Any CPU - {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Release|Any CPU.Build.0 = Release|Any CPU - {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Release|Any CPU.Build.0 = Release|Any CPU - {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Release|Any CPU.Build.0 = Release|Any CPU - {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Release|Any CPU.Build.0 = Release|Any CPU - {31B03DCB-ED12-4412-867A-61E347D40D8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {31B03DCB-ED12-4412-867A-61E347D40D8C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {31B03DCB-ED12-4412-867A-61E347D40D8C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {31B03DCB-ED12-4412-867A-61E347D40D8C}.Release|Any CPU.Build.0 = Release|Any CPU - {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Release|Any CPU.Build.0 = Release|Any CPU - {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Release|Any CPU.Build.0 = Release|Any CPU - {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Release|Any CPU.Build.0 = Release|Any CPU - {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Release|Any CPU.Build.0 = Release|Any CPU - {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Debug|Any CPU.Build.0 = Debug|Any CPU - {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Release|Any CPU.ActiveCfg = Release|Any CPU - {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Release|Any CPU.Build.0 = Release|Any CPU - {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Release|Any CPU.Build.0 = Release|Any CPU - {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Release|Any CPU.Build.0 = Release|Any CPU - {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Release|Any CPU.Build.0 = Release|Any CPU - {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Release|Any CPU.Build.0 = Release|Any CPU - {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Release|Any CPU.Build.0 = Release|Any CPU - {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Release|Any CPU.Build.0 = Release|Any CPU - {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Release|Any CPU.Build.0 = Release|Any CPU - {75A6D078-C19D-4030-88CC-C2A8608FF604}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {75A6D078-C19D-4030-88CC-C2A8608FF604}.Debug|Any CPU.Build.0 = Debug|Any CPU - {75A6D078-C19D-4030-88CC-C2A8608FF604}.Release|Any CPU.ActiveCfg = Release|Any CPU - {75A6D078-C19D-4030-88CC-C2A8608FF604}.Release|Any CPU.Build.0 = Release|Any CPU - {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Release|Any CPU.Build.0 = Release|Any CPU - {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Release|Any CPU.Build.0 = Release|Any CPU - {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Release|Any CPU.Build.0 = Release|Any CPU - {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Release|Any CPU.Build.0 = Release|Any CPU - {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Release|Any CPU.Build.0 = Release|Any CPU - {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Release|Any CPU.Build.0 = Release|Any CPU - {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Release|Any CPU.Build.0 = Release|Any CPU - {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Release|Any CPU.Build.0 = Release|Any CPU - {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.Build.0 = Release|Any CPU - {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Release|Any CPU.Build.0 = Release|Any CPU - {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Release|Any CPU.Build.0 = Release|Any CPU - {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Release|Any CPU.Build.0 = Release|Any CPU - {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Release|Any CPU.Build.0 = Release|Any CPU - {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Debug|Any CPU.Build.0 = Debug|Any CPU - {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Release|Any CPU.ActiveCfg = Release|Any CPU - {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Release|Any CPU.Build.0 = Release|Any CPU - {372123C3-3AFD-42C8-BB80-778322EA72C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {372123C3-3AFD-42C8-BB80-778322EA72C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {372123C3-3AFD-42C8-BB80-778322EA72C3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {372123C3-3AFD-42C8-BB80-778322EA72C3}.Release|Any CPU.Build.0 = Release|Any CPU - {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Release|Any CPU.Build.0 = Release|Any CPU - {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Release|Any CPU.Build.0 = Release|Any CPU - {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Release|Any CPU.Build.0 = Release|Any CPU - {6FE7E243-2D99-4567-8786-6C9283D608EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6FE7E243-2D99-4567-8786-6C9283D608EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6FE7E243-2D99-4567-8786-6C9283D608EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6FE7E243-2D99-4567-8786-6C9283D608EF}.Release|Any CPU.Build.0 = Release|Any CPU - {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Release|Any CPU.Build.0 = Release|Any CPU - {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Release|Any CPU.Build.0 = Release|Any CPU - {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Release|Any CPU.Build.0 = Release|Any CPU - {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Release|Any CPU.Build.0 = Release|Any CPU - {F12F4645-C0FE-4129-8C71-65B4039DC445}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F12F4645-C0FE-4129-8C71-65B4039DC445}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F12F4645-C0FE-4129-8C71-65B4039DC445}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F12F4645-C0FE-4129-8C71-65B4039DC445}.Release|Any CPU.Build.0 = Release|Any CPU - {C457FA70-8732-44B8-A018-C96D14025D4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C457FA70-8732-44B8-A018-C96D14025D4B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C457FA70-8732-44B8-A018-C96D14025D4B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C457FA70-8732-44B8-A018-C96D14025D4B}.Release|Any CPU.Build.0 = Release|Any CPU - {7071E78B-755B-410A-830B-AA05D7168944}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7071E78B-755B-410A-830B-AA05D7168944}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7071E78B-755B-410A-830B-AA05D7168944}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7071E78B-755B-410A-830B-AA05D7168944}.Release|Any CPU.Build.0 = Release|Any CPU - {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Release|Any CPU.Build.0 = Release|Any CPU - {F40F88F1-CA90-4A79-B772-80E287E25982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F40F88F1-CA90-4A79-B772-80E287E25982}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F40F88F1-CA90-4A79-B772-80E287E25982}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F40F88F1-CA90-4A79-B772-80E287E25982}.Release|Any CPU.Build.0 = Release|Any CPU - {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Release|Any CPU.Build.0 = Release|Any CPU - {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Release|Any CPU.Build.0 = Release|Any CPU - {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Release|Any CPU.Build.0 = Release|Any CPU - {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Release|Any CPU.Build.0 = Release|Any CPU - {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Release|Any CPU.Build.0 = Release|Any CPU - {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Release|Any CPU.Build.0 = Release|Any CPU - {43083268-74DE-4C68-824A-FB0CEC77358D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {43083268-74DE-4C68-824A-FB0CEC77358D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {43083268-74DE-4C68-824A-FB0CEC77358D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {43083268-74DE-4C68-824A-FB0CEC77358D}.Release|Any CPU.Build.0 = Release|Any CPU - {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Release|Any CPU.Build.0 = Release|Any CPU - {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Release|Any CPU.Build.0 = Release|Any CPU - {F18DE651-A3E4-478F-A2B5-686429729EB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F18DE651-A3E4-478F-A2B5-686429729EB8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F18DE651-A3E4-478F-A2B5-686429729EB8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F18DE651-A3E4-478F-A2B5-686429729EB8}.Release|Any CPU.Build.0 = Release|Any CPU - {42309C06-C0F2-490F-931B-CF41FA1970FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {42309C06-C0F2-490F-931B-CF41FA1970FF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {42309C06-C0F2-490F-931B-CF41FA1970FF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42309C06-C0F2-490F-931B-CF41FA1970FF}.Release|Any CPU.Build.0 = Release|Any CPU - {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Release|Any CPU.Build.0 = Release|Any CPU - {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Release|Any CPU.Build.0 = Release|Any CPU - {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Release|Any CPU.Build.0 = Release|Any CPU - {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Release|Any CPU.Build.0 = Release|Any CPU - {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Release|Any CPU.Build.0 = Release|Any CPU - {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Release|Any CPU.Build.0 = Release|Any CPU - {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Release|Any CPU.Build.0 = Release|Any CPU - {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Release|Any CPU.Build.0 = Release|Any CPU - {35B17218-9FB6-439E-AF73-9A1454BC923C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {35B17218-9FB6-439E-AF73-9A1454BC923C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {35B17218-9FB6-439E-AF73-9A1454BC923C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {35B17218-9FB6-439E-AF73-9A1454BC923C}.Release|Any CPU.Build.0 = Release|Any CPU - {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Release|Any CPU.Build.0 = Release|Any CPU - {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Release|Any CPU.Build.0 = Release|Any CPU - {BD74BE00-54E4-4979-8797-E8027695F396}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BD74BE00-54E4-4979-8797-E8027695F396}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BD74BE00-54E4-4979-8797-E8027695F396}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BD74BE00-54E4-4979-8797-E8027695F396}.Release|Any CPU.Build.0 = Release|Any CPU - {48DE251A-3482-4934-BC26-F99D2235AC9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {48DE251A-3482-4934-BC26-F99D2235AC9F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {48DE251A-3482-4934-BC26-F99D2235AC9F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {48DE251A-3482-4934-BC26-F99D2235AC9F}.Release|Any CPU.Build.0 = Release|Any CPU - {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Debug|Any CPU.Build.0 = Debug|Any CPU - {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Release|Any CPU.ActiveCfg = Release|Any CPU - {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Release|Any CPU.Build.0 = Release|Any CPU - {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Release|Any CPU.Build.0 = Release|Any CPU - {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Release|Any CPU.Build.0 = Release|Any CPU - {84868710-ECBB-4025-900A-EEB99EC49534}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {84868710-ECBB-4025-900A-EEB99EC49534}.Debug|Any CPU.Build.0 = Debug|Any CPU - {84868710-ECBB-4025-900A-EEB99EC49534}.Release|Any CPU.ActiveCfg = Release|Any CPU - {84868710-ECBB-4025-900A-EEB99EC49534}.Release|Any CPU.Build.0 = Release|Any CPU - {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Release|Any CPU.Build.0 = Release|Any CPU - {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Release|Any CPU.Build.0 = Release|Any CPU - {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Release|Any CPU.Build.0 = Release|Any CPU - {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Release|Any CPU.Build.0 = Release|Any CPU - {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Release|Any CPU.Build.0 = Release|Any CPU - {A98C939C-9F48-414A-A2D3-853BE4447397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A98C939C-9F48-414A-A2D3-853BE4447397}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A98C939C-9F48-414A-A2D3-853BE4447397}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A98C939C-9F48-414A-A2D3-853BE4447397}.Release|Any CPU.Build.0 = Release|Any CPU - {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Release|Any CPU.Build.0 = Release|Any CPU - {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Release|Any CPU.Build.0 = Release|Any CPU - {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Release|Any CPU.Build.0 = Release|Any CPU - {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Release|Any CPU.Build.0 = Release|Any CPU - {34BB9810-2983-4E55-A96A-132D32310145}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {34BB9810-2983-4E55-A96A-132D32310145}.Debug|Any CPU.Build.0 = Debug|Any CPU - {34BB9810-2983-4E55-A96A-132D32310145}.Release|Any CPU.ActiveCfg = Release|Any CPU - {34BB9810-2983-4E55-A96A-132D32310145}.Release|Any CPU.Build.0 = Release|Any CPU - {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Release|Any CPU.Build.0 = Release|Any CPU - {8EF31071-3521-409D-9740-BBFBFC04C50E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8EF31071-3521-409D-9740-BBFBFC04C50E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8EF31071-3521-409D-9740-BBFBFC04C50E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8EF31071-3521-409D-9740-BBFBFC04C50E}.Release|Any CPU.Build.0 = Release|Any CPU - {13219C1C-23E1-4EBA-93FB-86830C93A800}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {13219C1C-23E1-4EBA-93FB-86830C93A800}.Debug|Any CPU.Build.0 = Debug|Any CPU - {13219C1C-23E1-4EBA-93FB-86830C93A800}.Release|Any CPU.ActiveCfg = Release|Any CPU - {13219C1C-23E1-4EBA-93FB-86830C93A800}.Release|Any CPU.Build.0 = Release|Any CPU - {A320E23E-792D-4736-B963-381F9D7AF605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A320E23E-792D-4736-B963-381F9D7AF605}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A320E23E-792D-4736-B963-381F9D7AF605}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A320E23E-792D-4736-B963-381F9D7AF605}.Release|Any CPU.Build.0 = Release|Any CPU - {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Debug|Any CPU.Build.0 = Debug|Any CPU - {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Release|Any CPU.ActiveCfg = Release|Any CPU - {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Release|Any CPU.Build.0 = Release|Any CPU - {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Debug|Any CPU.Build.0 = Debug|Any CPU - {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Release|Any CPU.ActiveCfg = Release|Any CPU - {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {77BDEF2B-1A30-4E64-BC35-0DFC21091327} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} - {573B7B0E-3065-42DE-A391-EE026CE7A366} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} - {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} - {68ADC230-B563-4948-BBF1-2112DFE93BC1} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {40E217A9-46EA-48DE-BE0B-6CC824240E97} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {269FF49F-97A3-4502-B424-D8CD55FC5727} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {87049236-4808-4C33-88BA-D3CA6BB1F786} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {089BE2D2-D579-47DA-B135-449C1153F27E} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {D137106D-DCD5-455B-A297-44831DF38EE8} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} - {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {E2408063-FB1F-4513-B4A7-1FE50667C6E8} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {7DF65FB1-AFA3-4D50-83D6-A37318296E6D} = {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} - {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9} = {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} - {C1F56ED5-E898-45F1-97B5-61F4AB30FB58} = {685188AC-A145-4A27-BF5F-9C970A59AA9C} - {0439B173-F41E-4CE0-A44A-CCB70328F272} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {A584D040-95AC-4422-93FF-7B80532213F0} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {76249548-4344-4CD0-A0AC-12AC54184B58} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {A5543E56-DA53-494D-A531-DA75091D46FF} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {FF4A3402-8DE2-4494-8F2B-614356DA72EA} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {EAE87281-4C33-4E8B-A489-480C55BA9E89} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {E5D1B78A-1A8F-4D52-BF99-A4A863ADE898} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {85090598-6B03-43D3-BE61-1E9777252D50} = {F4615BCE-D5C1-407A-8681-8EEE92DEF9D0} - {8AC72641-30D3-4ACF-89FA-808FADC55C2E} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {AEC1E6D3-DC23-41BD-B456-3AAD26E34978} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {9E72FEB9-A626-4312-892B-CDD043879758} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {8B09385A-719C-4B83-B61E-0ECD5D2734BD} = {9E72FEB9-A626-4312-892B-CDD043879758} - {8E569C1C-2637-4D89-804C-50FBC83948FB} = {9E72FEB9-A626-4312-892B-CDD043879758} - {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D} = {9E72FEB9-A626-4312-892B-CDD043879758} - {FF1839EA-FB6B-4ED5-9804-E40427046D35} = {14CDBAD1-10C8-464A-B445-1F727C988010} - {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {6E4A0D87-C3CE-430F-A475-A6B68C116D96} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {A5851F0F-CB0D-4E29-A829-D1BDEADB807B} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {FDEECE0D-6F66-4053-948E-9AC021B97C8D} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {B9FA1A02-A2BF-480D-914E-0780DAE442FC} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {59619184-02E7-4C61-8F96-89320CD7A3AE} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {865A2AE3-864B-4425-8FA6-AFD62F6466DB} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {35A23613-85BA-4E1B-835C-DB33AB4A2751} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {F6776BF7-5F73-4224-8915-C017F4EEDD28} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {371B293B-0CA9-4385-8EBB-5224332066D2} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {0D1DB712-B48D-4FB7-9A47-694C668A62E3} = {608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F} - {9E12ADBF-713B-4FE7-B71F-52B5078A57CE} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {47CC8F7A-681D-42B9-AE04-78453782C1B6} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {F595CB9F-B117-4D62-A1AE-48599927DB36} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {5CF403B2-47C9-4E4E-8856-0294BDD64884} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {059473BA-FAF9-405F-9985-33DDCA2E9F0D} = {14CDBAD1-10C8-464A-B445-1F727C988010} - {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {C8A00439-5B8D-4923-8FAA-AB75E2A786ED} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {31B03DCB-ED12-4412-867A-61E347D40D8C} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {AB984240-EF03-416F-A9B2-F5CF169E04B7} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} - {65DDA934-B76B-4018-A565-CF6CEF0D6BB0} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {0F14C850-7F4C-4791-9C6C-7E56F985C71D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {376D8343-DF83-41D2-BF6E-2F5DC8DBF259} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {87C7DDCF-F80D-4A15-9044-71552DCB5550} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {7208C9AB-AB76-43E7-95FA-A0E463E82A3C} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {A2B4ECAE-DABE-40F7-9335-496A79EDE671} = {A5543E56-DA53-494D-A531-DA75091D46FF} - {1DA91161-8757-4A68-A0A1-8C94C36C9240} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {F4923692-D343-4318-AECA-96F580B1A563} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {F135B9E8-3FFE-44E9-835B-7B6A928F4823} = {F4923692-D343-4318-AECA-96F580B1A563} - {75A6D078-C19D-4030-88CC-C2A8608FF604} = {F4923692-D343-4318-AECA-96F580B1A563} - {2D895594-3FF5-4507-853A-CB65F2DB72ED} = {F4923692-D343-4318-AECA-96F580B1A563} - {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93} = {F4923692-D343-4318-AECA-96F580B1A563} - {0655A0FB-59E8-4A9F-BAF5-47A89377F747} = {F4923692-D343-4318-AECA-96F580B1A563} - {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE} = {F4923692-D343-4318-AECA-96F580B1A563} - {F4615BCE-D5C1-407A-8681-8EEE92DEF9D0} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {F3D9B137-32DE-4018-8058-78AB17FCDF9C} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {52B5D4F7-237B-4E0A-A167-68442164F70A} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {F19C8B0F-A332-4190-9ABE-95790E0AE864} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {72DCA4CF-8B95-47C9-B02A-2671953B7987} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {7DDEAEA9-E392-469C-ACB6-908C5BAD669E} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {86A67B8C-EFA0-4103-B60F-312F07C15A7A} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {854E1A42-FEA4-420E-9E83-0A39EE03F1ED} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {21FCEF89-9A3F-476E-833A-A9C2131B2AE6} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {372123C3-3AFD-42C8-BB80-778322EA72C3} = {E5D1B78A-1A8F-4D52-BF99-A4A863ADE898} - {F359AAA1-C854-444A-88F2-1C0D8A07F864} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {5D0ED1FC-3A7C-4531-9512-832E73AD9555} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {2BF7FB73-0C62-4ECF-99F0-0583855D2777} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {6FE7E243-2D99-4567-8786-6C9283D608EF} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {685188AC-A145-4A27-BF5F-9C970A59AA9C} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {F85552D4-D22E-483A-B1F8-3DFB840F6F7C} = {E2408063-FB1F-4513-B4A7-1FE50667C6E8} - {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {F12F4645-C0FE-4129-8C71-65B4039DC445} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {C457FA70-8732-44B8-A018-C96D14025D4B} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {7071E78B-755B-410A-830B-AA05D7168944} = {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} - {87B65CBD-0FF4-4FB5-9ABC-161911A71179} = {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} - {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {F40F88F1-CA90-4A79-B772-80E287E25982} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} - {AC3C8985-73C2-472A-8E76-A0B8786FEC3F} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} - {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} - {CC362C67-6FC1-42B3-A130-8120AA8D790C} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727} = {CC362C67-6FC1-42B3-A130-8120AA8D790C} - {2D377D3A-70EC-4BB3-9F4C-6C933693DA98} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {A66D48C9-F141-4111-9169-CEB64AFFF61D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {524276E1-053D-4191-ABF7-4CDA01BFFBC3} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {43083268-74DE-4C68-824A-FB0CEC77358D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {BAE74ABC-1096-495F-A624-BEBFBC1896F2} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} - {E92A1CAA-5758-41EF-B67E-C0D394E85417} = {52B5D4F7-237B-4E0A-A167-68442164F70A} - {F18DE651-A3E4-478F-A2B5-686429729EB8} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} - {42309C06-C0F2-490F-931B-CF41FA1970FF} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} - {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} - {7356FC4B-CAB2-4808-8C97-9AF74583F3A4} = {0439B173-F41E-4CE0-A44A-CCB70328F272} - {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} - {14CDBAD1-10C8-464A-B445-1F727C988010} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {3B96F4D8-4993-419B-BCEB-AFE4ED39449F} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC} = {14CDBAD1-10C8-464A-B445-1F727C988010} - {97B4A37E-B93E-48C9-95D5-689CB9495D8B} = {3B96F4D8-4993-419B-BCEB-AFE4ED39449F} - {8C3312E7-F51E-4780-A893-CE0E0B80B579} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C} = {14CDBAD1-10C8-464A-B445-1F727C988010} - {B86EBB6F-A27F-4277-8265-937951A9DCB0} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {35B17218-9FB6-439E-AF73-9A1454BC923C} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {D5036D3F-1C53-47EE-BA50-AD290AE062D7} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {BD74BE00-54E4-4979-8797-E8027695F396} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} - {48DE251A-3482-4934-BC26-F99D2235AC9F} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {94B47385-E47F-4FD7-A3A9-A7AA122EFC93} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {C892CD81-50AE-49E5-BF44-A0C28A1614CC} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {EEF03CC6-1013-4AAF-BEED-BB4BA5021039} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {90E88EAC-4291-4406-8D88-EFDF61B11292} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {84868710-ECBB-4025-900A-EEB99EC49534} = {90E88EAC-4291-4406-8D88-EFDF61B11292} - {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {4A9043FD-24A3-4A4A-956B-9CB71876F415} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {D3BAA44E-8395-4E8A-AA96-6B463356C537} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {5BE18D72-0D02-4854-966E-745CE5DAF77F} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {73EAD4FE-B44F-44A7-904E-FFA5096D91BD} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {06D34108-01BA-4C77-A704-4DD9E6F7E32C} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {A98C939C-9F48-414A-A2D3-853BE4447397} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {A94BE05F-7DAB-461C-93E7-914CBDF4FA93} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {FBE91498-D83B-4873-A67E-0FB9D1C366F0} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} - {A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B} = {672E1170-7B18-474B-85C7-1961BF2A48AE} - {6FFC14FE-F659-4B23-9746-4B767CE520D2} = {A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B} - {6084D52D-775B-4A39-8CD5-AA2F362B5A61} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} - {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} - {34BB9810-2983-4E55-A96A-132D32310145} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} - {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} - {8EF31071-3521-409D-9740-BBFBFC04C50E} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} - {13219C1C-23E1-4EBA-93FB-86830C93A800} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {A320E23E-792D-4736-B963-381F9D7AF605} = {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} - {60D0BEF2-FEAF-4066-8377-6C873CB24858} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - {340BE5AC-68EC-41A5-9D0D-266037C58F13} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{C5CAD011-DF84-4914-939C-0C029DCEF26F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{672E1170-7B18-474B-85C7-1961BF2A48AE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "settings", "settings", "{BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application.Contracts", "modules\settings\LINGYUN.Abp.SettingManagement.Application.Contracts\LINGYUN.Abp.SettingManagement.Application.Contracts.csproj", "{77BDEF2B-1A30-4E64-BC35-0DFC21091327}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application", "modules\settings\LINGYUN.Abp.SettingManagement.Application\LINGYUN.Abp.SettingManagement.Application.csproj", "{573B7B0E-3065-42DE-A391-EE026CE7A366}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.HttpApi", "modules\settings\LINGYUN.Abp.SettingManagement.HttpApi\LINGYUN.Abp.SettingManagement.HttpApi.csproj", "{FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apigateway", "apigateway", "{68ADC230-B563-4948-BBF1-2112DFE93BC1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Domain.Shared", "modules\apigateway\LINGYUN.ApiGateway.Domain.Shared\LINGYUN.ApiGateway.Domain.Shared.csproj", "{40E217A9-46EA-48DE-BE0B-6CC824240E97}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Domain", "modules\apigateway\LINGYUN.ApiGateway.Domain\LINGYUN.ApiGateway.Domain.csproj", "{1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Application.Contracts", "modules\apigateway\LINGYUN.ApiGateway.Application.Contracts\LINGYUN.ApiGateway.Application.Contracts.csproj", "{269FF49F-97A3-4502-B424-D8CD55FC5727}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Application", "modules\apigateway\LINGYUN.ApiGateway.Application\LINGYUN.ApiGateway.Application.csproj", "{87049236-4808-4C33-88BA-D3CA6BB1F786}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.EntityFrameworkCore", "modules\apigateway\LINGYUN.ApiGateway.EntityFrameworkCore\LINGYUN.ApiGateway.EntityFrameworkCore.csproj", "{3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi.Client", "modules\apigateway\LINGYUN.ApiGateway.HttpApi.Client\LINGYUN.ApiGateway.HttpApi.Client.csproj", "{089BE2D2-D579-47DA-B135-449C1153F27E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi", "modules\apigateway\LINGYUN.ApiGateway.HttpApi\LINGYUN.ApiGateway.HttpApi.csproj", "{D137106D-DCD5-455B-A297-44831DF38EE8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apigateway", "apigateway", "{19E6BD61-062B-4FAD-A51A-B55F5CE88B7A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identityServer", "identityServer", "{E2408063-FB1F-4513-B4A7-1FE50667C6E8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Host", "services\apigateway\LINGYUN.ApiGateway.Host\LINGYUN.ApiGateway.Host.csproj", "{7DF65FB1-AFA3-4D50-83D6-A37318296E6D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi.Host", "services\apigateway\LINGYUN.ApiGateway.HttpApi.Host\LINGYUN.ApiGateway.HttpApi.Host.csproj", "{9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuthServer.Host", "services\account\AuthServer.Host\AuthServer.Host.csproj", "{C1F56ED5-E898-45F1-97B5-61F4AB30FB58}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identityServer", "identityServer", "{0439B173-F41E-4CE0-A44A-CCB70328F272}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application.Contracts", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application.Contracts\LINGYUN.Abp.IdentityServer.Application.Contracts.csproj", "{3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application\LINGYUN.Abp.IdentityServer.Application.csproj", "{A584D040-95AC-4422-93FF-7B80532213F0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.HttpApi", "modules\identityServer\LINGYUN.Abp.IdentityServer.HttpApi\LINGYUN.Abp.IdentityServer.HttpApi.csproj", "{76249548-4344-4CD0-A0AC-12AC54184B58}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tenants", "tenants", "{A5543E56-DA53-494D-A531-DA75091D46FF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.Application.Contracts", "modules\tenants\LINGYUN.Abp.TenantManagement.Application.Contracts\LINGYUN.Abp.TenantManagement.Application.Contracts.csproj", "{FF4A3402-8DE2-4494-8F2B-614356DA72EA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.Application", "modules\tenants\LINGYUN.Abp.TenantManagement.Application\LINGYUN.Abp.TenantManagement.Application.csproj", "{EAE87281-4C33-4E8B-A489-480C55BA9E89}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.HttpApi", "modules\tenants\LINGYUN.Abp.TenantManagement.HttpApi\LINGYUN.Abp.TenantManagement.HttpApi.csproj", "{51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{E5D1B78A-1A8F-4D52-BF99-A4A863ADE898}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackendAdmin.HttpApi.Host", "services\admin\LINGYUN.Abp.BackendAdmin.HttpApi.Host\LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj", "{85090598-6B03-43D3-BE61-1E9777252D50}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{8AC72641-30D3-4ACF-89FA-808FADC55C2E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EventBus.CAP", "modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj", "{AEC1E6D3-DC23-41BD-B456-3AAD26E34978}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.SmsValidator", "modules\identityServer\LINGYUN.Abp.IdentityServer.SmsValidator\LINGYUN.Abp.IdentityServer.SmsValidator.csproj", "{E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{9E72FEB9-A626-4312-892B-CDD043879758}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application.Contracts", "modules\account\LINGYUN.Abp.Account.Application.Contracts\LINGYUN.Abp.Account.Application.Contracts.csproj", "{8B09385A-719C-4B83-B61E-0ECD5D2734BD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application", "modules\account\LINGYUN.Abp.Account.Application\LINGYUN.Abp.Account.Application.csproj", "{8E569C1C-2637-4D89-804C-50FBC83948FB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.HttpApi", "modules\account\LINGYUN.Abp.Account.HttpApi\LINGYUN.Abp.Account.HttpApi.csproj", "{5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Sms.Aliyun", "modules\common\LINGYUN.Abp.Sms.Aliyun\LINGYUN.Abp.Sms.Aliyun.csproj", "{FF1839EA-FB6B-4ED5-9804-E40427046D35}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location", "modules\common\LINGYUN.Abp.Location\LINGYUN.Abp.Location.csproj", "{9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Baidu", "modules\common\LINGYUN.Abp.Location.Baidu\LINGYUN.Abp.Location.Baidu.csproj", "{6E4A0D87-C3CE-430F-A475-A6B68C116D96}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "message", "message", "{3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain.Shared", "modules\message\LINGYUN.Abp.MessageService.Domain.Shared\LINGYUN.Abp.MessageService.Domain.Shared.csproj", "{A5851F0F-CB0D-4E29-A829-D1BDEADB807B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain", "modules\message\LINGYUN.Abp.MessageService.Domain\LINGYUN.Abp.MessageService.Domain.csproj", "{FDEECE0D-6F66-4053-948E-9AC021B97C8D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM.SignalR", "modules\common\LINGYUN.Abp.IM.SignalR\LINGYUN.Abp.IM.SignalR.csproj", "{B9FA1A02-A2BF-480D-914E-0780DAE442FC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM", "modules\common\LINGYUN.Abp.IM\LINGYUN.Abp.IM.csproj", "{59619184-02E7-4C61-8F96-89320CD7A3AE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications", "modules\common\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj", "{865A2AE3-864B-4425-8FA6-AFD62F6466DB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DistributedLock", "modules\common\LINGYUN.Abp.DistributedLock\LINGYUN.Abp.DistributedLock.csproj", "{35A23613-85BA-4E1B-835C-DB33AB4A2751}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DistributedLock.Redis", "modules\common\LINGYUN.Abp.DistributedLock.Redis\LINGYUN.Abp.DistributedLock.Redis.csproj", "{F6776BF7-5F73-4224-8915-C017F4EEDD28}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.SignalR", "modules\common\LINGYUN.Abp.Notifications.SignalR\LINGYUN.Abp.Notifications.SignalR.csproj", "{81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime", "modules\common\LINGYUN.Abp.RealTime\LINGYUN.Abp.RealTime.csproj", "{4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.EntityFrameworkCore", "modules\message\LINGYUN.Abp.MessageService.EntityFrameworkCore\LINGYUN.Abp.MessageService.EntityFrameworkCore.csproj", "{371B293B-0CA9-4385-8EBB-5224332066D2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "message", "message", "{608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi.Host", "services\messages\LINGYUN.Abp.MessageService.HttpApi.Host\LINGYUN.Abp.MessageService.HttpApi.Host.csproj", "{0D1DB712-B48D-4FB7-9A47-694C668A62E3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi", "modules\message\LINGYUN.Abp.MessageService.HttpApi\LINGYUN.Abp.MessageService.HttpApi.csproj", "{9E12ADBF-713B-4FE7-B71F-52B5078A57CE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Storage.MySql", "modules\common\LINGYUN.Abp.Hangfire.MySqlStorage\LINGYUN.Abp.Hangfire.Storage.MySql.csproj", "{47CC8F7A-681D-42B9-AE04-78453782C1B6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Storage.SqlServer", "modules\common\LINGYUN.Abp.Hangfire.Storage.SqlServer\LINGYUN.Abp.Hangfire.Storage.SqlServer.csproj", "{F595CB9F-B117-4D62-A1AE-48599927DB36}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundJobs.Hangfire", "modules\common\LINGYUN.Abp.BackgroundJobs.Hangfire\LINGYUN.Abp.BackgroundJobs.Hangfire.csproj", "{5CF403B2-47C9-4E4E-8856-0294BDD64884}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Aliyun", "modules\common\LINGYUN.Abp.BlobStoring.Aliyun\LINGYUN.Abp.BlobStoring.Aliyun.csproj", "{059473BA-FAF9-405F-9985-33DDCA2E9F0D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TestsBase", "tests\LINGYUN.Abp.TestBase\LINGYUN.Abp.TestsBase.csproj", "{B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Aliyun.Tests", "tests\LINGYUN.Abp.BlobStoring.Aliyun.Tests\LINGYUN.Abp.BlobStoring.Aliyun.Tests.csproj", "{C8A00439-5B8D-4923-8FAA-AB75E2A786ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application.Contracts", "modules\message\LINGYUN.Abp.MessageService.Application.Contracts\LINGYUN.Abp.MessageService.Application.Contracts.csproj", "{31B03DCB-ED12-4412-867A-61E347D40D8C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application", "modules\message\LINGYUN.Abp.MessageService.Application\LINGYUN.Abp.MessageService.Application.csproj", "{AB984240-EF03-416F-A9B2-F5CF169E04B7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi.Client", "modules\message\LINGYUN.Abp.MessageService.HttpApi.Client\LINGYUN.Abp.MessageService.HttpApi.Client.csproj", "{EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling", "modules\common\LINGYUN.Abp.ExceptionHandling\LINGYUN.Abp.ExceptionHandling.csproj", "{65DDA934-B76B-4018-A565-CF6CEF0D6BB0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Notifications", "modules\common\LINGYUN.Abp.ExceptionHandling.Notifications\LINGYUN.Abp.ExceptionHandling.Notifications.csproj", "{0F14C850-7F4C-4791-9C6C-7E56F985C71D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing", "modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj", "{376D8343-DF83-41D2-BF6E-2F5DC8DBF259}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing.Tests", "tests\LINGYUN.Abp.ExceptionHandling.Emailing.Tests\LINGYUN.Abp.ExceptionHandling.Emailing.Tests.csproj", "{6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.HttpApi.Client", "modules\tenants\LINGYUN.Abp.TenantManagement.HttpApi.Client\LINGYUN.Abp.TenantManagement.HttpApi.Client.csproj", "{87C7DDCF-F80D-4A15-9044-71552DCB5550}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.RemoteService", "modules\tenants\LINGYUN.Abp.MultiTenancy.RemoteService\LINGYUN.Abp.MultiTenancy.RemoteService.csproj", "{7208C9AB-AB76-43E7-95FA-A0E463E82A3C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.DbFinder", "modules\tenants\LINGYUN.Abp.MultiTenancy.DbFinder\LINGYUN.Abp.MultiTenancy.DbFinder.csproj", "{9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy", "modules\tenants\LINGYUN.Abp.MultiTenancy\LINGYUN.Abp.MultiTenancy.csproj", "{A2B4ECAE-DABE-40F7-9335-496A79EDE671}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Tencent", "modules\common\LINGYUN.Abp.Location.Tencent\LINGYUN.Abp.Location.Tencent.csproj", "{1DA91161-8757-4A68-A0A1-8C94C36C9240}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{F4923692-D343-4318-AECA-96F580B1A563}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain.Shared", "modules\platform\LINGYUN.Platform.Domain.Shared\LINGYUN.Platform.Domain.Shared.csproj", "{F135B9E8-3FFE-44E9-835B-7B6A928F4823}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain", "modules\platform\LINGYUN.Platform.Domain\LINGYUN.Platform.Domain.csproj", "{75A6D078-C19D-4030-88CC-C2A8608FF604}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.EntityFrameworkCore", "modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj", "{2D895594-3FF5-4507-853A-CB65F2DB72ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application.Contracts", "modules\platform\LINGYUN.Platform.Application.Contracts\LINGYUN.Platform.Application.Contracts.csproj", "{AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application", "modules\platform\LINGYUN.Platform.Application\LINGYUN.Platform.Application.csproj", "{0655A0FB-59E8-4A9F-BAF5-47A89377F747}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi", "modules\platform\LINGYUN.Platform.HttpApi\LINGYUN.Platform.HttpApi.csproj", "{5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "admin", "admin", "{F4615BCE-D5C1-407A-8681-8EEE92DEF9D0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EntityFrameworkCore.Tests", "tests\LINGYUN.Abp.EntityFrameworkCore.Tests\LINGYUN.Abp.EntityFrameworkCore.Tests.csproj", "{F3D9B137-32DE-4018-8058-78AB17FCDF9C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{52B5D4F7-237B-4E0A-A167-68442164F70A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application.Contracts", "modules\identity\LINGYUN.Abp.Identity.Application.Contracts\LINGYUN.Abp.Identity.Application.Contracts.csproj", "{F19C8B0F-A332-4190-9ABE-95790E0AE864}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application", "modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj", "{BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi", "modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj", "{72DCA4CF-8B95-47C9-B02A-2671953B7987}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi.Client", "modules\identity\LINGYUN.Abp.Identity.HttpApi.Client\LINGYUN.Abp.Identity.HttpApi.Client.csproj", "{7DDEAEA9-E392-469C-ACB6-908C5BAD669E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "oss-management", "oss-management", "{B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6}" + ProjectSection(SolutionItems) = preProject + modules\oss-management\README.md = modules\oss-management\README.md + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application", "modules\oss-management\LINGYUN.Abp.OssManagement.Application\LINGYUN.Abp.OssManagement.Application.csproj", "{F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application.Contracts", "modules\oss-management\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj", "{86A67B8C-EFA0-4103-B60F-312F07C15A7A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.HttpApi", "modules\oss-management\LINGYUN.Abp.OssManagement.HttpApi\LINGYUN.Abp.OssManagement.HttpApi.csproj", "{854E1A42-FEA4-420E-9E83-0A39EE03F1ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain.Shared", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain.Shared\LINGYUN.Abp.OssManagement.Domain.Shared.csproj", "{21FCEF89-9A3F-476E-833A-A9C2131B2AE6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain\LINGYUN.Abp.OssManagement.Domain.csproj", "{14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi.Host", "services\platform\LINGYUN.Platform.HttpApi.Host\LINGYUN.Platform.HttpApi.Host.csproj", "{372123C3-3AFD-42C8-BB80-778322EA72C3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Domain", "modules\identityServer\LINGYUN.Abp.IdentityServer.Domain\LINGYUN.Abp.IdentityServer.Domain.csproj", "{F359AAA1-C854-444A-88F2-1C0D8A07F864}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.EntityFrameworkCore", "modules\identityServer\LINGYUN.Abp.IdentityServer.EntityFrameworkCore\LINGYUN.Abp.IdentityServer.EntityFrameworkCore.csproj", "{5D0ED1FC-3A7C-4531-9512-832E73AD9555}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain", "modules\identity\LINGYUN.Abp.Identity.Domain\LINGYUN.Abp.Identity.Domain.csproj", "{2BF7FB73-0C62-4ECF-99F0-0583855D2777}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.EntityFrameworkCore", "modules\identity\LINGYUN.Abp.Identity.EntityFrameworkCore\LINGYUN.Abp.Identity.EntityFrameworkCore.csproj", "{6FE7E243-2D99-4567-8786-6C9283D608EF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{685188AC-A145-4A27-BF5F-9C970A59AA9C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer4.HttpApi.Host", "services\identity-server\LINGYUN.Abp.IdentityServer4.HttpApi.Host\LINGYUN.Abp.IdentityServer4.HttpApi.Host.csproj", "{F85552D4-D22E-483A-B1F8-3DFB840F6F7C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Settings", "modules\common\LINGYUN.Abp.Settings\LINGYUN.Abp.Settings.csproj", "{6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation", "modules\common\LINGYUN.Abp.Features.LimitValidation\LINGYUN.Abp.Features.LimitValidation.csproj", "{65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis", "modules\common\LINGYUN.Abp.Features.LimitValidation.Redis\LINGYUN.Abp.Features.LimitValidation.Redis.csproj", "{D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis.Tests", "tests\LINGYUN.Abp.Features.LimitValidation.Redis.Tests\LINGYUN.Abp.Features.LimitValidation.Redis.Tests.csproj", "{F12F4645-C0FE-4129-8C71-65B4039DC445}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Tests", "tests\LINGYUN.Abp.Features.LimitValidation.Tests\LINGYUN.Abp.Features.LimitValidation.Tests.csproj", "{C457FA70-8732-44B8-A018-C96D14025D4B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "features", "features", "{08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Client", "modules\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj", "{7071E78B-755B-410A-830B-AA05D7168944}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.Client", "modules\features\LINGYUN.Abp.Features.Client\LINGYUN.Abp.Features.Client.csproj", "{87B65CBD-0FF4-4FB5-9ABC-161911A71179}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "auditing", "auditing", "{67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application.Contracts", "modules\auditing\LINGYUN.Abp.Auditing.Application.Contracts\LINGYUN.Abp.Auditing.Application.Contracts.csproj", "{F40F88F1-CA90-4A79-B772-80E287E25982}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application", "modules\auditing\LINGYUN.Abp.Auditing.Application\LINGYUN.Abp.Auditing.Application.csproj", "{AC3C8985-73C2-472A-8E76-A0B8786FEC3F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.HttpApi", "modules\auditing\LINGYUN.Abp.Auditing.HttpApi\LINGYUN.Abp.Auditing.HttpApi.csproj", "{07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "permission-management", "permission-management", "{CC362C67-6FC1-42B3-A130-8120AA8D790C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Domain\LINGYUN.Abp.PermissionManagement.Domain.csproj", "{B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain.Identity", "modules\identity\LINGYUN.Abp.PermissionManagement.Domain.Identity\LINGYUN.Abp.PermissionManagement.Domain.Identity.csproj", "{2D377D3A-70EC-4BB3-9F4C-6C933693DA98}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.SignalR.JwtToken", "modules\common\LINGYUN.Abp.AspNetCore.SignalR\LINGYUN.Abp.AspNetCore.SignalR.JwtToken.csproj", "{A66D48C9-F141-4111-9169-CEB64AFFF61D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime.SignalR", "modules\common\LINGYUN.Abp.RealTime.SignalR\LINGYUN.Abp.RealTime.SignalR.csproj", "{524276E1-053D-4191-ABF7-4CDA01BFFBC3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json", "modules\common\LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json\LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json.csproj", "{43083268-74DE-4C68-824A-FB0CEC77358D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wechat", "wechat", "{DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat", "modules\wechat\LINGYUN.Abp.WeChat\LINGYUN.Abp.WeChat.csproj", "{BAE74ABC-1096-495F-A624-BEBFBC1896F2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain.Shared", "modules\identity\LINGYUN.Abp.Identity.Domain.Shared\LINGYUN.Abp.Identity.Domain.Shared.csproj", "{E92A1CAA-5758-41EF-B67E-C0D394E85417}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.MiniProgram", "modules\wechat\LINGYUN.Abp.WeChat.MiniProgram\LINGYUN.Abp.WeChat.MiniProgram.csproj", "{F18DE651-A3E4-478F-A2B5-686429729EB8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official", "modules\wechat\LINGYUN.Abp.WeChat.Official\LINGYUN.Abp.WeChat.Official.csproj", "{42309C06-C0F2-490F-931B-CF41FA1970FF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.SettingManagement", "modules\wechat\LINGYUN.Abp.WeChat.SettingManagement\LINGYUN.Abp.WeChat.SettingManagement.csproj", "{EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.WeChat", "modules\identityServer\LINGYUN.Abp.IdentityServer.WeChat\LINGYUN.Abp.IdentityServer.WeChat.csproj", "{7356FC4B-CAB2-4808-8C97-9AF74583F3A4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.WeChat.MiniProgram", "modules\wechat\LINGYUN.Abp.Notifications.WeChat.MiniProgram\LINGYUN.Abp.Notifications.WeChat.MiniProgram.csproj", "{DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cloud-aliyun", "cloud-aliyun", "{14CDBAD1-10C8-464A-B445-1F727C988010}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cloud-tencent", "cloud-tencent", "{3B96F4D8-4993-419B-BCEB-AFE4ED39449F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun", "modules\cloud-aliyun\LINGYUN.Abp.Aliyun\LINGYUN.Abp.Aliyun.csproj", "{FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Tencent", "modules\cloud-tencent\LINGYUN.Abp.Tencent\LINGYUN.Abp.Tencent.csproj", "{97B4A37E-B93E-48C9-95D5-689CB9495D8B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Sms", "modules\common\LINGYUN.Abp.Notifications.Sms\LINGYUN.Abp.Notifications.Sms.csproj", "{8C3312E7-F51E-4780-A893-CE0E0B80B579}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.SettingManagement", "modules\cloud-aliyun\LINGYUN.Abp.Aliyun.SettingManagement\LINGYUN.Abp.Aliyun.SettingManagement.csproj", "{FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.Tests", "tests\LINGYUN.Abp.Aliyun.Tests\LINGYUN.Abp.Aliyun.Tests.csproj", "{B86EBB6F-A27F-4277-8265-937951A9DCB0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Aliyun", "modules\oss-management\LINGYUN.Abp.OssManagement.Aliyun\LINGYUN.Abp.OssManagement.Aliyun.csproj", "{35B17218-9FB6-439E-AF73-9A1454BC923C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.FileSystem", "modules\oss-management\LINGYUN.Abp.OssManagement.FileSystem\LINGYUN.Abp.OssManagement.FileSystem.csproj", "{D5036D3F-1C53-47EE-BA50-AD290AE062D7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.FileSystem.ImageSharp", "modules\oss-management\LINGYUN.Abp.OssManagement.FileSystem.ImageSharp\LINGYUN.Abp.OssManagement.FileSystem.ImageSharp.csproj", "{3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.SettingManagement", "modules\oss-management\LINGYUN.Abp.OssManagement.SettingManagement\LINGYUN.Abp.OssManagement.SettingManagement.csproj", "{BD74BE00-54E4-4979-8797-E8027695F396}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis.Client", "modules\common\LINGYUN.Abp.Features.LimitValidation.Redis.Client\LINGYUN.Abp.Features.LimitValidation.Redis.Client.csproj", "{48DE251A-3482-4934-BC26-F99D2235AC9F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Tencent.Tests", "tests\LINGYUN.Abp.Location.Tencent.Tests\LINGYUN.Abp.Location.Tencent.Tests.csproj", "{94B47385-E47F-4FD7-A3A9-A7AA122EFC93}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Baidu.Tests", "tests\LINGYUN.Abp.Location.Baidu.Tests\LINGYUN.Abp.Location.Baidu.Tests.csproj", "{C892CD81-50AE-49E5-BF44-A0C28A1614CC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Client", "modules\common\LINGYUN.Abp.AspNetCore.Mvc.Client\LINGYUN.Abp.AspNetCore.Mvc.Client.csproj", "{EEF03CC6-1013-4AAF-BEED-BB4BA5021039}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{90E88EAC-4291-4406-8D88-EFDF61B11292}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Xml", "modules\localization\LINGYUN.Abp.Localization.Xml\LINGYUN.Abp.Localization.Xml.csproj", "{84868710-ECBB-4025-900A-EEB99EC49534}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Xml.Tests", "tests\LINGYUN.Abp.Localization.Xml.Tests\LINGYUN.Abp.Localization.Xml.Tests.csproj", "{A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Dynamic", "modules\common\LINGYUN.Abp.Localization.Dynamic\LINGYUN.Abp.Localization.Dynamic.csproj", "{4A9043FD-24A3-4A4A-956B-9CB71876F415}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization-management", "localization-management", "{D3BAA44E-8395-4E8A-AA96-6B463356C537}" + ProjectSection(SolutionItems) = preProject + modules\lt\README.md = modules\lt\README.md + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain.Shared", "modules\lt\LINGYUN.Abp.LocalizationManagement.Domain.Shared\LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj", "{5BE18D72-0D02-4854-966E-745CE5DAF77F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain", "modules\lt\LINGYUN.Abp.LocalizationManagement.Domain\LINGYUN.Abp.LocalizationManagement.Domain.csproj", "{73EAD4FE-B44F-44A7-904E-FFA5096D91BD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application.Contracts", "modules\lt\LINGYUN.Abp.LocalizationManagement.Application.Contracts\LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj", "{06D34108-01BA-4C77-A704-4DD9E6F7E32C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application", "modules\lt\LINGYUN.Abp.LocalizationManagement.Application\LINGYUN.Abp.LocalizationManagement.Application.csproj", "{A98C939C-9F48-414A-A2D3-853BE4447397}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore", "modules\lt\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj", "{A94BE05F-7DAB-461C-93E7-914CBDF4FA93}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi", "modules\lt\LINGYUN.Abp.LocalizationManagement.HttpApi\LINGYUN.Abp.LocalizationManagement.HttpApi.csproj", "{FBE91498-D83B-4873-A67E-0FB9D1C366F0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi.Host", "services\localization\LINGYUN.Abp.LocalizationManagement.HttpApi.Host\LINGYUN.Abp.LocalizationManagement.HttpApi.Host.csproj", "{6FFC14FE-F659-4B23-9746-4B767CE520D2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rules", "rules", "{6084D52D-775B-4A39-8CD5-AA2F362B5A61}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules", "modules\rules\LINGYUN.Abp.Rules\LINGYUN.Abp.Rules.csproj", "{D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.NRules", "modules\rules\LINGYUN.Abp.Rules.NRules\LINGYUN.Abp.Rules.NRules.csproj", "{34BB9810-2983-4E55-A96A-132D32310145}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.RulesEngine", "modules\rules\LINGYUN.Abp.Rules.RulesEngine\LINGYUN.Abp.Rules.RulesEngine.csproj", "{4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Rules.RulesEngine.Tests", "tests\LINGYUN.Abp.Rules.RulesEngine.Tests\LINGYUN.Abp.Rules.RulesEngine.Tests.csproj", "{8EF31071-3521-409D-9740-BBFBFC04C50E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.HttpOverrides", "modules\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN.Abp.AspNetCore.HttpOverrides.csproj", "{13219C1C-23E1-4EBA-93FB-86830C93A800}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundWorkers.Hangfire", "modules\common\LINGYUN.Abp.BackgroundWorkers.Hangfire\LINGYUN.Abp.BackgroundWorkers.Hangfire.csproj", "{60D0BEF2-FEAF-4066-8377-6C873CB24858}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Dashboard", "modules\common\LINGYUN.Abp.Hangfire.Dashboard\LINGYUN.Abp.Hangfire.Dashboard.csproj", "{340BE5AC-68EC-41A5-9D0D-266037C58F13}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77BDEF2B-1A30-4E64-BC35-0DFC21091327}.Release|Any CPU.Build.0 = Release|Any CPU + {573B7B0E-3065-42DE-A391-EE026CE7A366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {573B7B0E-3065-42DE-A391-EE026CE7A366}.Debug|Any CPU.Build.0 = Debug|Any CPU + {573B7B0E-3065-42DE-A391-EE026CE7A366}.Release|Any CPU.ActiveCfg = Release|Any CPU + {573B7B0E-3065-42DE-A391-EE026CE7A366}.Release|Any CPU.Build.0 = Release|Any CPU + {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF}.Release|Any CPU.Build.0 = Release|Any CPU + {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40E217A9-46EA-48DE-BE0B-6CC824240E97}.Release|Any CPU.Build.0 = Release|Any CPU + {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57}.Release|Any CPU.Build.0 = Release|Any CPU + {269FF49F-97A3-4502-B424-D8CD55FC5727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {269FF49F-97A3-4502-B424-D8CD55FC5727}.Debug|Any CPU.Build.0 = Debug|Any CPU + {269FF49F-97A3-4502-B424-D8CD55FC5727}.Release|Any CPU.ActiveCfg = Release|Any CPU + {269FF49F-97A3-4502-B424-D8CD55FC5727}.Release|Any CPU.Build.0 = Release|Any CPU + {87049236-4808-4C33-88BA-D3CA6BB1F786}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87049236-4808-4C33-88BA-D3CA6BB1F786}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87049236-4808-4C33-88BA-D3CA6BB1F786}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87049236-4808-4C33-88BA-D3CA6BB1F786}.Release|Any CPU.Build.0 = Release|Any CPU + {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B}.Release|Any CPU.Build.0 = Release|Any CPU + {089BE2D2-D579-47DA-B135-449C1153F27E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {089BE2D2-D579-47DA-B135-449C1153F27E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {089BE2D2-D579-47DA-B135-449C1153F27E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {089BE2D2-D579-47DA-B135-449C1153F27E}.Release|Any CPU.Build.0 = Release|Any CPU + {D137106D-DCD5-455B-A297-44831DF38EE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D137106D-DCD5-455B-A297-44831DF38EE8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D137106D-DCD5-455B-A297-44831DF38EE8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D137106D-DCD5-455B-A297-44831DF38EE8}.Release|Any CPU.Build.0 = Release|Any CPU + {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DF65FB1-AFA3-4D50-83D6-A37318296E6D}.Release|Any CPU.Build.0 = Release|Any CPU + {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9}.Release|Any CPU.Build.0 = Release|Any CPU + {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1F56ED5-E898-45F1-97B5-61F4AB30FB58}.Release|Any CPU.Build.0 = Release|Any CPU + {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2}.Release|Any CPU.Build.0 = Release|Any CPU + {A584D040-95AC-4422-93FF-7B80532213F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A584D040-95AC-4422-93FF-7B80532213F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A584D040-95AC-4422-93FF-7B80532213F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A584D040-95AC-4422-93FF-7B80532213F0}.Release|Any CPU.Build.0 = Release|Any CPU + {76249548-4344-4CD0-A0AC-12AC54184B58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76249548-4344-4CD0-A0AC-12AC54184B58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76249548-4344-4CD0-A0AC-12AC54184B58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76249548-4344-4CD0-A0AC-12AC54184B58}.Release|Any CPU.Build.0 = Release|Any CPU + {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF4A3402-8DE2-4494-8F2B-614356DA72EA}.Release|Any CPU.Build.0 = Release|Any CPU + {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EAE87281-4C33-4E8B-A489-480C55BA9E89}.Release|Any CPU.Build.0 = Release|Any CPU + {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6}.Release|Any CPU.Build.0 = Release|Any CPU + {85090598-6B03-43D3-BE61-1E9777252D50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {85090598-6B03-43D3-BE61-1E9777252D50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85090598-6B03-43D3-BE61-1E9777252D50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {85090598-6B03-43D3-BE61-1E9777252D50}.Release|Any CPU.Build.0 = Release|Any CPU + {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AEC1E6D3-DC23-41BD-B456-3AAD26E34978}.Release|Any CPU.Build.0 = Release|Any CPU + {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB}.Release|Any CPU.Build.0 = Release|Any CPU + {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B09385A-719C-4B83-B61E-0ECD5D2734BD}.Release|Any CPU.Build.0 = Release|Any CPU + {8E569C1C-2637-4D89-804C-50FBC83948FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8E569C1C-2637-4D89-804C-50FBC83948FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E569C1C-2637-4D89-804C-50FBC83948FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8E569C1C-2637-4D89-804C-50FBC83948FB}.Release|Any CPU.Build.0 = Release|Any CPU + {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D}.Release|Any CPU.Build.0 = Release|Any CPU + {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF1839EA-FB6B-4ED5-9804-E40427046D35}.Release|Any CPU.Build.0 = Release|Any CPU + {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D}.Release|Any CPU.Build.0 = Release|Any CPU + {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E4A0D87-C3CE-430F-A475-A6B68C116D96}.Release|Any CPU.Build.0 = Release|Any CPU + {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5851F0F-CB0D-4E29-A829-D1BDEADB807B}.Release|Any CPU.Build.0 = Release|Any CPU + {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDEECE0D-6F66-4053-948E-9AC021B97C8D}.Release|Any CPU.Build.0 = Release|Any CPU + {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B9FA1A02-A2BF-480D-914E-0780DAE442FC}.Release|Any CPU.Build.0 = Release|Any CPU + {59619184-02E7-4C61-8F96-89320CD7A3AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59619184-02E7-4C61-8F96-89320CD7A3AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59619184-02E7-4C61-8F96-89320CD7A3AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59619184-02E7-4C61-8F96-89320CD7A3AE}.Release|Any CPU.Build.0 = Release|Any CPU + {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {865A2AE3-864B-4425-8FA6-AFD62F6466DB}.Release|Any CPU.Build.0 = Release|Any CPU + {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35A23613-85BA-4E1B-835C-DB33AB4A2751}.Release|Any CPU.Build.0 = Release|Any CPU + {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6776BF7-5F73-4224-8915-C017F4EEDD28}.Release|Any CPU.Build.0 = Release|Any CPU + {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2}.Release|Any CPU.Build.0 = Release|Any CPU + {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873}.Release|Any CPU.Build.0 = Release|Any CPU + {371B293B-0CA9-4385-8EBB-5224332066D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {371B293B-0CA9-4385-8EBB-5224332066D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {371B293B-0CA9-4385-8EBB-5224332066D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {371B293B-0CA9-4385-8EBB-5224332066D2}.Release|Any CPU.Build.0 = Release|Any CPU + {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D1DB712-B48D-4FB7-9A47-694C668A62E3}.Release|Any CPU.Build.0 = Release|Any CPU + {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E12ADBF-713B-4FE7-B71F-52B5078A57CE}.Release|Any CPU.Build.0 = Release|Any CPU + {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47CC8F7A-681D-42B9-AE04-78453782C1B6}.Release|Any CPU.Build.0 = Release|Any CPU + {F595CB9F-B117-4D62-A1AE-48599927DB36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F595CB9F-B117-4D62-A1AE-48599927DB36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F595CB9F-B117-4D62-A1AE-48599927DB36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F595CB9F-B117-4D62-A1AE-48599927DB36}.Release|Any CPU.Build.0 = Release|Any CPU + {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CF403B2-47C9-4E4E-8856-0294BDD64884}.Release|Any CPU.Build.0 = Release|Any CPU + {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {059473BA-FAF9-405F-9985-33DDCA2E9F0D}.Release|Any CPU.Build.0 = Release|Any CPU + {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B}.Release|Any CPU.Build.0 = Release|Any CPU + {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C8A00439-5B8D-4923-8FAA-AB75E2A786ED}.Release|Any CPU.Build.0 = Release|Any CPU + {31B03DCB-ED12-4412-867A-61E347D40D8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31B03DCB-ED12-4412-867A-61E347D40D8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31B03DCB-ED12-4412-867A-61E347D40D8C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31B03DCB-ED12-4412-867A-61E347D40D8C}.Release|Any CPU.Build.0 = Release|Any CPU + {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB984240-EF03-416F-A9B2-F5CF169E04B7}.Release|Any CPU.Build.0 = Release|Any CPU + {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415}.Release|Any CPU.Build.0 = Release|Any CPU + {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65DDA934-B76B-4018-A565-CF6CEF0D6BB0}.Release|Any CPU.Build.0 = Release|Any CPU + {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F14C850-7F4C-4791-9C6C-7E56F985C71D}.Release|Any CPU.Build.0 = Release|Any CPU + {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Debug|Any CPU.Build.0 = Debug|Any CPU + {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Release|Any CPU.ActiveCfg = Release|Any CPU + {376D8343-DF83-41D2-BF6E-2F5DC8DBF259}.Release|Any CPU.Build.0 = Release|Any CPU + {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB}.Release|Any CPU.Build.0 = Release|Any CPU + {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87C7DDCF-F80D-4A15-9044-71552DCB5550}.Release|Any CPU.Build.0 = Release|Any CPU + {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7208C9AB-AB76-43E7-95FA-A0E463E82A3C}.Release|Any CPU.Build.0 = Release|Any CPU + {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413}.Release|Any CPU.Build.0 = Release|Any CPU + {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2B4ECAE-DABE-40F7-9335-496A79EDE671}.Release|Any CPU.Build.0 = Release|Any CPU + {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1DA91161-8757-4A68-A0A1-8C94C36C9240}.Release|Any CPU.Build.0 = Release|Any CPU + {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F135B9E8-3FFE-44E9-835B-7B6A928F4823}.Release|Any CPU.Build.0 = Release|Any CPU + {75A6D078-C19D-4030-88CC-C2A8608FF604}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75A6D078-C19D-4030-88CC-C2A8608FF604}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75A6D078-C19D-4030-88CC-C2A8608FF604}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75A6D078-C19D-4030-88CC-C2A8608FF604}.Release|Any CPU.Build.0 = Release|Any CPU + {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D895594-3FF5-4507-853A-CB65F2DB72ED}.Release|Any CPU.Build.0 = Release|Any CPU + {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93}.Release|Any CPU.Build.0 = Release|Any CPU + {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0655A0FB-59E8-4A9F-BAF5-47A89377F747}.Release|Any CPU.Build.0 = Release|Any CPU + {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE}.Release|Any CPU.Build.0 = Release|Any CPU + {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3D9B137-32DE-4018-8058-78AB17FCDF9C}.Release|Any CPU.Build.0 = Release|Any CPU + {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F19C8B0F-A332-4190-9ABE-95790E0AE864}.Release|Any CPU.Build.0 = Release|Any CPU + {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA}.Release|Any CPU.Build.0 = Release|Any CPU + {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Release|Any CPU.ActiveCfg = Release|Any CPU + {72DCA4CF-8B95-47C9-B02A-2671953B7987}.Release|Any CPU.Build.0 = Release|Any CPU + {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DDEAEA9-E392-469C-ACB6-908C5BAD669E}.Release|Any CPU.Build.0 = Release|Any CPU + {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0}.Release|Any CPU.Build.0 = Release|Any CPU + {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86A67B8C-EFA0-4103-B60F-312F07C15A7A}.Release|Any CPU.Build.0 = Release|Any CPU + {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {854E1A42-FEA4-420E-9E83-0A39EE03F1ED}.Release|Any CPU.Build.0 = Release|Any CPU + {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21FCEF89-9A3F-476E-833A-A9C2131B2AE6}.Release|Any CPU.Build.0 = Release|Any CPU + {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90}.Release|Any CPU.Build.0 = Release|Any CPU + {372123C3-3AFD-42C8-BB80-778322EA72C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {372123C3-3AFD-42C8-BB80-778322EA72C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {372123C3-3AFD-42C8-BB80-778322EA72C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {372123C3-3AFD-42C8-BB80-778322EA72C3}.Release|Any CPU.Build.0 = Release|Any CPU + {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F359AAA1-C854-444A-88F2-1C0D8A07F864}.Release|Any CPU.Build.0 = Release|Any CPU + {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D0ED1FC-3A7C-4531-9512-832E73AD9555}.Release|Any CPU.Build.0 = Release|Any CPU + {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2BF7FB73-0C62-4ECF-99F0-0583855D2777}.Release|Any CPU.Build.0 = Release|Any CPU + {6FE7E243-2D99-4567-8786-6C9283D608EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FE7E243-2D99-4567-8786-6C9283D608EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FE7E243-2D99-4567-8786-6C9283D608EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FE7E243-2D99-4567-8786-6C9283D608EF}.Release|Any CPU.Build.0 = Release|Any CPU + {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F85552D4-D22E-483A-B1F8-3DFB840F6F7C}.Release|Any CPU.Build.0 = Release|Any CPU + {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473}.Release|Any CPU.Build.0 = Release|Any CPU + {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED}.Release|Any CPU.Build.0 = Release|Any CPU + {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6}.Release|Any CPU.Build.0 = Release|Any CPU + {F12F4645-C0FE-4129-8C71-65B4039DC445}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F12F4645-C0FE-4129-8C71-65B4039DC445}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F12F4645-C0FE-4129-8C71-65B4039DC445}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F12F4645-C0FE-4129-8C71-65B4039DC445}.Release|Any CPU.Build.0 = Release|Any CPU + {C457FA70-8732-44B8-A018-C96D14025D4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C457FA70-8732-44B8-A018-C96D14025D4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C457FA70-8732-44B8-A018-C96D14025D4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C457FA70-8732-44B8-A018-C96D14025D4B}.Release|Any CPU.Build.0 = Release|Any CPU + {7071E78B-755B-410A-830B-AA05D7168944}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7071E78B-755B-410A-830B-AA05D7168944}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7071E78B-755B-410A-830B-AA05D7168944}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7071E78B-755B-410A-830B-AA05D7168944}.Release|Any CPU.Build.0 = Release|Any CPU + {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87B65CBD-0FF4-4FB5-9ABC-161911A71179}.Release|Any CPU.Build.0 = Release|Any CPU + {F40F88F1-CA90-4A79-B772-80E287E25982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F40F88F1-CA90-4A79-B772-80E287E25982}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F40F88F1-CA90-4A79-B772-80E287E25982}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F40F88F1-CA90-4A79-B772-80E287E25982}.Release|Any CPU.Build.0 = Release|Any CPU + {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC3C8985-73C2-472A-8E76-A0B8786FEC3F}.Release|Any CPU.Build.0 = Release|Any CPU + {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F}.Release|Any CPU.Build.0 = Release|Any CPU + {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727}.Release|Any CPU.Build.0 = Release|Any CPU + {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D377D3A-70EC-4BB3-9F4C-6C933693DA98}.Release|Any CPU.Build.0 = Release|Any CPU + {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A66D48C9-F141-4111-9169-CEB64AFFF61D}.Release|Any CPU.Build.0 = Release|Any CPU + {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {524276E1-053D-4191-ABF7-4CDA01BFFBC3}.Release|Any CPU.Build.0 = Release|Any CPU + {43083268-74DE-4C68-824A-FB0CEC77358D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43083268-74DE-4C68-824A-FB0CEC77358D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43083268-74DE-4C68-824A-FB0CEC77358D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43083268-74DE-4C68-824A-FB0CEC77358D}.Release|Any CPU.Build.0 = Release|Any CPU + {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BAE74ABC-1096-495F-A624-BEBFBC1896F2}.Release|Any CPU.Build.0 = Release|Any CPU + {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E92A1CAA-5758-41EF-B67E-C0D394E85417}.Release|Any CPU.Build.0 = Release|Any CPU + {F18DE651-A3E4-478F-A2B5-686429729EB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F18DE651-A3E4-478F-A2B5-686429729EB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F18DE651-A3E4-478F-A2B5-686429729EB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F18DE651-A3E4-478F-A2B5-686429729EB8}.Release|Any CPU.Build.0 = Release|Any CPU + {42309C06-C0F2-490F-931B-CF41FA1970FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42309C06-C0F2-490F-931B-CF41FA1970FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42309C06-C0F2-490F-931B-CF41FA1970FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42309C06-C0F2-490F-931B-CF41FA1970FF}.Release|Any CPU.Build.0 = Release|Any CPU + {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296}.Release|Any CPU.Build.0 = Release|Any CPU + {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7356FC4B-CAB2-4808-8C97-9AF74583F3A4}.Release|Any CPU.Build.0 = Release|Any CPU + {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91}.Release|Any CPU.Build.0 = Release|Any CPU + {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC}.Release|Any CPU.Build.0 = Release|Any CPU + {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97B4A37E-B93E-48C9-95D5-689CB9495D8B}.Release|Any CPU.Build.0 = Release|Any CPU + {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C3312E7-F51E-4780-A893-CE0E0B80B579}.Release|Any CPU.Build.0 = Release|Any CPU + {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C}.Release|Any CPU.Build.0 = Release|Any CPU + {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B86EBB6F-A27F-4277-8265-937951A9DCB0}.Release|Any CPU.Build.0 = Release|Any CPU + {35B17218-9FB6-439E-AF73-9A1454BC923C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35B17218-9FB6-439E-AF73-9A1454BC923C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35B17218-9FB6-439E-AF73-9A1454BC923C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35B17218-9FB6-439E-AF73-9A1454BC923C}.Release|Any CPU.Build.0 = Release|Any CPU + {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5036D3F-1C53-47EE-BA50-AD290AE062D7}.Release|Any CPU.Build.0 = Release|Any CPU + {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F}.Release|Any CPU.Build.0 = Release|Any CPU + {BD74BE00-54E4-4979-8797-E8027695F396}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD74BE00-54E4-4979-8797-E8027695F396}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD74BE00-54E4-4979-8797-E8027695F396}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD74BE00-54E4-4979-8797-E8027695F396}.Release|Any CPU.Build.0 = Release|Any CPU + {48DE251A-3482-4934-BC26-F99D2235AC9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48DE251A-3482-4934-BC26-F99D2235AC9F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48DE251A-3482-4934-BC26-F99D2235AC9F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48DE251A-3482-4934-BC26-F99D2235AC9F}.Release|Any CPU.Build.0 = Release|Any CPU + {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {94B47385-E47F-4FD7-A3A9-A7AA122EFC93}.Release|Any CPU.Build.0 = Release|Any CPU + {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C892CD81-50AE-49E5-BF44-A0C28A1614CC}.Release|Any CPU.Build.0 = Release|Any CPU + {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EEF03CC6-1013-4AAF-BEED-BB4BA5021039}.Release|Any CPU.Build.0 = Release|Any CPU + {84868710-ECBB-4025-900A-EEB99EC49534}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84868710-ECBB-4025-900A-EEB99EC49534}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84868710-ECBB-4025-900A-EEB99EC49534}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84868710-ECBB-4025-900A-EEB99EC49534}.Release|Any CPU.Build.0 = Release|Any CPU + {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED}.Release|Any CPU.Build.0 = Release|Any CPU + {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A9043FD-24A3-4A4A-956B-9CB71876F415}.Release|Any CPU.Build.0 = Release|Any CPU + {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5BE18D72-0D02-4854-966E-745CE5DAF77F}.Release|Any CPU.Build.0 = Release|Any CPU + {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {73EAD4FE-B44F-44A7-904E-FFA5096D91BD}.Release|Any CPU.Build.0 = Release|Any CPU + {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06D34108-01BA-4C77-A704-4DD9E6F7E32C}.Release|Any CPU.Build.0 = Release|Any CPU + {A98C939C-9F48-414A-A2D3-853BE4447397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A98C939C-9F48-414A-A2D3-853BE4447397}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A98C939C-9F48-414A-A2D3-853BE4447397}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A98C939C-9F48-414A-A2D3-853BE4447397}.Release|Any CPU.Build.0 = Release|Any CPU + {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A94BE05F-7DAB-461C-93E7-914CBDF4FA93}.Release|Any CPU.Build.0 = Release|Any CPU + {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FBE91498-D83B-4873-A67E-0FB9D1C366F0}.Release|Any CPU.Build.0 = Release|Any CPU + {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FFC14FE-F659-4B23-9746-4B767CE520D2}.Release|Any CPU.Build.0 = Release|Any CPU + {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF}.Release|Any CPU.Build.0 = Release|Any CPU + {34BB9810-2983-4E55-A96A-132D32310145}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34BB9810-2983-4E55-A96A-132D32310145}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34BB9810-2983-4E55-A96A-132D32310145}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34BB9810-2983-4E55-A96A-132D32310145}.Release|Any CPU.Build.0 = Release|Any CPU + {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498}.Release|Any CPU.Build.0 = Release|Any CPU + {8EF31071-3521-409D-9740-BBFBFC04C50E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8EF31071-3521-409D-9740-BBFBFC04C50E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8EF31071-3521-409D-9740-BBFBFC04C50E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8EF31071-3521-409D-9740-BBFBFC04C50E}.Release|Any CPU.Build.0 = Release|Any CPU + {13219C1C-23E1-4EBA-93FB-86830C93A800}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {13219C1C-23E1-4EBA-93FB-86830C93A800}.Debug|Any CPU.Build.0 = Debug|Any CPU + {13219C1C-23E1-4EBA-93FB-86830C93A800}.Release|Any CPU.ActiveCfg = Release|Any CPU + {13219C1C-23E1-4EBA-93FB-86830C93A800}.Release|Any CPU.Build.0 = Release|Any CPU + {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60D0BEF2-FEAF-4066-8377-6C873CB24858}.Release|Any CPU.Build.0 = Release|Any CPU + {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {340BE5AC-68EC-41A5-9D0D-266037C58F13}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {77BDEF2B-1A30-4E64-BC35-0DFC21091327} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} + {573B7B0E-3065-42DE-A391-EE026CE7A366} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} + {FFD1E99C-49DA-4ADC-BC92-B14B51B45CAF} = {BA00B3F2-199B-40E2-B0EA-0AA4F51A1C52} + {68ADC230-B563-4948-BBF1-2112DFE93BC1} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {40E217A9-46EA-48DE-BE0B-6CC824240E97} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {1026B28E-9A3D-47CD-B0EE-1C7E1CA92B57} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {269FF49F-97A3-4502-B424-D8CD55FC5727} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {87049236-4808-4C33-88BA-D3CA6BB1F786} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {3B6DD473-E87F-495E-80C9-D0A3A4C9F60B} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {089BE2D2-D579-47DA-B135-449C1153F27E} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {D137106D-DCD5-455B-A297-44831DF38EE8} = {68ADC230-B563-4948-BBF1-2112DFE93BC1} + {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {E2408063-FB1F-4513-B4A7-1FE50667C6E8} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {7DF65FB1-AFA3-4D50-83D6-A37318296E6D} = {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} + {9D9C2B07-5DB4-4513-B49A-06622F6E6FC9} = {19E6BD61-062B-4FAD-A51A-B55F5CE88B7A} + {C1F56ED5-E898-45F1-97B5-61F4AB30FB58} = {685188AC-A145-4A27-BF5F-9C970A59AA9C} + {0439B173-F41E-4CE0-A44A-CCB70328F272} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {3EE2D2F8-2B57-4EF7-88E8-5E4C851E66C2} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {A584D040-95AC-4422-93FF-7B80532213F0} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {76249548-4344-4CD0-A0AC-12AC54184B58} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {A5543E56-DA53-494D-A531-DA75091D46FF} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {FF4A3402-8DE2-4494-8F2B-614356DA72EA} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {EAE87281-4C33-4E8B-A489-480C55BA9E89} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {51305B1E-4B8B-40BC-87B9-C8BFA04C61E6} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {E5D1B78A-1A8F-4D52-BF99-A4A863ADE898} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {85090598-6B03-43D3-BE61-1E9777252D50} = {F4615BCE-D5C1-407A-8681-8EEE92DEF9D0} + {8AC72641-30D3-4ACF-89FA-808FADC55C2E} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {AEC1E6D3-DC23-41BD-B456-3AAD26E34978} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {E6B11DE5-B5EC-4C25-BAF6-1AC9FD0409EB} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {9E72FEB9-A626-4312-892B-CDD043879758} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {8B09385A-719C-4B83-B61E-0ECD5D2734BD} = {9E72FEB9-A626-4312-892B-CDD043879758} + {8E569C1C-2637-4D89-804C-50FBC83948FB} = {9E72FEB9-A626-4312-892B-CDD043879758} + {5A10C02B-D12C-479C-9E7F-9A7D9DDD753D} = {9E72FEB9-A626-4312-892B-CDD043879758} + {FF1839EA-FB6B-4ED5-9804-E40427046D35} = {14CDBAD1-10C8-464A-B445-1F727C988010} + {9FE2A95F-D7A3-4305-9E12-E955EF74CF8D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {6E4A0D87-C3CE-430F-A475-A6B68C116D96} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {A5851F0F-CB0D-4E29-A829-D1BDEADB807B} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {FDEECE0D-6F66-4053-948E-9AC021B97C8D} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {B9FA1A02-A2BF-480D-914E-0780DAE442FC} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {59619184-02E7-4C61-8F96-89320CD7A3AE} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {865A2AE3-864B-4425-8FA6-AFD62F6466DB} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {35A23613-85BA-4E1B-835C-DB33AB4A2751} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {F6776BF7-5F73-4224-8915-C017F4EEDD28} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {81DF3392-38F4-41E9-8499-4F7EA8ADF4F2} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {4DFA9E60-E9CE-4FD3-A57F-F76EF3FF4873} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {371B293B-0CA9-4385-8EBB-5224332066D2} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {0D1DB712-B48D-4FB7-9A47-694C668A62E3} = {608A3BD0-FC8D-48B0-B1C5-F3203A3BE99F} + {9E12ADBF-713B-4FE7-B71F-52B5078A57CE} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {47CC8F7A-681D-42B9-AE04-78453782C1B6} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {F595CB9F-B117-4D62-A1AE-48599927DB36} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {5CF403B2-47C9-4E4E-8856-0294BDD64884} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {059473BA-FAF9-405F-9985-33DDCA2E9F0D} = {14CDBAD1-10C8-464A-B445-1F727C988010} + {B39B5FB6-E7B9-4A13-8FFA-FC7FEED4371B} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {C8A00439-5B8D-4923-8FAA-AB75E2A786ED} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {31B03DCB-ED12-4412-867A-61E347D40D8C} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {AB984240-EF03-416F-A9B2-F5CF169E04B7} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {EBBBBD00-74B5-49CB-8C24-4FD7C2ECC415} = {3CDBA2A6-DC8A-48C5-8A6C-AF207394B43D} + {65DDA934-B76B-4018-A565-CF6CEF0D6BB0} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {0F14C850-7F4C-4791-9C6C-7E56F985C71D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {376D8343-DF83-41D2-BF6E-2F5DC8DBF259} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {6259BCB9-A302-4CE7-AF48-9283A0DFD3CB} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {87C7DDCF-F80D-4A15-9044-71552DCB5550} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {7208C9AB-AB76-43E7-95FA-A0E463E82A3C} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {9CB71AC4-139C-40EA-8EFF-5CFEFDD80413} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {A2B4ECAE-DABE-40F7-9335-496A79EDE671} = {A5543E56-DA53-494D-A531-DA75091D46FF} + {1DA91161-8757-4A68-A0A1-8C94C36C9240} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {F4923692-D343-4318-AECA-96F580B1A563} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {F135B9E8-3FFE-44E9-835B-7B6A928F4823} = {F4923692-D343-4318-AECA-96F580B1A563} + {75A6D078-C19D-4030-88CC-C2A8608FF604} = {F4923692-D343-4318-AECA-96F580B1A563} + {2D895594-3FF5-4507-853A-CB65F2DB72ED} = {F4923692-D343-4318-AECA-96F580B1A563} + {AFA3EEF5-525F-4FF7-A0D0-E8E5D2734F93} = {F4923692-D343-4318-AECA-96F580B1A563} + {0655A0FB-59E8-4A9F-BAF5-47A89377F747} = {F4923692-D343-4318-AECA-96F580B1A563} + {5FBBBA6A-D6EC-42E1-8164-15C411EC77BE} = {F4923692-D343-4318-AECA-96F580B1A563} + {F4615BCE-D5C1-407A-8681-8EEE92DEF9D0} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {F3D9B137-32DE-4018-8058-78AB17FCDF9C} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {52B5D4F7-237B-4E0A-A167-68442164F70A} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {F19C8B0F-A332-4190-9ABE-95790E0AE864} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {BB1B831F-4AC4-4DE5-A879-D5FC5B1CA9DA} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {72DCA4CF-8B95-47C9-B02A-2671953B7987} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {7DDEAEA9-E392-469C-ACB6-908C5BAD669E} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {F3D50E3E-34D2-48C1-AB0D-ADCF92DC07D0} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {86A67B8C-EFA0-4103-B60F-312F07C15A7A} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {854E1A42-FEA4-420E-9E83-0A39EE03F1ED} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {21FCEF89-9A3F-476E-833A-A9C2131B2AE6} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {14ECCFD6-2DC1-4124-BE26-15E8D28E3E90} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {372123C3-3AFD-42C8-BB80-778322EA72C3} = {E5D1B78A-1A8F-4D52-BF99-A4A863ADE898} + {F359AAA1-C854-444A-88F2-1C0D8A07F864} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {5D0ED1FC-3A7C-4531-9512-832E73AD9555} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {2BF7FB73-0C62-4ECF-99F0-0583855D2777} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {6FE7E243-2D99-4567-8786-6C9283D608EF} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {685188AC-A145-4A27-BF5F-9C970A59AA9C} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {F85552D4-D22E-483A-B1F8-3DFB840F6F7C} = {E2408063-FB1F-4513-B4A7-1FE50667C6E8} + {6AA0785D-9B6C-4EAE-AB83-0C4CF2B6B473} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {65DE28D5-DFEA-43E5-B820-BAF09A1FC4ED} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {D3E65610-4167-4235-9C9D-1E1FAD4C0CE6} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {F12F4645-C0FE-4129-8C71-65B4039DC445} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {C457FA70-8732-44B8-A018-C96D14025D4B} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {7071E78B-755B-410A-830B-AA05D7168944} = {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} + {87B65CBD-0FF4-4FB5-9ABC-161911A71179} = {08BD73E6-72CE-4A8A-896D-2DFFF4D7D2F8} + {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {F40F88F1-CA90-4A79-B772-80E287E25982} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} + {AC3C8985-73C2-472A-8E76-A0B8786FEC3F} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} + {07E19CA8-671D-4D58-9FED-5FEE9AE01A2F} = {67DAB2A0-D407-4CAB-8414-AE3D0AC52FC4} + {CC362C67-6FC1-42B3-A130-8120AA8D790C} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {B46D6DAF-98C6-441F-9FA5-3CAD7CF27727} = {CC362C67-6FC1-42B3-A130-8120AA8D790C} + {2D377D3A-70EC-4BB3-9F4C-6C933693DA98} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {A66D48C9-F141-4111-9169-CEB64AFFF61D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {524276E1-053D-4191-ABF7-4CDA01BFFBC3} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {43083268-74DE-4C68-824A-FB0CEC77358D} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {BAE74ABC-1096-495F-A624-BEBFBC1896F2} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} + {E92A1CAA-5758-41EF-B67E-C0D394E85417} = {52B5D4F7-237B-4E0A-A167-68442164F70A} + {F18DE651-A3E4-478F-A2B5-686429729EB8} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} + {42309C06-C0F2-490F-931B-CF41FA1970FF} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} + {EC19F867-E9EA-4B26-A1E7-87AAA3EB9296} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} + {7356FC4B-CAB2-4808-8C97-9AF74583F3A4} = {0439B173-F41E-4CE0-A44A-CCB70328F272} + {DC15AE5F-D20E-47E4-92A4-DBBD1BD51E91} = {DD9BE9E7-F6BF-4869-BCD2-82F5072BDA21} + {14CDBAD1-10C8-464A-B445-1F727C988010} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {3B96F4D8-4993-419B-BCEB-AFE4ED39449F} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {FCFAF1AF-B3F6-45F3-85AB-8249EB8432CC} = {14CDBAD1-10C8-464A-B445-1F727C988010} + {97B4A37E-B93E-48C9-95D5-689CB9495D8B} = {3B96F4D8-4993-419B-BCEB-AFE4ED39449F} + {8C3312E7-F51E-4780-A893-CE0E0B80B579} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {FE0F0889-C4AF-43C5-B851-B8CCC873BA2C} = {14CDBAD1-10C8-464A-B445-1F727C988010} + {B86EBB6F-A27F-4277-8265-937951A9DCB0} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {35B17218-9FB6-439E-AF73-9A1454BC923C} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {D5036D3F-1C53-47EE-BA50-AD290AE062D7} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {3E5EBCEC-78C9-4A1A-BF04-A216AA6A921F} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {BD74BE00-54E4-4979-8797-E8027695F396} = {B05CB08F-C088-4D6D-97EE-A94A5D1AE4A6} + {48DE251A-3482-4934-BC26-F99D2235AC9F} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {94B47385-E47F-4FD7-A3A9-A7AA122EFC93} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {C892CD81-50AE-49E5-BF44-A0C28A1614CC} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {EEF03CC6-1013-4AAF-BEED-BB4BA5021039} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {90E88EAC-4291-4406-8D88-EFDF61B11292} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {84868710-ECBB-4025-900A-EEB99EC49534} = {90E88EAC-4291-4406-8D88-EFDF61B11292} + {A061D2B4-B650-4F7F-A6CB-5C8FFFD512ED} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {4A9043FD-24A3-4A4A-956B-9CB71876F415} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {D3BAA44E-8395-4E8A-AA96-6B463356C537} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {5BE18D72-0D02-4854-966E-745CE5DAF77F} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {73EAD4FE-B44F-44A7-904E-FFA5096D91BD} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {06D34108-01BA-4C77-A704-4DD9E6F7E32C} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {A98C939C-9F48-414A-A2D3-853BE4447397} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {A94BE05F-7DAB-461C-93E7-914CBDF4FA93} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {FBE91498-D83B-4873-A67E-0FB9D1C366F0} = {D3BAA44E-8395-4E8A-AA96-6B463356C537} + {A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B} = {672E1170-7B18-474B-85C7-1961BF2A48AE} + {6FFC14FE-F659-4B23-9746-4B767CE520D2} = {A2EA6B3F-AD1A-4FDA-B12E-F71B20A43A6B} + {6084D52D-775B-4A39-8CD5-AA2F362B5A61} = {C5CAD011-DF84-4914-939C-0C029DCEF26F} + {D60EFB8E-F168-4EF2-8D8F-ED42EB6FB8CF} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} + {34BB9810-2983-4E55-A96A-132D32310145} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} + {4D83BDA7-2059-41C7-85AE-FEFAD5CD9498} = {6084D52D-775B-4A39-8CD5-AA2F362B5A61} + {8EF31071-3521-409D-9740-BBFBFC04C50E} = {370D7CD5-1E17-4F3D-BBFA-03429F6D4F2F} + {13219C1C-23E1-4EBA-93FB-86830C93A800} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {60D0BEF2-FEAF-4066-8377-6C873CB24858} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + {340BE5AC-68EC-41A5-9D0D-266037C58F13} = {8AC72641-30D3-4ACF-89FA-808FADC55C2E} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C95FDF91-16F2-4A8B-A4BE-0E62D1B66718} + EndGlobalSection +EndGlobal diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/AbpIMSignalROptions.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/AbpIMSignalROptions.cs index 769be79bc..e0e0482bb 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/AbpIMSignalROptions.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/AbpIMSignalROptions.cs @@ -1,19 +1,19 @@ -namespace LINGYUN.Abp.IM.SignalR -{ - public class AbpIMSignalROptions - { - /// - /// 自定义的客户端接收消息方法名称 - /// - public string GetChatMessageMethod { get; set; } - /// - /// 用户上线接收方法名称 - /// - public string UserOnlineMethod { get; set; } - public AbpIMSignalROptions() - { - GetChatMessageMethod = "getChatMessage"; - UserOnlineMethod = "onUserOnlined"; - } - } -} +namespace LINGYUN.Abp.IM.SignalR +{ + public class AbpIMSignalROptions + { + /// + /// 自定义的客户端接收消息方法名称 + /// + public string GetChatMessageMethod { get; set; } + /// + /// 用户上线接收方法名称 + /// + public string UserOnlineMethod { get; set; } + public AbpIMSignalROptions() + { + GetChatMessageMethod = "get-chat-message"; + UserOnlineMethod = "on-user-onlined"; + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs index 9b9b9eb34..1b51b2f91 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs @@ -1,124 +1,139 @@ -using LINGYUN.Abp.IM.Contract; -using LINGYUN.Abp.IM.Group; -using LINGYUN.Abp.IM.Messages; -using LINGYUN.Abp.RealTime.Client; -using LINGYUN.Abp.RealTime.SignalR; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using System; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.IM.SignalR.Hubs -{ - [Authorize] - public class MessagesHub : OnlineClientHubBase - { - protected AbpIMSignalROptions Options { get; } - protected IFriendStore FriendStore { get; } - protected IMessageStore MessageStore { get; } - protected IUserGroupStore UserGroupStore { get; } - - public MessagesHub( - IFriendStore friendStore, - IMessageStore messageStore, - IUserGroupStore userGroupStore, - IOptions options) - { - FriendStore = friendStore; - MessageStore = messageStore; - UserGroupStore = userGroupStore; - Options = options.Value; - } - - protected override async Task OnClientConnectedAsync(IOnlineClient client) - { - await base.OnClientConnectedAsync(client); - // 加入通讯组 - var userGroups = await UserGroupStore.GetUserGroupsAsync(client.TenantId, client.UserId.Value); - foreach (var group in userGroups) - { - await Groups.AddToGroupAsync(client.ConnectionId, group.Name); - var groupClient = Clients.Group(group.Name); - if (groupClient != null) - { - // 发送用户上线通知 - await groupClient.SendAsync(Options.UserOnlineMethod, client.TenantId, client.UserId.Value); - } - } - - // 发送好友上线通知 - var userFriends = await FriendStore.GetListAsync(client.TenantId, client.UserId.Value); - if (userFriends.Count > 0) - { - var friendClientIds = userFriends.Select(friend => friend.FriendId.ToString()).ToImmutableArray(); - var userClients = Clients.Users(friendClientIds); - if (userClients != null) - { - await userClients.SendAsync(Options.UserOnlineMethod, client.TenantId, client.UserId.Value); - } - } - } - /// - /// 客户端调用发送消息方法 - /// - /// - /// - [HubMethodName("SendMessage")] - public virtual async Task SendMessageAsync(ChatMessage chatMessage) - { - // 持久化 - await MessageStore.StoreMessageAsync(chatMessage, cancellationToken: Context.ConnectionAborted); - - if (!chatMessage.GroupId.IsNullOrWhiteSpace()) - { - await SendMessageToGroupAsync(chatMessage); - } - else - { - await SendMessageToUserAsync(chatMessage); - } - } - - protected virtual async Task SendMessageToGroupAsync(ChatMessage chatMessage) - { - var signalRClient = Clients.Group(chatMessage.GroupId); - if (signalRClient == null) - { - Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!"); - return; - } - - await signalRClient.SendAsync(Options.GetChatMessageMethod, chatMessage, cancellationToken: Context.ConnectionAborted); - } - - protected virtual async Task SendMessageToUserAsync(ChatMessage chatMessage) - { - var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.GetValueOrDefault()); - var onlineClients = OnlineClientManager.GetAllByContext(onlineClientContext); - - foreach (var onlineClient in onlineClients) - { - try - { - var signalRClient = Clients.Client(onlineClient.ConnectionId); - if (signalRClient == null) - { - Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " with connectionId " + onlineClient.ConnectionId + " from SignalR hub!"); - continue; - } - await signalRClient.SendAsync(Options.GetChatMessageMethod, chatMessage, cancellationToken: Context.ConnectionAborted); - } - catch (Exception ex) - { - // 发送异常记录就行了,因为消息已经持久化 - Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId); - Logger.LogWarning("Send to user message error: {0}", ex.Message); - } - } - } - } -} +using LINGYUN.Abp.IM.Contract; +using LINGYUN.Abp.IM.Group; +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.RealTime.Client; +using LINGYUN.Abp.RealTime.SignalR; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.SignalR; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Immutable; +using System.Linq; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM.SignalR.Hubs +{ + [Authorize] + public class MessagesHub : OnlineClientHubBase + { + protected IMessageProcessor Processor => LazyServiceProvider.LazyGetRequiredService(); + + protected AbpIMSignalROptions Options { get; } + protected IFriendStore FriendStore { get; } + protected IMessageStore MessageStore { get; } + protected IUserGroupStore UserGroupStore { get; } + + public MessagesHub( + IFriendStore friendStore, + IMessageStore messageStore, + IUserGroupStore userGroupStore, + IOptions options) + { + FriendStore = friendStore; + MessageStore = messageStore; + UserGroupStore = userGroupStore; + Options = options.Value; + } + + protected override async Task OnClientConnectedAsync(IOnlineClient client) + { + await base.OnClientConnectedAsync(client); + // 加入通讯组 + var userGroups = await UserGroupStore.GetUserGroupsAsync(client.TenantId, client.UserId.Value); + foreach (var group in userGroups) + { + await Groups.AddToGroupAsync(client.ConnectionId, group.Name); + var groupClient = Clients.Group(group.Name); + if (groupClient != null) + { + // 发送用户上线通知 + await groupClient.SendAsync(Options.UserOnlineMethod, client.TenantId, client.UserId.Value); + } + } + + // 发送好友上线通知 + var userFriends = await FriendStore.GetListAsync(client.TenantId, client.UserId.Value); + if (userFriends.Count > 0) + { + var friendClientIds = userFriends.Select(friend => friend.FriendId.ToString()).ToImmutableArray(); + var userClients = Clients.Users(friendClientIds); + if (userClients != null) + { + await userClients.SendAsync(Options.UserOnlineMethod, client.TenantId, client.UserId.Value); + } + } + } + /// + /// 客户端调用发送消息方法 + /// + /// + /// + // [HubMethodName("SendMessage")] + [HubMethodName("send")] + public virtual async Task SendAsync(ChatMessage chatMessage) + { + // 持久化 + await MessageStore.StoreMessageAsync(chatMessage, cancellationToken: Context.ConnectionAborted); + + if (!chatMessage.GroupId.IsNullOrWhiteSpace()) + { + await SendMessageToGroupAsync(chatMessage); + } + else + { + await SendMessageToUserAsync(chatMessage); + } + } + + [HubMethodName("recall")] + public virtual async Task ReCallAsync(ChatMessage chatMessage) + { + await Processor.ReCallAsync(chatMessage); + } + + [HubMethodName("read")] + public virtual async Task ReadAsync(ChatMessage chatMessage) + { + await Processor.ReadAsync(chatMessage); + } + + protected virtual async Task SendMessageToGroupAsync(ChatMessage chatMessage) + { + var signalRClient = Clients.Group(chatMessage.GroupId); + if (signalRClient == null) + { + Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!"); + return; + } + + await signalRClient.SendAsync(Options.GetChatMessageMethod, chatMessage, cancellationToken: Context.ConnectionAborted); + } + + protected virtual async Task SendMessageToUserAsync(ChatMessage chatMessage) + { + var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.GetValueOrDefault()); + var onlineClients = OnlineClientManager.GetAllByContext(onlineClientContext); + + foreach (var onlineClient in onlineClients) + { + try + { + var signalRClient = Clients.Client(onlineClient.ConnectionId); + if (signalRClient == null) + { + Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " with connectionId " + onlineClient.ConnectionId + " from SignalR hub!"); + continue; + } + await signalRClient.SendAsync(Options.GetChatMessageMethod, chatMessage, cancellationToken: Context.ConnectionAborted); + } + catch (Exception ex) + { + // 发送异常记录就行了,因为消息已经持久化 + Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId); + Logger.LogWarning("Send to user message error: {0}", ex.Message); + } + } + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs index 237a9a486..fada32ad7 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs @@ -1,161 +1,157 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.IM.Contract -{ - public interface IFriendStore - { - /// - /// 是否是好友关系 - /// - /// - /// - /// - /// - Task IsFriendAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default - ); - /// - /// 查询好友列表 - /// - /// - /// - /// - /// - /// - Task> GetListAsync( - Guid? tenantId, - Guid userId, - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - CancellationToken cancellationToken = default - ); - /// - /// 获取好友数量 - /// - /// - /// - /// - /// - Task GetCountAsync( - Guid? tenantId, - Guid userId, - string filter = "", - CancellationToken cancellationToken = default); - /// - /// 获取好友列表 - /// - /// - /// - /// - /// - /// - /// - /// - /// - Task> GetPagedListAsync( - Guid? tenantId, - Guid userId, - string filter = "", - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - /// - /// 获取最近联系好友列表 - /// - /// - /// - /// - /// - /// - Task> GetLastContactListAsync( - Guid? tenantId, - Guid userId, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - /// - /// 获取好友信息 - /// - /// - /// - /// - /// - Task GetMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - /// - /// 添加好友 - /// - /// - /// - /// - /// - Task AddMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - string remarkName = "", - CancellationToken cancellationToken = default); - /// - /// 添加好友请求 - /// - /// - /// - /// - /// - /// - Task AddRequestAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - string remarkName = "", - string description = "", - CancellationToken cancellationToken = default); - /// - /// 移除好友 - /// - /// - /// - /// - /// - Task RemoveMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - /// - /// 添加黑名单 - /// - /// - /// - /// - /// - Task AddShieldMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - /// - /// 移除黑名单 - /// - /// - /// - /// - /// - Task RemoveShieldMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - } -} +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM.Contract +{ + public interface IFriendStore + { + /// + /// 是否是好友关系 + /// + /// + /// + /// + /// + Task IsFriendAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default + ); + /// + /// 查询好友列表 + /// + /// + /// + /// + /// + Task> GetListAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(UserFriend.UserId), + CancellationToken cancellationToken = default + ); + /// + /// 获取好友数量 + /// + /// + /// + /// + /// + Task GetCountAsync( + Guid? tenantId, + Guid userId, + string filter = "", + CancellationToken cancellationToken = default); + /// + /// 获取好友列表 + /// + /// + /// + /// + /// + /// + /// + /// + Task> GetPagedListAsync( + Guid? tenantId, + Guid userId, + string filter = "", + string sorting = nameof(UserFriend.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + /// + /// 获取最近联系好友列表 + /// + /// + /// + /// + /// + /// + Task> GetLastContactListAsync( + Guid? tenantId, + Guid userId, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + /// + /// 获取好友信息 + /// + /// + /// + /// + /// + Task GetMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + /// + /// 添加好友 + /// + /// + /// + /// + /// + Task AddMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + string remarkName = "", + CancellationToken cancellationToken = default); + /// + /// 添加好友请求 + /// + /// + /// + /// + /// + /// + Task AddRequestAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + string remarkName = "", + string description = "", + CancellationToken cancellationToken = default); + /// + /// 移除好友 + /// + /// + /// + /// + /// + Task RemoveMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + /// + /// 添加黑名单 + /// + /// + /// + /// + /// + Task AddShieldMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + /// + /// 移除黑名单 + /// + /// + /// + /// + /// + Task RemoveShieldMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/IUserGroupStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/IUserGroupStore.cs index ea7212f7f..0cd6f9058 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/IUserGroupStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/IUserGroupStore.cs @@ -1,108 +1,106 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.IM.Group -{ - public interface IUserGroupStore - { - /// - /// 成员是否在群组 - /// - /// - /// - /// - /// - Task MemberHasInGroupAsync( - Guid? tenantId, - long groupId, - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 获取群组用户身份 - /// - /// - /// - /// - /// - Task GetUserGroupCardAsync( - Guid? tenantId, - long groupId, - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 获取用户所在通讯组列表 - /// - /// - /// - /// - Task> GetUserGroupsAsync( - Guid? tenantId, - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 获取群组成员列表 - /// - /// - /// - /// - Task> GetMembersAsync( - Guid? tenantId, - long groupId, - CancellationToken cancellationToken = default); - /// - /// 获取群组成员数 - /// - /// - /// - /// - Task GetMembersCountAsync( - Guid? tenantId, - long groupId, - CancellationToken cancellationToken = default); - /// - /// 获取通讯组用户 - /// - /// - /// - /// - /// - /// - /// - /// - Task> GetMembersAsync( - Guid? tenantId, - long groupId, - string sorting = nameof(GroupUserCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - /// - /// 用户加入通讯组 - /// - /// - /// - /// - /// - Task AddUserToGroupAsync( - Guid? tenantId, - Guid userId, - long groupId, - Guid acceptUserId, - CancellationToken cancellationToken = default); - /// - /// 用户退出通讯组 - /// - /// - /// - /// - /// - Task RemoveUserFormGroupAsync( - Guid? tenantId, - Guid userId, - long groupId, - CancellationToken cancellationToken = default); - } -} +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM.Group +{ + public interface IUserGroupStore + { + /// + /// 成员是否在群组 + /// + /// + /// + /// + /// + Task MemberHasInGroupAsync( + Guid? tenantId, + long groupId, + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 获取群组用户身份 + /// + /// + /// + /// + /// + Task GetUserGroupCardAsync( + Guid? tenantId, + long groupId, + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 获取用户所在通讯组列表 + /// + /// + /// + /// + Task> GetUserGroupsAsync( + Guid? tenantId, + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 获取群组成员列表 + /// + /// + /// + /// + Task> GetMembersAsync( + Guid? tenantId, + long groupId, + CancellationToken cancellationToken = default); + /// + /// 获取群组成员数 + /// + /// + /// + /// + Task GetMembersCountAsync( + Guid? tenantId, + long groupId, + CancellationToken cancellationToken = default); + /// + /// 获取通讯组用户 + /// + /// + /// + /// + /// + /// + /// + Task> GetMembersAsync( + Guid? tenantId, + long groupId, + string sorting = nameof(GroupUserCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + /// + /// 用户加入通讯组 + /// + /// + /// + /// + /// + Task AddUserToGroupAsync( + Guid? tenantId, + Guid userId, + long groupId, + Guid acceptUserId, + CancellationToken cancellationToken = default); + /// + /// 用户退出通讯组 + /// + /// + /// + /// + /// + Task RemoveUserFormGroupAsync( + Guid? tenantId, + Guid userId, + long groupId, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserCardFinder.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserCardFinder.cs index cdbe9834c..0e82b9103 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserCardFinder.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserCardFinder.cs @@ -1,60 +1,58 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.IM -{ - /// - /// IM用户资料查找接口 - /// - public interface IUserCardFinder - { - /// - /// 查询IM用户数量 - /// - /// - /// 用户名称 - /// 起止年龄 - /// 起止年龄 - /// 性别 - /// - Task GetCountAsync( - Guid? tenantId, - string findUserName = "", - int? startAge = null, - int? endAge = null, - Sex? sex = null); - /// - /// 查询IM用户列表 - /// - /// - /// 用户名称 - /// 起止年龄 - /// 起止年龄 - /// 性别 - /// 排序字段 - /// 是否倒序 - /// 起始记录位置 - /// 最大返回数量 - /// - Task> GetListAsync( - Guid? tenantId, - string findUserName = "", - int? startAge = null, - int? endAge = null, - Sex? sex = null, - string sorting = nameof(UserCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10); - /// - /// 获取IM用户信息 - /// - /// - /// - /// - Task GetMemberAsync( - Guid? tenantId, - Guid findUserId); - } -} +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM +{ + /// + /// IM用户资料查找接口 + /// + public interface IUserCardFinder + { + /// + /// 查询IM用户数量 + /// + /// + /// 用户名称 + /// 起止年龄 + /// 起止年龄 + /// 性别 + /// + Task GetCountAsync( + Guid? tenantId, + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null); + /// + /// 查询IM用户列表 + /// + /// + /// 用户名称 + /// 起止年龄 + /// 起止年龄 + /// 性别 + /// 排序字段 + /// 起始记录位置 + /// 最大返回数量 + /// + Task> GetListAsync( + Guid? tenantId, + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + string sorting = nameof(UserCard.UserId), + int skipCount = 0, + int maxResultCount = 10); + /// + /// 获取IM用户信息 + /// + /// + /// + /// + Task GetMemberAsync( + Guid? tenantId, + Guid findUserId); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageBlocker.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageBlocker.cs index 0d01a38c1..7704eb3d9 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageBlocker.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageBlocker.cs @@ -2,6 +2,9 @@ namespace LINGYUN.Abp.IM.Messages { + /// + /// 消息拦截器 + /// public interface IMessageBlocker { Task InterceptAsync(ChatMessage message); diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageProcessor.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageProcessor.cs new file mode 100644 index 000000000..12f309078 --- /dev/null +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageProcessor.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM.Messages +{ + /// + /// 消息处理器 + /// + public interface IMessageProcessor + { + /// + /// 撤回 + /// + /// + /// + Task ReCallAsync(ChatMessage message); + /// + /// 消息已读 + /// + /// + /// + Task ReadAsync(ChatMessage message); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs index 560548237..b6dae836c 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs @@ -1,108 +1,103 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.IM.Messages -{ - public interface IMessageStore - { - /// - /// 存储聊天记录 - /// - /// - /// - /// - /// - Task StoreMessageAsync( - ChatMessage chatMessage, - CancellationToken cancellationToken = default); - /// - /// 获取群组聊天记录总数 - /// - /// - /// - /// - /// - /// - Task GetGroupMessageCountAsync( - Guid? tenantId, - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - /// - /// 获取群组聊天记录 - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - Task> GetGroupMessageAsync( - Guid? tenantId, - long groupId, - string filter = "", - string sorting = nameof(ChatMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - /// - /// 获取上一次通讯消息记录 - /// - /// - /// - /// - /// - /// - /// - Task> GetLastChatMessagesAsync( - Guid? tenantId, - Guid userId, - string sorting = nameof(LastChatMessage.SendTime), - bool reverse = true, - int maxResultCount = 10, - CancellationToken cancellationToken = default - ); - /// - /// 获取与某个用户的聊天记录总数 - /// - /// - /// - /// - /// - /// - /// - Task GetChatMessageCountAsync( - Guid? tenantId, - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - /// - /// 获取与某个用户的聊天记录 - /// - /// - /// - /// - /// - Task> GetChatMessageAsync( - Guid? tenantId, - Guid sendUserId, - Guid receiveUserId, - string filter = "", - string sorting = nameof(ChatMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - } -} +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.IM.Messages +{ + public interface IMessageStore + { + /// + /// 存储聊天记录 + /// + /// + /// + /// + /// + Task StoreMessageAsync( + ChatMessage chatMessage, + CancellationToken cancellationToken = default); + /// + /// 获取群组聊天记录总数 + /// + /// + /// + /// + /// + /// + Task GetGroupMessageCountAsync( + Guid? tenantId, + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + /// + /// 获取群组聊天记录 + /// + /// + /// + /// + /// + /// + /// + /// + /// + Task> GetGroupMessageAsync( + Guid? tenantId, + long groupId, + string filter = "", + string sorting = nameof(ChatMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + /// + /// 获取上一次通讯消息记录 + /// + /// + /// + /// + /// + /// + Task> GetLastChatMessagesAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + int maxResultCount = 10, + CancellationToken cancellationToken = default + ); + /// + /// 获取与某个用户的聊天记录总数 + /// + /// + /// + /// + /// + /// + /// + Task GetChatMessageCountAsync( + Guid? tenantId, + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + /// + /// 获取与某个用户的聊天记录 + /// + /// + /// + /// + /// + Task> GetChatMessageAsync( + Guid? tenantId, + Guid sendUserId, + Guid receiveUserId, + string filter = "", + string sorting = nameof(ChatMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSendState.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageState.cs similarity index 75% rename from aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSendState.cs rename to aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageState.cs index 3fbbfafe1..422347a87 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSendState.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageState.cs @@ -1,25 +1,29 @@ -namespace LINGYUN.Abp.IM.Messages -{ - /// - /// 消息状态 - /// - public enum MessageSendState : sbyte - { - /// - /// 已发送 - /// - Send = 0, - /// - /// 撤回 - /// - ReCall = 10, - /// - /// 发送失败 - /// - Failed = 50, - /// - /// 退回 - /// - BackTo = 100 - } -} +namespace LINGYUN.Abp.IM.Messages +{ + /// + /// 消息状态 + /// + public enum MessageState : sbyte + { + /// + /// 已发送 + /// + Send = 0, + /// + /// 已读 + /// + Read = 1, + /// + /// 撤回 + /// + ReCall = 10, + /// + /// 发送失败 + /// + Failed = 50, + /// + /// 退回 + /// + BackTo = 100 + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/NullMessageProcessor.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/NullMessageProcessor.cs new file mode 100644 index 000000000..28eef382f --- /dev/null +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/NullMessageProcessor.cs @@ -0,0 +1,19 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace LINGYUN.Abp.IM.Messages +{ + [Dependency(TryRegister = true)] + public class NullMessageProcessor : IMessageProcessor, ISingletonDependency + { + public Task ReadAsync(ChatMessage message) + { + return Task.CompletedTask; + } + + public Task ReCallAsync(ChatMessage message) + { + return Task.CompletedTask; + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Settings/AbpIMSettingNames.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Settings/AbpIMSettingNames.cs new file mode 100644 index 000000000..2ea585770 --- /dev/null +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Settings/AbpIMSettingNames.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace LINGYUN.Abp.IM.Settings +{ + public static class AbpIMSettingNames + { + + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/AbpNotificationsSignalROptions.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/AbpNotificationsSignalROptions.cs index 9c9abceca..f5fdf7f10 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/AbpNotificationsSignalROptions.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/AbpNotificationsSignalROptions.cs @@ -1,15 +1,15 @@ -namespace LINGYUN.Abp.Notifications.SignalR -{ - public class AbpNotificationsSignalROptions - { - /// - /// 自定义的客户端订阅通知方法名称 - /// - public string MethodName { get; set; } - - public AbpNotificationsSignalROptions() - { - MethodName = "getNotification"; - } - } -} +namespace LINGYUN.Abp.Notifications.SignalR +{ + public class AbpNotificationsSignalROptions + { + /// + /// 自定义的客户端订阅通知方法名称 + /// + public string MethodName { get; set; } + + public AbpNotificationsSignalROptions() + { + MethodName = "get-notification"; + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/Hubs/NotificationsHub.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/Hubs/NotificationsHub.cs index 978c8ce6d..159a3ab20 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/Hubs/NotificationsHub.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.SignalR/LINGYUN/Abp/Notifications/SignalR/Hubs/NotificationsHub.cs @@ -1,78 +1,81 @@ -using LINGYUN.Abp.RealTime.Client; -using LINGYUN.Abp.RealTime.SignalR; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.SignalR; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Uow; -using Volo.Abp.Users; - -namespace LINGYUN.Abp.Notifications.SignalR.Hubs -{ - [Authorize] - public class NotificationsHub : OnlineClientHubBase - { - protected INotificationStore NotificationStore => LazyServiceProvider.LazyGetRequiredService(); - - protected override async Task OnClientConnectedAsync(IOnlineClient client) - { - await base.OnClientConnectedAsync(client); - - if (client.TenantId.HasValue) - { - // 以租户为分组,将用户加入租户通讯组 - await Groups.AddToGroupAsync(client.ConnectionId, client.TenantId.Value.ToString(), Context.ConnectionAborted); - } - else - { - await Groups.AddToGroupAsync(client.ConnectionId, "Global", Context.ConnectionAborted); - } - } - - protected override async Task OnClientDisconnectedAsync(IOnlineClient client) - { - await base.OnClientDisconnectedAsync(client); - - if (client.TenantId.HasValue) - { - // 以租户为分组,将移除租户通讯组 - await Groups.RemoveFromGroupAsync(client.ConnectionId, client.TenantId.Value.ToString(), Context.ConnectionAborted); - } - else - { - await Groups.RemoveFromGroupAsync(client.ConnectionId, "Global", Context.ConnectionAborted); - } - } - - [HubMethodName("MySubscriptions")] - public virtual async Task> GetMySubscriptionsAsync() - { - var subscriptions = await NotificationStore - .GetUserSubscriptionsAsync(CurrentTenant.Id, CurrentUser.GetId()); - - return new ListResultDto(subscriptions); - } - - [UnitOfWork] - [HubMethodName("GetNotification")] - public virtual async Task> GetNotificationAsync() - { - var userNotifications = await NotificationStore - .GetUserNotificationsAsync(CurrentTenant.Id, CurrentUser.GetId(), NotificationReadState.UnRead, 10); - - return new ListResultDto(userNotifications); - } - - [HubMethodName("ChangeState")] - public virtual async Task ChangeStateAsync(string id, NotificationReadState readState = NotificationReadState.Read) - { - await NotificationStore - .ChangeUserNotificationReadStateAsync( - CurrentTenant.Id, - CurrentUser.GetId(), - long.Parse(id), - readState, - Context.ConnectionAborted); - } - } -} +using LINGYUN.Abp.RealTime.Client; +using LINGYUN.Abp.RealTime.SignalR; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.SignalR; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Uow; +using Volo.Abp.Users; + +namespace LINGYUN.Abp.Notifications.SignalR.Hubs +{ + [Authorize] + public class NotificationsHub : OnlineClientHubBase + { + protected INotificationStore NotificationStore => LazyServiceProvider.LazyGetRequiredService(); + + protected override async Task OnClientConnectedAsync(IOnlineClient client) + { + await base.OnClientConnectedAsync(client); + + if (client.TenantId.HasValue) + { + // 以租户为分组,将用户加入租户通讯组 + await Groups.AddToGroupAsync(client.ConnectionId, client.TenantId.Value.ToString(), Context.ConnectionAborted); + } + else + { + await Groups.AddToGroupAsync(client.ConnectionId, "Global", Context.ConnectionAborted); + } + } + + protected override async Task OnClientDisconnectedAsync(IOnlineClient client) + { + await base.OnClientDisconnectedAsync(client); + + if (client.TenantId.HasValue) + { + // 以租户为分组,将移除租户通讯组 + await Groups.RemoveFromGroupAsync(client.ConnectionId, client.TenantId.Value.ToString(), Context.ConnectionAborted); + } + else + { + await Groups.RemoveFromGroupAsync(client.ConnectionId, "Global", Context.ConnectionAborted); + } + } + + // [HubMethodName("MySubscriptions")] + [HubMethodName("my-subscriptions")] + public virtual async Task> GetMySubscriptionsAsync() + { + var subscriptions = await NotificationStore + .GetUserSubscriptionsAsync(CurrentTenant.Id, CurrentUser.GetId()); + + return new ListResultDto(subscriptions); + } + + [UnitOfWork] + // [HubMethodName("GetNotification")] + [HubMethodName("get-notifications")] + public virtual async Task> GetNotificationAsync() + { + var userNotifications = await NotificationStore + .GetUserNotificationsAsync(CurrentTenant.Id, CurrentUser.GetId(), NotificationReadState.UnRead, 10); + + return new ListResultDto(userNotifications); + } + + // [HubMethodName("ChangeState")] + [HubMethodName("change-state")] + public virtual async Task ChangeStateAsync(string id, NotificationReadState readState = NotificationReadState.Read) + { + await NotificationStore + .ChangeUserNotificationReadStateAsync( + CurrentTenant.Id, + CurrentUser.GetId(), + long.Parse(id), + readState, + Context.ConnectionAborted); + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/INotificationStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/INotificationStore.cs index 9bbc95eb3..3e0f502f1 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/INotificationStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/INotificationStore.cs @@ -1,126 +1,125 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.Notifications -{ - public interface INotificationStore - { - Task InsertUserSubscriptionAsync( - Guid? tenantId, - UserIdentifier identifier, - string notificationName, - CancellationToken cancellationToken = default); - - Task InsertUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default); - - Task DeleteUserSubscriptionAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default); - - Task DeleteAllUserSubscriptionAsync( - Guid? tenantId, - string notificationName, - CancellationToken cancellationToken = default); - - Task DeleteUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default); - - Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string notificationName, - IEnumerable identifiers = null, - CancellationToken cancellationToken = default); - - Task> GetUserSubscriptionsAsync( - Guid? tenantId, - Guid userId, - CancellationToken cancellationToken = default); - - Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string userName, - CancellationToken cancellationToken = default); - - Task IsSubscribedAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default); - - Task InsertNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default); - - Task DeleteNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default); - - Task DeleteNotificationAsync( - int batchCount, - CancellationToken cancellationToken = default); - - Task InsertUserNotificationAsync( - NotificationInfo notification, - Guid userId, - CancellationToken cancellationToken = default); - - Task InsertUserNotificationsAsync( - NotificationInfo notification, - IEnumerable userIds, - CancellationToken cancellationToken = default); - - Task DeleteUserNotificationAsync( - Guid? tenantId, - Guid userId, - long notificationId, - CancellationToken cancellationToken = default); - - Task GetNotificationOrNullAsync( - Guid? tenantId, - long notificationId, - CancellationToken cancellationToken = default); - - Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - NotificationReadState? readState = null, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetUserNotificationsCountAsync( - Guid? tenantId, - Guid userId, - string filter = "", - NotificationReadState? readState = null, - CancellationToken cancellationToken = default); - - Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - string filter = "", - string sorting = nameof(NotificationInfo.CreationTime), - bool reverse = true, - NotificationReadState? readState = null, - int skipCount = 1, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task ChangeUserNotificationReadStateAsync( - Guid? tenantId, - Guid userId, - long notificationId, - NotificationReadState readState, - CancellationToken cancellationToken = default); - } -} +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.Notifications +{ + public interface INotificationStore + { + Task InsertUserSubscriptionAsync( + Guid? tenantId, + UserIdentifier identifier, + string notificationName, + CancellationToken cancellationToken = default); + + Task InsertUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default); + + Task DeleteUserSubscriptionAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default); + + Task DeleteAllUserSubscriptionAsync( + Guid? tenantId, + string notificationName, + CancellationToken cancellationToken = default); + + Task DeleteUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default); + + Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string notificationName, + IEnumerable identifiers = null, + CancellationToken cancellationToken = default); + + Task> GetUserSubscriptionsAsync( + Guid? tenantId, + Guid userId, + CancellationToken cancellationToken = default); + + Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string userName, + CancellationToken cancellationToken = default); + + Task IsSubscribedAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default); + + Task InsertNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default); + + Task DeleteNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default); + + Task DeleteNotificationAsync( + int batchCount, + CancellationToken cancellationToken = default); + + Task InsertUserNotificationAsync( + NotificationInfo notification, + Guid userId, + CancellationToken cancellationToken = default); + + Task InsertUserNotificationsAsync( + NotificationInfo notification, + IEnumerable userIds, + CancellationToken cancellationToken = default); + + Task DeleteUserNotificationAsync( + Guid? tenantId, + Guid userId, + long notificationId, + CancellationToken cancellationToken = default); + + Task GetNotificationOrNullAsync( + Guid? tenantId, + long notificationId, + CancellationToken cancellationToken = default); + + Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + NotificationReadState? readState = null, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetUserNotificationsCountAsync( + Guid? tenantId, + Guid userId, + string filter = "", + NotificationReadState? readState = null, + CancellationToken cancellationToken = default); + + Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + string filter = "", + string sorting = nameof(NotificationInfo.CreationTime), + NotificationReadState? readState = null, + int skipCount = 1, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task ChangeUserNotificationReadStateAsync( + Guid? tenantId, + Guid userId, + long notificationId, + NotificationReadState readState, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/NullNotificationStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/NullNotificationStore.cs index 8062548a5..df221796b 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/NullNotificationStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/NullNotificationStore.cs @@ -1,188 +1,187 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace LINGYUN.Abp.Notifications -{ - [Dependency(TryRegister = true)] - public class NullNotificationStore : INotificationStore, ISingletonDependency - { - public Task ChangeUserNotificationReadStateAsync( - Guid? tenantId, - Guid userId, - long notificationId, - NotificationReadState readState, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteAllUserSubscriptionAsync( - Guid? tenantId, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteNotificationAsync( - int batchCount, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteUserNotificationAsync( - Guid? tenantId, - Guid userId, - long notificationId, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteUserSubscriptionAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task DeleteUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task GetNotificationOrNullAsync( - Guid? tenantId, - long notificationId, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new NotificationInfo()); - } - - public Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string notificationName, - IEnumerable identifiers, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new List()); - } - - public Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - NotificationReadState? readState = null, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new List()); - } - - public Task GetUserNotificationsCountAsync( - Guid? tenantId, - Guid userId, - string filter = "", - NotificationReadState? readState = null, - CancellationToken cancellationToken = default) - { - return Task.FromResult(0); - } - - public Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - string filter = "", - string sorting = nameof(NotificationInfo.CreationTime), - bool reverse = true, - NotificationReadState? readState = null, - int skipCount = 1, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new List()); - } - - public Task> GetUserSubscriptionsAsync( - Guid? tenantId, - Guid userId, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new List()); - } - - public Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string userName, - CancellationToken cancellationToken = default) - { - return Task.FromResult(new List()); - } - - public Task InsertNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task InsertUserNotificationAsync( - NotificationInfo notification, - Guid userId, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task InsertUserNotificationsAsync( - NotificationInfo notification, - IEnumerable userIds, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task InsertUserSubscriptionAsync( - Guid? tenantId, - UserIdentifier identifier, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task InsertUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.CompletedTask; - } - - public Task IsSubscribedAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default) - { - return Task.FromResult(false); - } - } -} +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace LINGYUN.Abp.Notifications +{ + [Dependency(TryRegister = true)] + public class NullNotificationStore : INotificationStore, ISingletonDependency + { + public Task ChangeUserNotificationReadStateAsync( + Guid? tenantId, + Guid userId, + long notificationId, + NotificationReadState readState, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteAllUserSubscriptionAsync( + Guid? tenantId, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteNotificationAsync( + int batchCount, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteUserNotificationAsync( + Guid? tenantId, + Guid userId, + long notificationId, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteUserSubscriptionAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task DeleteUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task GetNotificationOrNullAsync( + Guid? tenantId, + long notificationId, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new NotificationInfo()); + } + + public Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string notificationName, + IEnumerable identifiers, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new List()); + } + + public Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + NotificationReadState? readState = null, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new List()); + } + + public Task GetUserNotificationsCountAsync( + Guid? tenantId, + Guid userId, + string filter = "", + NotificationReadState? readState = null, + CancellationToken cancellationToken = default) + { + return Task.FromResult(0); + } + + public Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + string filter = "", + string sorting = nameof(NotificationInfo.CreationTime), + NotificationReadState? readState = null, + int skipCount = 1, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new List()); + } + + public Task> GetUserSubscriptionsAsync( + Guid? tenantId, + Guid userId, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new List()); + } + + public Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string userName, + CancellationToken cancellationToken = default) + { + return Task.FromResult(new List()); + } + + public Task InsertNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task InsertUserNotificationAsync( + NotificationInfo notification, + Guid userId, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task InsertUserNotificationsAsync( + NotificationInfo notification, + IEnumerable userIds, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task InsertUserSubscriptionAsync( + Guid? tenantId, + UserIdentifier identifier, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task InsertUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.CompletedTask; + } + + public Task IsSubscribedAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default) + { + return Task.FromResult(false); + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.RealTime/LINGYUN.Abp.RealTime.csproj b/aspnet-core/modules/common/LINGYUN.Abp.RealTime/LINGYUN.Abp.RealTime.csproj index 184bbf6c6..c69060b43 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.RealTime/LINGYUN.Abp.RealTime.csproj +++ b/aspnet-core/modules/common/LINGYUN.Abp.RealTime/LINGYUN.Abp.RealTime.csproj @@ -9,6 +9,7 @@ + diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs index 25799aa99..007154f6e 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs @@ -1,10 +1,9 @@ -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class GetMyFriendsDto : ISortedResultRequest - { - public string Sorting { get; set; } - public bool Reverse { get; set; } - } -} +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class GetMyFriendsDto : ISortedResultRequest + { + public string Sorting { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs index 6c9382eaf..ede167fd4 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs @@ -1,11 +1,10 @@ -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class GetUserLastMessageDto : ILimitedResultRequest, ISortedResultRequest - { - public int MaxResultCount { get; set; } - public string Sorting { get; set; } - public bool Reverse { get; set; } - } -} +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class GetUserLastMessageDto : ILimitedResultRequest, ISortedResultRequest + { + public int MaxResultCount { get; set; } + public string Sorting { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupMessageGetByPagedDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupMessageGetByPagedDto.cs index 82ec7c4a5..36bb32ca6 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupMessageGetByPagedDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupMessageGetByPagedDto.cs @@ -1,15 +1,14 @@ -using LINGYUN.Abp.IM.Messages; -using System.ComponentModel.DataAnnotations; -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class GroupMessageGetByPagedDto : PagedAndSortedResultRequestDto - { - [Required] - public long GroupId { get; set; } - public bool Reverse { get; set; } - public string Filter { get; set; } - public MessageType? MessageType { get; set; } - } -} +using LINGYUN.Abp.IM.Messages; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class GroupMessageGetByPagedDto : PagedAndSortedResultRequestDto + { + [Required] + public long GroupId { get; set; } + public string Filter { get; set; } + public MessageType? MessageType { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupUserGetByPagedDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupUserGetByPagedDto.cs index 3441332c8..d1a77cde7 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupUserGetByPagedDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupUserGetByPagedDto.cs @@ -1,15 +1,13 @@ -using System.ComponentModel.DataAnnotations; -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class GroupUserGetByPagedDto : PagedAndSortedResultRequestDto - { - [Required] - public long GroupId { get; set; } - - public bool Reverse { get; set; } - - public string Filter { get; set; } - } -} +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class GroupUserGetByPagedDto : PagedAndSortedResultRequestDto + { + [Required] + public long GroupId { get; set; } + + public string Filter { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/MyFriendGetByPagedDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/MyFriendGetByPagedDto.cs index ae27bef2b..85af1d86a 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/MyFriendGetByPagedDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/MyFriendGetByPagedDto.cs @@ -1,15 +1,13 @@ -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class MyFriendGetByPagedDto : PagedAndSortedResultRequestDto - { - public string Filter { get; set; } - - public bool Reverse { get; set; } - } - - public class MyLastContractFriendGetByPagedDto : PagedResultRequestDto - { - } -} +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class MyFriendGetByPagedDto : PagedAndSortedResultRequestDto + { + public string Filter { get; set; } + } + + public class MyLastContractFriendGetByPagedDto : PagedResultRequestDto + { + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/UserMessageGetByPagedDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/UserMessageGetByPagedDto.cs index 514e5decc..c6620b82f 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/UserMessageGetByPagedDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/UserMessageGetByPagedDto.cs @@ -1,16 +1,15 @@ -using LINGYUN.Abp.IM.Messages; -using System; -using System.ComponentModel.DataAnnotations; -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class UserMessageGetByPagedDto : PagedAndSortedResultRequestDto - { - [Required] - public Guid ReceiveUserId { get; set; } - public bool Reverse { get; set; } - public string Filter { get; set; } - public MessageType? MessageType { get; set; } - } -} +using LINGYUN.Abp.IM.Messages; +using System; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class UserMessageGetByPagedDto : PagedAndSortedResultRequestDto + { + [Required] + public Guid ReceiveUserId { get; set; } + public string Filter { get; set; } + public MessageType? MessageType { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Notifications/Dto/UserNotificationGetByPagedDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Notifications/Dto/UserNotificationGetByPagedDto.cs index 4f4651498..542d59d70 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Notifications/Dto/UserNotificationGetByPagedDto.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Notifications/Dto/UserNotificationGetByPagedDto.cs @@ -1,14 +1,12 @@ -using LINGYUN.Abp.Notifications; -using Volo.Abp.Application.Dtos; - -namespace LINGYUN.Abp.MessageService.Notifications -{ - public class UserNotificationGetByPagedDto : PagedAndSortedResultRequestDto - { - public string Filter { get; set; } - - public bool Reverse { get; set; } - - public NotificationReadState? ReadState { get; set; } - } -} +using LINGYUN.Abp.Notifications; +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Notifications +{ + public class UserNotificationGetByPagedDto : PagedAndSortedResultRequestDto + { + public string Filter { get; set; } + + public NotificationReadState? ReadState { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs index ee7f85368..0f37e2044 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs @@ -1,136 +1,136 @@ -using LINGYUN.Abp.IM.Group; -using LINGYUN.Abp.IM.Messages; -using Microsoft.AspNetCore.Authorization; -using System.Threading.Tasks; -using Volo.Abp; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.Users; - -namespace LINGYUN.Abp.MessageService.Chat -{ - [Authorize] - public class ChatAppService : ApplicationService, IChatAppService - { - protected IMessageSender MessageSender => LazyServiceProvider.LazyGetRequiredService(); - - private readonly IUserGroupStore _userGroupStore; - private readonly IMessageStore _messageStore; - - public ChatAppService( - IMessageStore messageStore, - IUserGroupStore userGroupStore) - { - _messageStore = messageStore; - _userGroupStore = userGroupStore; - } - - public virtual async Task> GetMyChatMessageAsync(UserMessageGetByPagedDto input) - { - var chatMessageCount = await _messageStore - .GetChatMessageCountAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId, - input.Filter, input.MessageType); - - var chatMessages = await _messageStore - .GetChatMessageAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId, - input.Filter, input.Sorting, input.Reverse, - input.MessageType, input.SkipCount, input.MaxResultCount); - - return new PagedResultDto(chatMessageCount, chatMessages); - } - - public virtual async Task> GetMyLastChatMessageAsync(GetUserLastMessageDto input) - { - var chatMessages = await _messageStore - .GetLastChatMessagesAsync(CurrentTenant.Id, CurrentUser.GetId(), - input.Sorting, input.Reverse, input.MaxResultCount); - - return new ListResultDto(chatMessages); - } - - public virtual async Task> GetMyGroupMessageAsync(GroupMessageGetByPagedDto input) - { - if (! await _userGroupStore.MemberHasInGroupAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId())) - { - throw new BusinessException(MessageServiceErrorCodes.YouHaveNotJoinedGroup); - } - - var groupMessageCount = await _messageStore - .GetGroupMessageCountAsync(CurrentTenant.Id, input.GroupId, - input.Filter, input.MessageType); - - var groupMessages = await _messageStore - .GetGroupMessageAsync(CurrentTenant.Id, input.GroupId, - input.Filter, input.Sorting, input.Reverse, - input.MessageType, input.SkipCount, input.MaxResultCount); - - return new PagedResultDto(groupMessageCount, groupMessages); - } - - //public virtual async Task> GetGroupUsersAsync(GroupUserGetByPagedDto input) - //{ - // var groupUserCardCount = await _userGroupStore - // .GetMembersCountAsync(CurrentTenant.Id, input.GroupId); - - // var groupUserCards = await _userGroupStore.GetMembersAsync(CurrentTenant.Id, - // input.GroupId, input.Sorting, input.Reverse, - // input.SkipCount, input.MaxResultCount); - - // return new PagedResultDto(groupUserCardCount, groupUserCards); - //} - - //[Authorize] - //public virtual async Task> GetMyGroupsAsync() - //{ - // var myGroups = await _userGroupStore.GetUserGroupsAsync(CurrentTenant.Id, CurrentUser.GetId()); - - // return new ListResultDto(myGroups.ToImmutableList()); - //} - - //public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto input) - //{ - // var myGroupCard = await _userGroupStore - // .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()); - // if (myGroupCard == null) - // { - // // 当前登录用户不再用户组 - // throw new UserFriendlyException(""); - // } - // if (!myGroupCard.IsAdmin) - // { - // // 当前登录用户没有加人权限 - // throw new UserFriendlyException(""); - // } - // await _userGroupStore - // .AddUserToGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId, CurrentUser.GetId()); - //} - - //public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto input) - //{ - // var myGroupCard = await _userGroupStore - // .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()); - // if (myGroupCard == null) - // { - // // 当前登录用户不再用户组 - // throw new UserFriendlyException(""); - // } - // if (!myGroupCard.IsAdmin) - // { - // // 当前登录用户没有踢人权限 - // throw new UserFriendlyException(""); - // } - // await _userGroupStore - // .RemoveUserFormGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId); - //} - - public virtual async Task SendMessageAsync(ChatMessage input) - { - // TODO:向其他租户发送消息? - input.TenantId ??= CurrentTenant.Id; - - var messageId = await MessageSender.SendMessageAsync(input); - - return new ChatMessageSendResultDto(messageId); - } - } -} +using LINGYUN.Abp.IM.Group; +using LINGYUN.Abp.IM.Messages; +using Microsoft.AspNetCore.Authorization; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Users; + +namespace LINGYUN.Abp.MessageService.Chat +{ + [Authorize] + public class ChatAppService : ApplicationService, IChatAppService + { + protected IMessageSender MessageSender => LazyServiceProvider.LazyGetRequiredService(); + + private readonly IUserGroupStore _userGroupStore; + private readonly IMessageStore _messageStore; + + public ChatAppService( + IMessageStore messageStore, + IUserGroupStore userGroupStore) + { + _messageStore = messageStore; + _userGroupStore = userGroupStore; + } + + public virtual async Task> GetMyChatMessageAsync(UserMessageGetByPagedDto input) + { + var chatMessageCount = await _messageStore + .GetChatMessageCountAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId, + input.Filter, input.MessageType); + + var chatMessages = await _messageStore + .GetChatMessageAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId, + input.Filter, input.Sorting, + input.MessageType, input.SkipCount, input.MaxResultCount); + + return new PagedResultDto(chatMessageCount, chatMessages); + } + + public virtual async Task> GetMyLastChatMessageAsync(GetUserLastMessageDto input) + { + var chatMessages = await _messageStore + .GetLastChatMessagesAsync(CurrentTenant.Id, CurrentUser.GetId(), + input.Sorting, input.MaxResultCount); + + return new ListResultDto(chatMessages); + } + + public virtual async Task> GetMyGroupMessageAsync(GroupMessageGetByPagedDto input) + { + if (! await _userGroupStore.MemberHasInGroupAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId())) + { + throw new BusinessException(MessageServiceErrorCodes.YouHaveNotJoinedGroup); + } + + var groupMessageCount = await _messageStore + .GetGroupMessageCountAsync(CurrentTenant.Id, input.GroupId, + input.Filter, input.MessageType); + + var groupMessages = await _messageStore + .GetGroupMessageAsync(CurrentTenant.Id, input.GroupId, + input.Filter, input.Sorting, + input.MessageType, input.SkipCount, input.MaxResultCount); + + return new PagedResultDto(groupMessageCount, groupMessages); + } + + //public virtual async Task> GetGroupUsersAsync(GroupUserGetByPagedDto input) + //{ + // var groupUserCardCount = await _userGroupStore + // .GetMembersCountAsync(CurrentTenant.Id, input.GroupId); + + // var groupUserCards = await _userGroupStore.GetMembersAsync(CurrentTenant.Id, + // input.GroupId, input.Sorting, input.Reverse, + // input.SkipCount, input.MaxResultCount); + + // return new PagedResultDto(groupUserCardCount, groupUserCards); + //} + + //[Authorize] + //public virtual async Task> GetMyGroupsAsync() + //{ + // var myGroups = await _userGroupStore.GetUserGroupsAsync(CurrentTenant.Id, CurrentUser.GetId()); + + // return new ListResultDto(myGroups.ToImmutableList()); + //} + + //public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto input) + //{ + // var myGroupCard = await _userGroupStore + // .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()); + // if (myGroupCard == null) + // { + // // 当前登录用户不再用户组 + // throw new UserFriendlyException(""); + // } + // if (!myGroupCard.IsAdmin) + // { + // // 当前登录用户没有加人权限 + // throw new UserFriendlyException(""); + // } + // await _userGroupStore + // .AddUserToGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId, CurrentUser.GetId()); + //} + + //public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto input) + //{ + // var myGroupCard = await _userGroupStore + // .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()); + // if (myGroupCard == null) + // { + // // 当前登录用户不再用户组 + // throw new UserFriendlyException(""); + // } + // if (!myGroupCard.IsAdmin) + // { + // // 当前登录用户没有踢人权限 + // throw new UserFriendlyException(""); + // } + // await _userGroupStore + // .RemoveUserFormGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId); + //} + + public virtual async Task SendMessageAsync(ChatMessage input) + { + // TODO:向其他租户发送消息? + input.TenantId ??= CurrentTenant.Id; + + var messageId = await MessageSender.SendMessageAsync(input); + + return new ChatMessageSendResultDto(messageId); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs index 501ebd55b..101dccaec 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs @@ -1,66 +1,68 @@ -using LINGYUN.Abp.IM.Contract; -using LINGYUN.Abp.MessageService.Localization; -using Microsoft.AspNetCore.Authorization; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.Users; - -namespace LINGYUN.Abp.MessageService.Chat -{ - [Authorize] - public class MyFriendAppService : ApplicationService, IMyFriendAppService - { - protected IFriendStore FriendStore { get; } - - protected IUserChatCardRepository UserChatCardRepository { get; } - - public MyFriendAppService( - IFriendStore friendStore, - IUserChatCardRepository userChatCardRepository) - { - FriendStore = friendStore; - UserChatCardRepository = userChatCardRepository; - - LocalizationResource = typeof(MessageServiceResource); - } - - public virtual async Task CreateAsync(MyFriendCreateDto input) - { - var friendCard = await UserChatCardRepository.GetMemberAsync(input.FriendId); - - await FriendStore.AddMemberAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId, friendCard?.NickName ?? friendCard?.UserName ?? input.FriendId.ToString()); - } - - public virtual async Task AddRequestAsync(MyFriendAddRequestDto input) - { - await FriendStore.AddRequestAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId, input.RemarkName, L["AddNewFriendBySearchId"]); - } - - public virtual async Task DeleteAsync(MyFriendOperationDto input) - { - await FriendStore.RemoveMemberAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId); - } - - public virtual async Task> GetAllListAsync(GetMyFriendsDto input) - { - var myFriends = await FriendStore - .GetListAsync(CurrentTenant.Id, CurrentUser.GetId(), - input.Sorting, input.Reverse); - - return new ListResultDto(myFriends); - } - - public virtual async Task> GetListAsync(MyFriendGetByPagedDto input) - { - var myFrientCount = await FriendStore.GetCountAsync(CurrentTenant.Id, CurrentUser.GetId()); - - var myFriends = await FriendStore - .GetPagedListAsync(CurrentTenant.Id, CurrentUser.GetId(), - input.Filter, input.Sorting, input.Reverse, - input.SkipCount, input.MaxResultCount); - - return new PagedResultDto(myFrientCount, myFriends); - } - } -} +using LINGYUN.Abp.IM.Contract; +using LINGYUN.Abp.MessageService.Localization; +using Microsoft.AspNetCore.Authorization; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Users; + +namespace LINGYUN.Abp.MessageService.Chat +{ + [Authorize] + public class MyFriendAppService : ApplicationService, IMyFriendAppService + { + protected IFriendStore FriendStore { get; } + + protected IUserChatCardRepository UserChatCardRepository { get; } + + public MyFriendAppService( + IFriendStore friendStore, + IUserChatCardRepository userChatCardRepository) + { + FriendStore = friendStore; + UserChatCardRepository = userChatCardRepository; + + LocalizationResource = typeof(MessageServiceResource); + } + + public virtual async Task CreateAsync(MyFriendCreateDto input) + { + var friendCard = await UserChatCardRepository.GetMemberAsync(input.FriendId); + + await FriendStore.AddMemberAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId, friendCard?.NickName ?? friendCard?.UserName ?? input.FriendId.ToString()); + } + + public virtual async Task AddRequestAsync(MyFriendAddRequestDto input) + { + await FriendStore.AddRequestAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId, input.RemarkName, L["AddNewFriendBySearchId"]); + } + + public virtual async Task DeleteAsync(MyFriendOperationDto input) + { + await FriendStore.RemoveMemberAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId); + } + + public virtual async Task> GetAllListAsync(GetMyFriendsDto input) + { + var myFriends = await FriendStore + .GetListAsync( + CurrentTenant.Id, + CurrentUser.GetId(), + input.Sorting); + + return new ListResultDto(myFriends); + } + + public virtual async Task> GetListAsync(MyFriendGetByPagedDto input) + { + var myFrientCount = await FriendStore.GetCountAsync(CurrentTenant.Id, CurrentUser.GetId()); + + var myFriends = await FriendStore + .GetPagedListAsync(CurrentTenant.Id, CurrentUser.GetId(), + input.Filter, input.Sorting, + input.SkipCount, input.MaxResultCount); + + return new PagedResultDto(myFrientCount, myFriends); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Notifications/MyNotificationAppService.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Notifications/MyNotificationAppService.cs index 17bda9d91..3a2cef825 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Notifications/MyNotificationAppService.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Notifications/MyNotificationAppService.cs @@ -1,121 +1,121 @@ -using LINGYUN.Abp.Notifications; -using Microsoft.AspNetCore.Authorization; -using System.Collections.Generic; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.Users; - -namespace LINGYUN.Abp.MessageService.Notifications -{ - [Authorize] - public class MyNotificationAppService : ApplicationService, IMyNotificationAppService - { - protected INotificationSender NotificationSender { get; } - - protected INotificationStore NotificationStore { get; } - - protected INotificationDefinitionManager NotificationDefinitionManager { get; } - - public MyNotificationAppService( - INotificationStore notificationStore, - INotificationSender notificationSender, - INotificationDefinitionManager notificationDefinitionManager) - { - NotificationStore = notificationStore; - NotificationSender = notificationSender; - NotificationDefinitionManager = notificationDefinitionManager; - } - - public virtual async Task SendNofiterAsync(NotificationSendDto input) - { - UserIdentifier user = null; - if (input.ToUserId.HasValue) - { - user = new UserIdentifier(input.ToUserId.Value, input.ToUserName); - } - await NotificationSender - .SendNofiterAsync( - input.Name, - input.Data, - user, - CurrentTenant.Id, - input.Severity); - } - - public virtual async Task DeleteAsync(long id) - { - await NotificationStore - .DeleteUserNotificationAsync( - CurrentTenant.Id, - CurrentUser.GetId(), - id); - } - - public virtual Task> GetAssignableNotifiersAsync() - { - var groups = new List(); - - foreach (var group in NotificationDefinitionManager.GetGroups()) - { - if (!group.AllowSubscriptionToClients) - { - continue; - - } - var notificationGroup = new NotificationGroupDto - { - Name = group.Name, - DisplayName = group.DisplayName.Localize(StringLocalizerFactory) - }; - - foreach (var notification in group.Notifications) - { - if (!notification.AllowSubscriptionToClients) - { - continue; - } - - var notificationChildren = new NotificationDto - { - Name = notification.Name, - DisplayName = notification.DisplayName.Localize(StringLocalizerFactory), - Description = notification.Description.Localize(StringLocalizerFactory), - Lifetime = notification.NotificationLifetime, - Type = notification.NotificationType - }; - - notificationGroup.Notifications.Add(notificationChildren); - } - - groups.Add(notificationGroup); - } - - return Task.FromResult(new ListResultDto(groups)); - } - - public virtual async Task GetAsync(long id) - { - return await NotificationStore - .GetNotificationOrNullAsync(CurrentTenant.Id, id); - } - - public virtual async Task> GetListAsync(UserNotificationGetByPagedDto input) - { - var notificationCount = await NotificationStore - .GetUserNotificationsCountAsync( - CurrentTenant.Id, - CurrentUser.GetId(), - input.Filter, - input.ReadState); - - var notifications = await NotificationStore - .GetUserNotificationsAsync( - CurrentTenant.Id, CurrentUser.GetId(), - input.Filter, input.Sorting, input.Reverse, - input.ReadState, input.SkipCount, input.MaxResultCount); - - return new PagedResultDto(notificationCount, notifications); - } - } -} +using LINGYUN.Abp.Notifications; +using Microsoft.AspNetCore.Authorization; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Application.Services; +using Volo.Abp.Users; + +namespace LINGYUN.Abp.MessageService.Notifications +{ + [Authorize] + public class MyNotificationAppService : ApplicationService, IMyNotificationAppService + { + protected INotificationSender NotificationSender { get; } + + protected INotificationStore NotificationStore { get; } + + protected INotificationDefinitionManager NotificationDefinitionManager { get; } + + public MyNotificationAppService( + INotificationStore notificationStore, + INotificationSender notificationSender, + INotificationDefinitionManager notificationDefinitionManager) + { + NotificationStore = notificationStore; + NotificationSender = notificationSender; + NotificationDefinitionManager = notificationDefinitionManager; + } + + public virtual async Task SendNofiterAsync(NotificationSendDto input) + { + UserIdentifier user = null; + if (input.ToUserId.HasValue) + { + user = new UserIdentifier(input.ToUserId.Value, input.ToUserName); + } + await NotificationSender + .SendNofiterAsync( + input.Name, + input.Data, + user, + CurrentTenant.Id, + input.Severity); + } + + public virtual async Task DeleteAsync(long id) + { + await NotificationStore + .DeleteUserNotificationAsync( + CurrentTenant.Id, + CurrentUser.GetId(), + id); + } + + public virtual Task> GetAssignableNotifiersAsync() + { + var groups = new List(); + + foreach (var group in NotificationDefinitionManager.GetGroups()) + { + if (!group.AllowSubscriptionToClients) + { + continue; + + } + var notificationGroup = new NotificationGroupDto + { + Name = group.Name, + DisplayName = group.DisplayName.Localize(StringLocalizerFactory) + }; + + foreach (var notification in group.Notifications) + { + if (!notification.AllowSubscriptionToClients) + { + continue; + } + + var notificationChildren = new NotificationDto + { + Name = notification.Name, + DisplayName = notification.DisplayName.Localize(StringLocalizerFactory), + Description = notification.Description.Localize(StringLocalizerFactory), + Lifetime = notification.NotificationLifetime, + Type = notification.NotificationType + }; + + notificationGroup.Notifications.Add(notificationChildren); + } + + groups.Add(notificationGroup); + } + + return Task.FromResult(new ListResultDto(groups)); + } + + public virtual async Task GetAsync(long id) + { + return await NotificationStore + .GetNotificationOrNullAsync(CurrentTenant.Id, id); + } + + public virtual async Task> GetListAsync(UserNotificationGetByPagedDto input) + { + var notificationCount = await NotificationStore + .GetUserNotificationsCountAsync( + CurrentTenant.Id, + CurrentUser.GetId(), + input.Filter, + input.ReadState); + + var notifications = await NotificationStore + .GetUserNotificationsAsync( + CurrentTenant.Id, CurrentUser.GetId(), + input.Filter, input.Sorting, + input.ReadState, input.SkipCount, input.MaxResultCount); + + return new PagedResultDto(notificationCount, notifications); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Localization/MessageServiceResource.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Localization/MessageServiceResource.cs index 6f918bea7..589c4c003 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Localization/MessageServiceResource.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Localization/MessageServiceResource.cs @@ -1,9 +1,9 @@ -using Volo.Abp.Localization; - -namespace LINGYUN.Abp.MessageService.Localization -{ - [LocalizationResourceName("MessageService")] - public class MessageServiceResource - { - } -} +using Volo.Abp.Localization; + +namespace LINGYUN.Abp.MessageService.Localization +{ + [LocalizationResourceName("AbpMessageService")] + public class MessageServiceResource + { + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs index f804cc102..1245784b2 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs @@ -1,99 +1,103 @@ -namespace LINGYUN.Abp.MessageService -{ - /// - /// 消息系统错误码设计 - /// 状态码分为两部分 前2位领域 后3位状态 - /// - /// - /// 领域部分: - /// 01 输入 - /// 02 群组 - /// 03 用户 - /// 04 应用 - /// 05 内部 - /// 10 输出 - /// - /// - /// - /// 状态部分: - /// 200-299 成功 - /// 300-399 成功但有后续操作 - /// 400-499 业务异常 - /// 500-599 内部异常 - /// 900-999 输入输出异常 - /// - /// - /// - public class MessageServiceErrorCodes - { - public const string Namespace = "LINGYUN.Abp.Message"; - /// - /// 消息不完整 - /// - public const string MessageIncomplete = Namespace + ":01400"; - /// - /// 您还未加入群组,不能进行操作 - /// - public const string YouHaveNotJoinedGroup = Namespace + ":01401"; - /// - /// 已发送群组申请,等待管理员同意 - /// - public const string YouHaveAddingToGroup = Namespace + ":02301"; - /// - /// 你需要验证问题才能加入群聊 - /// - public const string YouNeedValidationQuestingByAddGroup = Namespace + ":02302"; - /// - /// 管理员已开启全员禁言 - /// - public const string GroupNotAllowedToSpeak = Namespace + ":02400"; - /// - /// 管理员已禁止用户发言 - /// - public const string GroupUserHasBlack = Namespace + ":02403"; - /// - /// 管理员不允许匿名发言 - /// - public const string GroupNotAllowedToSpeakAnonymously = Namespace + ":02401"; - /// - /// 群组不存在或已解散 - /// - public const string GroupNotFount = Namespace + ":02404"; - /// - /// 用户已拒接所有消息 - /// - public const string UserHasRejectAllMessage = Namespace + ":03400"; - /// - /// 用户已将发信人拉黑 - /// - public const string UserHasBlack = Namespace + ":03401"; - /// - /// 用户不允许匿名发言 - /// - public const string UserNotAllowedToSpeakAnonymously = Namespace + ":03402"; - /// - /// 用户不接收非好友发言 - /// - public const string UserHasRejectNotFriendMessage = Namespace + ":03403"; - /// - /// 接收消息用户不存在或已注销 - /// - public const string UseNotFount = Namespace + ":03404"; - /// - /// 用户拒绝添加好友 - /// - public const string UseRefuseToAddFriend = Namespace + ":03410"; - /// - /// 对方已是您的好友或已发送验证请求,不能重复操作 - /// - public const string UseHasBeenAddedTheFriendOrSendAuthorization = Namespace + ":03411"; - /// - /// 已发送好友申请,等待对方同意 - /// - public const string YouHaveAddingTheUserToFriend = Namespace + ":03301"; - /// - /// 你需要验证问题才能添加好友 - /// - public const string YouNeedValidationQuestingByAddFriend = Namespace + ":03302"; - } -} +namespace LINGYUN.Abp.MessageService +{ + /// + /// 消息系统错误码设计 + /// 状态码分为两部分 前2位领域 后3位状态 + /// + /// + /// 领域部分: + /// 01 输入 + /// 02 群组 + /// 03 用户 + /// 04 应用 + /// 05 内部 + /// 10 输出 + /// + /// + /// + /// 状态部分: + /// 200-299 成功 + /// 300-399 成功但有后续操作 + /// 400-499 业务异常 + /// 500-599 内部异常 + /// 900-999 输入输出异常 + /// + /// + /// + public class MessageServiceErrorCodes + { + public const string Namespace = "LINGYUN.Abp.Message"; + /// + /// 试图撤回过期消息 + /// + public const string ExpiredMessageCannotBeReCall = Namespace + ":01303"; + /// + /// 消息不完整 + /// + public const string MessageIncomplete = Namespace + ":01400"; + /// + /// 您还未加入群组,不能进行操作 + /// + public const string YouHaveNotJoinedGroup = Namespace + ":01401"; + /// + /// 已发送群组申请,等待管理员同意 + /// + public const string YouHaveAddingToGroup = Namespace + ":02301"; + /// + /// 你需要验证问题才能加入群聊 + /// + public const string YouNeedValidationQuestingByAddGroup = Namespace + ":02302"; + /// + /// 管理员已开启全员禁言 + /// + public const string GroupNotAllowedToSpeak = Namespace + ":02400"; + /// + /// 管理员已禁止用户发言 + /// + public const string GroupUserHasBlack = Namespace + ":02403"; + /// + /// 管理员不允许匿名发言 + /// + public const string GroupNotAllowedToSpeakAnonymously = Namespace + ":02401"; + /// + /// 群组不存在或已解散 + /// + public const string GroupNotFount = Namespace + ":02404"; + /// + /// 用户已拒接所有消息 + /// + public const string UserHasRejectAllMessage = Namespace + ":03400"; + /// + /// 用户已将发信人拉黑 + /// + public const string UserHasBlack = Namespace + ":03401"; + /// + /// 用户不允许匿名发言 + /// + public const string UserNotAllowedToSpeakAnonymously = Namespace + ":03402"; + /// + /// 用户不接收非好友发言 + /// + public const string UserHasRejectNotFriendMessage = Namespace + ":03403"; + /// + /// 接收消息用户不存在或已注销 + /// + public const string UseNotFount = Namespace + ":03404"; + /// + /// 用户拒绝添加好友 + /// + public const string UseRefuseToAddFriend = Namespace + ":03410"; + /// + /// 对方已是您的好友或已发送验证请求,不能重复操作 + /// + public const string UseHasBeenAddedTheFriendOrSendAuthorization = Namespace + ":03411"; + /// + /// 已发送好友申请,等待对方同意 + /// + public const string YouHaveAddingTheUserToFriend = Namespace + ":03301"; + /// + /// 你需要验证问题才能添加好友 + /// + public const string YouNeedValidationQuestingByAddFriend = Namespace + ":03302"; + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingDefinitionProvider.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingDefinitionProvider.cs new file mode 100644 index 000000000..208c993db --- /dev/null +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingDefinitionProvider.cs @@ -0,0 +1,30 @@ +using LINGYUN.Abp.MessageService.Localization; +using Volo.Abp.Localization; +using Volo.Abp.Settings; + +namespace LINGYUN.Abp.MessageService.Settings +{ + public class MessageServiceSettingDefinitionProvider : SettingDefinitionProvider + { + public override void Define(ISettingDefinitionContext context) + { + context.Add( + new SettingDefinition( + MessageServiceSettingNames.Messages.RecallExpirationTime, + "2", + L("DisplayName:RecallExpirationTime"), + L("Description:RecallExpirationTime"), + isVisibleToClients: false, + isEncrypted: false) + .WithProviders( + GlobalSettingValueProvider.ProviderName, + TenantSettingValueProvider.ProviderName) + ); + } + + protected ILocalizableString L(string name) + { + return LocalizableString.Create(name); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceSettingNames.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingNames.cs similarity index 53% rename from aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceSettingNames.cs rename to aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingNames.cs index 0b4a121fe..700b1d35a 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceSettingNames.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Settings/MessageServiceSettingNames.cs @@ -1,16 +1,25 @@ -namespace LINGYUN.Abp.MessageService -{ - public class MessageServiceSettingNames - { - public const string GroupName = "Abp.MessageService"; - - public class Notifications - { - public const string Default = GroupName + ".Notifications"; - /// - /// 清理过期消息批次 - /// - public const string CleanupExpirationBatchCount = Default + ".CleanupExpirationBatchCount"; - } - } -} +namespace LINGYUN.Abp.MessageService.Settings +{ + public class MessageServiceSettingNames + { + public const string GroupName = "Abp.MessageService"; + + public class Notifications + { + public const string Default = GroupName + ".Notifications"; + /// + /// 清理过期消息批次 + /// + public const string CleanupExpirationBatchCount = Default + ".CleanupExpirationBatchCount"; + } + + public class Messages + { + public const string Default = GroupName + ".Messages"; + /// + /// 撤回消息过期时间(分) + /// + public const string RecallExpirationTime = Default + ".RecallExpirationTime"; + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs index 04e744451..ba239fa32 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs @@ -1,280 +1,277 @@ -using LINGYUN.Abp.IM.Contract; -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp; -using Volo.Abp.Caching; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; -using Volo.Abp.Timing; -using Volo.Abp.Uow; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class FriendStore : IFriendStore, ITransientDependency - { - private readonly IClock _clock; - private readonly ILogger _logger; - private readonly ICurrentTenant _currentTenant; - private readonly IDistributedCache _cache; - private readonly IUserChatFriendRepository _userChatFriendRepository; - private readonly IUserChatSettingRepository _userChatSettingRepository; - - public FriendStore( - IClock clock, - ILogger logger, - ICurrentTenant currentTenant, - IDistributedCache cache, - IUserChatFriendRepository userChatFriendRepository, - IUserChatSettingRepository userChatSettingRepository - ) - { - _clock = clock; - _cache = cache; - _logger = logger; - _currentTenant = currentTenant; - _userChatFriendRepository = userChatFriendRepository; - _userChatSettingRepository = userChatSettingRepository; - } - - public virtual async Task IsFriendAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default - ) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatFriendRepository.IsFriendAsync(userId, friendId, cancellationToken); - } - } - - [UnitOfWork] - public virtual async Task AddMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - string remarkName = "", - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - if (!await _userChatFriendRepository.IsAddedAsync(userId, friendId)) - { - var userFriend = new UserChatFriend(userId, friendId, remarkName); - userFriend.SetStatus(UserFriendStatus.Added); - - await _userChatFriendRepository.InsertAsync(userFriend); - } - - var userChatFriend = await _userChatFriendRepository - .FindByUserFriendIdAsync(friendId, userId); - - userChatFriend.SetStatus(UserFriendStatus.Added); - - await _userChatFriendRepository.UpdateAsync(userChatFriend, cancellationToken: cancellationToken); - } - } - - [UnitOfWork] - public virtual async Task AddRequestAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - string remarkName = "", - string description = "", - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - if (await _userChatFriendRepository.IsAddedAsync(userId, friendId)) - { - throw new BusinessException(MessageServiceErrorCodes.UseHasBeenAddedTheFriendOrSendAuthorization); - } - - var status = UserFriendStatus.NeedValidation; - var userChatSetting = await _userChatSettingRepository.FindByUserIdAsync(friendId, cancellationToken); - if (userChatSetting != null) - { - if (!userChatSetting.AllowAddFriend) - { - throw new BusinessException(MessageServiceErrorCodes.UseRefuseToAddFriend); - } - - status = userChatSetting.RequireAddFriendValition - ? UserFriendStatus.NeedValidation - : UserFriendStatus.Added; - } - - var userChatFriend = new UserChatFriend(userId, friendId, remarkName, description, tenantId) - { - CreationTime = _clock.Now, - CreatorId = userId, - }; - userChatFriend.SetStatus(status); - - await _userChatFriendRepository.InsertAsync(userChatFriend, cancellationToken: cancellationToken); - - return new UserAddFriendResult(status); - } - } - - [UnitOfWork] - public virtual async Task AddShieldMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default) - { - await ChangeFriendShieldAsync(tenantId, userId, friendId, true, cancellationToken); - } - - public virtual async Task> GetListAsync( - Guid? tenantId, - Guid userId, - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - CancellationToken cancellationToken = default - ) - { - using (_currentTenant.Change(tenantId)) - { - return await GetAllFriendByCacheItemAsync(userId, sorting, reverse, cancellationToken); - } - } - - public virtual async Task GetCountAsync( - Guid? tenantId, - Guid userId, - string filter = "", - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatFriendRepository - .GetMembersCountAsync(userId, filter, cancellationToken); - } - } - - public virtual async Task> GetPagedListAsync( - Guid? tenantId, - Guid userId, - string filter = "", - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatFriendRepository - .GetMembersAsync(userId, filter, sorting, reverse, - skipCount, maxResultCount, cancellationToken); - } - } - - public virtual async Task> GetLastContactListAsync( - Guid? tenantId, - Guid userId, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatFriendRepository - .GetLastContactMembersAsync(userId, - skipCount, maxResultCount, cancellationToken); - } - } - - public virtual async Task GetMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatFriendRepository - .GetMemberAsync(userId, friendId, cancellationToken); - } - } - - [UnitOfWork] - public virtual async Task RemoveMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userChatFriend = await _userChatFriendRepository.FindByUserFriendIdAsync(userId, friendId, cancellationToken); - if (userChatFriend != null) - { - await _userChatFriendRepository.DeleteAsync(userChatFriend, cancellationToken: cancellationToken); - } - } - } - - [UnitOfWork] - public virtual async Task RemoveShieldMemberAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default) - { - await ChangeFriendShieldAsync(tenantId, userId, friendId, false, cancellationToken); - } - - - protected virtual async Task ChangeFriendShieldAsync( - Guid? tenantId, - Guid userId, - Guid friendId, - bool isBlack = false, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userChatFriend = await _userChatFriendRepository.FindByUserFriendIdAsync(userId, friendId, cancellationToken); - if (userChatFriend != null) - { - userChatFriend.Black = isBlack; - await _userChatFriendRepository.UpdateAsync(userChatFriend, cancellationToken: cancellationToken); - } - } - } - - protected virtual async Task> GetAllFriendByCacheItemAsync( - Guid userId, - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - CancellationToken cancellationToken = default - ) - { - var cacheKey = UserFriendCacheItem.CalculateCacheKey(userId.ToString()); - _logger.LogDebug($"FriendStore.GetCacheItemAsync: {cacheKey}"); - - var cacheItem = await _cache.GetAsync(cacheKey, token: cancellationToken); - if (cacheItem != null) - { - _logger.LogDebug($"Found in the cache: {cacheKey}"); - return cacheItem.Friends; - } - - _logger.LogDebug($"Not found in the cache: {cacheKey}"); - var friends = await _userChatFriendRepository - .GetAllMembersAsync(userId, sorting, reverse, cancellationToken); - cacheItem = new UserFriendCacheItem(friends); - _logger.LogDebug($"Set item in the cache: {cacheKey}"); - await _cache.SetAsync(cacheKey, cacheItem, token: cancellationToken); - return friends; - } - } -} +using LINGYUN.Abp.IM.Contract; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Timing; +using Volo.Abp.Uow; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class FriendStore : IFriendStore, ITransientDependency + { + private readonly IClock _clock; + private readonly ILogger _logger; + private readonly ICurrentTenant _currentTenant; + private readonly IDistributedCache _cache; + private readonly IUserChatFriendRepository _userChatFriendRepository; + private readonly IUserChatSettingRepository _userChatSettingRepository; + + public FriendStore( + IClock clock, + ILogger logger, + ICurrentTenant currentTenant, + IDistributedCache cache, + IUserChatFriendRepository userChatFriendRepository, + IUserChatSettingRepository userChatSettingRepository + ) + { + _clock = clock; + _cache = cache; + _logger = logger; + _currentTenant = currentTenant; + _userChatFriendRepository = userChatFriendRepository; + _userChatSettingRepository = userChatSettingRepository; + } + + public virtual async Task IsFriendAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default + ) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatFriendRepository.IsFriendAsync(userId, friendId, cancellationToken); + } + } + + [UnitOfWork] + public virtual async Task AddMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + string remarkName = "", + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + if (!await _userChatFriendRepository.IsAddedAsync(userId, friendId)) + { + var userFriend = new UserChatFriend(userId, friendId, remarkName); + userFriend.SetStatus(UserFriendStatus.Added); + + await _userChatFriendRepository.InsertAsync(userFriend); + } + + var userChatFriend = await _userChatFriendRepository + .FindByUserFriendIdAsync(friendId, userId); + + userChatFriend.SetStatus(UserFriendStatus.Added); + + await _userChatFriendRepository.UpdateAsync(userChatFriend, cancellationToken: cancellationToken); + } + } + + [UnitOfWork] + public virtual async Task AddRequestAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + string remarkName = "", + string description = "", + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + if (await _userChatFriendRepository.IsAddedAsync(userId, friendId)) + { + throw new BusinessException(MessageServiceErrorCodes.UseHasBeenAddedTheFriendOrSendAuthorization); + } + + var status = UserFriendStatus.NeedValidation; + var userChatSetting = await _userChatSettingRepository.FindByUserIdAsync(friendId, cancellationToken); + if (userChatSetting != null) + { + if (!userChatSetting.AllowAddFriend) + { + throw new BusinessException(MessageServiceErrorCodes.UseRefuseToAddFriend); + } + + status = userChatSetting.RequireAddFriendValition + ? UserFriendStatus.NeedValidation + : UserFriendStatus.Added; + } + + var userChatFriend = new UserChatFriend(userId, friendId, remarkName, description, tenantId) + { + CreationTime = _clock.Now, + CreatorId = userId, + }; + userChatFriend.SetStatus(status); + + await _userChatFriendRepository.InsertAsync(userChatFriend, cancellationToken: cancellationToken); + + return new UserAddFriendResult(status); + } + } + + [UnitOfWork] + public virtual async Task AddShieldMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default) + { + await ChangeFriendShieldAsync(tenantId, userId, friendId, true, cancellationToken); + } + + public virtual async Task> GetListAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(UserFriend.UserId), + CancellationToken cancellationToken = default + ) + { + using (_currentTenant.Change(tenantId)) + { + return await GetAllFriendByCacheItemAsync(userId, sorting, cancellationToken); + } + } + + public virtual async Task GetCountAsync( + Guid? tenantId, + Guid userId, + string filter = "", + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatFriendRepository + .GetMembersCountAsync(userId, filter, cancellationToken); + } + } + + public virtual async Task> GetPagedListAsync( + Guid? tenantId, + Guid userId, + string filter = "", + string sorting = nameof(UserFriend.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatFriendRepository + .GetMembersAsync(userId, filter, sorting, + skipCount, maxResultCount, cancellationToken); + } + } + + public virtual async Task> GetLastContactListAsync( + Guid? tenantId, + Guid userId, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatFriendRepository + .GetLastContactMembersAsync(userId, + skipCount, maxResultCount, cancellationToken); + } + } + + public virtual async Task GetMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatFriendRepository + .GetMemberAsync(userId, friendId, cancellationToken); + } + } + + [UnitOfWork] + public virtual async Task RemoveMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userChatFriend = await _userChatFriendRepository.FindByUserFriendIdAsync(userId, friendId, cancellationToken); + if (userChatFriend != null) + { + await _userChatFriendRepository.DeleteAsync(userChatFriend, cancellationToken: cancellationToken); + } + } + } + + [UnitOfWork] + public virtual async Task RemoveShieldMemberAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default) + { + await ChangeFriendShieldAsync(tenantId, userId, friendId, false, cancellationToken); + } + + + protected virtual async Task ChangeFriendShieldAsync( + Guid? tenantId, + Guid userId, + Guid friendId, + bool isBlack = false, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userChatFriend = await _userChatFriendRepository.FindByUserFriendIdAsync(userId, friendId, cancellationToken); + if (userChatFriend != null) + { + userChatFriend.Black = isBlack; + await _userChatFriendRepository.UpdateAsync(userChatFriend, cancellationToken: cancellationToken); + } + } + } + + protected virtual async Task> GetAllFriendByCacheItemAsync( + Guid userId, + string sorting = nameof(UserFriend.UserId), + CancellationToken cancellationToken = default + ) + { + var cacheKey = UserFriendCacheItem.CalculateCacheKey(userId.ToString()); + _logger.LogDebug($"FriendStore.GetCacheItemAsync: {cacheKey}"); + + var cacheItem = await _cache.GetAsync(cacheKey, token: cancellationToken); + if (cacheItem != null) + { + _logger.LogDebug($"Found in the cache: {cacheKey}"); + return cacheItem.Friends; + } + + _logger.LogDebug($"Not found in the cache: {cacheKey}"); + var friends = await _userChatFriendRepository + .GetAllMembersAsync(userId, sorting, cancellationToken); + cacheItem = new UserFriendCacheItem(friends); + _logger.LogDebug($"Set item in the cache: {cacheKey}"); + await _cache.SetAsync(cacheKey, cacheItem, token: cancellationToken); + return friends; + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs index 43b45d938..920209bd5 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs @@ -1,100 +1,104 @@ -using LINGYUN.Abp.IM.Messages; -using LINGYUN.Abp.MessageService.Group; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public interface IMessageRepository - { - Task InsertUserMessageAsync( - UserMessage userMessage, - CancellationToken cancellationToken = default); - - Task InsertGroupMessageAsync( - GroupMessage groupMessage, - CancellationToken cancellationToken = default); - - Task GetUserMessageAsync( - long id, - CancellationToken cancellationToken = default); - - Task GetGroupMessageAsync( - long id, - CancellationToken cancellationToken = default); - - Task GetUserMessagesCountAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - - Task GetCountAsync( - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - - Task GetCountAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - - Task> GetLastMessagesByOneFriendAsync( - Guid userId, - string sorting = nameof(LastChatMessage.SendTime), - bool reverse = true, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task> GetUserMessagesAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetGroupMessagesCountAsync( - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - - Task> GetGroupMessagesAsync( - long groupId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetUserGroupMessagesCountAsync( - Guid sendUserId, - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default); - - Task> GetUserGroupMessagesAsync( - Guid sendUserId, - long groupId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - } -} +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.MessageService.Group; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public interface IMessageRepository + { + Task InsertUserMessageAsync( + UserMessage userMessage, + CancellationToken cancellationToken = default); + + Task UpdateUserMessageAsync( + UserMessage userMessage, + CancellationToken cancellationToken = default); + + Task InsertGroupMessageAsync( + GroupMessage groupMessage, + CancellationToken cancellationToken = default); + + Task UpdateGroupMessageAsync( + GroupMessage groupMessage, + CancellationToken cancellationToken = default); + + Task GetUserMessageAsync( + long id, + CancellationToken cancellationToken = default); + + Task GetGroupMessageAsync( + long id, + CancellationToken cancellationToken = default); + + Task GetUserMessagesCountAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + + Task GetCountAsync( + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + + Task GetCountAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + + Task> GetLastMessagesByOneFriendAsync( + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task> GetUserMessagesAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetGroupMessagesCountAsync( + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + + Task> GetGroupMessagesAsync( + long groupId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetUserGroupMessagesCountAsync( + Guid sendUserId, + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default); + + Task> GetUserGroupMessagesAsync( + Guid sendUserId, + long groupId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatCardRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatCardRepository.cs index e55c9ab96..9cbbbd0d2 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatCardRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatCardRepository.cs @@ -1,38 +1,37 @@ -using LINGYUN.Abp.IM; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public interface IUserChatCardRepository : IBasicRepository - { - Task CheckUserIdExistsAsync( - Guid userId, - CancellationToken cancellationToken = default); - - Task GetMemberCountAsync( - string findUserName = "", - int? startAge = null, - int? endAge = null, - Sex? sex = null, - CancellationToken cancellationToken = default); - - Task> GetMembersAsync( - string findUserName = "", - int? startAge = null, - int? endAge = null, - Sex? sex = null, - string sorting = nameof(UserChatCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetMemberAsync( - Guid findUserId, - CancellationToken cancellationToken = default); - } -} +using LINGYUN.Abp.IM; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public interface IUserChatCardRepository : IBasicRepository + { + Task CheckUserIdExistsAsync( + Guid userId, + CancellationToken cancellationToken = default); + + Task GetMemberCountAsync( + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + CancellationToken cancellationToken = default); + + Task> GetMembersAsync( + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + string sorting = nameof(UserChatCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetMemberAsync( + Guid findUserId, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs index debc5aa57..a67c81fdb 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs @@ -1,58 +1,56 @@ -using LINGYUN.Abp.IM.Contract; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public interface IUserChatFriendRepository : IBasicRepository - { - Task IsFriendAsync( - Guid userId, - Guid frientId, - CancellationToken cancellationToken = default); - - Task IsAddedAsync( - Guid userId, - Guid frientId, - CancellationToken cancellationToken = default); - - Task FindByUserFriendIdAsync( - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - - Task> GetAllMembersAsync( - Guid userId, - string sorting = nameof(UserChatFriend.RemarkName), - bool reverse = false, - CancellationToken cancellationToken = default); - - Task GetMembersCountAsync( - Guid userId, - string filter = "", - CancellationToken cancellationToken = default); - - Task> GetMembersAsync( - Guid userId, - string filter = "", - string sorting = nameof(UserChatFriend.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task> GetLastContactMembersAsync( - Guid userId, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetMemberAsync( - Guid userId, - Guid friendId, - CancellationToken cancellationToken = default); - } -} +using LINGYUN.Abp.IM.Contract; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public interface IUserChatFriendRepository : IBasicRepository + { + Task IsFriendAsync( + Guid userId, + Guid frientId, + CancellationToken cancellationToken = default); + + Task IsAddedAsync( + Guid userId, + Guid frientId, + CancellationToken cancellationToken = default); + + Task FindByUserFriendIdAsync( + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + + Task> GetAllMembersAsync( + Guid userId, + string sorting = nameof(UserChatFriend.RemarkName), + CancellationToken cancellationToken = default); + + Task GetMembersCountAsync( + Guid userId, + string filter = "", + CancellationToken cancellationToken = default); + + Task> GetMembersAsync( + Guid userId, + string filter = "", + string sorting = nameof(UserChatFriend.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task> GetLastContactMembersAsync( + Guid userId, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetMemberAsync( + Guid userId, + Guid friendId, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/Message.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/Message.cs index bee4de691..d263a1fce 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/Message.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/Message.cs @@ -1,51 +1,52 @@ -using LINGYUN.Abp.IM.Messages; -using System; -using Volo.Abp.Data; -using Volo.Abp.Domain.Entities.Auditing; -using Volo.Abp.MultiTenancy; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public abstract class Message : CreationAuditedAggregateRoot, IMultiTenant - { - /// - /// 租户 - /// - public virtual Guid? TenantId { get; protected set; } - /// - /// 消息标识 - /// - public virtual long MessageId { get; protected set; } - /// - /// 发送用户名称 - /// - public virtual string SendUserName { get; protected set; } - /// - /// 内容 - /// - public virtual string Content { get; protected set; } - /// - /// 消息类型 - /// - public virtual MessageType Type { get; protected set; } - /// - /// 发送状态 - /// - public virtual MessageSendState SendState { get; protected set; } - protected Message() { } - public Message(long id, Guid sendUserId, string sendUserName, string content, MessageType type = MessageType.Text) - { - MessageId = id; - CreatorId = sendUserId; - SendUserName = sendUserName; - Content = content; - Type = type; - CreationTime = DateTime.Now; - } - - public void ChangeSendState(MessageSendState state = MessageSendState.Send) - { - SendState = state; - } - } -} +using LINGYUN.Abp.IM.Messages; +using System; +using Volo.Abp.Data; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public abstract class Message : CreationAuditedAggregateRoot, IMultiTenant + { + /// + /// 租户 + /// + public virtual Guid? TenantId { get; protected set; } + /// + /// 消息标识 + /// + public virtual long MessageId { get; protected set; } + /// + /// 发送用户名称 + /// + public virtual string SendUserName { get; protected set; } + /// + /// 内容 + /// + public virtual string Content { get; protected set; } + /// + /// 消息类型 + /// + public virtual MessageType Type { get; protected set; } + /// + /// 发送状态 + /// + public virtual MessageState SendState { get; protected set; } + protected Message() { } + public Message(long id, Guid sendUserId, string sendUserName, string content, MessageType type = MessageType.Text) + { + MessageId = id; + CreatorId = sendUserId; + SendUserName = sendUserName; + Content = content; + Type = type; + CreationTime = DateTime.Now; + ChangeSendState(); + } + + public void ChangeSendState(MessageState state = MessageState.Send) + { + SendState = state; + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageProcessor.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageProcessor.cs new file mode 100644 index 000000000..bda531003 --- /dev/null +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageProcessor.cs @@ -0,0 +1,82 @@ +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.MessageService.Settings; +using System; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Settings; +using Volo.Abp.Timing; + +namespace LINGYUN.Abp.MessageService.Chat +{ + [Dependency(ReplaceServices = true)] + public class MessageProcessor : IMessageProcessor, ITransientDependency + { + private readonly IClock _clock; + private readonly IMessageRepository _repository; + private readonly ISettingProvider _settingProvider; + + public MessageProcessor(IMessageRepository repository) + { + _repository = repository; + } + + public virtual async Task ReadAsync(ChatMessage message) + { + if (!message.GroupId.IsNullOrWhiteSpace()) + { + long groupId = long.Parse(message.GroupId); + var groupMessage = await _repository.GetGroupMessageAsync(groupId); + groupMessage.ChangeSendState(MessageState.Read); + + await _repository.UpdateGroupMessageAsync(groupMessage); + } + else + { + long messageId = long.Parse(message.MessageId); + var userMessage = await _repository.GetUserMessageAsync(messageId); + userMessage.ChangeSendState(MessageState.Read); + + await _repository.UpdateUserMessageAsync(userMessage); + } + } + + public virtual async Task ReCallAsync(ChatMessage message) + { + var expiration = await _settingProvider.GetAsync( + MessageServiceSettingNames.Messages.RecallExpirationTime, 2d); + + Func hasExpiredMessage = (Message msg) => + msg.CreationTime.AddMinutes(expiration) < _clock.Now; + + if (!message.GroupId.IsNullOrWhiteSpace()) + { + long groupId = long.Parse(message.GroupId); + var groupMessage = await _repository.GetGroupMessageAsync(groupId); + if (hasExpiredMessage(groupMessage)) + { + throw new BusinessException(MessageServiceErrorCodes.ExpiredMessageCannotBeReCall) + .WithData("Time", expiration); + } + + groupMessage.ChangeSendState(MessageState.ReCall); + + await _repository.UpdateGroupMessageAsync(groupMessage); + } + else + { + long messageId = long.Parse(message.MessageId); + var userMessage = await _repository.GetUserMessageAsync(messageId); + if (hasExpiredMessage(userMessage)) + { + throw new BusinessException(MessageServiceErrorCodes.ExpiredMessageCannotBeReCall) + .WithData("Time", expiration); + } + + userMessage.ChangeSendState(MessageState.ReCall); + + await _repository.UpdateUserMessageAsync(userMessage); + } + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs index a9e128ef0..5254d8ae6 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs @@ -1,257 +1,254 @@ -using LINGYUN.Abp.IM.Contract; -using LINGYUN.Abp.IM.Messages; -using LINGYUN.Abp.MessageService.Group; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; -using Volo.Abp.ObjectMapping; -using Volo.Abp.Uow; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class MessageStore : IMessageStore, ITransientDependency - { - private readonly IFriendStore _friendStore; - - private readonly IObjectMapper _objectMapper; - - private readonly ICurrentTenant _currentTenant; - - private readonly IUnitOfWorkManager _unitOfWorkManager; - - private readonly IGroupRepository _groupRepository; - - private readonly IMessageRepository _messageRepository; - - private readonly IUserChatSettingRepository _userChatSettingRepository; - public MessageStore( - IFriendStore friendStore, - IObjectMapper objectMapper, - ICurrentTenant currentTenant, - IUnitOfWorkManager unitOfWorkManager, - IGroupRepository groupRepository, - IMessageRepository messageRepository, - IUserChatSettingRepository userChatSettingRepository) - { - _friendStore = friendStore; - _objectMapper = objectMapper; - _currentTenant = currentTenant; - _unitOfWorkManager = unitOfWorkManager; - _groupRepository = groupRepository; - _messageRepository = messageRepository; - _userChatSettingRepository = userChatSettingRepository; - } - - public virtual async Task StoreMessageAsync( - ChatMessage chatMessage, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - { - using (_currentTenant.Change(chatMessage.TenantId)) - { - if (!chatMessage.GroupId.IsNullOrWhiteSpace()) - { - long groupId = long.Parse(chatMessage.GroupId); - await StoreGroupMessageAsync(chatMessage, groupId, cancellationToken); - } - else - { - await StoreUserMessageAsync(chatMessage, cancellationToken); - } - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - } - - public virtual async Task> GetGroupMessageAsync( - Guid? tenantId, - long groupId, - string filter = "", - string sorting = nameof(ChatMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var groupMessages = await _messageRepository - .GetGroupMessagesAsync(groupId, filter, sorting, reverse, type, skipCount, maxResultCount, cancellationToken); - - var chatMessages = _objectMapper.Map, List>(groupMessages); - - return chatMessages; - } - } - - public virtual async Task> GetChatMessageAsync( - Guid? tenantId, - Guid sendUserId, - Guid receiveUserId, - string filter = "", - string sorting = nameof(ChatMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userMessages = await _messageRepository - .GetUserMessagesAsync(sendUserId, receiveUserId, filter, sorting, reverse, type, skipCount, maxResultCount, cancellationToken); - - var chatMessages = _objectMapper.Map, List>(userMessages); - - return chatMessages; - } - } - - public virtual async Task> GetLastChatMessagesAsync( - Guid? tenantId, - Guid userId, - string sorting = nameof(LastChatMessage.SendTime), - bool reverse = true, - int maxResultCount = 10, - CancellationToken cancellationToken = default - ) - { - using (_currentTenant.Change(tenantId)) - { - return await _messageRepository - .GetLastMessagesByOneFriendAsync(userId, sorting, reverse, maxResultCount, cancellationToken); - } - } - - public virtual async Task GetGroupMessageCountAsync( - Guid? tenantId, - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _messageRepository.GetCountAsync(groupId, filter, type, cancellationToken); - } - } - - public virtual async Task GetChatMessageCountAsync( - Guid? tenantId, - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _messageRepository.GetCountAsync(sendUserId, receiveUserId, filter, type, cancellationToken); - } - } - - protected virtual async Task StoreUserMessageAsync( - ChatMessage chatMessage, - CancellationToken cancellationToken = default) - { - // 检查接收用户 - if (!chatMessage.ToUserId.HasValue) - { - throw new BusinessException(MessageServiceErrorCodes.UseNotFount); - } - - var myFriend = await _friendStore - .GetMemberAsync(chatMessage.TenantId, chatMessage.ToUserId.Value, chatMessage.FormUserId, cancellationToken); - - var userChatSetting = await _userChatSettingRepository - .FindByUserIdAsync(chatMessage.ToUserId.Value, cancellationToken); - - if (userChatSetting != null) - { - if (!userChatSetting.AllowReceiveMessage) - { - // 当前发送的用户不接收消息 - throw new BusinessException(MessageServiceErrorCodes.UserHasRejectAllMessage); - } - - if (myFriend == null && !chatMessage.IsAnonymous) - { - throw new BusinessException(MessageServiceErrorCodes.UserHasRejectNotFriendMessage); - } - - if (chatMessage.IsAnonymous && !userChatSetting.AllowAnonymous) - { - // 当前用户不允许匿名发言 - throw new BusinessException(MessageServiceErrorCodes.UserNotAllowedToSpeakAnonymously); - } - } - else - { - if (myFriend == null) - { - throw new BusinessException(MessageServiceErrorCodes.UserHasRejectNotFriendMessage); - } - } - if (myFriend?.Black == true) - { - throw new BusinessException(MessageServiceErrorCodes.UserHasBlack); - } - - var message = new UserMessage( - long.Parse(chatMessage.MessageId), - chatMessage.FormUserId, - chatMessage.FormUserName, - chatMessage.Content, - chatMessage.MessageType); - - message.SendToUser(chatMessage.ToUserId.Value); - message.SetProperty(nameof(ChatMessage.IsAnonymous), chatMessage.IsAnonymous); - - await _messageRepository.InsertUserMessageAsync(message, cancellationToken); - } - - protected virtual async Task StoreGroupMessageAsync( - ChatMessage chatMessage, - long groupId, - CancellationToken cancellationToken = default) - { - var userHasBlacked = await _groupRepository - .UserHasBlackedAsync(groupId, chatMessage.FormUserId, cancellationToken); - if (userHasBlacked) - { - // 当前发送的用户已被拉黑 - throw new BusinessException(MessageServiceErrorCodes.GroupUserHasBlack); - } - var group = await _groupRepository.GetByIdAsync(groupId, cancellationToken); - if (!group.AllowSendMessage) - { - // 当前群组不允许发言 - throw new BusinessException(MessageServiceErrorCodes.GroupNotAllowedToSpeak); - } - if (chatMessage.IsAnonymous && !group.AllowAnonymous) - { - // 当前群组不允许匿名发言 - throw new BusinessException(MessageServiceErrorCodes.GroupNotAllowedToSpeakAnonymously); - } - - var message = new GroupMessage( - long.Parse(chatMessage.MessageId), - chatMessage.FormUserId, - chatMessage.FormUserName, - chatMessage.Content, - chatMessage.MessageType); - - message.SendToGroup(groupId); - message.SetProperty(nameof(ChatMessage.IsAnonymous), chatMessage.IsAnonymous); - - await _messageRepository.InsertGroupMessageAsync(message, cancellationToken); - } - } -} +using LINGYUN.Abp.IM.Contract; +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.MessageService.Group; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; +using Volo.Abp.ObjectMapping; +using Volo.Abp.Uow; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class MessageStore : IMessageStore, ITransientDependency + { + private readonly IFriendStore _friendStore; + + private readonly IObjectMapper _objectMapper; + + private readonly ICurrentTenant _currentTenant; + + private readonly IUnitOfWorkManager _unitOfWorkManager; + + private readonly IGroupRepository _groupRepository; + + private readonly IMessageRepository _messageRepository; + + private readonly IUserChatSettingRepository _userChatSettingRepository; + public MessageStore( + IFriendStore friendStore, + IObjectMapper objectMapper, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IGroupRepository groupRepository, + IMessageRepository messageRepository, + IUserChatSettingRepository userChatSettingRepository) + { + _friendStore = friendStore; + _objectMapper = objectMapper; + _currentTenant = currentTenant; + _unitOfWorkManager = unitOfWorkManager; + _groupRepository = groupRepository; + _messageRepository = messageRepository; + _userChatSettingRepository = userChatSettingRepository; + } + + public virtual async Task StoreMessageAsync( + ChatMessage chatMessage, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + { + using (_currentTenant.Change(chatMessage.TenantId)) + { + if (!chatMessage.GroupId.IsNullOrWhiteSpace()) + { + long groupId = long.Parse(chatMessage.GroupId); + await StoreGroupMessageAsync(chatMessage, groupId, cancellationToken); + } + else + { + await StoreUserMessageAsync(chatMessage, cancellationToken); + } + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + } + + public virtual async Task> GetGroupMessageAsync( + Guid? tenantId, + long groupId, + string filter = "", + string sorting = nameof(ChatMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var groupMessages = await _messageRepository + .GetGroupMessagesAsync(groupId, filter, sorting, type, skipCount, maxResultCount, cancellationToken); + + var chatMessages = _objectMapper.Map, List>(groupMessages); + + return chatMessages; + } + } + + public virtual async Task> GetChatMessageAsync( + Guid? tenantId, + Guid sendUserId, + Guid receiveUserId, + string filter = "", + string sorting = nameof(ChatMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userMessages = await _messageRepository + .GetUserMessagesAsync(sendUserId, receiveUserId, filter, sorting, type, skipCount, maxResultCount, cancellationToken); + + var chatMessages = _objectMapper.Map, List>(userMessages); + + return chatMessages; + } + } + + public virtual async Task> GetLastChatMessagesAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + int maxResultCount = 10, + CancellationToken cancellationToken = default + ) + { + using (_currentTenant.Change(tenantId)) + { + return await _messageRepository + .GetLastMessagesByOneFriendAsync(userId, sorting, maxResultCount, cancellationToken); + } + } + + public virtual async Task GetGroupMessageCountAsync( + Guid? tenantId, + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _messageRepository.GetCountAsync(groupId, filter, type, cancellationToken); + } + } + + public virtual async Task GetChatMessageCountAsync( + Guid? tenantId, + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _messageRepository.GetCountAsync(sendUserId, receiveUserId, filter, type, cancellationToken); + } + } + + protected virtual async Task StoreUserMessageAsync( + ChatMessage chatMessage, + CancellationToken cancellationToken = default) + { + // 检查接收用户 + if (!chatMessage.ToUserId.HasValue) + { + throw new BusinessException(MessageServiceErrorCodes.UseNotFount); + } + + var myFriend = await _friendStore + .GetMemberAsync(chatMessage.TenantId, chatMessage.ToUserId.Value, chatMessage.FormUserId, cancellationToken); + + var userChatSetting = await _userChatSettingRepository + .FindByUserIdAsync(chatMessage.ToUserId.Value, cancellationToken); + + if (userChatSetting != null) + { + if (!userChatSetting.AllowReceiveMessage) + { + // 当前发送的用户不接收消息 + throw new BusinessException(MessageServiceErrorCodes.UserHasRejectAllMessage); + } + + if (myFriend == null && !chatMessage.IsAnonymous) + { + throw new BusinessException(MessageServiceErrorCodes.UserHasRejectNotFriendMessage); + } + + if (chatMessage.IsAnonymous && !userChatSetting.AllowAnonymous) + { + // 当前用户不允许匿名发言 + throw new BusinessException(MessageServiceErrorCodes.UserNotAllowedToSpeakAnonymously); + } + } + else + { + if (myFriend == null) + { + throw new BusinessException(MessageServiceErrorCodes.UserHasRejectNotFriendMessage); + } + } + if (myFriend?.Black == true) + { + throw new BusinessException(MessageServiceErrorCodes.UserHasBlack); + } + + var message = new UserMessage( + long.Parse(chatMessage.MessageId), + chatMessage.FormUserId, + chatMessage.FormUserName, + chatMessage.Content, + chatMessage.MessageType); + + message.SendToUser(chatMessage.ToUserId.Value); + message.SetProperty(nameof(ChatMessage.IsAnonymous), chatMessage.IsAnonymous); + + await _messageRepository.InsertUserMessageAsync(message, cancellationToken); + } + + protected virtual async Task StoreGroupMessageAsync( + ChatMessage chatMessage, + long groupId, + CancellationToken cancellationToken = default) + { + var userHasBlacked = await _groupRepository + .UserHasBlackedAsync(groupId, chatMessage.FormUserId, cancellationToken); + if (userHasBlacked) + { + // 当前发送的用户已被拉黑 + throw new BusinessException(MessageServiceErrorCodes.GroupUserHasBlack); + } + var group = await _groupRepository.GetByIdAsync(groupId, cancellationToken); + if (!group.AllowSendMessage) + { + // 当前群组不允许发言 + throw new BusinessException(MessageServiceErrorCodes.GroupNotAllowedToSpeak); + } + if (chatMessage.IsAnonymous && !group.AllowAnonymous) + { + // 当前群组不允许匿名发言 + throw new BusinessException(MessageServiceErrorCodes.GroupNotAllowedToSpeakAnonymously); + } + + var message = new GroupMessage( + long.Parse(chatMessage.MessageId), + chatMessage.FormUserId, + chatMessage.FormUserName, + chatMessage.Content, + chatMessage.MessageType); + + message.SendToGroup(groupId); + message.SetProperty(nameof(ChatMessage.IsAnonymous), chatMessage.IsAnonymous); + + await _messageRepository.InsertGroupMessageAsync(message, cancellationToken); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserCardFinder.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserCardFinder.cs index 8f8a50711..6e8f5184d 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserCardFinder.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserCardFinder.cs @@ -1,51 +1,64 @@ -using LINGYUN.Abp.IM; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class UserCardFinder : IUserCardFinder, ITransientDependency - { - private readonly ICurrentTenant _currentTenant; - private readonly IUserChatCardRepository _userChatCardRepository; - - public UserCardFinder( - ICurrentTenant currentTenant, - IUserChatCardRepository userChatCardRepository) - { - _currentTenant = currentTenant; - _userChatCardRepository = userChatCardRepository; - } - - public virtual async Task GetCountAsync(Guid? tenantId, string findUserName = "", int? startAge = null, int? endAge = null, Sex? sex = null) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatCardRepository - .GetMemberCountAsync(findUserName, startAge, endAge, sex); - } - } - - public virtual async Task> GetListAsync(Guid? tenantId, string findUserName = "", int? startAge = null, int? endAge = null, Sex? sex = null, string sorting = nameof(UserCard.UserId), bool reverse = false, int skipCount = 0, int maxResultCount = 10) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatCardRepository - .GetMembersAsync(findUserName, startAge, endAge, sex, - sorting, reverse, skipCount, maxResultCount); - } - } - - public virtual async Task GetMemberAsync(Guid? tenantId, Guid findUserId) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatCardRepository - .GetMemberAsync(findUserId); - } - } - } -} +using LINGYUN.Abp.IM; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class UserCardFinder : IUserCardFinder, ITransientDependency + { + private readonly ICurrentTenant _currentTenant; + private readonly IUserChatCardRepository _userChatCardRepository; + + public UserCardFinder( + ICurrentTenant currentTenant, + IUserChatCardRepository userChatCardRepository) + { + _currentTenant = currentTenant; + _userChatCardRepository = userChatCardRepository; + } + + public virtual async Task GetCountAsync( + Guid? tenantId, + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatCardRepository + .GetMemberCountAsync(findUserName, startAge, endAge, sex); + } + } + + public virtual async Task> GetListAsync( + Guid? tenantId, + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + string sorting = nameof(UserCard.UserId), + int skipCount = 0, + int maxResultCount = 10) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatCardRepository + .GetMembersAsync(findUserName, startAge, endAge, sex, + sorting, skipCount, maxResultCount); + } + } + + public virtual async Task GetMemberAsync(Guid? tenantId, Guid findUserId) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatCardRepository + .GetMemberAsync(findUserId); + } + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IUserChatGroupRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IUserChatGroupRepository.cs index 7f687e70b..13dfd3495 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IUserChatGroupRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IUserChatGroupRepository.cs @@ -1,80 +1,78 @@ -using LINGYUN.Abp.IM.Group; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories; - -namespace LINGYUN.Abp.MessageService.Group -{ - public interface IUserChatGroupRepository : IBasicRepository - { - /// - /// 成员是否在群组里 - /// - /// - /// - /// - Task MemberHasInGroupAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 获取群组成员 - /// - /// - /// - /// - /// - Task GetMemberAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 获取群组成员数 - /// - /// - /// - /// - Task GetMembersCountAsync( - long groupId, - CancellationToken cancellationToken = default); - /// - /// 获取群组成员列表 - /// - /// - /// - /// - /// - /// - /// - /// - Task> GetMembersAsync( - long groupId, - string sorting = nameof(GroupUserCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - /// - /// 获取成员所在群组列表 - /// - /// - /// - /// - Task> GetMemberGroupsAsync( - Guid userId, - CancellationToken cancellationToken = default); - /// - /// 从群组中移除成员 - /// - /// - /// - /// - /// - Task RemoveMemberFormGroupAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default); - } -} +using LINGYUN.Abp.IM.Group; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace LINGYUN.Abp.MessageService.Group +{ + public interface IUserChatGroupRepository : IBasicRepository + { + /// + /// 成员是否在群组里 + /// + /// + /// + /// + Task MemberHasInGroupAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 获取群组成员 + /// + /// + /// + /// + /// + Task GetMemberAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 获取群组成员数 + /// + /// + /// + /// + Task GetMembersCountAsync( + long groupId, + CancellationToken cancellationToken = default); + /// + /// 获取群组成员列表 + /// + /// + /// + /// + /// + /// + /// + Task> GetMembersAsync( + long groupId, + string sorting = nameof(GroupUserCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + /// + /// 获取成员所在群组列表 + /// + /// + /// + /// + Task> GetMemberGroupsAsync( + Guid userId, + CancellationToken cancellationToken = default); + /// + /// 从群组中移除成员 + /// + /// + /// + /// + /// + Task RemoveMemberFormGroupAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserGroupStore.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserGroupStore.cs index 1bb3a9191..f186e7d0a 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserGroupStore.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserGroupStore.cs @@ -1,147 +1,146 @@ -using LINGYUN.Abp.IM.Group; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; -using Volo.Abp.ObjectMapping; -using Volo.Abp.Uow; - -namespace LINGYUN.Abp.MessageService.Group -{ - public class UserGroupStore : IUserGroupStore, ITransientDependency - { - private readonly IObjectMapper _objectMapper; - private readonly ICurrentTenant _currentTenant; - private readonly IUnitOfWorkManager _unitOfWorkManager; - private readonly IUserChatGroupRepository _userChatGroupRepository; - - public UserGroupStore( - IObjectMapper objectMapper, - ICurrentTenant currentTenant, - IUnitOfWorkManager unitOfWorkManager, - IUserChatGroupRepository userChatGroupRepository) - { - _objectMapper = objectMapper; - _currentTenant = currentTenant; - _unitOfWorkManager = unitOfWorkManager; - _userChatGroupRepository = userChatGroupRepository; - } - - public virtual async Task MemberHasInGroupAsync( - Guid? tenantId, - long groupId, - Guid userId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatGroupRepository.MemberHasInGroupAsync(groupId, userId, cancellationToken); - } - } - - public virtual async Task AddUserToGroupAsync( - Guid? tenantId, - Guid userId, - long groupId, - Guid acceptUserId, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - { - using (_currentTenant.Change(tenantId)) - { - var userHasInGroup = await _userChatGroupRepository.MemberHasInGroupAsync(groupId, userId, cancellationToken); - if (!userHasInGroup) - { - var userGroup = new UserChatGroup(groupId, userId, acceptUserId, tenantId); - - await _userChatGroupRepository.InsertAsync(userGroup, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - } - } - - public async Task GetUserGroupCardAsync( - Guid? tenantId, - long groupId, - Guid userId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var groupUserCard = await _userChatGroupRepository.GetMemberAsync(groupId, userId, cancellationToken); - - return groupUserCard; - } - } - - public async Task> GetMembersAsync( - Guid? tenantId, - long groupId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatGroupRepository.GetMembersAsync(groupId, cancellationToken: cancellationToken); - } - } - - public async Task> GetUserGroupsAsync( - Guid? tenantId, - Guid userId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatGroupRepository.GetMemberGroupsAsync(userId, cancellationToken); - } - } - - public async Task RemoveUserFormGroupAsync( - Guid? tenantId, - Guid userId, - long groupId, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - { - using (_currentTenant.Change(tenantId)) - { - await _userChatGroupRepository.RemoveMemberFormGroupAsync(groupId, userId, cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - } - - public async Task GetMembersCountAsync( - Guid? tenantId, - long groupId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatGroupRepository.GetMembersCountAsync(groupId, cancellationToken); - } - } - - public async Task> GetMembersAsync( - Guid? tenantId, - long groupId, - string sorting = nameof(GroupUserCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userChatGroupRepository.GetMembersAsync(groupId, sorting, reverse, skipCount, maxResultCount, cancellationToken); - } - } - } -} +using LINGYUN.Abp.IM.Group; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; +using Volo.Abp.ObjectMapping; +using Volo.Abp.Uow; + +namespace LINGYUN.Abp.MessageService.Group +{ + public class UserGroupStore : IUserGroupStore, ITransientDependency + { + private readonly IObjectMapper _objectMapper; + private readonly ICurrentTenant _currentTenant; + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly IUserChatGroupRepository _userChatGroupRepository; + + public UserGroupStore( + IObjectMapper objectMapper, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IUserChatGroupRepository userChatGroupRepository) + { + _objectMapper = objectMapper; + _currentTenant = currentTenant; + _unitOfWorkManager = unitOfWorkManager; + _userChatGroupRepository = userChatGroupRepository; + } + + public virtual async Task MemberHasInGroupAsync( + Guid? tenantId, + long groupId, + Guid userId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatGroupRepository.MemberHasInGroupAsync(groupId, userId, cancellationToken); + } + } + + public virtual async Task AddUserToGroupAsync( + Guid? tenantId, + Guid userId, + long groupId, + Guid acceptUserId, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + { + using (_currentTenant.Change(tenantId)) + { + var userHasInGroup = await _userChatGroupRepository.MemberHasInGroupAsync(groupId, userId, cancellationToken); + if (!userHasInGroup) + { + var userGroup = new UserChatGroup(groupId, userId, acceptUserId, tenantId); + + await _userChatGroupRepository.InsertAsync(userGroup, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + } + } + + public async Task GetUserGroupCardAsync( + Guid? tenantId, + long groupId, + Guid userId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var groupUserCard = await _userChatGroupRepository.GetMemberAsync(groupId, userId, cancellationToken); + + return groupUserCard; + } + } + + public async Task> GetMembersAsync( + Guid? tenantId, + long groupId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatGroupRepository.GetMembersAsync(groupId, cancellationToken: cancellationToken); + } + } + + public async Task> GetUserGroupsAsync( + Guid? tenantId, + Guid userId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatGroupRepository.GetMemberGroupsAsync(userId, cancellationToken); + } + } + + public async Task RemoveUserFormGroupAsync( + Guid? tenantId, + Guid userId, + long groupId, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + { + using (_currentTenant.Change(tenantId)) + { + await _userChatGroupRepository.RemoveMemberFormGroupAsync(groupId, userId, cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + } + + public async Task GetMembersCountAsync( + Guid? tenantId, + long groupId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatGroupRepository.GetMembersCountAsync(groupId, cancellationToken); + } + } + + public async Task> GetMembersAsync( + Guid? tenantId, + long groupId, + string sorting = nameof(GroupUserCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userChatGroupRepository.GetMembersAsync(groupId, sorting, skipCount, maxResultCount, cancellationToken); + } + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/IUserNotificationRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/IUserNotificationRepository.cs index 16312df09..5af844aaf 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/IUserNotificationRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/IUserNotificationRepository.cs @@ -1,48 +1,47 @@ -using LINGYUN.Abp.Notifications; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories; - -namespace LINGYUN.Abp.MessageService.Notifications -{ - public interface IUserNotificationRepository : IBasicRepository - { - Task AnyAsync( - Guid userId, - long notificationId, - CancellationToken cancellationToken = default); - - Task InsertUserNotificationsAsync( - IEnumerable userNotifications, - CancellationToken cancellationToken = default); - - Task GetByIdAsync( - Guid userId, - long notificationId, - CancellationToken cancellationToken = default); - - Task> GetNotificationsAsync( - Guid userId, - NotificationReadState? readState = null, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - - Task GetCountAsync( - Guid userId, - string filter = "", - NotificationReadState? readState = null, - CancellationToken cancellationToken = default); - - Task> GetListAsync( - Guid userId, - string filter = "", - string sorting = nameof(Notification.CreationTime), - bool reverse = true, - NotificationReadState? readState = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default); - } -} +using LINGYUN.Abp.Notifications; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace LINGYUN.Abp.MessageService.Notifications +{ + public interface IUserNotificationRepository : IBasicRepository + { + Task AnyAsync( + Guid userId, + long notificationId, + CancellationToken cancellationToken = default); + + Task InsertUserNotificationsAsync( + IEnumerable userNotifications, + CancellationToken cancellationToken = default); + + Task GetByIdAsync( + Guid userId, + long notificationId, + CancellationToken cancellationToken = default); + + Task> GetNotificationsAsync( + Guid userId, + NotificationReadState? readState = null, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + + Task GetCountAsync( + Guid userId, + string filter = "", + NotificationReadState? readState = null, + CancellationToken cancellationToken = default); + + Task> GetListAsync( + Guid userId, + string filter = "", + string sorting = nameof(Notification.CreationTime), + NotificationReadState? readState = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/NotificationStore.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/NotificationStore.cs index 375f64dbf..3e7c04f10 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/NotificationStore.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/NotificationStore.cs @@ -1,439 +1,438 @@ -using LINGYUN.Abp.MessageService.Subscriptions; -using LINGYUN.Abp.Notifications; -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Json; -using Volo.Abp.MultiTenancy; -using Volo.Abp.ObjectMapping; -using Volo.Abp.Timing; -using Volo.Abp.Uow; - -namespace LINGYUN.Abp.MessageService.Notifications -{ - [Dependency(ServiceLifetime.Transient, ReplaceServices = true)] - [ExposeServices(typeof(INotificationStore))] - public class NotificationStore : INotificationStore - { - private readonly IClock _clock; - - private readonly IObjectMapper _objectMapper; - - private readonly ICurrentTenant _currentTenant; - - private readonly IJsonSerializer _jsonSerializer; - - private readonly IUnitOfWorkManager _unitOfWorkManager; - - private readonly INotificationRepository _notificationRepository; - - private readonly IUserNotificationRepository _userNotificationRepository; - - private readonly IUserSubscribeRepository _userSubscribeRepository; - - public NotificationStore( - IClock clock, - IObjectMapper objectMapper, - ICurrentTenant currentTenant, - IJsonSerializer jsonSerializer, - IUnitOfWorkManager unitOfWorkManager, - INotificationRepository notificationRepository, - IUserSubscribeRepository userSubscribeRepository, - IUserNotificationRepository userNotificationRepository - ) - { - _clock = clock; - _objectMapper = objectMapper; - _currentTenant = currentTenant; - _jsonSerializer = jsonSerializer; - _unitOfWorkManager = unitOfWorkManager; - _notificationRepository = notificationRepository; - _userSubscribeRepository = userSubscribeRepository; - _userNotificationRepository = userNotificationRepository; - } - - public virtual async Task ChangeUserNotificationReadStateAsync( - Guid? tenantId, - Guid userId, - long notificationId, - NotificationReadState readState, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - var notification = await _userNotificationRepository.GetByIdAsync(userId, notificationId); - if (notification != null) - { - notification.ChangeReadState(readState); - await _userNotificationRepository.UpdateAsync(notification); - - await unitOfWork.SaveChangesAsync(); - } - } - } - - public virtual async Task DeleteNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(notification.TenantId)) - { - var notify = await _notificationRepository.GetByIdAsync(notification.GetId(), cancellationToken); - await _notificationRepository.DeleteAsync(notify.Id, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task DeleteNotificationAsync( - int batchCount, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - { - await _notificationRepository.DeleteExpritionAsync(batchCount, cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task DeleteUserNotificationAsync( - Guid? tenantId, - Guid userId, - long notificationId, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - var notify = await _userNotificationRepository - .GetByIdAsync(userId, notificationId, cancellationToken); - await _userNotificationRepository - .DeleteAsync(notify.Id, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task DeleteAllUserSubscriptionAsync( - Guid? tenantId, - string notificationName, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - await _userSubscribeRepository - .DeleteUserSubscriptionAsync(notificationName, cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task DeleteUserSubscriptionAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - var userSubscribe = await _userSubscribeRepository - .GetUserSubscribeAsync(notificationName, userId, cancellationToken); - await _userSubscribeRepository - .DeleteAsync(userSubscribe.Id, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task DeleteUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - await _userSubscribeRepository - .DeleteUserSubscriptionAsync(notificationName, identifiers.Select(ids => ids.UserId), cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task GetNotificationOrNullAsync( - Guid? tenantId, - long notificationId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var notification = await _notificationRepository - .GetByIdAsync(notificationId, cancellationToken); - - return _objectMapper.Map(notification); - } - } - - public virtual async Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string notificationName, - IEnumerable identifiers = null, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userSubscriptions = new List(); - - if (identifiers == null) - { - userSubscriptions = await _userSubscribeRepository - .GetUserSubscribesAsync(notificationName, null, cancellationToken); - } - else - { - userSubscriptions = await _userSubscribeRepository - .GetUserSubscribesAsync( - notificationName, - identifiers.Select(ids => ids.UserId), - cancellationToken); - } - - return _objectMapper.Map, List>(userSubscriptions); - } - } - - public virtual async Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - NotificationReadState? readState = null, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var notifications = await _userNotificationRepository - .GetNotificationsAsync(userId, readState, maxResultCount, cancellationToken); - - return _objectMapper.Map, List>(notifications); - } - } - - public virtual async Task GetUserNotificationsCountAsync( - Guid? tenantId, - Guid userId, - string filter = "", - NotificationReadState? readState = null, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - return await _userNotificationRepository - .GetCountAsync(userId, filter, readState, cancellationToken); - } - } - - public virtual async Task> GetUserNotificationsAsync( - Guid? tenantId, - Guid userId, - string filter = "", - string sorting = nameof(NotificationInfo.CreationTime), - bool reverse = true, - NotificationReadState? readState = null, - int skipCount = 1, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var notifications = await _userNotificationRepository - .GetListAsync(userId, filter, sorting, reverse, readState, skipCount, maxResultCount, cancellationToken); - - return _objectMapper.Map, List>(notifications); - } - } - - public virtual async Task> GetUserSubscriptionsAsync( - Guid? tenantId, - Guid userId, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userSubscriptionNames = await _userSubscribeRepository - .GetUserSubscribesAsync(userId, cancellationToken); - - var userSubscriptions = new List(); - - userSubscriptionNames.ForEach(name => userSubscriptions.Add( - new NotificationSubscriptionInfo - { - UserId = userId, - TenantId = tenantId, - NotificationName = name - })); - - return userSubscriptions; - } - } - - public virtual async Task> GetUserSubscriptionsAsync( - Guid? tenantId, - string userName, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - { - var userSubscriptions = await _userSubscribeRepository - .GetUserSubscribesByNameAsync(userName, cancellationToken); - - var userSubscriptionInfos = new List(); - - userSubscriptions.ForEach(us => userSubscriptionInfos.Add( - new NotificationSubscriptionInfo - { - UserId = us.UserId, - TenantId = us.TenantId, - NotificationName = us.NotificationName - })); - - return userSubscriptionInfos; - } - } - - public virtual async Task InsertNotificationAsync( - NotificationInfo notification, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(notification.TenantId)) - { - var notify = new Notification( - notification.GetId(), - notification.Name, - notification.Data.GetType().AssemblyQualifiedName, - _jsonSerializer.Serialize(notification.Data), - notification.Severity, notification.TenantId) - { - CreationTime = _clock.Now, - Type = notification.Type, - // TODO: 通知过期时间应该可以配置 - ExpirationTime = _clock.Now.AddDays(60) - }; - - await _notificationRepository.InsertAsync(notify, cancellationToken: cancellationToken); - - notification.Id = notify.NotificationId.ToString(); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task InsertUserNotificationAsync( - NotificationInfo notification, - Guid userId, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(notification.TenantId)) - { - var userNotification = new UserNotification(notification.GetId(), userId, notification.TenantId); - await _userNotificationRepository - .InsertAsync(userNotification, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task InsertUserSubscriptionAsync( - Guid? tenantId, - UserIdentifier identifier, - string notificationName, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - - var userSubscription = new UserSubscribe(notificationName, identifier.UserId, identifier.UserName, tenantId) - { - CreationTime = _clock.Now - }; - - await _userSubscribeRepository - .InsertAsync(userSubscription, cancellationToken: cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task InsertUserSubscriptionAsync( - Guid? tenantId, - IEnumerable identifiers, - string notificationName, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(tenantId)) - { - var userSubscribes = new List(); - - foreach (var identifier in identifiers) - { - userSubscribes.Add(new UserSubscribe(notificationName, identifier.UserId, identifier.UserName, tenantId)); - } - - await _userSubscribeRepository - .InsertUserSubscriptionAsync(userSubscribes, cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - - public virtual async Task IsSubscribedAsync( - Guid? tenantId, - Guid userId, - string notificationName, - CancellationToken cancellationToken = default) - { - using (_currentTenant.Change(tenantId)) - return await _userSubscribeRepository - .UserSubscribeExistsAysnc(notificationName, userId, cancellationToken); - } - - public virtual async Task InsertUserNotificationsAsync( - NotificationInfo notification, - IEnumerable userIds, - CancellationToken cancellationToken = default) - { - using (var unitOfWork = _unitOfWorkManager.Begin()) - using (_currentTenant.Change(notification.TenantId)) - { - var userNofitications = new List(); - foreach (var userId in userIds) - { - // 重复检查 - // TODO:如果存在很多个订阅用户,这是个隐患 - if (!await _userNotificationRepository.AnyAsync(userId, notification.GetId(), cancellationToken)) - { - var userNofitication = new UserNotification(notification.GetId(), userId, notification.TenantId); - userNofitications.Add(userNofitication); - } - } - await _userNotificationRepository - .InsertUserNotificationsAsync(userNofitications, cancellationToken); - - await unitOfWork.SaveChangesAsync(cancellationToken); - } - } - } -} +using LINGYUN.Abp.MessageService.Subscriptions; +using LINGYUN.Abp.Notifications; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Json; +using Volo.Abp.MultiTenancy; +using Volo.Abp.ObjectMapping; +using Volo.Abp.Timing; +using Volo.Abp.Uow; + +namespace LINGYUN.Abp.MessageService.Notifications +{ + [Dependency(ServiceLifetime.Transient, ReplaceServices = true)] + [ExposeServices(typeof(INotificationStore))] + public class NotificationStore : INotificationStore + { + private readonly IClock _clock; + + private readonly IObjectMapper _objectMapper; + + private readonly ICurrentTenant _currentTenant; + + private readonly IJsonSerializer _jsonSerializer; + + private readonly IUnitOfWorkManager _unitOfWorkManager; + + private readonly INotificationRepository _notificationRepository; + + private readonly IUserNotificationRepository _userNotificationRepository; + + private readonly IUserSubscribeRepository _userSubscribeRepository; + + public NotificationStore( + IClock clock, + IObjectMapper objectMapper, + ICurrentTenant currentTenant, + IJsonSerializer jsonSerializer, + IUnitOfWorkManager unitOfWorkManager, + INotificationRepository notificationRepository, + IUserSubscribeRepository userSubscribeRepository, + IUserNotificationRepository userNotificationRepository + ) + { + _clock = clock; + _objectMapper = objectMapper; + _currentTenant = currentTenant; + _jsonSerializer = jsonSerializer; + _unitOfWorkManager = unitOfWorkManager; + _notificationRepository = notificationRepository; + _userSubscribeRepository = userSubscribeRepository; + _userNotificationRepository = userNotificationRepository; + } + + public virtual async Task ChangeUserNotificationReadStateAsync( + Guid? tenantId, + Guid userId, + long notificationId, + NotificationReadState readState, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + var notification = await _userNotificationRepository.GetByIdAsync(userId, notificationId); + if (notification != null) + { + notification.ChangeReadState(readState); + await _userNotificationRepository.UpdateAsync(notification); + + await unitOfWork.SaveChangesAsync(); + } + } + } + + public virtual async Task DeleteNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(notification.TenantId)) + { + var notify = await _notificationRepository.GetByIdAsync(notification.GetId(), cancellationToken); + await _notificationRepository.DeleteAsync(notify.Id, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task DeleteNotificationAsync( + int batchCount, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + { + await _notificationRepository.DeleteExpritionAsync(batchCount, cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task DeleteUserNotificationAsync( + Guid? tenantId, + Guid userId, + long notificationId, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + var notify = await _userNotificationRepository + .GetByIdAsync(userId, notificationId, cancellationToken); + await _userNotificationRepository + .DeleteAsync(notify.Id, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task DeleteAllUserSubscriptionAsync( + Guid? tenantId, + string notificationName, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + await _userSubscribeRepository + .DeleteUserSubscriptionAsync(notificationName, cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task DeleteUserSubscriptionAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + var userSubscribe = await _userSubscribeRepository + .GetUserSubscribeAsync(notificationName, userId, cancellationToken); + await _userSubscribeRepository + .DeleteAsync(userSubscribe.Id, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task DeleteUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + await _userSubscribeRepository + .DeleteUserSubscriptionAsync(notificationName, identifiers.Select(ids => ids.UserId), cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task GetNotificationOrNullAsync( + Guid? tenantId, + long notificationId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var notification = await _notificationRepository + .GetByIdAsync(notificationId, cancellationToken); + + return _objectMapper.Map(notification); + } + } + + public virtual async Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string notificationName, + IEnumerable identifiers = null, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userSubscriptions = new List(); + + if (identifiers == null) + { + userSubscriptions = await _userSubscribeRepository + .GetUserSubscribesAsync(notificationName, null, cancellationToken); + } + else + { + userSubscriptions = await _userSubscribeRepository + .GetUserSubscribesAsync( + notificationName, + identifiers.Select(ids => ids.UserId), + cancellationToken); + } + + return _objectMapper.Map, List>(userSubscriptions); + } + } + + public virtual async Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + NotificationReadState? readState = null, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var notifications = await _userNotificationRepository + .GetNotificationsAsync(userId, readState, maxResultCount, cancellationToken); + + return _objectMapper.Map, List>(notifications); + } + } + + public virtual async Task GetUserNotificationsCountAsync( + Guid? tenantId, + Guid userId, + string filter = "", + NotificationReadState? readState = null, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + return await _userNotificationRepository + .GetCountAsync(userId, filter, readState, cancellationToken); + } + } + + public virtual async Task> GetUserNotificationsAsync( + Guid? tenantId, + Guid userId, + string filter = "", + string sorting = nameof(NotificationInfo.CreationTime), + NotificationReadState? readState = null, + int skipCount = 1, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var notifications = await _userNotificationRepository + .GetListAsync(userId, filter, sorting, readState, skipCount, maxResultCount, cancellationToken); + + return _objectMapper.Map, List>(notifications); + } + } + + public virtual async Task> GetUserSubscriptionsAsync( + Guid? tenantId, + Guid userId, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userSubscriptionNames = await _userSubscribeRepository + .GetUserSubscribesAsync(userId, cancellationToken); + + var userSubscriptions = new List(); + + userSubscriptionNames.ForEach(name => userSubscriptions.Add( + new NotificationSubscriptionInfo + { + UserId = userId, + TenantId = tenantId, + NotificationName = name + })); + + return userSubscriptions; + } + } + + public virtual async Task> GetUserSubscriptionsAsync( + Guid? tenantId, + string userName, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + { + var userSubscriptions = await _userSubscribeRepository + .GetUserSubscribesByNameAsync(userName, cancellationToken); + + var userSubscriptionInfos = new List(); + + userSubscriptions.ForEach(us => userSubscriptionInfos.Add( + new NotificationSubscriptionInfo + { + UserId = us.UserId, + TenantId = us.TenantId, + NotificationName = us.NotificationName + })); + + return userSubscriptionInfos; + } + } + + public virtual async Task InsertNotificationAsync( + NotificationInfo notification, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(notification.TenantId)) + { + var notify = new Notification( + notification.GetId(), + notification.Name, + notification.Data.GetType().AssemblyQualifiedName, + _jsonSerializer.Serialize(notification.Data), + notification.Severity, notification.TenantId) + { + CreationTime = _clock.Now, + Type = notification.Type, + // TODO: 通知过期时间应该可以配置 + ExpirationTime = _clock.Now.AddDays(60) + }; + + await _notificationRepository.InsertAsync(notify, cancellationToken: cancellationToken); + + notification.Id = notify.NotificationId.ToString(); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task InsertUserNotificationAsync( + NotificationInfo notification, + Guid userId, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(notification.TenantId)) + { + var userNotification = new UserNotification(notification.GetId(), userId, notification.TenantId); + await _userNotificationRepository + .InsertAsync(userNotification, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task InsertUserSubscriptionAsync( + Guid? tenantId, + UserIdentifier identifier, + string notificationName, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + + var userSubscription = new UserSubscribe(notificationName, identifier.UserId, identifier.UserName, tenantId) + { + CreationTime = _clock.Now + }; + + await _userSubscribeRepository + .InsertAsync(userSubscription, cancellationToken: cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task InsertUserSubscriptionAsync( + Guid? tenantId, + IEnumerable identifiers, + string notificationName, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(tenantId)) + { + var userSubscribes = new List(); + + foreach (var identifier in identifiers) + { + userSubscribes.Add(new UserSubscribe(notificationName, identifier.UserId, identifier.UserName, tenantId)); + } + + await _userSubscribeRepository + .InsertUserSubscriptionAsync(userSubscribes, cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + + public virtual async Task IsSubscribedAsync( + Guid? tenantId, + Guid userId, + string notificationName, + CancellationToken cancellationToken = default) + { + using (_currentTenant.Change(tenantId)) + return await _userSubscribeRepository + .UserSubscribeExistsAysnc(notificationName, userId, cancellationToken); + } + + public virtual async Task InsertUserNotificationsAsync( + NotificationInfo notification, + IEnumerable userIds, + CancellationToken cancellationToken = default) + { + using (var unitOfWork = _unitOfWorkManager.Begin()) + using (_currentTenant.Change(notification.TenantId)) + { + var userNofitications = new List(); + foreach (var userId in userIds) + { + // 重复检查 + // TODO:如果存在很多个订阅用户,这是个隐患 + if (!await _userNotificationRepository.AnyAsync(userId, notification.GetId(), cancellationToken)) + { + var userNofitication = new UserNotification(notification.GetId(), userId, notification.TenantId); + userNofitications.Add(userNofitication); + } + } + await _userNotificationRepository + .InsertUserNotificationsAsync(userNofitications, cancellationToken); + + await unitOfWork.SaveChangesAsync(cancellationToken); + } + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs index aa6d6c13b..eac37b464 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs @@ -1,254 +1,257 @@ -using LINGYUN.Abp.IM.Messages; -using LINGYUN.Abp.MessageService.EntityFrameworkCore; -using LINGYUN.Abp.MessageService.Group; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class EfCoreMessageRepository : EfCoreRepository, - IMessageRepository, ITransientDependency - { - public EfCoreMessageRepository( - IDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public virtual async Task GetGroupMessageAsync( - long id, - CancellationToken cancellationToken = default) - { - return await (await GetDbContextAsync()).Set() - .Where(x => x.MessageId.Equals(id)) - .AsNoTracking() - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetGroupMessagesAsync( - long groupId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting = reverse ? sorting + " desc" : sorting; - var groupMessages = await (await GetDbContextAsync()).Set() - .Distinct() - .Where(x => x.GroupId.Equals(groupId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .OrderBy(sorting ?? nameof(GroupMessage.MessageId)) - .PageBy(skipCount, maxResultCount) - .AsNoTracking() - .ToListAsync(GetCancellationToken(cancellationToken)); - - return groupMessages; - } - - public virtual async Task GetGroupMessagesCountAsync( - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - var groupMessagesCount = await (await GetDbContextAsync()).Set() - .Distinct() - .Where(x => x.GroupId.Equals(groupId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .LongCountAsync(GetCancellationToken(cancellationToken)); - return groupMessagesCount; - } - - public virtual async Task> GetUserGroupMessagesAsync( - Guid sendUserId, - long groupId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting = reverse ? sorting + " desc" : sorting; - var groupMessages = await (await GetDbContextAsync()).Set() - .Distinct() - .Where(x => x.GroupId.Equals(groupId) && x.CreatorId.Equals(sendUserId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .OrderBy(sorting ?? nameof(GroupMessage.MessageId)) - .PageBy(skipCount, maxResultCount) - .AsNoTracking() - .ToListAsync(GetCancellationToken(cancellationToken)); - - return groupMessages; - } - - public virtual async Task GetUserGroupMessagesCountAsync( - Guid sendUserId, - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - var groupMessagesCount = await (await GetDbContextAsync()).Set() - .Where(x => x.GroupId.Equals(groupId) && x.CreatorId.Equals(sendUserId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .LongCountAsync(GetCancellationToken(cancellationToken)); - return groupMessagesCount; - } - - public virtual async Task GetCountAsync( - long groupId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - return await (await GetDbContextAsync()).Set() - .Where(x => x.GroupId.Equals(groupId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .LongCountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetCountAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - return await (await GetDbContextAsync()).Set() - .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || - x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .LongCountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetUserMessageAsync( - long id, - CancellationToken cancellationToken = default) - { - return await (await GetDbContextAsync()).Set() - .Where(x => x.MessageId.Equals(id)) - .AsNoTracking() - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetLastMessagesByOneFriendAsync( - Guid userId, - string sorting = nameof(LastChatMessage.SendTime), - bool reverse = true, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting ??= nameof(LastChatMessage.SendTime); - sorting = reverse ? sorting + " DESC" : sorting; - - var dbContext = await GetDbContextAsync(); - var groupMsgQuery = dbContext.Set() - .Where(msg => msg.ReceiveUserId == userId || msg.CreatorId == userId) - .GroupBy(msg => new { msg.CreatorId, msg.ReceiveUserId }) - .Select(msg => new - { - msg.Key.CreatorId, - msg.Key.ReceiveUserId, - MessageId = msg.Max(x => x.MessageId) - }); - - var userMessageQuery = from msg in dbContext.Set() - join gMsg in groupMsgQuery - on msg.MessageId equals gMsg.MessageId - select new LastChatMessage - { - Content = msg.Content, - SendTime = msg.CreationTime, - FormUserId = msg.CreatorId.Value, - FormUserName = msg.SendUserName, - MessageId = msg.MessageId.ToString(), - MessageType = msg.Type, - TenantId = msg.TenantId, - ToUserId = msg.ReceiveUserId - }; - - return await userMessageQuery - .OrderBy(sorting) - .Take(maxResultCount) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetUserMessagesAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - string sorting = nameof(UserMessage.MessageId), - bool reverse = true, - MessageType? type = null, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting ??= nameof(UserMessage.MessageId); - sorting = reverse ? sorting + " desc" : sorting; - var userMessages = await (await GetDbContextAsync()).Set() - .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || - x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .OrderBy(sorting) - .PageBy(skipCount, maxResultCount) - .AsNoTracking() - .ToListAsync(GetCancellationToken(cancellationToken)); - - return userMessages; - } - - public virtual async Task GetUserMessagesCountAsync( - Guid sendUserId, - Guid receiveUserId, - string filter = "", - MessageType? type = null, - CancellationToken cancellationToken = default) - { - var userMessagesCount = await (await GetDbContextAsync()).Set() - .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || - x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) - .WhereIf(type != null, x => x.Type.Equals(type)) - .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .LongCountAsync(GetCancellationToken(cancellationToken)); - - return userMessagesCount; - } - - public virtual async Task InsertGroupMessageAsync( - GroupMessage groupMessage, - CancellationToken cancellationToken = default) - { - await (await GetDbContextAsync()).Set() - .AddAsync(groupMessage, GetCancellationToken(cancellationToken)); - } - - public virtual async Task InsertUserMessageAsync( - UserMessage userMessage, - CancellationToken cancellationToken = default) - { - await (await GetDbContextAsync()).Set() - .AddAsync(userMessage, GetCancellationToken(cancellationToken)); - } - } -} +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using LINGYUN.Abp.MessageService.Group; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class EfCoreMessageRepository : EfCoreRepository, + IMessageRepository, ITransientDependency + { + public EfCoreMessageRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task GetGroupMessageAsync( + long id, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .Where(x => x.MessageId.Equals(id)) + .AsNoTracking() + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetGroupMessagesAsync( + long groupId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var groupMessages = await (await GetDbContextAsync()).Set() + .Distinct() + .Where(x => x.GroupId.Equals(groupId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .OrderBy(sorting ?? nameof(GroupMessage.MessageId)) + .PageBy(skipCount, maxResultCount) + .AsNoTracking() + .ToListAsync(GetCancellationToken(cancellationToken)); + + return groupMessages; + } + + public virtual async Task GetGroupMessagesCountAsync( + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + var groupMessagesCount = await (await GetDbContextAsync()).Set() + .Distinct() + .Where(x => x.GroupId.Equals(groupId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .LongCountAsync(GetCancellationToken(cancellationToken)); + return groupMessagesCount; + } + + public virtual async Task> GetUserGroupMessagesAsync( + Guid sendUserId, + long groupId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var groupMessages = await (await GetDbContextAsync()).Set() + .Distinct() + .Where(x => x.GroupId.Equals(groupId) && x.CreatorId.Equals(sendUserId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .OrderBy(sorting ?? nameof(GroupMessage.MessageId)) + .PageBy(skipCount, maxResultCount) + .AsNoTracking() + .ToListAsync(GetCancellationToken(cancellationToken)); + + return groupMessages; + } + + public virtual async Task GetUserGroupMessagesCountAsync( + Guid sendUserId, + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + var groupMessagesCount = await (await GetDbContextAsync()).Set() + .Where(x => x.GroupId.Equals(groupId) && x.CreatorId.Equals(sendUserId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .LongCountAsync(GetCancellationToken(cancellationToken)); + return groupMessagesCount; + } + + public virtual async Task GetCountAsync( + long groupId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .Where(x => x.GroupId.Equals(groupId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .LongCountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetCountAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || + x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .LongCountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetUserMessageAsync( + long id, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .Where(x => x.MessageId.Equals(id)) + .AsNoTracking() + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetLastMessagesByOneFriendAsync( + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var groupMsgQuery = dbContext.Set() + .Where(msg => msg.ReceiveUserId == userId || msg.CreatorId == userId) + .GroupBy(msg => new { msg.CreatorId, msg.ReceiveUserId }) + .Select(msg => new + { + msg.Key.CreatorId, + msg.Key.ReceiveUserId, + MessageId = msg.Max(x => x.MessageId) + }); + + var userMessageQuery = from msg in dbContext.Set() + join gMsg in groupMsgQuery + on msg.MessageId equals gMsg.MessageId + select new LastChatMessage + { + Content = msg.Content, + SendTime = msg.CreationTime, + FormUserId = msg.CreatorId.Value, + FormUserName = msg.SendUserName, + MessageId = msg.MessageId.ToString(), + MessageType = msg.Type, + TenantId = msg.TenantId, + ToUserId = msg.ReceiveUserId + }; + + return await userMessageQuery + .OrderBy(sorting ?? nameof(LastChatMessage.SendTime)) + .Take(maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetUserMessagesAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + string sorting = nameof(UserMessage.MessageId), + MessageType? type = null, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var userMessages = await (await GetDbContextAsync()).Set() + .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || + x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .OrderBy(sorting ?? nameof(UserMessage.MessageId)) + .PageBy(skipCount, maxResultCount) + .AsNoTracking() + .ToListAsync(GetCancellationToken(cancellationToken)); + + return userMessages; + } + + public virtual async Task GetUserMessagesCountAsync( + Guid sendUserId, + Guid receiveUserId, + string filter = "", + MessageType? type = null, + CancellationToken cancellationToken = default) + { + var userMessagesCount = await (await GetDbContextAsync()).Set() + .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || + x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) + .WhereIf(type != null, x => x.Type.Equals(type)) + .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) + .LongCountAsync(GetCancellationToken(cancellationToken)); + + return userMessagesCount; + } + + public virtual async Task InsertGroupMessageAsync( + GroupMessage groupMessage, + CancellationToken cancellationToken = default) + { + await (await GetDbContextAsync()).Set() + .AddAsync(groupMessage, GetCancellationToken(cancellationToken)); + } + + public virtual async Task UpdateGroupMessageAsync( + GroupMessage groupMessage, + CancellationToken cancellationToken = default) + { + (await GetDbContextAsync()).Set().Update(groupMessage); + } + + public virtual async Task InsertUserMessageAsync( + UserMessage userMessage, + CancellationToken cancellationToken = default) + { + await (await GetDbContextAsync()).Set() + .AddAsync(userMessage, GetCancellationToken(cancellationToken)); + } + + public virtual async Task UpdateUserMessageAsync( + UserMessage userMessage, + CancellationToken cancellationToken = default) + { + (await GetDbContextAsync()).Set().Update(userMessage); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatCardRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatCardRepository.cs index 637df17ef..52e22f3c9 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatCardRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatCardRepository.cs @@ -1,63 +1,74 @@ -using LINGYUN.Abp.IM; -using LINGYUN.Abp.MessageService.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class EfCoreUserChatCardRepository : EfCoreRepository, IUserChatCardRepository - { - public EfCoreUserChatCardRepository( - IDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public virtual async Task CheckUserIdExistsAsync(Guid userId, CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .AnyAsync(ucc => ucc.UserId == userId, - GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetMemberAsync(Guid findUserId, CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .Where(ucc => ucc.UserId == findUserId) - .Select(ucc => ucc.ToUserCard()) - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetMemberCountAsync(string findUserName = "", int? startAge = null, int? endAge = null, Sex? sex = null, CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .WhereIf(!findUserName.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(findUserName)) - .WhereIf(startAge.HasValue, ucc => ucc.Age >= startAge.Value) - .WhereIf(endAge.HasValue, ucc => ucc.Age <= endAge.Value) - .WhereIf(sex.HasValue, ucc => ucc.Sex == sex) - .CountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetMembersAsync(string findUserName = "", int? startAge = null, int? endAge = null, Sex? sex = null, string sorting = nameof(UserChatCard.UserId), bool reverse = false, int skipCount = 0, int maxResultCount = 10, CancellationToken cancellationToken = default) - { - sorting ??= nameof(UserChatCard.UserId); - sorting = reverse ? sorting + " desc" : sorting; - return await (await GetDbSetAsync()) - .WhereIf(!findUserName.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(findUserName)) - .WhereIf(startAge.HasValue, ucc => ucc.Age >= startAge.Value) - .WhereIf(endAge.HasValue, ucc => ucc.Age <= endAge.Value) - .WhereIf(sex.HasValue, ucc => ucc.Sex == sex) - .OrderBy(sorting) - .PageBy(skipCount, maxResultCount) - .Select(ucc => ucc.ToUserCard()) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - } -} +using LINGYUN.Abp.IM; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class EfCoreUserChatCardRepository : EfCoreRepository, IUserChatCardRepository + { + public EfCoreUserChatCardRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task CheckUserIdExistsAsync(Guid userId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AnyAsync(ucc => ucc.UserId == userId, + GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetMemberAsync(Guid findUserId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .Where(ucc => ucc.UserId == findUserId) + .Select(ucc => ucc.ToUserCard()) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetMemberCountAsync( + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .WhereIf(!findUserName.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(findUserName)) + .WhereIf(startAge.HasValue, ucc => ucc.Age >= startAge.Value) + .WhereIf(endAge.HasValue, ucc => ucc.Age <= endAge.Value) + .WhereIf(sex.HasValue, ucc => ucc.Sex == sex) + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetMembersAsync( + string findUserName = "", + int? startAge = null, + int? endAge = null, + Sex? sex = null, + string sorting = nameof(UserChatCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .WhereIf(!findUserName.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(findUserName)) + .WhereIf(startAge.HasValue, ucc => ucc.Age >= startAge.Value) + .WhereIf(endAge.HasValue, ucc => ucc.Age <= endAge.Value) + .WhereIf(sex.HasValue, ucc => ucc.Sex == sex) + .OrderBy(sorting ?? nameof(UserChatCard.UserId)) + .PageBy(skipCount, maxResultCount) + .Select(ucc => ucc.ToUserCard()) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs index 7cd10cc41..27bb479bc 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs @@ -1,220 +1,221 @@ -using LINGYUN.Abp.IM.Contract; -using LINGYUN.Abp.MessageService.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace LINGYUN.Abp.MessageService.Chat -{ - public class EfCoreUserChatFriendRepository : EfCoreRepository, IUserChatFriendRepository - { - public EfCoreUserChatFriendRepository( - IDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public virtual async Task FindByUserFriendIdAsync(Guid userId, Guid friendId, CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .Where(ucf => ucf.UserId == userId && ucf.FrientId == friendId) - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetAllMembersAsync( - Guid userId, - string sorting = nameof(UserChatFriend.RemarkName), - bool reverse = false, - CancellationToken cancellationToken = default) - { - sorting = reverse ? sorting + " DESC" : sorting; - - var dbContext = await GetDbContextAsync(); - var userFriendQuery = from ucf in dbContext.Set() - join ucc in dbContext.Set() - // on ucf.FrientId equals ucc.UserId // 查询双向好友的 - on ucf.UserId equals ucc.UserId - where ucf.UserId == userId && ucf.Status == UserFriendStatus.Added - select new UserFriend - { - Age = ucc.Age, - AvatarUrl = ucc.AvatarUrl, - Birthday = ucc.Birthday, - Black = ucf.Black, - Description = ucc.Description, - DontDisturb = ucf.DontDisturb, - FriendId = ucf.FrientId, - NickName = ucc.NickName, - RemarkName = ucf.RemarkName ?? ucc.NickName, - Sex = ucc.Sex, - Sign = ucc.Sign, - SpecialFocus = ucf.SpecialFocus, - TenantId = ucf.TenantId, - UserId = ucf.UserId, - UserName = ucc.UserName - }; - - return await userFriendQuery - .OrderBy(sorting ?? $"{nameof(UserChatFriend.RemarkName)} DESC") - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetMemberAsync(Guid userId, Guid friendId, CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var userFriendQuery = from ucf in dbContext.Set() - join ucc in dbContext.Set() - on ucf.FrientId equals ucc.UserId - where ucf.UserId == userId && ucf.FrientId == friendId && ucf.Status == UserFriendStatus.Added - select new UserFriend - { - Age = ucc.Age, - AvatarUrl = ucc.AvatarUrl, - Birthday = ucc.Birthday, - Black = ucf.Black, - Description = ucc.Description, - DontDisturb = ucf.DontDisturb, - FriendId = ucf.FrientId, - NickName = ucc.NickName, - RemarkName = ucf.RemarkName, - Sex = ucc.Sex, - Sign = ucc.Sign, - SpecialFocus = ucf.SpecialFocus, - TenantId = ucf.TenantId, - UserId = ucf.UserId, - UserName = ucc.UserName - }; - - return await userFriendQuery - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetMembersAsync(Guid userId, string filter = "", string sorting = nameof(UserChatFriend.UserId), bool reverse = false, int skipCount = 0, int maxResultCount = 10, CancellationToken cancellationToken = default) - { - sorting = reverse ? sorting + " desc" : sorting; - - var dbContext = await GetDbContextAsync(); - // 过滤用户资料 - var userChatCardQuery = dbContext.Set() - .WhereIf(!filter.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(filter) || ucc.NickName.Contains(filter)); - - // 过滤好友资料 - var userChatFriendQuery = dbContext.Set() - .Where(ucf => ucf.Status == UserFriendStatus.Added) - .WhereIf(!filter.IsNullOrWhiteSpace(), ucf => ucf.RemarkName.Contains(filter)); - - // 组合查询 - var userFriendQuery = from ucf in userChatFriendQuery - join ucc in userChatCardQuery // TODO: Need LEFT JOIN? - on ucf.FrientId equals ucc.UserId - where ucf.UserId == userId - select new UserFriend - { - Age = ucc.Age, - AvatarUrl = ucc.AvatarUrl, - Birthday = ucc.Birthday, - Black = ucf.Black, - Description = ucc.Description, - DontDisturb = ucf.DontDisturb, - FriendId = ucf.FrientId, - NickName = ucc.NickName, - RemarkName = ucf.RemarkName, - Sex = ucc.Sex, - Sign = ucc.Sign, - SpecialFocus = ucf.SpecialFocus, - TenantId = ucf.TenantId, - UserId = ucf.UserId, - UserName = ucc.UserName - }; - - return await userFriendQuery - .OrderBy(sorting) - .PageBy(skipCount, maxResultCount) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetLastContactMembersAsync( - Guid userId, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var userReceiveMsgQuery = dbContext.Set() - .Where(um => um.ReceiveUserId == userId); - - var userFriendQuery = from ucf in dbContext.Set() - join ucc in dbContext.Set() - on ucf.FrientId equals ucc.UserId - join um in userReceiveMsgQuery - on ucc.UserId equals um.CreatorId - where ucf.UserId == userId && ucf.Status == UserFriendStatus.Added - orderby um.CreationTime descending // 消息创建时间倒序 - select new UserFriend - { - Age = ucc.Age, - AvatarUrl = ucc.AvatarUrl, - Birthday = ucc.Birthday, - Black = ucf.Black, - Description = ucc.Description, - DontDisturb = ucf.DontDisturb, - FriendId = ucf.FrientId, - NickName = ucc.NickName, - RemarkName = ucf.RemarkName, - Sex = ucc.Sex, - Sign = ucc.Sign, - SpecialFocus = ucf.SpecialFocus, - TenantId = ucf.TenantId, - UserId = ucf.UserId, - UserName = ucc.UserName - }; - - return await userFriendQuery - .PageBy(skipCount, maxResultCount) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetMembersCountAsync(Guid userId, string filter = "", CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var userChatCardQuery = dbContext.Set() - .WhereIf(!filter.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(filter) || ucc.NickName.Contains(filter)); - - var userChatFriendQuery = dbContext.Set() - .Where(ucf => ucf.Status == UserFriendStatus.Added) - .WhereIf(!filter.IsNullOrWhiteSpace(), ucf => ucf.RemarkName.Contains(filter)); - - var userFriendQuery = from ucf in userChatFriendQuery - join ucc in userChatCardQuery - on ucf.FrientId equals ucc.UserId - where ucf.UserId == userId - select ucc; - - return await userFriendQuery - .CountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task IsFriendAsync( - Guid userId, - Guid frientId, - CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .AnyAsync(ucf => ucf.UserId == userId && ucf.FrientId == frientId && ucf.Status == UserFriendStatus.Added, - GetCancellationToken(cancellationToken)); - } - - public virtual async Task IsAddedAsync(Guid userId, Guid frientId, CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .AnyAsync(ucf => ucf.UserId == userId && ucf.FrientId == frientId, - GetCancellationToken(cancellationToken)); - } - } -} +using LINGYUN.Abp.IM.Contract; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class EfCoreUserChatFriendRepository : EfCoreRepository, IUserChatFriendRepository + { + public EfCoreUserChatFriendRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task FindByUserFriendIdAsync(Guid userId, Guid friendId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .Where(ucf => ucf.UserId == userId && ucf.FrientId == friendId) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetAllMembersAsync( + Guid userId, + string sorting = nameof(UserChatFriend.RemarkName), + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userFriendQuery = from ucf in dbContext.Set() + join ucc in dbContext.Set() + // on ucf.FrientId equals ucc.UserId // 查询双向好友的 + on ucf.UserId equals ucc.UserId + where ucf.UserId == userId && ucf.Status == UserFriendStatus.Added + select new UserFriend + { + Age = ucc.Age, + AvatarUrl = ucc.AvatarUrl, + Birthday = ucc.Birthday, + Black = ucf.Black, + Description = ucc.Description, + DontDisturb = ucf.DontDisturb, + FriendId = ucf.FrientId, + NickName = ucc.NickName, + RemarkName = ucf.RemarkName ?? ucc.NickName, + Sex = ucc.Sex, + Sign = ucc.Sign, + SpecialFocus = ucf.SpecialFocus, + TenantId = ucf.TenantId, + UserId = ucf.UserId, + UserName = ucc.UserName + }; + + return await userFriendQuery + .OrderBy(sorting ?? nameof(UserChatFriend.RemarkName)) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetMemberAsync(Guid userId, Guid friendId, CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userFriendQuery = from ucf in dbContext.Set() + join ucc in dbContext.Set() + on ucf.FrientId equals ucc.UserId + where ucf.UserId == userId && ucf.FrientId == friendId && ucf.Status == UserFriendStatus.Added + select new UserFriend + { + Age = ucc.Age, + AvatarUrl = ucc.AvatarUrl, + Birthday = ucc.Birthday, + Black = ucf.Black, + Description = ucc.Description, + DontDisturb = ucf.DontDisturb, + FriendId = ucf.FrientId, + NickName = ucc.NickName, + RemarkName = ucf.RemarkName, + Sex = ucc.Sex, + Sign = ucc.Sign, + SpecialFocus = ucf.SpecialFocus, + TenantId = ucf.TenantId, + UserId = ucf.UserId, + UserName = ucc.UserName + }; + + return await userFriendQuery + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetMembersAsync( + Guid userId, + string filter = "", + string sorting = nameof(UserChatFriend.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + // 过滤用户资料 + var userChatCardQuery = dbContext.Set() + .WhereIf(!filter.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(filter) || ucc.NickName.Contains(filter)); + + // 过滤好友资料 + var userChatFriendQuery = dbContext.Set() + .Where(ucf => ucf.Status == UserFriendStatus.Added) + .WhereIf(!filter.IsNullOrWhiteSpace(), ucf => ucf.RemarkName.Contains(filter)); + + // 组合查询 + var userFriendQuery = from ucf in userChatFriendQuery + join ucc in userChatCardQuery // TODO: Need LEFT JOIN? + on ucf.FrientId equals ucc.UserId + where ucf.UserId == userId + select new UserFriend + { + Age = ucc.Age, + AvatarUrl = ucc.AvatarUrl, + Birthday = ucc.Birthday, + Black = ucf.Black, + Description = ucc.Description, + DontDisturb = ucf.DontDisturb, + FriendId = ucf.FrientId, + NickName = ucc.NickName, + RemarkName = ucf.RemarkName, + Sex = ucc.Sex, + Sign = ucc.Sign, + SpecialFocus = ucf.SpecialFocus, + TenantId = ucf.TenantId, + UserId = ucf.UserId, + UserName = ucc.UserName + }; + + return await userFriendQuery + .OrderBy(sorting ?? nameof(UserChatFriend.UserId)) + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetLastContactMembersAsync( + Guid userId, + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userReceiveMsgQuery = dbContext.Set() + .Where(um => um.ReceiveUserId == userId); + + var userFriendQuery = from ucf in dbContext.Set() + join ucc in dbContext.Set() + on ucf.FrientId equals ucc.UserId + join um in userReceiveMsgQuery + on ucc.UserId equals um.CreatorId + where ucf.UserId == userId && ucf.Status == UserFriendStatus.Added + orderby um.CreationTime descending // 消息创建时间倒序 + select new UserFriend + { + Age = ucc.Age, + AvatarUrl = ucc.AvatarUrl, + Birthday = ucc.Birthday, + Black = ucf.Black, + Description = ucc.Description, + DontDisturb = ucf.DontDisturb, + FriendId = ucf.FrientId, + NickName = ucc.NickName, + RemarkName = ucf.RemarkName, + Sex = ucc.Sex, + Sign = ucc.Sign, + SpecialFocus = ucf.SpecialFocus, + TenantId = ucf.TenantId, + UserId = ucf.UserId, + UserName = ucc.UserName + }; + + return await userFriendQuery + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetMembersCountAsync(Guid userId, string filter = "", CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userChatCardQuery = dbContext.Set() + .WhereIf(!filter.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(filter) || ucc.NickName.Contains(filter)); + + var userChatFriendQuery = dbContext.Set() + .Where(ucf => ucf.Status == UserFriendStatus.Added) + .WhereIf(!filter.IsNullOrWhiteSpace(), ucf => ucf.RemarkName.Contains(filter)); + + var userFriendQuery = from ucf in userChatFriendQuery + join ucc in userChatCardQuery + on ucf.FrientId equals ucc.UserId + where ucf.UserId == userId + select ucc; + + return await userFriendQuery + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task IsFriendAsync( + Guid userId, + Guid frientId, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AnyAsync(ucf => ucf.UserId == userId && ucf.FrientId == frientId && ucf.Status == UserFriendStatus.Added, + GetCancellationToken(cancellationToken)); + } + + public virtual async Task IsAddedAsync(Guid userId, Guid frientId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AnyAsync(ucf => ucf.UserId == userId && ucf.FrientId == frientId, + GetCancellationToken(cancellationToken)); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Group/EfCoreUserChatGroupRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Group/EfCoreUserChatGroupRepository.cs index 39635bc6d..65ba42e36 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Group/EfCoreUserChatGroupRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Group/EfCoreUserChatGroupRepository.cs @@ -1,171 +1,167 @@ -using LINGYUN.Abp.IM.Group; -using LINGYUN.Abp.MessageService.Chat; -using LINGYUN.Abp.MessageService.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Internal; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace LINGYUN.Abp.MessageService.Group -{ - public class EfCoreUserChatGroupRepository : EfCoreRepository, - IUserChatGroupRepository, ITransientDependency - { - public EfCoreUserChatGroupRepository( - IDbContextProvider dbContextProvider) : base(dbContextProvider) - { - } - - public virtual async Task GetMemberAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var cardQuery = from gp in dbContext.Set() - join ucg in dbContext.Set() - on gp.GroupId equals ucg.GroupId - join ugc in dbContext.Set() - on ucg.UserId equals ugc.UserId - join uc in dbContext.Set() - on ugc.UserId equals uc.UserId - where gp.GroupId == groupId && ugc.UserId == userId - select new GroupUserCard - { - TenantId = uc.TenantId, - UserId = uc.UserId, - UserName = uc.UserName, - Age = uc.Age, - AvatarUrl = uc.AvatarUrl, - IsAdmin = ugc.IsAdmin, - IsSuperAdmin = gp.AdminUserId == uc.UserId, - GroupId = gp.GroupId, - Birthday = uc.Birthday, - Description = uc.Description, - NickName = ugc.NickName ?? uc.NickName, - Sex = uc.Sex, - Sign = uc.Sign - }; - - return await cardQuery - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetMembersAsync( - long groupId, - string sorting = nameof(UserChatCard.UserId), - bool reverse = false, - int skipCount = 0, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting ??= nameof(UserChatCard.UserId); - sorting = reverse ? sorting + " desc" : sorting; - - var dbContext = await GetDbContextAsync(); - var cardQuery = from gp in dbContext.Set() - join ucg in dbContext.Set() - on gp.GroupId equals ucg.GroupId - join ugc in dbContext.Set() - on ucg.UserId equals ugc.UserId - join uc in dbContext.Set() - on ugc.UserId equals uc.UserId - where gp.GroupId == groupId - select new GroupUserCard - { - TenantId = uc.TenantId, - UserId = uc.UserId, - UserName = uc.UserName, - Age = uc.Age, - AvatarUrl = uc.AvatarUrl, - IsAdmin = ugc.IsAdmin, - IsSuperAdmin = gp.AdminUserId == uc.UserId, - GroupId = gp.GroupId, - Birthday = uc.Birthday, - Description = uc.Description, - NickName = ugc.NickName ?? uc.NickName, - Sex = uc.Sex, - Sign = uc.Sign - }; - - return await cardQuery - .OrderBy(sorting ?? nameof(UserChatCard.UserId)) - .PageBy(skipCount, maxResultCount) - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetMembersCountAsync( - long groupId, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var cardQuery = from gp in dbContext.Set() - join ucg in dbContext.Set() - on gp.GroupId equals ucg.GroupId - join ugc in dbContext.Set() - on ucg.UserId equals ugc.UserId - join uc in dbContext.Set() - on ugc.UserId equals uc.UserId - where gp.GroupId == groupId - select ucg; - - return await cardQuery - .CountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task MemberHasInGroupAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default) - { - return await (await GetDbContextAsync()).Set() - .AnyAsync(ucg => ucg.GroupId == groupId && ucg.UserId == userId, - GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetMemberGroupsAsync( - Guid userId, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var groupQuery = from gp in dbContext.Set() - join ucg in dbContext.Set() - on gp.GroupId equals ucg.GroupId - where ucg.UserId.Equals(userId) - group ucg by new - { - gp.AllowAnonymous, - gp.AllowSendMessage, - gp.MaxUserCount, - gp.Name - } - into cg - select new IM.Group.Group - { - AllowAnonymous = cg.Key.AllowAnonymous, - AllowSendMessage = cg.Key.AllowSendMessage, - MaxUserLength = cg.Key.MaxUserCount, - Name = cg.Key.Name, - GroupUserCount = cg.Count() - }; - - return await groupQuery - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task RemoveMemberFormGroupAsync( - long groupId, - Guid userId, - CancellationToken cancellationToken = default) - { - await DeleteAsync(ucg => ucg.GroupId == groupId && ucg.UserId == userId, cancellationToken: GetCancellationToken(cancellationToken)); - } - } -} +using LINGYUN.Abp.IM.Group; +using LINGYUN.Abp.MessageService.Chat; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Internal; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace LINGYUN.Abp.MessageService.Group +{ + public class EfCoreUserChatGroupRepository : EfCoreRepository, + IUserChatGroupRepository, ITransientDependency + { + public EfCoreUserChatGroupRepository( + IDbContextProvider dbContextProvider) : base(dbContextProvider) + { + } + + public virtual async Task GetMemberAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var cardQuery = from gp in dbContext.Set() + join ucg in dbContext.Set() + on gp.GroupId equals ucg.GroupId + join ugc in dbContext.Set() + on ucg.UserId equals ugc.UserId + join uc in dbContext.Set() + on ugc.UserId equals uc.UserId + where gp.GroupId == groupId && ugc.UserId == userId + select new GroupUserCard + { + TenantId = uc.TenantId, + UserId = uc.UserId, + UserName = uc.UserName, + Age = uc.Age, + AvatarUrl = uc.AvatarUrl, + IsAdmin = ugc.IsAdmin, + IsSuperAdmin = gp.AdminUserId == uc.UserId, + GroupId = gp.GroupId, + Birthday = uc.Birthday, + Description = uc.Description, + NickName = ugc.NickName ?? uc.NickName, + Sex = uc.Sex, + Sign = uc.Sign + }; + + return await cardQuery + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetMembersAsync( + long groupId, + string sorting = nameof(UserChatCard.UserId), + int skipCount = 0, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var cardQuery = from gp in dbContext.Set() + join ucg in dbContext.Set() + on gp.GroupId equals ucg.GroupId + join ugc in dbContext.Set() + on ucg.UserId equals ugc.UserId + join uc in dbContext.Set() + on ugc.UserId equals uc.UserId + where gp.GroupId == groupId + select new GroupUserCard + { + TenantId = uc.TenantId, + UserId = uc.UserId, + UserName = uc.UserName, + Age = uc.Age, + AvatarUrl = uc.AvatarUrl, + IsAdmin = ugc.IsAdmin, + IsSuperAdmin = gp.AdminUserId == uc.UserId, + GroupId = gp.GroupId, + Birthday = uc.Birthday, + Description = uc.Description, + NickName = ugc.NickName ?? uc.NickName, + Sex = uc.Sex, + Sign = uc.Sign + }; + + return await cardQuery + .OrderBy(sorting ?? nameof(UserChatCard.UserId)) + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetMembersCountAsync( + long groupId, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var cardQuery = from gp in dbContext.Set() + join ucg in dbContext.Set() + on gp.GroupId equals ucg.GroupId + join ugc in dbContext.Set() + on ucg.UserId equals ugc.UserId + join uc in dbContext.Set() + on ugc.UserId equals uc.UserId + where gp.GroupId == groupId + select ucg; + + return await cardQuery + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task MemberHasInGroupAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default) + { + return await (await GetDbContextAsync()).Set() + .AnyAsync(ucg => ucg.GroupId == groupId && ucg.UserId == userId, + GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetMemberGroupsAsync( + Guid userId, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var groupQuery = from gp in dbContext.Set() + join ucg in dbContext.Set() + on gp.GroupId equals ucg.GroupId + where ucg.UserId.Equals(userId) + group ucg by new + { + gp.AllowAnonymous, + gp.AllowSendMessage, + gp.MaxUserCount, + gp.Name + } + into cg + select new IM.Group.Group + { + AllowAnonymous = cg.Key.AllowAnonymous, + AllowSendMessage = cg.Key.AllowSendMessage, + MaxUserLength = cg.Key.MaxUserCount, + Name = cg.Key.Name, + GroupUserCount = cg.Count() + }; + + return await groupQuery + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task RemoveMemberFormGroupAsync( + long groupId, + Guid userId, + CancellationToken cancellationToken = default) + { + await DeleteAsync(ucg => ucg.GroupId == groupId && ucg.UserId == userId, cancellationToken: GetCancellationToken(cancellationToken)); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreUserNotificationRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreUserNotificationRepository.cs index 6464527aa..0654ba881 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreUserNotificationRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreUserNotificationRepository.cs @@ -1,133 +1,129 @@ -using LINGYUN.Abp.MessageService.EntityFrameworkCore; -using LINGYUN.Abp.Notifications; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Dynamic.Core; -using System.Threading; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore; - -namespace LINGYUN.Abp.MessageService.Notifications -{ - public class EfCoreUserNotificationRepository : EfCoreRepository, - IUserNotificationRepository, ITransientDependency - { - public EfCoreUserNotificationRepository( - IDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public virtual async Task AnyAsync( - Guid userId, - long notificationId, - CancellationToken cancellationToken = default) - { - return await (await GetDbSetAsync()) - .AnyAsync(x => x.NotificationId.Equals(notificationId) && x.UserId.Equals(userId), - GetCancellationToken(cancellationToken)); - } - - public virtual async Task InsertUserNotificationsAsync( - IEnumerable userNotifications, - CancellationToken cancellationToken = default) - { - await (await GetDbSetAsync()).AddRangeAsync(userNotifications, GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetByIdAsync( - Guid userId, - long notificationId, - CancellationToken cancellationToken = default) - { - var userNofitication = await (await GetDbSetAsync()) - .Where(x => x.NotificationId.Equals(notificationId) && x.UserId.Equals(userId)) - .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); - - return userNofitication; - } - - public virtual async Task> GetNotificationsAsync( - Guid userId, - NotificationReadState? readState = null, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var userNotifilerQuery = dbContext.Set() - .Where(x => x.UserId == userId) - .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); - - var notifilerQuery = from un in userNotifilerQuery - join n in dbContext.Set() - on un.NotificationId equals n.NotificationId - select n; - - return await notifilerQuery - .OrderBy(nameof(Notification.CreationTime) + " DESC") - .Take(maxResultCount) - .AsNoTracking() - .ToListAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task GetCountAsync( - Guid userId, - string filter = "", - NotificationReadState? readState = null, - CancellationToken cancellationToken = default) - { - var dbContext = await GetDbContextAsync(); - var userNotifilerQuery = dbContext.Set() - .Where(x => x.UserId == userId) - .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); - - var notifilerQuery = from un in userNotifilerQuery - join n in dbContext.Set() - on un.NotificationId equals n.NotificationId - select n; - - return await notifilerQuery - .WhereIf(!filter.IsNullOrWhiteSpace(), nf => - nf.NotificationName.Contains(filter) || - nf.NotificationTypeName.Contains(filter)) - .CountAsync(GetCancellationToken(cancellationToken)); - } - - public virtual async Task> GetListAsync( - Guid userId, - string filter = "", - string sorting = nameof(Notification.CreationTime), - bool reverse = true, - NotificationReadState? readState = null, - int skipCount = 1, - int maxResultCount = 10, - CancellationToken cancellationToken = default) - { - sorting ??= nameof(Notification.CreationTime); - sorting = reverse ? sorting + " DESC" : sorting; - - var dbContext = await GetDbContextAsync(); - var userNotifilerQuery = dbContext.Set() - .Where(x => x.UserId == userId) - .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); - - var notifilerQuery = from un in userNotifilerQuery - join n in dbContext.Set() - on un.NotificationId equals n.NotificationId - select n; - - return await notifilerQuery - .WhereIf(!filter.IsNullOrWhiteSpace(), nf => - nf.NotificationName.Contains(filter) || - nf.NotificationTypeName.Contains(filter)) - .OrderBy(sorting) - .PageBy(skipCount, maxResultCount) - .AsNoTracking() - .ToListAsync(GetCancellationToken(cancellationToken)); - } - } -} +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using LINGYUN.Abp.Notifications; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace LINGYUN.Abp.MessageService.Notifications +{ + public class EfCoreUserNotificationRepository : EfCoreRepository, + IUserNotificationRepository, ITransientDependency + { + public EfCoreUserNotificationRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task AnyAsync( + Guid userId, + long notificationId, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AnyAsync(x => x.NotificationId.Equals(notificationId) && x.UserId.Equals(userId), + GetCancellationToken(cancellationToken)); + } + + public virtual async Task InsertUserNotificationsAsync( + IEnumerable userNotifications, + CancellationToken cancellationToken = default) + { + await (await GetDbSetAsync()).AddRangeAsync(userNotifications, GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetByIdAsync( + Guid userId, + long notificationId, + CancellationToken cancellationToken = default) + { + var userNofitication = await (await GetDbSetAsync()) + .Where(x => x.NotificationId.Equals(notificationId) && x.UserId.Equals(userId)) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + + return userNofitication; + } + + public virtual async Task> GetNotificationsAsync( + Guid userId, + NotificationReadState? readState = null, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userNotifilerQuery = dbContext.Set() + .Where(x => x.UserId == userId) + .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); + + var notifilerQuery = from un in userNotifilerQuery + join n in dbContext.Set() + on un.NotificationId equals n.NotificationId + select n; + + return await notifilerQuery + .OrderBy(nameof(Notification.CreationTime) + " DESC") + .Take(maxResultCount) + .AsNoTracking() + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task GetCountAsync( + Guid userId, + string filter = "", + NotificationReadState? readState = null, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userNotifilerQuery = dbContext.Set() + .Where(x => x.UserId == userId) + .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); + + var notifilerQuery = from un in userNotifilerQuery + join n in dbContext.Set() + on un.NotificationId equals n.NotificationId + select n; + + return await notifilerQuery + .WhereIf(!filter.IsNullOrWhiteSpace(), nf => + nf.NotificationName.Contains(filter) || + nf.NotificationTypeName.Contains(filter)) + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public virtual async Task> GetListAsync( + Guid userId, + string filter = "", + string sorting = nameof(Notification.CreationTime), + NotificationReadState? readState = null, + int skipCount = 1, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var userNotifilerQuery = dbContext.Set() + .Where(x => x.UserId == userId) + .WhereIf(readState.HasValue, x => x.ReadStatus == readState.Value); + + var notifilerQuery = from un in userNotifilerQuery + join n in dbContext.Set() + on un.NotificationId equals n.NotificationId + select n; + + return await notifilerQuery + .WhereIf(!filter.IsNullOrWhiteSpace(), nf => + nf.NotificationName.Contains(filter) || + nf.NotificationTypeName.Contains(filter)) + .OrderBy(sorting ??= nameof(Notification.CreationTime)) + .PageBy(skipCount, maxResultCount) + .AsNoTracking() + .ToListAsync(GetCancellationToken(cancellationToken)); + } + } +} diff --git a/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN.Abp.WeChat.csproj b/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN.Abp.WeChat.csproj index 359b2c6a8..7f70d5817 100644 --- a/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN.Abp.WeChat.csproj +++ b/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN.Abp.WeChat.csproj @@ -1,4 +1,4 @@ - + @@ -21,7 +21,7 @@ - + diff --git a/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN/Abp/WeChat/AbpWeChatModule.cs b/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN/Abp/WeChat/AbpWeChatModule.cs index f72cbcb8c..cf692fda7 100644 --- a/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN/Abp/WeChat/AbpWeChatModule.cs +++ b/aspnet-core/modules/wechat/LINGYUN.Abp.WeChat/LINGYUN/Abp/WeChat/AbpWeChatModule.cs @@ -1,6 +1,5 @@ using LINGYUN.Abp.WeChat.Localization; using Microsoft.Extensions.DependencyInjection; -using Polly; using System; using Volo.Abp.Caching; using Volo.Abp.Features; @@ -37,8 +36,7 @@ namespace LINGYUN.Abp.WeChat options => { options.BaseAddress = new Uri("https://api.weixin.qq.com"); - }).AddTransientHttpErrorPolicy(builder => - builder.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i)))); + }); } } } diff --git a/aspnet-core/services/account/AuthServer.Host/Startup.cs b/aspnet-core/services/account/AuthServer.Host/Startup.cs index 5f469b45f..ed49d6522 100644 --- a/aspnet-core/services/account/AuthServer.Host/Startup.cs +++ b/aspnet-core/services/account/AuthServer.Host/Startup.cs @@ -1,20 +1,33 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace AuthServer.Host -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace AuthServer.Host +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // 搜索 Modules 目录下所有文件作为插件 + // 取消显示引用所有其他项目的模块,改为通过插件的形式引用 + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/BackendAdminHostModule.cs b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/BackendAdminHostModule.cs index 263345da7..dd05df80c 100644 --- a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/BackendAdminHostModule.cs +++ b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/BackendAdminHostModule.cs @@ -1,23 +1,16 @@ using DotNetCore.CAP; -using LINGYUN.Abp.Aliyun.SettingManagement; using LINGYUN.Abp.AspNetCore.HttpOverrides; using LINGYUN.Abp.Auditing; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling; using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.FeatureManagement; -using LINGYUN.Abp.LocalizationManagement; using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore; -using LINGYUN.Abp.MessageService; using LINGYUN.Abp.MultiTenancy.DbFinder; -using LINGYUN.Abp.OssManagement; using LINGYUN.Abp.PermissionManagement.Identity; using LINGYUN.Abp.SettingManagement; using LINGYUN.Abp.Sms.Aliyun; using LINGYUN.Abp.TenantManagement; -using LINGYUN.Abp.WeChat.SettingManagement; -using LINGYUN.ApiGateway; -using LINGYUN.Platform; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.DataProtection; @@ -51,7 +44,6 @@ using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.Identity.EntityFrameworkCore; using Volo.Abp.Identity.Localization; using Volo.Abp.IdentityServer.EntityFrameworkCore; -using Volo.Abp.Json; using Volo.Abp.Json.SystemTextJson; using Volo.Abp.Localization; using Volo.Abp.Modularity; @@ -71,14 +63,6 @@ namespace LINGYUN.Abp.BackendAdmin { [DependsOn( typeof(AbpAspNetCoreMvcUiMultiTenancyModule), - typeof(PlatformApplicationContractModule), - typeof(ApiGatewayApplicationContractsModule), - typeof(AbpOssManagementApplicationContractsModule), - typeof(AbpMessageServiceApplicationContractsModule), - typeof(AbpLocalizationManagementApplicationContractsModule), - typeof(LINGYUN.Abp.Account.AbpAccountApplicationContractsModule),// 引用类似的包主要用于聚合权限管理和设置 - typeof(LINGYUN.Abp.Identity.AbpIdentityApplicationContractsModule), - typeof(LINGYUN.Abp.IdentityServer.AbpIdentityServerApplicationContractsModule), typeof(AbpSettingManagementApplicationModule), typeof(AbpSettingManagementHttpApiModule), typeof(AbpPermissionManagementApplicationModule), @@ -90,8 +74,6 @@ namespace LINGYUN.Abp.BackendAdmin typeof(AbpAuditingHttpApiModule), typeof(AbpTenantManagementApplicationModule), typeof(AbpTenantManagementHttpApiModule), - typeof(AbpWeChatSettingManagementModule),// 微信配置管理模块 - typeof(AbpAliyunSettingManagementModule),// 阿里云配置管理模块 typeof(AbpEntityFrameworkCoreMySQLModule), typeof(AbpIdentityEntityFrameworkCoreModule),// 用户角色权限需要引用包 typeof(AbpIdentityServerEntityFrameworkCoreModule), // 客户端权限需要引用包 diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Dockerfile b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Dockerfile index d6224c2ed..e3a75024b 100644 --- a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Dockerfile +++ b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Dockerfile @@ -1,13 +1,14 @@ -FROM mcr.microsoft.com/dotnet/aspnet:5.0 -LABEL maintainer="colin.in@foxmail.com" -WORKDIR /app - -COPY . /app - -ENV TZ=Asia/Shanghai -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone - -EXPOSE 80/tcp -VOLUME [ "./app/Logs" ] - -ENTRYPOINT ["dotnet", "LINGYUN.Abp.BackendAdmin.HttpApi.Host.dll"] +FROM mcr.microsoft.com/dotnet/aspnet:5.0 +LABEL maintainer="colin.in@foxmail.com" +WORKDIR /app + +COPY . /app + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone + +EXPOSE 80/tcp +VOLUME [ "./app/Logs" ] +VOLUME [ "./app/Modules" ] + +ENTRYPOINT ["dotnet", "LINGYUN.Abp.BackendAdmin.HttpApi.Host.dll"] diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj index 6e3d9a6a5..78f076351 100644 --- a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj +++ b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/LINGYUN.Abp.BackendAdmin.HttpApi.Host.csproj @@ -59,37 +59,25 @@ - - - - - - - + - - - - - - diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Account.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Account.Application.Contracts.dll new file mode 100644 index 000000000..a5cb1e8f1 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Account.Application.Contracts.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.SettingManagement.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.SettingManagement.dll new file mode 100644 index 000000000..27ffae253 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.SettingManagement.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.dll new file mode 100644 index 000000000..8ed2a4436 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Aliyun.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.IM.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.IM.dll new file mode 100644 index 000000000..07dbae98f Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.IM.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Identity.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Identity.Application.Contracts.dll new file mode 100644 index 000000000..541e5555c Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Identity.Application.Contracts.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Identity.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Identity.Domain.Shared.dll new file mode 100644 index 000000000..932ae87cb Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Identity.Domain.Shared.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.IdentityServer.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.IdentityServer.Application.Contracts.dll new file mode 100644 index 000000000..02deb108a Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.IdentityServer.Application.Contracts.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.LocalizationManagement.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.LocalizationManagement.Application.Contracts.dll new file mode 100644 index 000000000..50c9df8c9 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.LocalizationManagement.Application.Contracts.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.LocalizationManagement.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.LocalizationManagement.Domain.Shared.dll new file mode 100644 index 000000000..5854af11b Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.LocalizationManagement.Domain.Shared.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.MessageService.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.MessageService.Application.Contracts.dll new file mode 100644 index 000000000..5a731b46a Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.MessageService.Application.Contracts.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.MessageService.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.MessageService.Domain.Shared.dll new file mode 100644 index 000000000..76ff2cc90 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.MessageService.Domain.Shared.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Notifications.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Notifications.dll new file mode 100644 index 000000000..edc4fc375 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Notifications.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.OssManagement.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.OssManagement.Application.Contracts.dll new file mode 100644 index 000000000..782654ebf Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.OssManagement.Application.Contracts.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.OssManagement.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.OssManagement.Domain.Shared.dll new file mode 100644 index 000000000..6f7b76e2b Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.OssManagement.Domain.Shared.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.RealTime.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.RealTime.dll new file mode 100644 index 000000000..308204054 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.RealTime.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Sms.Aliyun.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Sms.Aliyun.dll new file mode 100644 index 000000000..870954dca Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.Sms.Aliyun.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.MiniProgram.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.MiniProgram.dll new file mode 100644 index 000000000..6193ee578 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.MiniProgram.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.Official.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.Official.dll new file mode 100644 index 000000000..4d4a948e2 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.Official.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.SettingManagement.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.SettingManagement.dll new file mode 100644 index 000000000..7cce1d8d0 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.SettingManagement.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.dll new file mode 100644 index 000000000..2a33ea125 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Abp.WeChat.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Application.Contracts.dll new file mode 100644 index 000000000..362cb560e Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Application.Contracts.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Domain.Shared.dll new file mode 100644 index 000000000..d68c69049 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.ApiGateway.Domain.Shared.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Application.Contracts.dll new file mode 100644 index 000000000..0b325ba4d Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Application.Contracts.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Domain.Shared.dll new file mode 100644 index 000000000..478bf9017 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/LINGYUN.Platform.Domain.Shared.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Account.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Account.Application.Contracts.dll new file mode 100644 index 000000000..bec3e97ba Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Account.Application.Contracts.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Identity.Application.Contracts.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Identity.Application.Contracts.dll new file mode 100644 index 000000000..5dc16f35d Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Identity.Application.Contracts.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Identity.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Identity.Domain.Shared.dll new file mode 100644 index 000000000..ce7b2982c Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Identity.Domain.Shared.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.IdentityServer.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.IdentityServer.Domain.Shared.dll new file mode 100644 index 000000000..eb51f937d Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.IdentityServer.Domain.Shared.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Abstractions.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Abstractions.dll new file mode 100644 index 000000000..8749e3934 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Abstractions.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Domain.Shared.dll b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Domain.Shared.dll new file mode 100644 index 000000000..b1ec3c0a2 Binary files /dev/null and b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/Volo.Abp.Users.Domain.Shared.dll differ diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Properties/launchSettings.json b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Properties/launchSettings.json index 9388bc29c..7a6916353 100644 --- a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Properties/launchSettings.json +++ b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Properties/launchSettings.json @@ -1,20 +1,20 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:54521", - "sslPort": 0 - } - }, - "profiles": { - "LINGYUN.Abp.BackendAdminApp.Host": { - "commandName": "Project", - "launchBrowser": false, - "applicationUrl": "http://0.0.0.0:30010", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:54521", + "sslPort": 0 + } + }, + "profiles": { + "LINGYUN.Abp.BackendAdminApp.Host": { + "commandName": "Project", + "launchBrowser": false, + "applicationUrl": "http://0.0.0.0:30010", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Startup.cs b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Startup.cs index 734395818..e1edd53ec 100644 --- a/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.Abp.BackendAdmin -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.Abp.BackendAdmin +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // 搜索 Modules 目录下所有文件作为插件 + // 取消显示引用所有其他项目的模块,改为通过插件的形式引用 + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/Startup.cs b/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/Startup.cs index 956b8f5bc..e7f68a9ea 100644 --- a/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/Startup.cs +++ b/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.ApiGateway -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.ApiGateway +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // Modules Ŀ¼ļΪ + // ȡʾĿģ飬Ϊͨʽ + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/apigateway/LINGYUN.ApiGateway.HttpApi.Host/Startup.cs b/aspnet-core/services/apigateway/LINGYUN.ApiGateway.HttpApi.Host/Startup.cs index a48493cbb..58fed07bb 100644 --- a/aspnet-core/services/apigateway/LINGYUN.ApiGateway.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/apigateway/LINGYUN.ApiGateway.HttpApi.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.ApiGateway -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.ApiGateway +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // 搜索 Modules 目录下所有文件作为插件 + // 取消显示引用所有其他项目的模块,改为通过插件的形式引用 + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/Startup.cs b/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/Startup.cs index 116954420..d88b092f2 100644 --- a/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.Abp.IdentityServer4 -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.Abp.IdentityServer4 +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // Modules Ŀ¼ļΪ + // ȡʾĿģ飬Ϊͨʽ + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } } \ No newline at end of file diff --git a/aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/Startup.cs b/aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/Startup.cs index 5976dbf86..dcc2112fe 100644 --- a/aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/localization/LINGYUN.Abp.LocalizationManagement.HttpApi.Host/Startup.cs @@ -1,25 +1,38 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.LocalizationManagement -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.Abp.LocalizationManagement +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // Modules Ŀ¼ļΪ + // ȡʾĿģ飬Ϊͨʽ + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Startup.cs b/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Startup.cs index ad091b0da..21396aba9 100644 --- a/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.Abp.MessageService -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.Abp.MessageService +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // Modules Ŀ¼ļΪ + // ȡʾĿģ飬Ϊͨʽ + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Startup.cs b/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Startup.cs index f92b5443a..981834511 100644 --- a/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Startup.cs +++ b/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Startup.cs @@ -1,18 +1,31 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace LINGYUN.Platform -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System.IO; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace LINGYUN.Platform +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddApplication(options => + { + // Modules Ŀ¼ļΪ + // ȡʾĿģ飬Ϊͨʽ + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + } + + public void Configure(IApplicationBuilder app) + { + app.InitializeApplication(); + } + } +} diff --git a/build/build-aspnetcore-ef-update.ps1 b/build/build-aspnetcore-ef-update.ps1 index 626935f6e..1b6a3e55b 100644 --- a/build/build-aspnetcore-ef-update.ps1 +++ b/build/build-aspnetcore-ef-update.ps1 @@ -1,9 +1,9 @@ -. "./build-aspnetcore-common.ps1" - -# Build all solutions -foreach ($service in $serviceArray) { - Set-Location $service.Path - dotnet ef database update -} - +. "./build-aspnetcore-common.ps1" + +# Build all solutions +foreach ($service in $serviceArray) { + Set-Location $service.Path + dotnet ef database update +} + Set-Location $rootFolder \ No newline at end of file diff --git a/build/build-aspnetcore-modules.ps1 b/build/build-aspnetcore-modules.ps1 new file mode 100644 index 000000000..6dda28d82 --- /dev/null +++ b/build/build-aspnetcore-modules.ps1 @@ -0,0 +1,31 @@ +# COMMON PATHS + +$rootFolder = (Get-Item -Path "./" -Verbose).FullName + +# List of solutions used only in development mode +$dependenciesFile = Join-Path $rootFolder "../build/modules.dependencies.json" + +function ReadFile($path) { + return (Get-Content -Raw -Encoding "UTF8" -Path "$path" ) +} + +function ReadJsonFile($path) { + $content = ReadFile $path + return ConvertFrom-Json -InputObject $content +} + +$modules = (ReadJsonFile -path $dependenciesFile) + +foreach ($module in $modules) { + foreach ($dependencieRoot in $module.dependencies) { + foreach ($dependencie in $dependencieRoot.dependencies) { + $thisPath = Join-Path $rootFolder $dependencieRoot.depPath + $modulePath = Join-Path $rootFolder $dependencieRoot.path + Write-host $thisPath + if (!(Test-Path $modulePath)) { + New-Item -ItemType Directory -Force -Path $modulePath + } + Copy-Item (Join-Path $thisPath $dependencie) -Destination $modulePath + } + } +} diff --git a/build/modules.dependencies.json b/build/modules.dependencies.json new file mode 100644 index 000000000..c92a05f33 --- /dev/null +++ b/build/modules.dependencies.json @@ -0,0 +1,51 @@ +[ + { + "tag": "net5.0", + "dependencies": [ + { + "service": "Backend-Admin", + "path": "/../aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/", + "depPath": "/../aspnet-core/LocalNuget/net5.0/", + "dependencies": [ + "LINGYUN.ApiGateway.Application.Contracts.dll", + "LINGYUN.ApiGateway.Domain.Shared.dll", + "LINGYUN.Abp.Aliyun.SettingManagement.dll", + "LINGYUN.Abp.Sms.Aliyun.dll", + "LINGYUN.Abp.Aliyun.dll", + "LINGYUN.Abp.WeChat.MiniProgram.dll", + "LINGYUN.Abp.WeChat.Official.dll", + "LINGYUN.Abp.WeChat.dll", + "LINGYUN.Abp.WeChat.SettingManagement.dll", + "LINGYUN.Abp.LocalizationManagement.Application.Contracts.dll", + "LINGYUN.Abp.LocalizationManagement.Domain.Shared.dll", + "LINGYUN.Abp.OssManagement.Application.Contracts.dll", + "LINGYUN.Abp.OssManagement.Domain.Shared.dll", + "LINGYUN.Abp.MessageService.Application.Contracts.dll", + "LINGYUN.Abp.IM.dll", + "LINGYUN.Abp.MessageService.Domain.Shared.dll", + "LINGYUN.Abp.RealTime.dll", + "LINGYUN.Abp.Notifications.dll", + "LINGYUN.Platform.Application.Contracts.dll", + "LINGYUN.Platform.Domain.Shared.dll" + ] + }, + { + "service": "Backend-Admin", + "path": "/../aspnet-core/services/admin/LINGYUN.Abp.BackendAdmin.HttpApi.Host/Modules/", + "depPath": "/../aspnet-core/services/identity-server/LINGYUN.Abp.IdentityServer4.HttpApi.Host/bin/Debug/net5.0", + "dependencies": [ + "LINGYUN.Abp.Account.Application.Contracts.dll", + "Volo.Abp.Account.Application.Contracts.dll", + "Volo.Abp.Identity.Application.Contracts.dll", + "LINGYUN.Abp.Identity.Application.Contracts.dll", + "LINGYUN.Abp.Identity.Domain.Shared.dll", + "Volo.Abp.Identity.Domain.Shared.dll", + "Volo.Abp.Users.Domain.Shared.dll", + "Volo.Abp.Users.Abstractions.dll", + "LINGYUN.Abp.IdentityServer.Application.Contracts.dll", + "Volo.Abp.IdentityServer.Domain.Shared.dll" + ] + } + ] + } +] \ No newline at end of file diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 5d31ac5c7..ee30631c4 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -4,60 +4,61 @@ services: identity-server-sts: build: context: ./aspnet-core/services/Publish/identityserver - volumes: + volumes: - /var/opt/abp/logs/ids-sts:/app/Logs restart: always identity-server-admin: build: context: ./aspnet-core/services/Publish/identityserver4-admin - volumes: + volumes: - /var/opt/abp/logs/ids-admin:/app/Logs - depends_on: + depends_on: - identity-server-sts restart: always admin-service: build: context: ./aspnet-core/services/Publish/admin - volumes: + volumes: - /var/opt/abp/logs/backend-admin:/app/Logs - depends_on: + - /var/opt/abp/data/backend-admin/Modules:/app/Modules + depends_on: - identity-server-sts restart: always localization-service: build: context: ./aspnet-core/services/Publish/localization - volumes: + volumes: - /var/opt/abp/logs/localization:/app/Logs restart: always platform-service: build: context: ./aspnet-core/services/Publish/platform - volumes: + volumes: - /var/opt/abp/logs/platform:/app/Logs - /var/opt/abp/data/platform:/app/file-blob-storing - depends_on: + depends_on: - identity-server-sts restart: always messages-service: build: context: ./aspnet-core/services/Publish/messages - volumes: + volumes: - /var/opt/abp/logs/messages:/app/Logs - depends_on: + depends_on: - identity-server-sts restart: always - + apigateway-admin-service: build: context: ./aspnet-core/services/Publish/apigateway-admin - volumes: + volumes: - /var/opt/abp/logs/apigateway-admin:/app/Logs - depends_on: + depends_on: - identity-server-sts - admin-service restart: always @@ -65,9 +66,9 @@ services: apigateway-host-service: build: context: ./aspnet-core/services/Publish/apigateway-host - volumes: + volumes: - /var/opt/abp/logs/apigateway-host:/app/Logs - depends_on: + depends_on: - identity-server-sts - apigateway-admin-service restart: always @@ -76,9 +77,9 @@ services: build: context: ./aspnet-core/services/Publish/client restart: always - + volumes: dbdata: -networks: +networks: linyun-abp: