committed by
GitHub
304 changed files with 12577 additions and 3040 deletions
@ -0,0 +1,91 @@ |
|||||
|
|
||||
|
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", "{630FB448-8C5C-438F-930D-B0209407DE6A}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{F3B1B755-37B6-420B-9E82-A5BDFF2BF647}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apigateway", "apigateway", "{AD93DD04-989C-40BE-A3F4-25DABF290423}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Host", "services\apigateway\LINGYUN.ApiGateway.Host\LINGYUN.ApiGateway.Host.csproj", "{A9D125BB-3C5A-4083-AD30-B88947460556}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi.Host", "services\apigateway\LINGYUN.ApiGateway.HttpApi.Host\LINGYUN.ApiGateway.HttpApi.Host.csproj", "{54987DD7-5311-430D-BAFF-9F856468C893}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Domain.Shared", "modules\apigateway\LINGYUN.ApiGateway.Domain.Shared\LINGYUN.ApiGateway.Domain.Shared.csproj", "{DE80ED02-D021-497A-94D9-AD0BA042EA3F}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Domain", "modules\apigateway\LINGYUN.ApiGateway.Domain\LINGYUN.ApiGateway.Domain.csproj", "{38A8F904-E894-4C3D-9C35-DCD6E544AE43}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Application.Contracts", "modules\apigateway\LINGYUN.ApiGateway.Application.Contracts\LINGYUN.ApiGateway.Application.Contracts.csproj", "{F716F299-267B-430C-BC7F-ECE7E8AB2351}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.Application", "modules\apigateway\LINGYUN.ApiGateway.Application\LINGYUN.ApiGateway.Application.csproj", "{B045F4B7-AE0E-4403-B7C2-A66B06CF6A62}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.EntityFrameworkCore", "modules\apigateway\LINGYUN.ApiGateway.EntityFrameworkCore\LINGYUN.ApiGateway.EntityFrameworkCore.csproj", "{4D686265-3927-43F5-B9BF-8A013F8BC9E8}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi", "modules\apigateway\LINGYUN.ApiGateway.HttpApi\LINGYUN.ApiGateway.HttpApi.csproj", "{D890BEBE-563A-47ED-B767-2E80077B5D37}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.ApiGateway.HttpApi.Client", "modules\apigateway\LINGYUN.ApiGateway.HttpApi.Client\LINGYUN.ApiGateway.HttpApi.Client.csproj", "{4757C7D9-6AE9-477D-9829-55D9906AC3E6}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{A9D125BB-3C5A-4083-AD30-B88947460556}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{A9D125BB-3C5A-4083-AD30-B88947460556}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{A9D125BB-3C5A-4083-AD30-B88947460556}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{A9D125BB-3C5A-4083-AD30-B88947460556}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{54987DD7-5311-430D-BAFF-9F856468C893}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{54987DD7-5311-430D-BAFF-9F856468C893}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{54987DD7-5311-430D-BAFF-9F856468C893}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{54987DD7-5311-430D-BAFF-9F856468C893}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{DE80ED02-D021-497A-94D9-AD0BA042EA3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{DE80ED02-D021-497A-94D9-AD0BA042EA3F}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{DE80ED02-D021-497A-94D9-AD0BA042EA3F}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{DE80ED02-D021-497A-94D9-AD0BA042EA3F}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{38A8F904-E894-4C3D-9C35-DCD6E544AE43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{38A8F904-E894-4C3D-9C35-DCD6E544AE43}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{38A8F904-E894-4C3D-9C35-DCD6E544AE43}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{38A8F904-E894-4C3D-9C35-DCD6E544AE43}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{F716F299-267B-430C-BC7F-ECE7E8AB2351}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{F716F299-267B-430C-BC7F-ECE7E8AB2351}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{F716F299-267B-430C-BC7F-ECE7E8AB2351}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{F716F299-267B-430C-BC7F-ECE7E8AB2351}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{B045F4B7-AE0E-4403-B7C2-A66B06CF6A62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{B045F4B7-AE0E-4403-B7C2-A66B06CF6A62}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{B045F4B7-AE0E-4403-B7C2-A66B06CF6A62}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{B045F4B7-AE0E-4403-B7C2-A66B06CF6A62}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{4D686265-3927-43F5-B9BF-8A013F8BC9E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{4D686265-3927-43F5-B9BF-8A013F8BC9E8}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{4D686265-3927-43F5-B9BF-8A013F8BC9E8}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{4D686265-3927-43F5-B9BF-8A013F8BC9E8}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{D890BEBE-563A-47ED-B767-2E80077B5D37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{D890BEBE-563A-47ED-B767-2E80077B5D37}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{D890BEBE-563A-47ED-B767-2E80077B5D37}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{D890BEBE-563A-47ED-B767-2E80077B5D37}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{4757C7D9-6AE9-477D-9829-55D9906AC3E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{4757C7D9-6AE9-477D-9829-55D9906AC3E6}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{4757C7D9-6AE9-477D-9829-55D9906AC3E6}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{4757C7D9-6AE9-477D-9829-55D9906AC3E6}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(SolutionProperties) = preSolution |
||||
|
HideSolutionNode = FALSE |
||||
|
EndGlobalSection |
||||
|
GlobalSection(NestedProjects) = preSolution |
||||
|
{AD93DD04-989C-40BE-A3F4-25DABF290423} = {630FB448-8C5C-438F-930D-B0209407DE6A} |
||||
|
{A9D125BB-3C5A-4083-AD30-B88947460556} = {F3B1B755-37B6-420B-9E82-A5BDFF2BF647} |
||||
|
{54987DD7-5311-430D-BAFF-9F856468C893} = {F3B1B755-37B6-420B-9E82-A5BDFF2BF647} |
||||
|
{DE80ED02-D021-497A-94D9-AD0BA042EA3F} = {AD93DD04-989C-40BE-A3F4-25DABF290423} |
||||
|
{38A8F904-E894-4C3D-9C35-DCD6E544AE43} = {AD93DD04-989C-40BE-A3F4-25DABF290423} |
||||
|
{F716F299-267B-430C-BC7F-ECE7E8AB2351} = {AD93DD04-989C-40BE-A3F4-25DABF290423} |
||||
|
{B045F4B7-AE0E-4403-B7C2-A66B06CF6A62} = {AD93DD04-989C-40BE-A3F4-25DABF290423} |
||||
|
{4D686265-3927-43F5-B9BF-8A013F8BC9E8} = {AD93DD04-989C-40BE-A3F4-25DABF290423} |
||||
|
{D890BEBE-563A-47ED-B767-2E80077B5D37} = {AD93DD04-989C-40BE-A3F4-25DABF290423} |
||||
|
{4757C7D9-6AE9-477D-9829-55D9906AC3E6} = {AD93DD04-989C-40BE-A3F4-25DABF290423} |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ExtensibilityGlobals) = postSolution |
||||
|
SolutionGuid = {B327C65A-BD15-480D-825E-9D5A870C521A} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
@ -0,0 +1,131 @@ |
|||||
|
|
||||
|
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", "{ED23B2F3-87C1-44B6-8906-9DE739422C2C}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{1E8D56FE-2FA1-4041-AB69-00952BF42EC9}" |
||||
|
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", "{A12DB303-F90B-4E56-B99F-A40816FCB04A}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tenant-management", "tenant-management", "{CB1A2EB0-34D4-41C4-BF01-C99EFBBF09EE}" |
||||
|
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", "{926E8543-6A0E-4B36-8F3C-9278281E3420}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.Application", "modules\tenants\LINGYUN.Abp.TenantManagement.Application\LINGYUN.Abp.TenantManagement.Application.csproj", "{0DDA914E-CE2A-446F-A43D-09C52704D39C}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TenantManagement.HttpApi", "modules\tenants\LINGYUN.Abp.TenantManagement.HttpApi\LINGYUN.Abp.TenantManagement.HttpApi.csproj", "{E7185ACE-4D40-4215-BBD7-73D2DB69F482}" |
||||
|
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", "{011F5FF0-468F-4423-8DC3-C3ECC3F63829}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "setting-management", "setting-management", "{202AC90B-0E4A-44B4-9A9D-3C869D0D4B8E}" |
||||
|
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", "{35A4661D-12A0-47A9-ACC6-111D1474A88B}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application", "modules\settings\LINGYUN.Abp.SettingManagement.Application\LINGYUN.Abp.SettingManagement.Application.csproj", "{9EAAB564-5971-4AE3-9228-3953C228A890}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.HttpApi", "modules\settings\LINGYUN.Abp.SettingManagement.HttpApi\LINGYUN.Abp.SettingManagement.HttpApi.csproj", "{5BAC138C-2AD5-426E-9D85-BDC6A0B38787}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "auditing", "auditing", "{709E77F9-DABF-47D3-A86E-40CD5448B1E5}" |
||||
|
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", "{BE063443-09F6-4611-AE17-811AD00D51E9}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application", "modules\auditing\LINGYUN.Abp.Auditing.Application\LINGYUN.Abp.Auditing.Application.csproj", "{69CBAE90-D5BE-4362-98DE-1505A59DD0A6}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.HttpApi", "modules\auditing\LINGYUN.Abp.Auditing.HttpApi\LINGYUN.Abp.Auditing.HttpApi.csproj", "{DAD70E78-D4A1-4B19-AF11-9236825FF013}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{2F56344F-6E06-4F9B-A0F2-8A6F0AEB096A}" |
||||
|
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", "{376B2235-ADA7-4EC7-A27D-8F97EC6A57CD}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "permissions-management", "permissions-management", "{D25C4814-71AB-4A9D-8C76-298A7DE1A747}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Domain\LINGYUN.Abp.PermissionManagement.Domain.csproj", "{7521486D-2144-4AFA-86AD-8E8021479DE6}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{A12DB303-F90B-4E56-B99F-A40816FCB04A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{A12DB303-F90B-4E56-B99F-A40816FCB04A}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{A12DB303-F90B-4E56-B99F-A40816FCB04A}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{A12DB303-F90B-4E56-B99F-A40816FCB04A}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{926E8543-6A0E-4B36-8F3C-9278281E3420}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{926E8543-6A0E-4B36-8F3C-9278281E3420}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{926E8543-6A0E-4B36-8F3C-9278281E3420}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{926E8543-6A0E-4B36-8F3C-9278281E3420}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{0DDA914E-CE2A-446F-A43D-09C52704D39C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{0DDA914E-CE2A-446F-A43D-09C52704D39C}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{0DDA914E-CE2A-446F-A43D-09C52704D39C}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{0DDA914E-CE2A-446F-A43D-09C52704D39C}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{E7185ACE-4D40-4215-BBD7-73D2DB69F482}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{E7185ACE-4D40-4215-BBD7-73D2DB69F482}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{E7185ACE-4D40-4215-BBD7-73D2DB69F482}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{E7185ACE-4D40-4215-BBD7-73D2DB69F482}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{011F5FF0-468F-4423-8DC3-C3ECC3F63829}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{011F5FF0-468F-4423-8DC3-C3ECC3F63829}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{011F5FF0-468F-4423-8DC3-C3ECC3F63829}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{011F5FF0-468F-4423-8DC3-C3ECC3F63829}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{35A4661D-12A0-47A9-ACC6-111D1474A88B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{35A4661D-12A0-47A9-ACC6-111D1474A88B}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{35A4661D-12A0-47A9-ACC6-111D1474A88B}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{35A4661D-12A0-47A9-ACC6-111D1474A88B}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{9EAAB564-5971-4AE3-9228-3953C228A890}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{9EAAB564-5971-4AE3-9228-3953C228A890}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{9EAAB564-5971-4AE3-9228-3953C228A890}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{9EAAB564-5971-4AE3-9228-3953C228A890}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{5BAC138C-2AD5-426E-9D85-BDC6A0B38787}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{5BAC138C-2AD5-426E-9D85-BDC6A0B38787}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{5BAC138C-2AD5-426E-9D85-BDC6A0B38787}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{5BAC138C-2AD5-426E-9D85-BDC6A0B38787}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{BE063443-09F6-4611-AE17-811AD00D51E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{BE063443-09F6-4611-AE17-811AD00D51E9}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{BE063443-09F6-4611-AE17-811AD00D51E9}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{BE063443-09F6-4611-AE17-811AD00D51E9}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{69CBAE90-D5BE-4362-98DE-1505A59DD0A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{69CBAE90-D5BE-4362-98DE-1505A59DD0A6}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{69CBAE90-D5BE-4362-98DE-1505A59DD0A6}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{69CBAE90-D5BE-4362-98DE-1505A59DD0A6}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{DAD70E78-D4A1-4B19-AF11-9236825FF013}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{DAD70E78-D4A1-4B19-AF11-9236825FF013}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{DAD70E78-D4A1-4B19-AF11-9236825FF013}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{DAD70E78-D4A1-4B19-AF11-9236825FF013}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{376B2235-ADA7-4EC7-A27D-8F97EC6A57CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{376B2235-ADA7-4EC7-A27D-8F97EC6A57CD}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{376B2235-ADA7-4EC7-A27D-8F97EC6A57CD}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{376B2235-ADA7-4EC7-A27D-8F97EC6A57CD}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{7521486D-2144-4AFA-86AD-8E8021479DE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{7521486D-2144-4AFA-86AD-8E8021479DE6}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{7521486D-2144-4AFA-86AD-8E8021479DE6}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{7521486D-2144-4AFA-86AD-8E8021479DE6}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(SolutionProperties) = preSolution |
||||
|
HideSolutionNode = FALSE |
||||
|
EndGlobalSection |
||||
|
GlobalSection(NestedProjects) = preSolution |
||||
|
{A12DB303-F90B-4E56-B99F-A40816FCB04A} = {1E8D56FE-2FA1-4041-AB69-00952BF42EC9} |
||||
|
{CB1A2EB0-34D4-41C4-BF01-C99EFBBF09EE} = {ED23B2F3-87C1-44B6-8906-9DE739422C2C} |
||||
|
{926E8543-6A0E-4B36-8F3C-9278281E3420} = {CB1A2EB0-34D4-41C4-BF01-C99EFBBF09EE} |
||||
|
{0DDA914E-CE2A-446F-A43D-09C52704D39C} = {CB1A2EB0-34D4-41C4-BF01-C99EFBBF09EE} |
||||
|
{E7185ACE-4D40-4215-BBD7-73D2DB69F482} = {CB1A2EB0-34D4-41C4-BF01-C99EFBBF09EE} |
||||
|
{011F5FF0-468F-4423-8DC3-C3ECC3F63829} = {CB1A2EB0-34D4-41C4-BF01-C99EFBBF09EE} |
||||
|
{202AC90B-0E4A-44B4-9A9D-3C869D0D4B8E} = {ED23B2F3-87C1-44B6-8906-9DE739422C2C} |
||||
|
{35A4661D-12A0-47A9-ACC6-111D1474A88B} = {202AC90B-0E4A-44B4-9A9D-3C869D0D4B8E} |
||||
|
{9EAAB564-5971-4AE3-9228-3953C228A890} = {202AC90B-0E4A-44B4-9A9D-3C869D0D4B8E} |
||||
|
{5BAC138C-2AD5-426E-9D85-BDC6A0B38787} = {202AC90B-0E4A-44B4-9A9D-3C869D0D4B8E} |
||||
|
{709E77F9-DABF-47D3-A86E-40CD5448B1E5} = {ED23B2F3-87C1-44B6-8906-9DE739422C2C} |
||||
|
{BE063443-09F6-4611-AE17-811AD00D51E9} = {709E77F9-DABF-47D3-A86E-40CD5448B1E5} |
||||
|
{69CBAE90-D5BE-4362-98DE-1505A59DD0A6} = {709E77F9-DABF-47D3-A86E-40CD5448B1E5} |
||||
|
{DAD70E78-D4A1-4B19-AF11-9236825FF013} = {709E77F9-DABF-47D3-A86E-40CD5448B1E5} |
||||
|
{2F56344F-6E06-4F9B-A0F2-8A6F0AEB096A} = {ED23B2F3-87C1-44B6-8906-9DE739422C2C} |
||||
|
{376B2235-ADA7-4EC7-A27D-8F97EC6A57CD} = {2F56344F-6E06-4F9B-A0F2-8A6F0AEB096A} |
||||
|
{D25C4814-71AB-4A9D-8C76-298A7DE1A747} = {ED23B2F3-87C1-44B6-8906-9DE739422C2C} |
||||
|
{7521486D-2144-4AFA-86AD-8E8021479DE6} = {D25C4814-71AB-4A9D-8C76-298A7DE1A747} |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ExtensibilityGlobals) = postSolution |
||||
|
SolutionGuid = {1573B900-87BA-4AD3-B785-6DD78127ADEF} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
@ -0,0 +1,285 @@ |
|||||
|
|
||||
|
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", "{02EA4E78-5891-43BC-944F-3E52FEE032E4}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{086BE5BE-8594-4DA7-8819-935FEF76DABD}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM", "modules\common\LINGYUN.Abp.IM\LINGYUN.Abp.IM.csproj", "{5A87E9DD-3340-44DC-9564-4D8832A0228E}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime", "modules\common\LINGYUN.Abp.RealTime\LINGYUN.Abp.RealTime.csproj", "{E9BE3C65-2AB2-4CE8-8EB9-5C91B329ADB4}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime.SignalR", "modules\common\LINGYUN.Abp.RealTime.SignalR\LINGYUN.Abp.RealTime.SignalR.csproj", "{824CB367-383B-48B2-972D-33923438A9A0}" |
||||
|
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", "{E9AEC9D6-1FE7-4B00-BAC5-2C3D4B63CCA2}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.SignalR.JwtToken", "modules\common\LINGYUN.Abp.AspNetCore.SignalR\LINGYUN.Abp.AspNetCore.SignalR.JwtToken.csproj", "{304D06E6-41EC-4DCB-AEAE-DBEEC75F9ADC}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.Authorization", "modules\common\LINGYUN.Abp.Aliyun.Authorization\LINGYUN.Abp.Aliyun.Authorization.csproj", "{58777534-1AEF-4D1B-807C-1070D6CB1D48}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundJobs", "modules\common\LINGYUN.Abp.BackgroundJobs\LINGYUN.Abp.BackgroundJobs.csproj", "{FFC21AA5-8DCF-4514-95F0-9A1D428095F8}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundJobs.Hangfire", "modules\common\LINGYUN.Abp.BackgroundJobs.Hangfire\LINGYUN.Abp.BackgroundJobs.Hangfire.csproj", "{492710E6-EEF5-4390-A474-8FB2412ECBE5}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Aliyun", "modules\common\LINGYUN.Abp.BlobStoring.Aliyun\LINGYUN.Abp.BlobStoring.Aliyun.csproj", "{CCF1EB86-29BD-4531-BB27-C9111CC67570}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DistributedLock", "modules\common\LINGYUN.Abp.DistributedLock\LINGYUN.Abp.DistributedLock.csproj", "{4BD715F2-D117-45FB-B26C-F92D912144C7}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DistributedLock.Redis", "modules\common\LINGYUN.Abp.DistributedLock.Redis\LINGYUN.Abp.DistributedLock.Redis.csproj", "{71C57C19-671D-4CD4-AA46-E8021E53BBE5}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.EventBus.CAP", "modules\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj", "{7947D559-4288-486B-8FB3-D957CC7EDD32}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling", "modules\common\LINGYUN.Abp.ExceptionHandling\LINGYUN.Abp.ExceptionHandling.csproj", "{A4195E41-3919-4C3E-8768-7F277B583D16}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing", "modules\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj", "{60083380-062C-4914-9E4E-5AE6637CCC3F}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Notifications", "modules\common\LINGYUN.Abp.ExceptionHandling.Notifications\LINGYUN.Abp.ExceptionHandling.Notifications.csproj", "{9C6E9EE2-5C83-4D96-A7B7-32798FEF2845}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation", "modules\common\LINGYUN.Abp.Features.LimitValidation\LINGYUN.Abp.Features.LimitValidation.csproj", "{34C1E979-65B9-46F5-B7BA-60F227EBA093}" |
||||
|
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", "{80A56461-0ACC-4069-B571-87DCA064B2EF}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Hangfire.Storage.MySql", "modules\common\LINGYUN.Abp.Hangfire.MySqlStorage\LINGYUN.Abp.Hangfire.Storage.MySql.csproj", "{568D2C50-1C31-4C31-89A2-C608FA93C6FD}" |
||||
|
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", "{12451B83-18DE-4E93-B98C-509477D53D5E}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location", "modules\common\LINGYUN.Abp.Location\LINGYUN.Abp.Location.csproj", "{AAD0B6A7-847A-4537-A300-50E37F4B70CC}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Baidu", "modules\common\LINGYUN.Abp.Location.Baidu\LINGYUN.Abp.Location.Baidu.csproj", "{5B5C2372-2EAB-4559-BBCB-0C1C9A7158DB}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Location.Tencent", "modules\common\LINGYUN.Abp.Location.Tencent\LINGYUN.Abp.Location.Tencent.csproj", "{2A0C5EF1-CB21-4656-8C32-B5673F6B82D2}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications", "modules\common\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj", "{3021DD8B-EA8F-4A88-BC2C-1BBEDC6255FE}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.SignalR", "modules\common\LINGYUN.Abp.Notifications.SignalR\LINGYUN.Abp.Notifications.SignalR.csproj", "{B31CEE79-45F6-4BB9-9EEB-08843C324B37}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wechat", "wechat", "{22C61434-D29A-4376-AD56-F5089F3E617A}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat", "modules\wechat\LINGYUN.Abp.WeChat\LINGYUN.Abp.WeChat.csproj", "{865D5508-63CD-4D44-9F5B-AE5CD4A43D08}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.WeChat.WeApp", "modules\wechat\LINGYUN.Abp.Notifications.WeChat\LINGYUN.Abp.Notifications.WeChat.WeApp.csproj", "{076B511E-39C5-4C91-BE8D-CA666CCCEA46}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Authorization", "modules\wechat\LINGYUN.Abp.WeChat.Authorization\LINGYUN.Abp.WeChat.Authorization.csproj", "{BCB7E04B-4A60-4596-8051-8ABC08444CAF}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Settings", "modules\common\LINGYUN.Abp.Settings\LINGYUN.Abp.Settings.csproj", "{ECAA4B82-A240-4747-888C-FACD8634D389}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Sms.Aliyun", "modules\common\LINGYUN.Abp.Sms.Aliyun\LINGYUN.Abp.Sms.Aliyun.csproj", "{8AF8FD6B-634F-41FA-B421-A4ACFD159FE0}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "aliyun", "aliyun", "{7F18BCA5-35BD-41FB-8EFF-801B56E5E414}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "signalr", "signalr", "{E2E7A062-0ABB-41B4-8220-60228446D2C2}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "location", "location", "{EFFAF456-50C1-42C9-836E-E95E7A38D52C}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "realtime", "realtime", "{B91F26C5-B148-4094-B5F1-71E5F945DBED}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "features", "features", "{0D2D7A10-CBA5-4798-BFC7-EB05D1E6B94C}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.Client", "modules\features\LINGYUN.Abp.Features.Client\LINGYUN.Abp.Features.Client.csproj", "{3B455AA7-B165-4EA0-8870-DB8DA5C76FC5}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Client", "modules\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj", "{99F8F254-A76E-43BB-8048-CC17EE1C8527}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tenants", "tenants", "{38E21687-5F19-42C9-9D11-4B1D2EF64EDB}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy", "modules\tenants\LINGYUN.Abp.MultiTenancy\LINGYUN.Abp.MultiTenancy.csproj", "{F2DAA5EB-5508-4D99-AE64-A10C025712BC}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.DbFinder", "modules\tenants\LINGYUN.Abp.MultiTenancy.DbFinder\LINGYUN.Abp.MultiTenancy.DbFinder.csproj", "{BD0A1F2D-7667-45F8-872D-D41F36384163}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.RemoteService", "modules\tenants\LINGYUN.Abp.MultiTenancy.RemoteService\LINGYUN.Abp.MultiTenancy.RemoteService.csproj", "{21C0A260-BC14-4A8F-9299-A9EE58682B96}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{5A87E9DD-3340-44DC-9564-4D8832A0228E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{5A87E9DD-3340-44DC-9564-4D8832A0228E}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{5A87E9DD-3340-44DC-9564-4D8832A0228E}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{5A87E9DD-3340-44DC-9564-4D8832A0228E}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{E9BE3C65-2AB2-4CE8-8EB9-5C91B329ADB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{E9BE3C65-2AB2-4CE8-8EB9-5C91B329ADB4}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{E9BE3C65-2AB2-4CE8-8EB9-5C91B329ADB4}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{E9BE3C65-2AB2-4CE8-8EB9-5C91B329ADB4}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{824CB367-383B-48B2-972D-33923438A9A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{824CB367-383B-48B2-972D-33923438A9A0}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{824CB367-383B-48B2-972D-33923438A9A0}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{824CB367-383B-48B2-972D-33923438A9A0}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{E9AEC9D6-1FE7-4B00-BAC5-2C3D4B63CCA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{E9AEC9D6-1FE7-4B00-BAC5-2C3D4B63CCA2}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{E9AEC9D6-1FE7-4B00-BAC5-2C3D4B63CCA2}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{E9AEC9D6-1FE7-4B00-BAC5-2C3D4B63CCA2}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{304D06E6-41EC-4DCB-AEAE-DBEEC75F9ADC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{304D06E6-41EC-4DCB-AEAE-DBEEC75F9ADC}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{304D06E6-41EC-4DCB-AEAE-DBEEC75F9ADC}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{304D06E6-41EC-4DCB-AEAE-DBEEC75F9ADC}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{58777534-1AEF-4D1B-807C-1070D6CB1D48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{58777534-1AEF-4D1B-807C-1070D6CB1D48}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{58777534-1AEF-4D1B-807C-1070D6CB1D48}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{58777534-1AEF-4D1B-807C-1070D6CB1D48}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{FFC21AA5-8DCF-4514-95F0-9A1D428095F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{FFC21AA5-8DCF-4514-95F0-9A1D428095F8}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{FFC21AA5-8DCF-4514-95F0-9A1D428095F8}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{FFC21AA5-8DCF-4514-95F0-9A1D428095F8}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{492710E6-EEF5-4390-A474-8FB2412ECBE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{492710E6-EEF5-4390-A474-8FB2412ECBE5}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{492710E6-EEF5-4390-A474-8FB2412ECBE5}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{492710E6-EEF5-4390-A474-8FB2412ECBE5}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{CCF1EB86-29BD-4531-BB27-C9111CC67570}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{CCF1EB86-29BD-4531-BB27-C9111CC67570}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{CCF1EB86-29BD-4531-BB27-C9111CC67570}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{CCF1EB86-29BD-4531-BB27-C9111CC67570}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{4BD715F2-D117-45FB-B26C-F92D912144C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{4BD715F2-D117-45FB-B26C-F92D912144C7}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{4BD715F2-D117-45FB-B26C-F92D912144C7}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{4BD715F2-D117-45FB-B26C-F92D912144C7}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{71C57C19-671D-4CD4-AA46-E8021E53BBE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{71C57C19-671D-4CD4-AA46-E8021E53BBE5}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{71C57C19-671D-4CD4-AA46-E8021E53BBE5}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{71C57C19-671D-4CD4-AA46-E8021E53BBE5}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{7947D559-4288-486B-8FB3-D957CC7EDD32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{7947D559-4288-486B-8FB3-D957CC7EDD32}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{7947D559-4288-486B-8FB3-D957CC7EDD32}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{7947D559-4288-486B-8FB3-D957CC7EDD32}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{A4195E41-3919-4C3E-8768-7F277B583D16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{A4195E41-3919-4C3E-8768-7F277B583D16}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{A4195E41-3919-4C3E-8768-7F277B583D16}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{A4195E41-3919-4C3E-8768-7F277B583D16}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{60083380-062C-4914-9E4E-5AE6637CCC3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{60083380-062C-4914-9E4E-5AE6637CCC3F}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{60083380-062C-4914-9E4E-5AE6637CCC3F}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{60083380-062C-4914-9E4E-5AE6637CCC3F}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{9C6E9EE2-5C83-4D96-A7B7-32798FEF2845}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{9C6E9EE2-5C83-4D96-A7B7-32798FEF2845}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{9C6E9EE2-5C83-4D96-A7B7-32798FEF2845}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{9C6E9EE2-5C83-4D96-A7B7-32798FEF2845}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{34C1E979-65B9-46F5-B7BA-60F227EBA093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{34C1E979-65B9-46F5-B7BA-60F227EBA093}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{34C1E979-65B9-46F5-B7BA-60F227EBA093}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{34C1E979-65B9-46F5-B7BA-60F227EBA093}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{80A56461-0ACC-4069-B571-87DCA064B2EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{80A56461-0ACC-4069-B571-87DCA064B2EF}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{80A56461-0ACC-4069-B571-87DCA064B2EF}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{80A56461-0ACC-4069-B571-87DCA064B2EF}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{568D2C50-1C31-4C31-89A2-C608FA93C6FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{568D2C50-1C31-4C31-89A2-C608FA93C6FD}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{568D2C50-1C31-4C31-89A2-C608FA93C6FD}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{568D2C50-1C31-4C31-89A2-C608FA93C6FD}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{12451B83-18DE-4E93-B98C-509477D53D5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{12451B83-18DE-4E93-B98C-509477D53D5E}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{12451B83-18DE-4E93-B98C-509477D53D5E}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{12451B83-18DE-4E93-B98C-509477D53D5E}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{AAD0B6A7-847A-4537-A300-50E37F4B70CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{AAD0B6A7-847A-4537-A300-50E37F4B70CC}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{AAD0B6A7-847A-4537-A300-50E37F4B70CC}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{AAD0B6A7-847A-4537-A300-50E37F4B70CC}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{5B5C2372-2EAB-4559-BBCB-0C1C9A7158DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{5B5C2372-2EAB-4559-BBCB-0C1C9A7158DB}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{5B5C2372-2EAB-4559-BBCB-0C1C9A7158DB}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{5B5C2372-2EAB-4559-BBCB-0C1C9A7158DB}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{2A0C5EF1-CB21-4656-8C32-B5673F6B82D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{2A0C5EF1-CB21-4656-8C32-B5673F6B82D2}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{2A0C5EF1-CB21-4656-8C32-B5673F6B82D2}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{2A0C5EF1-CB21-4656-8C32-B5673F6B82D2}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{3021DD8B-EA8F-4A88-BC2C-1BBEDC6255FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{3021DD8B-EA8F-4A88-BC2C-1BBEDC6255FE}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{3021DD8B-EA8F-4A88-BC2C-1BBEDC6255FE}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{3021DD8B-EA8F-4A88-BC2C-1BBEDC6255FE}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{B31CEE79-45F6-4BB9-9EEB-08843C324B37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{B31CEE79-45F6-4BB9-9EEB-08843C324B37}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{B31CEE79-45F6-4BB9-9EEB-08843C324B37}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{B31CEE79-45F6-4BB9-9EEB-08843C324B37}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{865D5508-63CD-4D44-9F5B-AE5CD4A43D08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{865D5508-63CD-4D44-9F5B-AE5CD4A43D08}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{865D5508-63CD-4D44-9F5B-AE5CD4A43D08}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{865D5508-63CD-4D44-9F5B-AE5CD4A43D08}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{076B511E-39C5-4C91-BE8D-CA666CCCEA46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{076B511E-39C5-4C91-BE8D-CA666CCCEA46}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{076B511E-39C5-4C91-BE8D-CA666CCCEA46}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{076B511E-39C5-4C91-BE8D-CA666CCCEA46}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{BCB7E04B-4A60-4596-8051-8ABC08444CAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{BCB7E04B-4A60-4596-8051-8ABC08444CAF}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{BCB7E04B-4A60-4596-8051-8ABC08444CAF}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{BCB7E04B-4A60-4596-8051-8ABC08444CAF}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{ECAA4B82-A240-4747-888C-FACD8634D389}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{ECAA4B82-A240-4747-888C-FACD8634D389}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{ECAA4B82-A240-4747-888C-FACD8634D389}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{ECAA4B82-A240-4747-888C-FACD8634D389}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{8AF8FD6B-634F-41FA-B421-A4ACFD159FE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{8AF8FD6B-634F-41FA-B421-A4ACFD159FE0}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{8AF8FD6B-634F-41FA-B421-A4ACFD159FE0}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{8AF8FD6B-634F-41FA-B421-A4ACFD159FE0}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{3B455AA7-B165-4EA0-8870-DB8DA5C76FC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{3B455AA7-B165-4EA0-8870-DB8DA5C76FC5}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{3B455AA7-B165-4EA0-8870-DB8DA5C76FC5}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{3B455AA7-B165-4EA0-8870-DB8DA5C76FC5}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{99F8F254-A76E-43BB-8048-CC17EE1C8527}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{99F8F254-A76E-43BB-8048-CC17EE1C8527}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{99F8F254-A76E-43BB-8048-CC17EE1C8527}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{99F8F254-A76E-43BB-8048-CC17EE1C8527}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{F2DAA5EB-5508-4D99-AE64-A10C025712BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{F2DAA5EB-5508-4D99-AE64-A10C025712BC}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{F2DAA5EB-5508-4D99-AE64-A10C025712BC}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{F2DAA5EB-5508-4D99-AE64-A10C025712BC}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{BD0A1F2D-7667-45F8-872D-D41F36384163}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{BD0A1F2D-7667-45F8-872D-D41F36384163}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{BD0A1F2D-7667-45F8-872D-D41F36384163}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{BD0A1F2D-7667-45F8-872D-D41F36384163}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{21C0A260-BC14-4A8F-9299-A9EE58682B96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{21C0A260-BC14-4A8F-9299-A9EE58682B96}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{21C0A260-BC14-4A8F-9299-A9EE58682B96}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{21C0A260-BC14-4A8F-9299-A9EE58682B96}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(SolutionProperties) = preSolution |
||||
|
HideSolutionNode = FALSE |
||||
|
EndGlobalSection |
||||
|
GlobalSection(NestedProjects) = preSolution |
||||
|
{086BE5BE-8594-4DA7-8819-935FEF76DABD} = {02EA4E78-5891-43BC-944F-3E52FEE032E4} |
||||
|
{5A87E9DD-3340-44DC-9564-4D8832A0228E} = {B91F26C5-B148-4094-B5F1-71E5F945DBED} |
||||
|
{E9BE3C65-2AB2-4CE8-8EB9-5C91B329ADB4} = {B91F26C5-B148-4094-B5F1-71E5F945DBED} |
||||
|
{824CB367-383B-48B2-972D-33923438A9A0} = {B91F26C5-B148-4094-B5F1-71E5F945DBED} |
||||
|
{E9AEC9D6-1FE7-4B00-BAC5-2C3D4B63CCA2} = {E2E7A062-0ABB-41B4-8220-60228446D2C2} |
||||
|
{304D06E6-41EC-4DCB-AEAE-DBEEC75F9ADC} = {E2E7A062-0ABB-41B4-8220-60228446D2C2} |
||||
|
{58777534-1AEF-4D1B-807C-1070D6CB1D48} = {7F18BCA5-35BD-41FB-8EFF-801B56E5E414} |
||||
|
{FFC21AA5-8DCF-4514-95F0-9A1D428095F8} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{492710E6-EEF5-4390-A474-8FB2412ECBE5} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{CCF1EB86-29BD-4531-BB27-C9111CC67570} = {7F18BCA5-35BD-41FB-8EFF-801B56E5E414} |
||||
|
{4BD715F2-D117-45FB-B26C-F92D912144C7} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{71C57C19-671D-4CD4-AA46-E8021E53BBE5} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{7947D559-4288-486B-8FB3-D957CC7EDD32} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{A4195E41-3919-4C3E-8768-7F277B583D16} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{60083380-062C-4914-9E4E-5AE6637CCC3F} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{9C6E9EE2-5C83-4D96-A7B7-32798FEF2845} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{34C1E979-65B9-46F5-B7BA-60F227EBA093} = {0D2D7A10-CBA5-4798-BFC7-EB05D1E6B94C} |
||||
|
{80A56461-0ACC-4069-B571-87DCA064B2EF} = {0D2D7A10-CBA5-4798-BFC7-EB05D1E6B94C} |
||||
|
{568D2C50-1C31-4C31-89A2-C608FA93C6FD} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{12451B83-18DE-4E93-B98C-509477D53D5E} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{AAD0B6A7-847A-4537-A300-50E37F4B70CC} = {EFFAF456-50C1-42C9-836E-E95E7A38D52C} |
||||
|
{5B5C2372-2EAB-4559-BBCB-0C1C9A7158DB} = {EFFAF456-50C1-42C9-836E-E95E7A38D52C} |
||||
|
{2A0C5EF1-CB21-4656-8C32-B5673F6B82D2} = {EFFAF456-50C1-42C9-836E-E95E7A38D52C} |
||||
|
{3021DD8B-EA8F-4A88-BC2C-1BBEDC6255FE} = {B91F26C5-B148-4094-B5F1-71E5F945DBED} |
||||
|
{B31CEE79-45F6-4BB9-9EEB-08843C324B37} = {B91F26C5-B148-4094-B5F1-71E5F945DBED} |
||||
|
{22C61434-D29A-4376-AD56-F5089F3E617A} = {02EA4E78-5891-43BC-944F-3E52FEE032E4} |
||||
|
{865D5508-63CD-4D44-9F5B-AE5CD4A43D08} = {22C61434-D29A-4376-AD56-F5089F3E617A} |
||||
|
{076B511E-39C5-4C91-BE8D-CA666CCCEA46} = {22C61434-D29A-4376-AD56-F5089F3E617A} |
||||
|
{BCB7E04B-4A60-4596-8051-8ABC08444CAF} = {22C61434-D29A-4376-AD56-F5089F3E617A} |
||||
|
{ECAA4B82-A240-4747-888C-FACD8634D389} = {086BE5BE-8594-4DA7-8819-935FEF76DABD} |
||||
|
{8AF8FD6B-634F-41FA-B421-A4ACFD159FE0} = {7F18BCA5-35BD-41FB-8EFF-801B56E5E414} |
||||
|
{7F18BCA5-35BD-41FB-8EFF-801B56E5E414} = {02EA4E78-5891-43BC-944F-3E52FEE032E4} |
||||
|
{E2E7A062-0ABB-41B4-8220-60228446D2C2} = {02EA4E78-5891-43BC-944F-3E52FEE032E4} |
||||
|
{EFFAF456-50C1-42C9-836E-E95E7A38D52C} = {02EA4E78-5891-43BC-944F-3E52FEE032E4} |
||||
|
{B91F26C5-B148-4094-B5F1-71E5F945DBED} = {02EA4E78-5891-43BC-944F-3E52FEE032E4} |
||||
|
{0D2D7A10-CBA5-4798-BFC7-EB05D1E6B94C} = {02EA4E78-5891-43BC-944F-3E52FEE032E4} |
||||
|
{3B455AA7-B165-4EA0-8870-DB8DA5C76FC5} = {0D2D7A10-CBA5-4798-BFC7-EB05D1E6B94C} |
||||
|
{99F8F254-A76E-43BB-8048-CC17EE1C8527} = {0D2D7A10-CBA5-4798-BFC7-EB05D1E6B94C} |
||||
|
{38E21687-5F19-42C9-9D11-4B1D2EF64EDB} = {02EA4E78-5891-43BC-944F-3E52FEE032E4} |
||||
|
{F2DAA5EB-5508-4D99-AE64-A10C025712BC} = {38E21687-5F19-42C9-9D11-4B1D2EF64EDB} |
||||
|
{BD0A1F2D-7667-45F8-872D-D41F36384163} = {38E21687-5F19-42C9-9D11-4B1D2EF64EDB} |
||||
|
{21C0A260-BC14-4A8F-9299-A9EE58682B96} = {38E21687-5F19-42C9-9D11-4B1D2EF64EDB} |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ExtensibilityGlobals) = postSolution |
||||
|
SolutionGuid = {06C707C6-02C0-411A-AD3B-2D0E13787CB8} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
@ -0,0 +1,69 @@ |
|||||
|
|
||||
|
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", "{7C727110-59CA-495B-8143-C5DDEDE41289}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{DDCA574F-911B-4547-BA21-12CCE1022D95}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuthServer.Host", "services\account\AuthServer.Host\AuthServer.Host.csproj", "{BF8073FF-6403-4ED6-A3CD-74F240DC8044}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity-server", "identity-server", "{98887A8F-7040-4FA1-842F-A4C77A61ED09}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.SmsValidator", "modules\identityServer\LINGYUN.Abp.IdentityServer.SmsValidator\LINGYUN.Abp.IdentityServer.SmsValidator.csproj", "{9EA06629-DBAC-4369-9850-B7415D0470B0}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.WeChatValidator", "modules\identityServer\LINGYUN.Abp.IdentityServer.WeChatValidator\LINGYUN.Abp.IdentityServer.WeChatValidator.csproj", "{B9E9D754-0BC1-42EA-94B3-631D1EA82B48}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{70B8D735-1E89-4163-8EDB-56A74E374CF4}" |
||||
|
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", "{F87B2BA3-40BC-4CB8-B53E-793C860F285D}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wechat", "wechat", "{AF8AECC8-0F42-4FC5-B3C0-00987BA8279F}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Authorization", "modules\wechat\LINGYUN.Abp.WeChat.Authorization\LINGYUN.Abp.WeChat.Authorization.csproj", "{F656C1B2-6122-44C1-97F4-421CB4C03ED8}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{BF8073FF-6403-4ED6-A3CD-74F240DC8044}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{BF8073FF-6403-4ED6-A3CD-74F240DC8044}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{BF8073FF-6403-4ED6-A3CD-74F240DC8044}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{BF8073FF-6403-4ED6-A3CD-74F240DC8044}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{9EA06629-DBAC-4369-9850-B7415D0470B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{9EA06629-DBAC-4369-9850-B7415D0470B0}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{9EA06629-DBAC-4369-9850-B7415D0470B0}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{9EA06629-DBAC-4369-9850-B7415D0470B0}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{B9E9D754-0BC1-42EA-94B3-631D1EA82B48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{B9E9D754-0BC1-42EA-94B3-631D1EA82B48}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{B9E9D754-0BC1-42EA-94B3-631D1EA82B48}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{B9E9D754-0BC1-42EA-94B3-631D1EA82B48}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{F87B2BA3-40BC-4CB8-B53E-793C860F285D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{F87B2BA3-40BC-4CB8-B53E-793C860F285D}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{F87B2BA3-40BC-4CB8-B53E-793C860F285D}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{F87B2BA3-40BC-4CB8-B53E-793C860F285D}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{F656C1B2-6122-44C1-97F4-421CB4C03ED8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{F656C1B2-6122-44C1-97F4-421CB4C03ED8}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{F656C1B2-6122-44C1-97F4-421CB4C03ED8}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{F656C1B2-6122-44C1-97F4-421CB4C03ED8}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(SolutionProperties) = preSolution |
||||
|
HideSolutionNode = FALSE |
||||
|
EndGlobalSection |
||||
|
GlobalSection(NestedProjects) = preSolution |
||||
|
{BF8073FF-6403-4ED6-A3CD-74F240DC8044} = {DDCA574F-911B-4547-BA21-12CCE1022D95} |
||||
|
{98887A8F-7040-4FA1-842F-A4C77A61ED09} = {7C727110-59CA-495B-8143-C5DDEDE41289} |
||||
|
{9EA06629-DBAC-4369-9850-B7415D0470B0} = {98887A8F-7040-4FA1-842F-A4C77A61ED09} |
||||
|
{B9E9D754-0BC1-42EA-94B3-631D1EA82B48} = {98887A8F-7040-4FA1-842F-A4C77A61ED09} |
||||
|
{70B8D735-1E89-4163-8EDB-56A74E374CF4} = {7C727110-59CA-495B-8143-C5DDEDE41289} |
||||
|
{F87B2BA3-40BC-4CB8-B53E-793C860F285D} = {70B8D735-1E89-4163-8EDB-56A74E374CF4} |
||||
|
{AF8AECC8-0F42-4FC5-B3C0-00987BA8279F} = {7C727110-59CA-495B-8143-C5DDEDE41289} |
||||
|
{F656C1B2-6122-44C1-97F4-421CB4C03ED8} = {AF8AECC8-0F42-4FC5-B3C0-00987BA8279F} |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ExtensibilityGlobals) = postSolution |
||||
|
SolutionGuid = {FCB77471-9ECB-4666-A316-1D6A6285A468} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
@ -0,0 +1,177 @@ |
|||||
|
|
||||
|
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", "{14B8F528-C649-4FAD-9BBB-6C979ED403E1}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Domain", "modules\identityServer\LINGYUN.Abp.IdentityServer.Domain\LINGYUN.Abp.IdentityServer.Domain.csproj", "{DC379D12-77E1-4600-8E99-AAD9B92C3A1B}" |
||||
|
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", "{3265F0C5-2D16-4CA8-A980-1B4B3CB928BB}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application\LINGYUN.Abp.IdentityServer.Application.csproj", "{DBC8DC97-06DD-4496-9D2A-F28FDD379AE4}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.EntityFrameworkCore", "modules\identityServer\LINGYUN.Abp.IdentityServer.EntityFrameworkCore\LINGYUN.Abp.IdentityServer.EntityFrameworkCore.csproj", "{DA57672C-501D-4CAF-8BF2-4D93B2D460BF}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.HttpApi", "modules\identityServer\LINGYUN.Abp.IdentityServer.HttpApi\LINGYUN.Abp.IdentityServer.HttpApi.csproj", "{9C505703-C073-4E7F-9BB5-9DE0631C95AB}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{0CA2F891-7E8E-453B-9FEF-ADCBEB7795DD}" |
||||
|
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", "{DE9E58E2-268C-4DF0-85AA-FF7F328B62F0}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{4F06C65B-22CC-466E-B3FD-3F695DD38191}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity-server", "identity-server", "{7AB942D5-D139-4F9F-9342-71534AA3A5AC}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{BD964040-90B2-4179-A5EB-5830F5C7E073}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Domain.Shared", "modules\account\LINGYUN.Abp.Account.Domain.Shared\LINGYUN.Abp.Account.Domain.Shared.csproj", "{82ACBDDA-1C77-49B6-9F33-38DFD3D4691D}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Domain", "modules\account\LINGYUN.Abp.Account.Domain\LINGYUN.Abp.Account.Domain.csproj", "{2BA25A1B-D53E-432B-BAC2-BAAC66CA390D}" |
||||
|
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", "{A4DFDE21-1931-46B5-8381-36B6EB6E51E1}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application", "modules\account\LINGYUN.Abp.Account.Application\LINGYUN.Abp.Account.Application.csproj", "{6EE4D85F-6035-4AB5-B650-9E3D3A2AA8D2}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.HttpApi", "modules\account\LINGYUN.Abp.Account.HttpApi\LINGYUN.Abp.Account.HttpApi.csproj", "{BB1124C0-79F4-4E72-8854-945B3F0AD76D}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Web", "modules\account\LINGYUN.Abp.Account.Web\LINGYUN.Abp.Account.Web.csproj", "{3297ED1B-FB82-4EC5-ADA1-0D0390BEDBB8}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain", "modules\identity\LINGYUN.Abp.Identity.Domain\LINGYUN.Abp.Identity.Domain.csproj", "{E22445B9-7039-4DA1-B547-BAB437D6D2B3}" |
||||
|
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", "{116D9D69-ED2C-4F23-9445-3981D8EA0EB7}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application", "modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj", "{B07A1763-1B37-4416-8F0C-B938C175A56D}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi", "modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj", "{0F87C16B-8E91-4B25-B501-AD81F8EC599E}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.EntityFrameworkCore", "modules\identity\LINGYUN.Abp.Identity.EntityFrameworkCore\LINGYUN.Abp.Identity.EntityFrameworkCore.csproj", "{BF059F48-C8C0-4E17-AC4F-A1D1ADE405C7}" |
||||
|
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", "{6679A09F-124A-470A-81F5-A94302CEFEE4}" |
||||
|
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", "{177B6CD3-1690-416D-9B37-A821093DEFBD}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wechat", "wechat", "{7EE9651C-17B0-4343-A2ED-92439F8C9019}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Authorization", "modules\wechat\LINGYUN.Abp.WeChat.Authorization\LINGYUN.Abp.WeChat.Authorization.csproj", "{F61FA8AA-4248-4F2B-87E0-73CD2C027783}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{DC379D12-77E1-4600-8E99-AAD9B92C3A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{DC379D12-77E1-4600-8E99-AAD9B92C3A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{DC379D12-77E1-4600-8E99-AAD9B92C3A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{DC379D12-77E1-4600-8E99-AAD9B92C3A1B}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{3265F0C5-2D16-4CA8-A980-1B4B3CB928BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{3265F0C5-2D16-4CA8-A980-1B4B3CB928BB}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{3265F0C5-2D16-4CA8-A980-1B4B3CB928BB}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{3265F0C5-2D16-4CA8-A980-1B4B3CB928BB}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{DBC8DC97-06DD-4496-9D2A-F28FDD379AE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{DBC8DC97-06DD-4496-9D2A-F28FDD379AE4}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{DBC8DC97-06DD-4496-9D2A-F28FDD379AE4}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{DBC8DC97-06DD-4496-9D2A-F28FDD379AE4}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{DA57672C-501D-4CAF-8BF2-4D93B2D460BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{DA57672C-501D-4CAF-8BF2-4D93B2D460BF}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{DA57672C-501D-4CAF-8BF2-4D93B2D460BF}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{DA57672C-501D-4CAF-8BF2-4D93B2D460BF}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{9C505703-C073-4E7F-9BB5-9DE0631C95AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{9C505703-C073-4E7F-9BB5-9DE0631C95AB}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{9C505703-C073-4E7F-9BB5-9DE0631C95AB}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{9C505703-C073-4E7F-9BB5-9DE0631C95AB}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{DE9E58E2-268C-4DF0-85AA-FF7F328B62F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{DE9E58E2-268C-4DF0-85AA-FF7F328B62F0}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{DE9E58E2-268C-4DF0-85AA-FF7F328B62F0}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{DE9E58E2-268C-4DF0-85AA-FF7F328B62F0}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{82ACBDDA-1C77-49B6-9F33-38DFD3D4691D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{82ACBDDA-1C77-49B6-9F33-38DFD3D4691D}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{82ACBDDA-1C77-49B6-9F33-38DFD3D4691D}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{82ACBDDA-1C77-49B6-9F33-38DFD3D4691D}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{2BA25A1B-D53E-432B-BAC2-BAAC66CA390D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{2BA25A1B-D53E-432B-BAC2-BAAC66CA390D}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{2BA25A1B-D53E-432B-BAC2-BAAC66CA390D}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{2BA25A1B-D53E-432B-BAC2-BAAC66CA390D}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{A4DFDE21-1931-46B5-8381-36B6EB6E51E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{A4DFDE21-1931-46B5-8381-36B6EB6E51E1}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{A4DFDE21-1931-46B5-8381-36B6EB6E51E1}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{A4DFDE21-1931-46B5-8381-36B6EB6E51E1}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{6EE4D85F-6035-4AB5-B650-9E3D3A2AA8D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{6EE4D85F-6035-4AB5-B650-9E3D3A2AA8D2}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{6EE4D85F-6035-4AB5-B650-9E3D3A2AA8D2}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{6EE4D85F-6035-4AB5-B650-9E3D3A2AA8D2}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{BB1124C0-79F4-4E72-8854-945B3F0AD76D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{BB1124C0-79F4-4E72-8854-945B3F0AD76D}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{BB1124C0-79F4-4E72-8854-945B3F0AD76D}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{BB1124C0-79F4-4E72-8854-945B3F0AD76D}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{3297ED1B-FB82-4EC5-ADA1-0D0390BEDBB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{3297ED1B-FB82-4EC5-ADA1-0D0390BEDBB8}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{3297ED1B-FB82-4EC5-ADA1-0D0390BEDBB8}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{3297ED1B-FB82-4EC5-ADA1-0D0390BEDBB8}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{E22445B9-7039-4DA1-B547-BAB437D6D2B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{E22445B9-7039-4DA1-B547-BAB437D6D2B3}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{E22445B9-7039-4DA1-B547-BAB437D6D2B3}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{E22445B9-7039-4DA1-B547-BAB437D6D2B3}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{116D9D69-ED2C-4F23-9445-3981D8EA0EB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{116D9D69-ED2C-4F23-9445-3981D8EA0EB7}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{116D9D69-ED2C-4F23-9445-3981D8EA0EB7}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{116D9D69-ED2C-4F23-9445-3981D8EA0EB7}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{B07A1763-1B37-4416-8F0C-B938C175A56D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{B07A1763-1B37-4416-8F0C-B938C175A56D}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{B07A1763-1B37-4416-8F0C-B938C175A56D}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{B07A1763-1B37-4416-8F0C-B938C175A56D}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{0F87C16B-8E91-4B25-B501-AD81F8EC599E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{0F87C16B-8E91-4B25-B501-AD81F8EC599E}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{0F87C16B-8E91-4B25-B501-AD81F8EC599E}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{0F87C16B-8E91-4B25-B501-AD81F8EC599E}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{BF059F48-C8C0-4E17-AC4F-A1D1ADE405C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{BF059F48-C8C0-4E17-AC4F-A1D1ADE405C7}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{BF059F48-C8C0-4E17-AC4F-A1D1ADE405C7}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{BF059F48-C8C0-4E17-AC4F-A1D1ADE405C7}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{6679A09F-124A-470A-81F5-A94302CEFEE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{6679A09F-124A-470A-81F5-A94302CEFEE4}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{6679A09F-124A-470A-81F5-A94302CEFEE4}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{6679A09F-124A-470A-81F5-A94302CEFEE4}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{177B6CD3-1690-416D-9B37-A821093DEFBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{177B6CD3-1690-416D-9B37-A821093DEFBD}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{177B6CD3-1690-416D-9B37-A821093DEFBD}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{177B6CD3-1690-416D-9B37-A821093DEFBD}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{F61FA8AA-4248-4F2B-87E0-73CD2C027783}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{F61FA8AA-4248-4F2B-87E0-73CD2C027783}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{F61FA8AA-4248-4F2B-87E0-73CD2C027783}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{F61FA8AA-4248-4F2B-87E0-73CD2C027783}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(SolutionProperties) = preSolution |
||||
|
HideSolutionNode = FALSE |
||||
|
EndGlobalSection |
||||
|
GlobalSection(NestedProjects) = preSolution |
||||
|
{DC379D12-77E1-4600-8E99-AAD9B92C3A1B} = {7AB942D5-D139-4F9F-9342-71534AA3A5AC} |
||||
|
{3265F0C5-2D16-4CA8-A980-1B4B3CB928BB} = {7AB942D5-D139-4F9F-9342-71534AA3A5AC} |
||||
|
{DBC8DC97-06DD-4496-9D2A-F28FDD379AE4} = {7AB942D5-D139-4F9F-9342-71534AA3A5AC} |
||||
|
{DA57672C-501D-4CAF-8BF2-4D93B2D460BF} = {7AB942D5-D139-4F9F-9342-71534AA3A5AC} |
||||
|
{9C505703-C073-4E7F-9BB5-9DE0631C95AB} = {7AB942D5-D139-4F9F-9342-71534AA3A5AC} |
||||
|
{DE9E58E2-268C-4DF0-85AA-FF7F328B62F0} = {0CA2F891-7E8E-453B-9FEF-ADCBEB7795DD} |
||||
|
{4F06C65B-22CC-466E-B3FD-3F695DD38191} = {14B8F528-C649-4FAD-9BBB-6C979ED403E1} |
||||
|
{7AB942D5-D139-4F9F-9342-71534AA3A5AC} = {14B8F528-C649-4FAD-9BBB-6C979ED403E1} |
||||
|
{BD964040-90B2-4179-A5EB-5830F5C7E073} = {14B8F528-C649-4FAD-9BBB-6C979ED403E1} |
||||
|
{82ACBDDA-1C77-49B6-9F33-38DFD3D4691D} = {4F06C65B-22CC-466E-B3FD-3F695DD38191} |
||||
|
{2BA25A1B-D53E-432B-BAC2-BAAC66CA390D} = {4F06C65B-22CC-466E-B3FD-3F695DD38191} |
||||
|
{A4DFDE21-1931-46B5-8381-36B6EB6E51E1} = {4F06C65B-22CC-466E-B3FD-3F695DD38191} |
||||
|
{6EE4D85F-6035-4AB5-B650-9E3D3A2AA8D2} = {4F06C65B-22CC-466E-B3FD-3F695DD38191} |
||||
|
{BB1124C0-79F4-4E72-8854-945B3F0AD76D} = {4F06C65B-22CC-466E-B3FD-3F695DD38191} |
||||
|
{3297ED1B-FB82-4EC5-ADA1-0D0390BEDBB8} = {4F06C65B-22CC-466E-B3FD-3F695DD38191} |
||||
|
{E22445B9-7039-4DA1-B547-BAB437D6D2B3} = {BD964040-90B2-4179-A5EB-5830F5C7E073} |
||||
|
{116D9D69-ED2C-4F23-9445-3981D8EA0EB7} = {BD964040-90B2-4179-A5EB-5830F5C7E073} |
||||
|
{B07A1763-1B37-4416-8F0C-B938C175A56D} = {BD964040-90B2-4179-A5EB-5830F5C7E073} |
||||
|
{0F87C16B-8E91-4B25-B501-AD81F8EC599E} = {BD964040-90B2-4179-A5EB-5830F5C7E073} |
||||
|
{BF059F48-C8C0-4E17-AC4F-A1D1ADE405C7} = {BD964040-90B2-4179-A5EB-5830F5C7E073} |
||||
|
{6679A09F-124A-470A-81F5-A94302CEFEE4} = {BD964040-90B2-4179-A5EB-5830F5C7E073} |
||||
|
{177B6CD3-1690-416D-9B37-A821093DEFBD} = {BD964040-90B2-4179-A5EB-5830F5C7E073} |
||||
|
{7EE9651C-17B0-4343-A2ED-92439F8C9019} = {14B8F528-C649-4FAD-9BBB-6C979ED403E1} |
||||
|
{F61FA8AA-4248-4F2B-87E0-73CD2C027783} = {7EE9651C-17B0-4343-A2ED-92439F8C9019} |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ExtensibilityGlobals) = postSolution |
||||
|
SolutionGuid = {785FFF4D-BC59-499E-88A3-7CB7A7667228} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
@ -0,0 +1,174 @@ |
|||||
|
|
||||
|
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", "{0C7AA298-2957-4D71-A8F1-1C3C7932A1B3}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{E7A821D8-85B5-4098-897D-5A814BD8131D}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{C00828FB-E7D5-4086-BA50-02022594AB73}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime", "modules\common\LINGYUN.Abp.RealTime\LINGYUN.Abp.RealTime.csproj", "{07BCD006-F2F2-4685-8887-E8BEB18745FD}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime.SignalR", "modules\common\LINGYUN.Abp.RealTime.SignalR\LINGYUN.Abp.RealTime.SignalR.csproj", "{60E37E86-ACA6-4464-9592-B0D8EFB629BD}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.SignalR.JwtToken", "modules\common\LINGYUN.Abp.AspNetCore.SignalR\LINGYUN.Abp.AspNetCore.SignalR.JwtToken.csproj", "{85B39FCE-6778-497C-A12E-6777C7FE651A}" |
||||
|
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", "{8C973655-DF59-40D8-B206-82344575A8CF}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM", "modules\common\LINGYUN.Abp.IM\LINGYUN.Abp.IM.csproj", "{55B9F554-1754-4EF9-B325-B33421D4F6A9}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM.SignalR", "modules\common\LINGYUN.Abp.IM.SignalR\LINGYUN.Abp.IM.SignalR.csproj", "{7AC8C076-87E2-48ED-8AB3-C1F737F55DD1}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications", "modules\common\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj", "{C6F494D3-2C41-46DF-BCAD-F74D3E53CDE1}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.SignalR", "modules\common\LINGYUN.Abp.Notifications.SignalR\LINGYUN.Abp.Notifications.SignalR.csproj", "{3531699A-9FF9-4F8C-BEAD-9D114FE8E519}" |
||||
|
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", "{50DE8ABF-B50A-4AAB-A69B-4E727AFDB6B5}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain", "modules\message\LINGYUN.Abp.MessageService.Domain\LINGYUN.Abp.MessageService.Domain.csproj", "{2094F03B-FC73-4B3F-88CB-F7951E22FED5}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.EntityFrameworkCore", "modules\message\LINGYUN.Abp.MessageService.EntityFrameworkCore\LINGYUN.Abp.MessageService.EntityFrameworkCore.csproj", "{554E5BCA-7F88-4E7C-86ED-8B6DE3A3A802}" |
||||
|
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", "{92E4CAD4-F5B9-4B16-B7BC-4A40DC1E93F1}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application", "modules\message\LINGYUN.Abp.MessageService.Application\LINGYUN.Abp.MessageService.Application.csproj", "{DB8CE5AF-1888-4C51-97C3-2188BE50FAF9}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi", "modules\message\LINGYUN.Abp.MessageService.HttpApi\LINGYUN.Abp.MessageService.HttpApi.csproj", "{54395254-0383-4932-B2E4-50932DAD7D10}" |
||||
|
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", "{3E9CCC0A-DAD5-4F32-8EAE-654D67DEE2B9}" |
||||
|
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", "{8168B7B4-9F6B-4658-A28C-D0F9D10AB93D}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wechat", "wechat", "{78164C5C-63B9-4FB6-ACC9-6496E236C946}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.WeChat.WeApp", "modules\wechat\LINGYUN.Abp.Notifications.WeChat\LINGYUN.Abp.Notifications.WeChat.WeApp.csproj", "{D7B2B2BE-C32C-47AE-A46C-62B7EF8C318E}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation", "modules\common\LINGYUN.Abp.Features.LimitValidation\LINGYUN.Abp.Features.LimitValidation.csproj", "{93971F1F-F6AC-4F83-8119-21260FCE2828}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Authorization", "modules\wechat\LINGYUN.Abp.WeChat.Authorization\LINGYUN.Abp.WeChat.Authorization.csproj", "{ADB894C3-8CED-4809-8D85-478D2335CDA2}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat", "modules\wechat\LINGYUN.Abp.WeChat\LINGYUN.Abp.WeChat.csproj", "{3B87330F-A303-4413-B653-1C9536C74109}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "message", "message", "{D58F1DF5-2DFE-40A2-B136-7606D4CDE903}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{07BCD006-F2F2-4685-8887-E8BEB18745FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{07BCD006-F2F2-4685-8887-E8BEB18745FD}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{07BCD006-F2F2-4685-8887-E8BEB18745FD}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{07BCD006-F2F2-4685-8887-E8BEB18745FD}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{60E37E86-ACA6-4464-9592-B0D8EFB629BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{60E37E86-ACA6-4464-9592-B0D8EFB629BD}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{60E37E86-ACA6-4464-9592-B0D8EFB629BD}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{60E37E86-ACA6-4464-9592-B0D8EFB629BD}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{85B39FCE-6778-497C-A12E-6777C7FE651A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{85B39FCE-6778-497C-A12E-6777C7FE651A}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{85B39FCE-6778-497C-A12E-6777C7FE651A}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{85B39FCE-6778-497C-A12E-6777C7FE651A}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{8C973655-DF59-40D8-B206-82344575A8CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{8C973655-DF59-40D8-B206-82344575A8CF}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{8C973655-DF59-40D8-B206-82344575A8CF}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{8C973655-DF59-40D8-B206-82344575A8CF}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{55B9F554-1754-4EF9-B325-B33421D4F6A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{55B9F554-1754-4EF9-B325-B33421D4F6A9}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{55B9F554-1754-4EF9-B325-B33421D4F6A9}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{55B9F554-1754-4EF9-B325-B33421D4F6A9}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{7AC8C076-87E2-48ED-8AB3-C1F737F55DD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{7AC8C076-87E2-48ED-8AB3-C1F737F55DD1}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{7AC8C076-87E2-48ED-8AB3-C1F737F55DD1}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{7AC8C076-87E2-48ED-8AB3-C1F737F55DD1}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{C6F494D3-2C41-46DF-BCAD-F74D3E53CDE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{C6F494D3-2C41-46DF-BCAD-F74D3E53CDE1}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{C6F494D3-2C41-46DF-BCAD-F74D3E53CDE1}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{C6F494D3-2C41-46DF-BCAD-F74D3E53CDE1}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{3531699A-9FF9-4F8C-BEAD-9D114FE8E519}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{3531699A-9FF9-4F8C-BEAD-9D114FE8E519}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{3531699A-9FF9-4F8C-BEAD-9D114FE8E519}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{3531699A-9FF9-4F8C-BEAD-9D114FE8E519}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{50DE8ABF-B50A-4AAB-A69B-4E727AFDB6B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{50DE8ABF-B50A-4AAB-A69B-4E727AFDB6B5}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{50DE8ABF-B50A-4AAB-A69B-4E727AFDB6B5}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{50DE8ABF-B50A-4AAB-A69B-4E727AFDB6B5}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{2094F03B-FC73-4B3F-88CB-F7951E22FED5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{2094F03B-FC73-4B3F-88CB-F7951E22FED5}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{2094F03B-FC73-4B3F-88CB-F7951E22FED5}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{2094F03B-FC73-4B3F-88CB-F7951E22FED5}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{554E5BCA-7F88-4E7C-86ED-8B6DE3A3A802}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{554E5BCA-7F88-4E7C-86ED-8B6DE3A3A802}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{554E5BCA-7F88-4E7C-86ED-8B6DE3A3A802}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{554E5BCA-7F88-4E7C-86ED-8B6DE3A3A802}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{92E4CAD4-F5B9-4B16-B7BC-4A40DC1E93F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{92E4CAD4-F5B9-4B16-B7BC-4A40DC1E93F1}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{92E4CAD4-F5B9-4B16-B7BC-4A40DC1E93F1}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{92E4CAD4-F5B9-4B16-B7BC-4A40DC1E93F1}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{DB8CE5AF-1888-4C51-97C3-2188BE50FAF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{DB8CE5AF-1888-4C51-97C3-2188BE50FAF9}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{DB8CE5AF-1888-4C51-97C3-2188BE50FAF9}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{DB8CE5AF-1888-4C51-97C3-2188BE50FAF9}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{54395254-0383-4932-B2E4-50932DAD7D10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{54395254-0383-4932-B2E4-50932DAD7D10}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{54395254-0383-4932-B2E4-50932DAD7D10}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{54395254-0383-4932-B2E4-50932DAD7D10}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{3E9CCC0A-DAD5-4F32-8EAE-654D67DEE2B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{3E9CCC0A-DAD5-4F32-8EAE-654D67DEE2B9}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{3E9CCC0A-DAD5-4F32-8EAE-654D67DEE2B9}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{3E9CCC0A-DAD5-4F32-8EAE-654D67DEE2B9}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{8168B7B4-9F6B-4658-A28C-D0F9D10AB93D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{8168B7B4-9F6B-4658-A28C-D0F9D10AB93D}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{8168B7B4-9F6B-4658-A28C-D0F9D10AB93D}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{8168B7B4-9F6B-4658-A28C-D0F9D10AB93D}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{D7B2B2BE-C32C-47AE-A46C-62B7EF8C318E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{D7B2B2BE-C32C-47AE-A46C-62B7EF8C318E}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{D7B2B2BE-C32C-47AE-A46C-62B7EF8C318E}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{D7B2B2BE-C32C-47AE-A46C-62B7EF8C318E}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{93971F1F-F6AC-4F83-8119-21260FCE2828}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{93971F1F-F6AC-4F83-8119-21260FCE2828}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{93971F1F-F6AC-4F83-8119-21260FCE2828}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{93971F1F-F6AC-4F83-8119-21260FCE2828}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{ADB894C3-8CED-4809-8D85-478D2335CDA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{ADB894C3-8CED-4809-8D85-478D2335CDA2}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{ADB894C3-8CED-4809-8D85-478D2335CDA2}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{ADB894C3-8CED-4809-8D85-478D2335CDA2}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{3B87330F-A303-4413-B653-1C9536C74109}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{3B87330F-A303-4413-B653-1C9536C74109}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{3B87330F-A303-4413-B653-1C9536C74109}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{3B87330F-A303-4413-B653-1C9536C74109}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(SolutionProperties) = preSolution |
||||
|
HideSolutionNode = FALSE |
||||
|
EndGlobalSection |
||||
|
GlobalSection(NestedProjects) = preSolution |
||||
|
{C00828FB-E7D5-4086-BA50-02022594AB73} = {0C7AA298-2957-4D71-A8F1-1C3C7932A1B3} |
||||
|
{07BCD006-F2F2-4685-8887-E8BEB18745FD} = {C00828FB-E7D5-4086-BA50-02022594AB73} |
||||
|
{60E37E86-ACA6-4464-9592-B0D8EFB629BD} = {C00828FB-E7D5-4086-BA50-02022594AB73} |
||||
|
{85B39FCE-6778-497C-A12E-6777C7FE651A} = {C00828FB-E7D5-4086-BA50-02022594AB73} |
||||
|
{8C973655-DF59-40D8-B206-82344575A8CF} = {C00828FB-E7D5-4086-BA50-02022594AB73} |
||||
|
{55B9F554-1754-4EF9-B325-B33421D4F6A9} = {C00828FB-E7D5-4086-BA50-02022594AB73} |
||||
|
{7AC8C076-87E2-48ED-8AB3-C1F737F55DD1} = {C00828FB-E7D5-4086-BA50-02022594AB73} |
||||
|
{C6F494D3-2C41-46DF-BCAD-F74D3E53CDE1} = {C00828FB-E7D5-4086-BA50-02022594AB73} |
||||
|
{3531699A-9FF9-4F8C-BEAD-9D114FE8E519} = {C00828FB-E7D5-4086-BA50-02022594AB73} |
||||
|
{50DE8ABF-B50A-4AAB-A69B-4E727AFDB6B5} = {D58F1DF5-2DFE-40A2-B136-7606D4CDE903} |
||||
|
{2094F03B-FC73-4B3F-88CB-F7951E22FED5} = {D58F1DF5-2DFE-40A2-B136-7606D4CDE903} |
||||
|
{554E5BCA-7F88-4E7C-86ED-8B6DE3A3A802} = {D58F1DF5-2DFE-40A2-B136-7606D4CDE903} |
||||
|
{92E4CAD4-F5B9-4B16-B7BC-4A40DC1E93F1} = {D58F1DF5-2DFE-40A2-B136-7606D4CDE903} |
||||
|
{DB8CE5AF-1888-4C51-97C3-2188BE50FAF9} = {D58F1DF5-2DFE-40A2-B136-7606D4CDE903} |
||||
|
{54395254-0383-4932-B2E4-50932DAD7D10} = {D58F1DF5-2DFE-40A2-B136-7606D4CDE903} |
||||
|
{3E9CCC0A-DAD5-4F32-8EAE-654D67DEE2B9} = {D58F1DF5-2DFE-40A2-B136-7606D4CDE903} |
||||
|
{8168B7B4-9F6B-4658-A28C-D0F9D10AB93D} = {E7A821D8-85B5-4098-897D-5A814BD8131D} |
||||
|
{78164C5C-63B9-4FB6-ACC9-6496E236C946} = {0C7AA298-2957-4D71-A8F1-1C3C7932A1B3} |
||||
|
{D7B2B2BE-C32C-47AE-A46C-62B7EF8C318E} = {78164C5C-63B9-4FB6-ACC9-6496E236C946} |
||||
|
{93971F1F-F6AC-4F83-8119-21260FCE2828} = {C00828FB-E7D5-4086-BA50-02022594AB73} |
||||
|
{ADB894C3-8CED-4809-8D85-478D2335CDA2} = {78164C5C-63B9-4FB6-ACC9-6496E236C946} |
||||
|
{3B87330F-A303-4413-B653-1C9536C74109} = {78164C5C-63B9-4FB6-ACC9-6496E236C946} |
||||
|
{D58F1DF5-2DFE-40A2-B136-7606D4CDE903} = {0C7AA298-2957-4D71-A8F1-1C3C7932A1B3} |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ExtensibilityGlobals) = postSolution |
||||
|
SolutionGuid = {6238659A-7267-49B9-A499-8746BDEED6B8} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
@ -0,0 +1,115 @@ |
|||||
|
|
||||
|
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", "{15BDA03E-DE8E-46E4-96A8-CA3F2872E812}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "services", "services", "{B81EF311-D7FD-4F07-9DC6-96D9BB517A74}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain.Shared", "modules\platform\LINGYUN.Platform.Domain.Shared\LINGYUN.Platform.Domain.Shared.csproj", "{6EE3ADC1-5E58-4A2E-B5DB-85163D9A0156}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain", "modules\platform\LINGYUN.Platform.Domain\LINGYUN.Platform.Domain.csproj", "{746E0357-5AA9-4F7A-B85E-E8F83EE5A749}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.EntityFrameworkCore", "modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj", "{939EF41A-E38F-4693-91D2-7B871D89DC5A}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application.Contracts", "modules\platform\LINGYUN.Platform.Application.Contracts\LINGYUN.Platform.Application.Contracts.csproj", "{2B49B1C8-EE71-4F68-9501-EA5222381CC7}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application", "modules\platform\LINGYUN.Platform.Application\LINGYUN.Platform.Application.csproj", "{462FFFC0-CAFA-462C-A65D-DEAA91EE5449}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi", "modules\platform\LINGYUN.Platform.HttpApi\LINGYUN.Platform.HttpApi.csproj", "{BDBCCE63-F4BB-405A-8620-58743A905F98}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi.Host", "services\platform\LINGYUN.Platform.HttpApi.Host\LINGYUN.Platform.HttpApi.Host.csproj", "{D1DD7E12-EFA4-4068-8B6D-0D0612ACA8EE}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{4096EC6A-EEAD-4E5B-B087-393D7A4E5874}" |
||||
|
EndProject |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "file-management", "file-management", "{C7D0EB39-3418-4A7C-AD94-FAB76F023E88}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FileManagement.Domain.Shared", "modules\file-management\LINGYUN.Abp.FileManagement.Domain.Shared\LINGYUN.Abp.FileManagement.Domain.Shared.csproj", "{4D3C1EBD-1A4A-4300-A889-72DA0E082BAE}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FileManagement.Domain", "modules\file-management\LINGYUN.Abp.FileManagement.Domain\LINGYUN.Abp.FileManagement.Domain.csproj", "{D6D4C667-B58C-4266-9929-AFE54C8F0FBA}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FileManagement.Application.Contracts", "modules\file-management\LINGYUN.Abp.FileManagement.Application.Contracts\LINGYUN.Abp.FileManagement.Application.Contracts.csproj", "{A1561B9D-2EAB-4C6A-AE62-9D517A450D4D}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FileManagement.Application", "modules\file-management\LINGYUN.Abp.FileManagement.Application\LINGYUN.Abp.FileManagement.Application.csproj", "{1C3A25AF-9A59-4532-88A4-E57BECFA7E96}" |
||||
|
EndProject |
||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FileManagement.HttpApi", "modules\file-management\LINGYUN.Abp.FileManagement.HttpApi\LINGYUN.Abp.FileManagement.HttpApi.csproj", "{C616C167-E5DF-4141-98BE-F98C58890122}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{6EE3ADC1-5E58-4A2E-B5DB-85163D9A0156}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{6EE3ADC1-5E58-4A2E-B5DB-85163D9A0156}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{6EE3ADC1-5E58-4A2E-B5DB-85163D9A0156}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{6EE3ADC1-5E58-4A2E-B5DB-85163D9A0156}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{746E0357-5AA9-4F7A-B85E-E8F83EE5A749}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{746E0357-5AA9-4F7A-B85E-E8F83EE5A749}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{746E0357-5AA9-4F7A-B85E-E8F83EE5A749}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{746E0357-5AA9-4F7A-B85E-E8F83EE5A749}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{939EF41A-E38F-4693-91D2-7B871D89DC5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{939EF41A-E38F-4693-91D2-7B871D89DC5A}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{939EF41A-E38F-4693-91D2-7B871D89DC5A}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{939EF41A-E38F-4693-91D2-7B871D89DC5A}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{2B49B1C8-EE71-4F68-9501-EA5222381CC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{2B49B1C8-EE71-4F68-9501-EA5222381CC7}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{2B49B1C8-EE71-4F68-9501-EA5222381CC7}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{2B49B1C8-EE71-4F68-9501-EA5222381CC7}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{462FFFC0-CAFA-462C-A65D-DEAA91EE5449}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{462FFFC0-CAFA-462C-A65D-DEAA91EE5449}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{462FFFC0-CAFA-462C-A65D-DEAA91EE5449}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{462FFFC0-CAFA-462C-A65D-DEAA91EE5449}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{BDBCCE63-F4BB-405A-8620-58743A905F98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{BDBCCE63-F4BB-405A-8620-58743A905F98}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{BDBCCE63-F4BB-405A-8620-58743A905F98}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{BDBCCE63-F4BB-405A-8620-58743A905F98}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{D1DD7E12-EFA4-4068-8B6D-0D0612ACA8EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{D1DD7E12-EFA4-4068-8B6D-0D0612ACA8EE}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{D1DD7E12-EFA4-4068-8B6D-0D0612ACA8EE}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{D1DD7E12-EFA4-4068-8B6D-0D0612ACA8EE}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{4D3C1EBD-1A4A-4300-A889-72DA0E082BAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{4D3C1EBD-1A4A-4300-A889-72DA0E082BAE}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{4D3C1EBD-1A4A-4300-A889-72DA0E082BAE}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{4D3C1EBD-1A4A-4300-A889-72DA0E082BAE}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{D6D4C667-B58C-4266-9929-AFE54C8F0FBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{D6D4C667-B58C-4266-9929-AFE54C8F0FBA}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{D6D4C667-B58C-4266-9929-AFE54C8F0FBA}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{D6D4C667-B58C-4266-9929-AFE54C8F0FBA}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{A1561B9D-2EAB-4C6A-AE62-9D517A450D4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{A1561B9D-2EAB-4C6A-AE62-9D517A450D4D}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{A1561B9D-2EAB-4C6A-AE62-9D517A450D4D}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{A1561B9D-2EAB-4C6A-AE62-9D517A450D4D}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{1C3A25AF-9A59-4532-88A4-E57BECFA7E96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{1C3A25AF-9A59-4532-88A4-E57BECFA7E96}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{1C3A25AF-9A59-4532-88A4-E57BECFA7E96}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{1C3A25AF-9A59-4532-88A4-E57BECFA7E96}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{C616C167-E5DF-4141-98BE-F98C58890122}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{C616C167-E5DF-4141-98BE-F98C58890122}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{C616C167-E5DF-4141-98BE-F98C58890122}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{C616C167-E5DF-4141-98BE-F98C58890122}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(SolutionProperties) = preSolution |
||||
|
HideSolutionNode = FALSE |
||||
|
EndGlobalSection |
||||
|
GlobalSection(NestedProjects) = preSolution |
||||
|
{6EE3ADC1-5E58-4A2E-B5DB-85163D9A0156} = {4096EC6A-EEAD-4E5B-B087-393D7A4E5874} |
||||
|
{746E0357-5AA9-4F7A-B85E-E8F83EE5A749} = {4096EC6A-EEAD-4E5B-B087-393D7A4E5874} |
||||
|
{939EF41A-E38F-4693-91D2-7B871D89DC5A} = {4096EC6A-EEAD-4E5B-B087-393D7A4E5874} |
||||
|
{2B49B1C8-EE71-4F68-9501-EA5222381CC7} = {4096EC6A-EEAD-4E5B-B087-393D7A4E5874} |
||||
|
{462FFFC0-CAFA-462C-A65D-DEAA91EE5449} = {4096EC6A-EEAD-4E5B-B087-393D7A4E5874} |
||||
|
{BDBCCE63-F4BB-405A-8620-58743A905F98} = {4096EC6A-EEAD-4E5B-B087-393D7A4E5874} |
||||
|
{D1DD7E12-EFA4-4068-8B6D-0D0612ACA8EE} = {B81EF311-D7FD-4F07-9DC6-96D9BB517A74} |
||||
|
{4096EC6A-EEAD-4E5B-B087-393D7A4E5874} = {15BDA03E-DE8E-46E4-96A8-CA3F2872E812} |
||||
|
{C7D0EB39-3418-4A7C-AD94-FAB76F023E88} = {15BDA03E-DE8E-46E4-96A8-CA3F2872E812} |
||||
|
{4D3C1EBD-1A4A-4300-A889-72DA0E082BAE} = {C7D0EB39-3418-4A7C-AD94-FAB76F023E88} |
||||
|
{D6D4C667-B58C-4266-9929-AFE54C8F0FBA} = {C7D0EB39-3418-4A7C-AD94-FAB76F023E88} |
||||
|
{A1561B9D-2EAB-4C6A-AE62-9D517A450D4D} = {C7D0EB39-3418-4A7C-AD94-FAB76F023E88} |
||||
|
{1C3A25AF-9A59-4532-88A4-E57BECFA7E96} = {C7D0EB39-3418-4A7C-AD94-FAB76F023E88} |
||||
|
{C616C167-E5DF-4141-98BE-F98C58890122} = {C7D0EB39-3418-4A7C-AD94-FAB76F023E88} |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ExtensibilityGlobals) = postSolution |
||||
|
SolutionGuid = {03D3B66F-8926-4C00-B7AB-A21761EC859E} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,15 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netcoreapp3.1</TargetFramework> |
||||
|
<RootNamespace /> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="3.1.6" /> |
||||
|
<PackageReference Include="Volo.Abp.AspNetCore.SignalR" Version="3.2.0" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,22 @@ |
|||||
|
using Microsoft.AspNetCore.SignalR; |
||||
|
using Microsoft.AspNetCore.SignalR.Protocol; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Microsoft.Extensions.DependencyInjection.Extensions; |
||||
|
using Volo.Abp.AspNetCore.SignalR; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace LINGYUN.Abp.AspNetCore.SignalR.Protocol.Json |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(AbpAspNetCoreSignalRModule))] |
||||
|
public class AbpAspNetCoreSignalRProtocolJsonModule : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
var newtonsoftJsonOptions = new NewtonsoftJsonHubProtocolOptions(); |
||||
|
context.Services.ExecutePreConfiguredActions(newtonsoftJsonOptions); |
||||
|
|
||||
|
context.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IHubProtocol, NewtonsoftJsonHubProtocol>()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,14 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netcoreapp3.1</TargetFramework> |
||||
|
<RootNamespace /> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Volo.Abp.AspNetCore.SignalR" Version="3.2.0" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,25 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
|
||||
|
namespace LINGYUN.Abp.AspNetCore.SignalR.JwtToken |
||||
|
{ |
||||
|
public class AbpAspNetCoreSignalRJwtTokenMapPathOptions |
||||
|
{ |
||||
|
public List<string> MapJwtTokenPaths { get; set; } |
||||
|
public AbpAspNetCoreSignalRJwtTokenMapPathOptions() |
||||
|
{ |
||||
|
MapJwtTokenPaths = new List<string>(); |
||||
|
} |
||||
|
|
||||
|
public void MapPath(string path) |
||||
|
{ |
||||
|
if (path.StartsWith("/signalr-hubs/")) |
||||
|
{ |
||||
|
MapJwtTokenPaths.AddIfNotContains(path); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
MapJwtTokenPaths.AddIfNotContains($"/signalr-hubs/{path}"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Volo.Abp.AspNetCore.SignalR; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace LINGYUN.Abp.AspNetCore.SignalR.JwtToken |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(AbpAspNetCoreSignalRModule))] |
||||
|
public class AbpAspNetCoreSignalRJwtTokenModule : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
var configuration = context.Services.GetConfiguration(); |
||||
|
|
||||
|
Configure<AbpAspNetCoreSignalRJwtTokenMapPathOptions>(configuration.GetSection("SignalR:MapPath")); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
using LINGYUN.Abp.AspNetCore.SignalR.JwtToken; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace Microsoft.AspNetCore.Http |
||||
|
{ |
||||
|
public class SignalRJwtTokenMiddleware : IMiddleware, ITransientDependency |
||||
|
{ |
||||
|
protected AbpAspNetCoreSignalRJwtTokenMapPathOptions Options { get; } |
||||
|
|
||||
|
public SignalRJwtTokenMiddleware(IOptions<AbpAspNetCoreSignalRJwtTokenMapPathOptions> options) |
||||
|
{ |
||||
|
Options = options.Value; |
||||
|
} |
||||
|
|
||||
|
public async Task InvokeAsync(HttpContext context, RequestDelegate next) |
||||
|
{ |
||||
|
if (Options.MapJwtTokenPaths.Any(path => context.Request.Path.StartsWithSegments(path))) |
||||
|
{ |
||||
|
if (context.User.Identity?.IsAuthenticated != true) |
||||
|
{ |
||||
|
if (context.Request.Query.TryGetValue("access_token", out var accessToken)) |
||||
|
{ |
||||
|
context.Request.Headers.Add("Authorization", $"Bearer {accessToken}"); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
//if (context.Request.Path.StartsWithSegments("/signalr-hubs/"))
|
||||
|
//{
|
||||
|
// if (context.User.Identity?.IsAuthenticated != true)
|
||||
|
// {
|
||||
|
// if (context.Request.Query.TryGetValue("access_token", out var accessToken))
|
||||
|
// {
|
||||
|
// context.Request.Headers.Add("Authorization", $"Bearer {accessToken}");
|
||||
|
// }
|
||||
|
|
||||
|
// }
|
||||
|
//}
|
||||
|
await next(context); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
{ |
||||
|
"culture": "en", |
||||
|
"texts": { |
||||
|
"Notifications:Exception": "Exception", |
||||
|
"Notifications:ExceptionNotifier": "Exception Notifier" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
{ |
||||
|
"culture": "zh-Hans", |
||||
|
"texts": { |
||||
|
"Notifications:Exception": "异常通知", |
||||
|
"Notifications:ExceptionNotifier": "异常推送" |
||||
|
} |
||||
|
} |
||||
@ -1,8 +1,18 @@ |
|||||
using Volo.Abp.Modularity; |
using LINGYUN.Abp.ExceptionHandling.Localization; |
||||
|
using Volo.Abp.Localization; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
namespace LINGYUN.Abp.ExceptionHandling |
namespace LINGYUN.Abp.ExceptionHandling |
||||
{ |
{ |
||||
|
[DependsOn(typeof(AbpLocalizationModule))] |
||||
public class AbpExceptionHandlingModule : AbpModule |
public class AbpExceptionHandlingModule : AbpModule |
||||
{ |
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
Configure<AbpLocalizationOptions>(options => |
||||
|
{ |
||||
|
options.Resources.Add<ExceptionHandlingResource>("en"); |
||||
|
}); |
||||
|
} |
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -0,0 +1,9 @@ |
|||||
|
using Volo.Abp.Localization; |
||||
|
|
||||
|
namespace LINGYUN.Abp.ExceptionHandling.Localization |
||||
|
{ |
||||
|
[LocalizationResourceName("AbpExceptionHandling")] |
||||
|
public class ExceptionHandlingResource |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
@ -1,14 +1,27 @@ |
|||||
using LINGYUN.Abp.RealTime; |
using LINGYUN.Abp.AspNetCore.SignalR.JwtToken; |
||||
using Volo.Abp.AspNetCore.SignalR; |
using LINGYUN.Abp.IM.SignalR.Messages; |
||||
|
using LINGYUN.Abp.RealTime.SignalR; |
||||
using Volo.Abp.Modularity; |
using Volo.Abp.Modularity; |
||||
|
|
||||
namespace LINGYUN.Abp.IM.SignalR |
namespace LINGYUN.Abp.IM.SignalR |
||||
{ |
{ |
||||
[DependsOn( |
[DependsOn( |
||||
typeof(AbpRealTimeModule), |
typeof(AbpIMModule), |
||||
typeof(AbpAspNetCoreSignalRModule))] |
typeof(AbpRealTimeSignalRModule), |
||||
|
typeof(AbpAspNetCoreSignalRJwtTokenModule))] |
||||
public class AbpIMSignalRModule : AbpModule |
public class AbpIMSignalRModule : AbpModule |
||||
{ |
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
Configure<AbpIMOptions>(options => |
||||
|
{ |
||||
|
options.Providers.Add<SignalRMessageSenderProvider>(); |
||||
|
}); |
||||
|
|
||||
|
Configure<AbpAspNetCoreSignalRJwtTokenMapPathOptions>(options => |
||||
|
{ |
||||
|
options.MapPath("messages"); |
||||
|
}); |
||||
|
} |
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -1,94 +0,0 @@ |
|||||
using LINGYUN.Abp.IM.Messages; |
|
||||
using LINGYUN.Abp.RealTime.Client; |
|
||||
using Microsoft.AspNetCore.Authorization; |
|
||||
using Microsoft.AspNetCore.SignalR; |
|
||||
using Microsoft.Extensions.Logging; |
|
||||
using System; |
|
||||
using System.Threading.Tasks; |
|
||||
|
|
||||
namespace LINGYUN.Abp.IM.SignalR.Hubs |
|
||||
{ |
|
||||
[Authorize] |
|
||||
public class MessageHub : OnlineClientHubBase |
|
||||
{ |
|
||||
private readonly IMessageStore _messageStore; |
|
||||
|
|
||||
public MessageHub( |
|
||||
IMessageStore messageStore) |
|
||||
{ |
|
||||
_messageStore = messageStore; |
|
||||
} |
|
||||
/// <summary>
|
|
||||
/// 客户端调用发送消息方法
|
|
||||
/// </summary>
|
|
||||
/// <param name="chatMessage"></param>
|
|
||||
/// <returns></returns>
|
|
||||
[HubMethodName("SendMessage")] |
|
||||
public virtual async Task SendMessageAsync(ChatMessage chatMessage) |
|
||||
{ |
|
||||
// 持久化
|
|
||||
await _messageStore.StoreMessageAsync(chatMessage); |
|
||||
|
|
||||
try |
|
||||
{ |
|
||||
if (!chatMessage.GroupId.IsNullOrWhiteSpace()) |
|
||||
{ |
|
||||
await SendMessageToGroupAsync(chatMessage); |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
await SendMessageToUserAsync(chatMessage); |
|
||||
} |
|
||||
} |
|
||||
catch (Exception ex) |
|
||||
{ |
|
||||
Logger.LogWarning("Could not send message, group: {0}, formUser: {1}, toUser: {2}", |
|
||||
chatMessage.GroupId, chatMessage.FormUserName, |
|
||||
chatMessage.ToUserId.HasValue ? chatMessage.ToUserId.ToString() : "None"); |
|
||||
Logger.LogWarning("Send group message error: {0}", ex.Message); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
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("getChatMessage", chatMessage); |
|
||||
} |
|
||||
|
|
||||
protected virtual async Task SendMessageToUserAsync(ChatMessage chatMessage) |
|
||||
{ |
|
||||
var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.GetValueOrDefault()); |
|
||||
var onlineClients = OnlineClientManager.GetAllByContext(onlineClientContext); |
|
||||
|
|
||||
// 需要捕捉每一个发送任务的异常吗?
|
|
||||
// var onlineClientConnections = onlineClients.Select(c => c.ConnectionId).ToImmutableList();
|
|
||||
// var signalRClient = Clients.Clients(onlineClientConnections);
|
|
||||
// await signalRClient.SendAsync("getChatMessage", chatMessage);
|
|
||||
|
|
||||
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("getChatMessage", chatMessage); |
|
||||
} |
|
||||
catch (Exception ex) |
|
||||
{ |
|
||||
Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId); |
|
||||
Logger.LogWarning("Send to user message error: {0}", ex.Message); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,122 @@ |
|||||
|
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 System; |
||||
|
using System.Collections.Immutable; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
using Volo.Abp.Users; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM.SignalR.Hubs |
||||
|
{ |
||||
|
[Authorize] |
||||
|
public class MessagesHub : OnlineClientHubBase |
||||
|
{ |
||||
|
protected IFriendStore FriendStore { get; } |
||||
|
protected IMessageStore MessageStore { get; } |
||||
|
protected IUserGroupStore UserGroupStore { get; } |
||||
|
|
||||
|
public MessagesHub( |
||||
|
IFriendStore friendStore, |
||||
|
IMessageStore messageStore, |
||||
|
IUserGroupStore userGroupStore) |
||||
|
{ |
||||
|
FriendStore = friendStore; |
||||
|
MessageStore = messageStore; |
||||
|
UserGroupStore = userGroupStore; |
||||
|
} |
||||
|
|
||||
|
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("onUserOnlined", 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("onUserOnlined", client.TenantId, client.UserId.Value); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
/// <summary>
|
||||
|
/// 客户端调用发送消息方法
|
||||
|
/// </summary>
|
||||
|
/// <param name="chatMessage"></param>
|
||||
|
/// <returns></returns>
|
||||
|
[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("getChatMessage", 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("getChatMessage", 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); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,101 +0,0 @@ |
|||||
using LINGYUN.Abp.IM.Messages; |
|
||||
using LINGYUN.Abp.IM.SignalR.Hubs; |
|
||||
using LINGYUN.Abp.RealTime.Client; |
|
||||
using Microsoft.AspNetCore.SignalR; |
|
||||
using Microsoft.Extensions.Logging; |
|
||||
using Microsoft.Extensions.Logging.Abstractions; |
|
||||
using System; |
|
||||
using System.Threading.Tasks; |
|
||||
using Volo.Abp.DependencyInjection; |
|
||||
|
|
||||
namespace LINGYUN.Abp.IM.SignalR.Messages |
|
||||
{ |
|
||||
public class SignalRMessageSender : IMessageSender, ITransientDependency |
|
||||
{ |
|
||||
public ILogger<SignalRMessageSender> Logger { protected get; set; } |
|
||||
|
|
||||
private readonly IOnlineClientManager _onlineClientManager; |
|
||||
|
|
||||
private readonly IHubContext<MessageHub> _hubContext; |
|
||||
|
|
||||
private readonly IMessageStore _messageStore; |
|
||||
|
|
||||
public SignalRMessageSender( |
|
||||
IOnlineClientManager onlineClientManager, |
|
||||
IHubContext<MessageHub> hubContext, |
|
||||
IMessageStore messageStore) |
|
||||
{ |
|
||||
_hubContext = hubContext; |
|
||||
_messageStore = messageStore; |
|
||||
_onlineClientManager = onlineClientManager; |
|
||||
|
|
||||
Logger = NullLogger<SignalRMessageSender>.Instance; |
|
||||
} |
|
||||
/// <summary>
|
|
||||
/// 服务端调用发送消息方法
|
|
||||
/// </summary>
|
|
||||
/// <param name="chatMessage"></param>
|
|
||||
/// <returns></returns>
|
|
||||
public async Task SendMessageAsync(ChatMessage chatMessage) |
|
||||
{ |
|
||||
// 持久化
|
|
||||
await _messageStore.StoreMessageAsync(chatMessage); |
|
||||
|
|
||||
try |
|
||||
{ |
|
||||
if (!chatMessage.GroupId.IsNullOrWhiteSpace()) |
|
||||
{ |
|
||||
await SendMessageToGroupAsync(chatMessage); |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
await SendMessageToUserAsync(chatMessage); |
|
||||
} |
|
||||
} |
|
||||
catch (Exception ex) |
|
||||
{ |
|
||||
Logger.LogWarning("Could not send message, group: {0}, formUser: {1}, toUser: {2}", |
|
||||
chatMessage.GroupId, chatMessage.FormUserName, |
|
||||
chatMessage.ToUserId.HasValue ? chatMessage.ToUserId.ToString() : "None"); |
|
||||
Logger.LogWarning("Send group message error: {0}", ex.Message); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
protected virtual async Task SendMessageToGroupAsync(ChatMessage chatMessage) |
|
||||
{ |
|
||||
var signalRClient = _hubContext.Clients.Group(chatMessage.GroupId); |
|
||||
if (signalRClient == null) |
|
||||
{ |
|
||||
Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!"); |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
await signalRClient.SendAsync("getChatMessage", chatMessage); |
|
||||
} |
|
||||
|
|
||||
protected virtual async Task SendMessageToUserAsync(ChatMessage chatMessage) |
|
||||
{ |
|
||||
var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.Value); |
|
||||
var onlineClients = _onlineClientManager.GetAllByContext(onlineClientContext); |
|
||||
foreach (var onlineClient in onlineClients) |
|
||||
{ |
|
||||
try |
|
||||
{ |
|
||||
var signalRClient = _hubContext.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("getChatMessage", chatMessage); |
|
||||
} |
|
||||
catch (Exception ex) |
|
||||
{ |
|
||||
Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId); |
|
||||
Logger.LogWarning("Send to user message error: {0}", ex.Message); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,65 @@ |
|||||
|
using LINGYUN.Abp.IM.Messages; |
||||
|
using LINGYUN.Abp.IM.SignalR.Hubs; |
||||
|
using LINGYUN.Abp.RealTime.Client; |
||||
|
using Microsoft.AspNetCore.SignalR; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using System; |
||||
|
using System.Collections.Immutable; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM.SignalR.Messages |
||||
|
{ |
||||
|
public class SignalRMessageSenderProvider : MessageSenderProviderBase |
||||
|
{ |
||||
|
public override string Name => "SignalR"; |
||||
|
|
||||
|
private readonly IOnlineClientManager _onlineClientManager; |
||||
|
|
||||
|
private readonly IHubContext<MessagesHub> _hubContext; |
||||
|
|
||||
|
public SignalRMessageSenderProvider( |
||||
|
IOnlineClientManager onlineClientManager, |
||||
|
IHubContext<MessagesHub> hubContext, |
||||
|
IServiceProvider serviceProvider) |
||||
|
: base(serviceProvider) |
||||
|
{ |
||||
|
_hubContext = hubContext; |
||||
|
_onlineClientManager = onlineClientManager; |
||||
|
} |
||||
|
|
||||
|
protected override async Task SendMessageToGroupAsync(ChatMessage chatMessage) |
||||
|
{ |
||||
|
var signalRClient = _hubContext.Clients.Group(chatMessage.GroupId); |
||||
|
if (signalRClient == null) |
||||
|
{ |
||||
|
Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!"); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
await signalRClient.SendAsync("getChatMessage", chatMessage); |
||||
|
} |
||||
|
|
||||
|
protected override async Task SendMessageToUserAsync(ChatMessage chatMessage) |
||||
|
{ |
||||
|
var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.Value); |
||||
|
var onlineClients = _onlineClientManager.GetAllByContext(onlineClientContext); |
||||
|
try |
||||
|
{ |
||||
|
var onlineClientConnectionIds = onlineClients.Select(client => client.ConnectionId).ToImmutableArray(); |
||||
|
var signalRClients = _hubContext.Clients.Clients(onlineClientConnectionIds); |
||||
|
if (signalRClients == null) |
||||
|
{ |
||||
|
Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " connection from SignalR hub!"); |
||||
|
return; |
||||
|
} |
||||
|
await signalRClients.SendAsync("getChatMessage", chatMessage); |
||||
|
} |
||||
|
catch (Exception ex) |
||||
|
{ |
||||
|
Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId); |
||||
|
Logger.LogWarning("Send to user message error: {0}", ex.Message); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,83 +0,0 @@ |
|||||
using LINGYUN.Abp.IM.Group; |
|
||||
using LINGYUN.Abp.RealTime.Client; |
|
||||
using Microsoft.AspNetCore.Http; |
|
||||
using Microsoft.Extensions.Logging; |
|
||||
using System; |
|
||||
using System.Threading.Tasks; |
|
||||
using Volo.Abp.AspNetCore.SignalR; |
|
||||
|
|
||||
namespace LINGYUN.Abp.IM.SignalR |
|
||||
{ |
|
||||
public abstract class OnlineClientHubBase : AbpHub |
|
||||
{ |
|
||||
private IUserGroupStore _userGroupStore; |
|
||||
protected IUserGroupStore UserGroupStore => LazyGetRequiredService(ref _userGroupStore); |
|
||||
|
|
||||
private IOnlineClientManager _onlineClientManager; |
|
||||
protected IOnlineClientManager OnlineClientManager => LazyGetRequiredService(ref _onlineClientManager); |
|
||||
|
|
||||
private IHttpContextAccessor _httpContextAccessor; |
|
||||
protected IHttpContextAccessor HttpContextAccessor => LazyGetRequiredService(ref _httpContextAccessor); |
|
||||
|
|
||||
public override async Task OnConnectedAsync() |
|
||||
{ |
|
||||
await base.OnConnectedAsync(); |
|
||||
IOnlineClient onlineClient = CreateClientForCurrentConnection(); |
|
||||
Logger.LogDebug("A client is connected: " + onlineClient.ToString()); |
|
||||
OnlineClientManager.Add(onlineClient); |
|
||||
// 加入通讯组
|
|
||||
var userGroups = await UserGroupStore.GetUserGroupsAsync(onlineClient.TenantId, onlineClient.UserId.Value); |
|
||||
foreach(var group in userGroups) |
|
||||
{ |
|
||||
await Groups.AddToGroupAsync(onlineClient.ConnectionId, group.Name); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
public override async Task OnDisconnectedAsync(Exception exception) |
|
||||
{ |
|
||||
await base.OnDisconnectedAsync(exception); |
|
||||
Logger.LogDebug("A client is disconnected: " + Context.ConnectionId); |
|
||||
try |
|
||||
{ |
|
||||
// 从通讯组移除
|
|
||||
var onlineClient = OnlineClientManager.GetByConnectionIdOrNull(Context.ConnectionId); |
|
||||
if(onlineClient != null) |
|
||||
{ |
|
||||
var userGroups = await UserGroupStore.GetUserGroupsAsync(onlineClient.TenantId, onlineClient.UserId.Value); |
|
||||
foreach (var group in userGroups) |
|
||||
{ |
|
||||
await Groups.RemoveFromGroupAsync(onlineClient.ConnectionId, group.Name); |
|
||||
} |
|
||||
// 移除在线客户端
|
|
||||
OnlineClientManager.Remove(Context.ConnectionId); |
|
||||
} |
|
||||
} |
|
||||
catch (Exception ex) |
|
||||
{ |
|
||||
Logger.LogWarning(ex.ToString(), ex); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
protected virtual IOnlineClient CreateClientForCurrentConnection() |
|
||||
{ |
|
||||
return new OnlineClient(Context.ConnectionId, GetClientIpAddress(), |
|
||||
CurrentTenant.Id, CurrentUser.Id) |
|
||||
{ |
|
||||
ConnectTime = Clock.Now |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
protected virtual string GetClientIpAddress() |
|
||||
{ |
|
||||
try |
|
||||
{ |
|
||||
return HttpContextAccessor.HttpContext?.Connection?.RemoteIpAddress?.ToString(); |
|
||||
} |
|
||||
catch (Exception ex) |
|
||||
{ |
|
||||
Logger.LogException(ex, LogLevel.Warning); |
|
||||
return null; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,10 @@ |
|||||
|
using Volo.Abp.EventBus; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM |
||||
|
{ |
||||
|
[DependsOn(typeof(AbpEventBusModule))] |
||||
|
public class AbpIMModule : AbpModule |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
using LINGYUN.Abp.IM.Messages; |
||||
|
using Volo.Abp.Collections; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM |
||||
|
{ |
||||
|
public class AbpIMOptions |
||||
|
{ |
||||
|
public ITypeList<IMessageSenderProvider> Providers { get; } |
||||
|
|
||||
|
public AbpIMOptions() |
||||
|
{ |
||||
|
Providers = new TypeList<IMessageSenderProvider>(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,161 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM.Contract |
||||
|
{ |
||||
|
public interface IFriendStore |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 是否是好友关系
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="friendId"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<bool> IsFriendAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
Guid friendId, |
||||
|
CancellationToken cancellationToken = default |
||||
|
); |
||||
|
/// <summary>
|
||||
|
/// 查询好友列表
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="sorting"></param>
|
||||
|
/// <param name="reverse"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<List<UserFriend>> GetListAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
string sorting = nameof(UserFriend.UserId), |
||||
|
bool reverse = false, |
||||
|
CancellationToken cancellationToken = default |
||||
|
); |
||||
|
/// <summary>
|
||||
|
/// 获取好友数量
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="filter"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<int> GetCountAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
string filter = "", |
||||
|
CancellationToken cancellationToken = default); |
||||
|
/// <summary>
|
||||
|
/// 获取好友列表
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="filter"></param>
|
||||
|
/// <param name="sorting"></param>
|
||||
|
/// <param name="reverse"></param>
|
||||
|
/// <param name="skipCount"></param>
|
||||
|
/// <param name="maxResultCount"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<List<UserFriend>> GetPagedListAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
string filter = "", |
||||
|
string sorting = nameof(UserFriend.UserId), |
||||
|
bool reverse = false, |
||||
|
int skipCount = 0, |
||||
|
int maxResultCount = 10, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
/// <summary>
|
||||
|
/// 获取最近联系好友列表
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="skipCount"></param>
|
||||
|
/// <param name="maxResultCount"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<List<UserFriend>> GetLastContactListAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
int skipCount = 0, |
||||
|
int maxResultCount = 10, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
/// <summary>
|
||||
|
/// 获取好友信息
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="friendId"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<UserFriend> GetMemberAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
Guid friendId, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
/// <summary>
|
||||
|
/// 添加好友
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="friendId"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task AddMemberAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
Guid friendId, |
||||
|
string remarkName = "", |
||||
|
CancellationToken cancellationToken = default); |
||||
|
/// <summary>
|
||||
|
/// 添加好友请求
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="friendId"></param>
|
||||
|
/// <param name="remarkName"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<UserAddFriendResult> AddRequestAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
Guid friendId, |
||||
|
string remarkName = "", |
||||
|
string description = "", |
||||
|
CancellationToken cancellationToken = default); |
||||
|
/// <summary>
|
||||
|
/// 移除好友
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="friendId"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task RemoveMemberAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
Guid friendId, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
/// <summary>
|
||||
|
/// 添加黑名单
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="friendId"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task AddShieldMemberAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
Guid friendId, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
/// <summary>
|
||||
|
/// 移除黑名单
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="userId"></param>
|
||||
|
/// <param name="friendId"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task RemoveShieldMemberAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
Guid friendId, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
namespace LINGYUN.Abp.IM.Contract |
||||
|
{ |
||||
|
public class UserAddFriendResult |
||||
|
{ |
||||
|
public bool Successed => Status == UserFriendStatus.Added; |
||||
|
public UserFriendStatus Status { get; } |
||||
|
public UserAddFriendResult(UserFriendStatus status) |
||||
|
{ |
||||
|
Status = status; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM.Contract |
||||
|
{ |
||||
|
public class UserFriend : UserCard |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 好友标识
|
||||
|
/// </summary>
|
||||
|
public Guid FriendId { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 已添加黑名单
|
||||
|
/// </summary>
|
||||
|
public bool Black { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 特别关注
|
||||
|
/// </summary>
|
||||
|
public bool SpecialFocus { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 消息免打扰
|
||||
|
/// </summary>
|
||||
|
public bool DontDisturb { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 备注名称
|
||||
|
/// </summary>
|
||||
|
public string RemarkName { get; set; } |
||||
|
|
||||
|
public override int GetHashCode() |
||||
|
{ |
||||
|
return FriendId.GetHashCode(); |
||||
|
} |
||||
|
|
||||
|
public override bool Equals(object obj) |
||||
|
{ |
||||
|
if (obj == null) |
||||
|
{ |
||||
|
return false; |
||||
|
} |
||||
|
if (obj is UserFriend friend) |
||||
|
{ |
||||
|
return friend.FriendId.Equals(FriendId); |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM.Contract |
||||
|
{ |
||||
|
public class UserFriendGroup |
||||
|
{ |
||||
|
public Guid? TenantId { get; set; } |
||||
|
public string DisplayName { get; set; } |
||||
|
public List<UserFriend> UserFriends { get; set; } = new List<UserFriend>(); |
||||
|
|
||||
|
public void AddFriend(UserFriend friend) |
||||
|
{ |
||||
|
UserFriends.AddIfNotContains(friend); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,14 @@ |
|||||
|
namespace LINGYUN.Abp.IM.Contract |
||||
|
{ |
||||
|
public enum UserFriendStatus : byte |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 需要验证
|
||||
|
/// </summary>
|
||||
|
NeedValidation, |
||||
|
/// <summary>
|
||||
|
/// 已添加
|
||||
|
/// </summary>
|
||||
|
Added |
||||
|
} |
||||
|
} |
||||
@ -1,22 +1,12 @@ |
|||||
using System.Collections.Generic; |
namespace LINGYUN.Abp.IM.Group |
||||
using System.Linq; |
|
||||
|
|
||||
namespace LINGYUN.Abp.IM.Group |
|
||||
{ |
{ |
||||
public class GroupUserCard : UserCard |
public class GroupUserCard : UserCard |
||||
{ |
{ |
||||
public long GroupId { get; set; } |
public long GroupId { get; set; } |
||||
public bool IsAdmin { get; set; } |
public bool IsAdmin { get; set; } |
||||
public bool IsSuperAdmin { get; set; } |
public bool IsSuperAdmin { get; set; } |
||||
public IDictionary<string, bool> Permissions { get; set; } |
|
||||
public GroupUserCard() |
public GroupUserCard() |
||||
{ |
{ |
||||
Permissions = new Dictionary<string, bool>(); |
|
||||
} |
|
||||
|
|
||||
public bool IsGrant(string key) |
|
||||
{ |
|
||||
return Permissions.Any(x => x.Equals(key) && x.Value); |
|
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -0,0 +1,60 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// IM用户资料查找接口
|
||||
|
/// </summary>
|
||||
|
public interface IUserCardFinder |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 查询IM用户数量
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="findUserName">用户名称</param>
|
||||
|
/// <param name="startAge">起止年龄</param>
|
||||
|
/// <param name="endAge">起止年龄</param>
|
||||
|
/// <param name="sex">性别</param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<int> GetCountAsync( |
||||
|
Guid? tenantId, |
||||
|
string findUserName = "", |
||||
|
int? startAge = null, |
||||
|
int? endAge = null, |
||||
|
Sex? sex = null); |
||||
|
/// <summary>
|
||||
|
/// 查询IM用户列表
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="findUserName">用户名称</param>
|
||||
|
/// <param name="startAge">起止年龄</param>
|
||||
|
/// <param name="endAge">起止年龄</param>
|
||||
|
/// <param name="sex">性别</param>
|
||||
|
/// <param name="sorting">排序字段</param>
|
||||
|
/// <param name="reverse">是否倒序</param>
|
||||
|
/// <param name="skipCount">起始记录位置</param>
|
||||
|
/// <param name="maxResultCount">最大返回数量</param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<List<UserCard>> 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); |
||||
|
/// <summary>
|
||||
|
/// 获取IM用户信息
|
||||
|
/// </summary>
|
||||
|
/// <param name="tenantId"></param>
|
||||
|
/// <param name="findUserId"></param>
|
||||
|
/// <returns></returns>
|
||||
|
Task<UserCard> GetMemberAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid findUserId); |
||||
|
} |
||||
|
} |
||||
@ -1,29 +1,79 @@ |
|||||
using System; |
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
using Volo.Abp.Auditing; |
using Volo.Abp.Auditing; |
||||
|
using Volo.Abp.ObjectExtending; |
||||
|
|
||||
namespace LINGYUN.Abp.IM.Messages |
namespace LINGYUN.Abp.IM.Messages |
||||
{ |
{ |
||||
public class ChatMessage |
public class ChatMessage : ExtensibleObject |
||||
{ |
{ |
||||
|
/// <summary>
|
||||
|
/// 租户
|
||||
|
/// </summary>
|
||||
public Guid? TenantId { get; set; } |
public Guid? TenantId { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 群组标识
|
||||
|
/// </summary>
|
||||
public string GroupId { get; set; } |
public string GroupId { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 消息标识
|
||||
|
/// </summary>
|
||||
|
/// <remarks>
|
||||
|
/// 调用者无需关注此字段,将由服务自动生成
|
||||
|
/// </remarks>
|
||||
public string MessageId { get; set; } |
public string MessageId { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发送者标识
|
||||
|
/// </summary>
|
||||
public Guid FormUserId { get; set; } |
public Guid FormUserId { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发送者名称
|
||||
|
/// </summary>
|
||||
public string FormUserName { get; set; } |
public string FormUserName { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 接收用户标识
|
||||
|
/// </summary>
|
||||
|
/// <remarks>
|
||||
|
/// 设计为可空是为了兼容群聊消息
|
||||
|
/// /remarks>
|
||||
public Guid? ToUserId { get; set; } |
public Guid? ToUserId { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 消息内容
|
||||
|
/// </summary>
|
||||
[DisableAuditing] |
[DisableAuditing] |
||||
public string Content { get; set; } |
public string Content { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 发送时间
|
||||
|
/// </summary>
|
||||
public DateTime SendTime { get; set; } |
public DateTime SendTime { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 是否匿名发送(存储在扩展字段)
|
||||
|
/// </summary>
|
||||
|
public bool IsAnonymous { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 消息类型
|
||||
|
/// </summary>
|
||||
|
public MessageType MessageType { get; set; } = MessageType.Text; |
||||
|
|
||||
public bool IsAnonymous { get; set; } = false; |
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext) |
||||
|
{ |
||||
|
var results = ExtensibleObjectValidator.GetValidationErrors(this, validationContext); |
||||
|
|
||||
public MessageType MessageType { get; set; } = MessageType.Text; |
foreach (var result in ValidateReceiver(validationContext)) |
||||
|
{ |
||||
|
results.Add(result); |
||||
|
} |
||||
|
|
||||
|
return results; |
||||
|
} |
||||
|
|
||||
|
protected virtual IEnumerable<ValidationResult> ValidateReceiver(ValidationContext validationContext) |
||||
|
{ |
||||
|
if (GroupId.IsNullOrWhiteSpace() && !ToUserId.HasValue) |
||||
|
{ |
||||
|
yield return new ValidationResult(""); |
||||
|
} |
||||
|
} |
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -0,0 +1,10 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM.Messages |
||||
|
{ |
||||
|
public interface IMessageSenderProvider |
||||
|
{ |
||||
|
string Name { get; } |
||||
|
Task SendMessageAsync(ChatMessage chatMessage); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM.Messages |
||||
|
{ |
||||
|
public interface IMessageSenderProviderManager |
||||
|
{ |
||||
|
List<IMessageSenderProvider> Providers { get; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
namespace LINGYUN.Abp.IM.Messages |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 上一次通讯消息
|
||||
|
/// </summary>
|
||||
|
public class LastChatMessage : ChatMessage |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.EventBus.Distributed; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM.Messages |
||||
|
{ |
||||
|
public class MessageSender : IMessageSender, ITransientDependency |
||||
|
{ |
||||
|
protected IDistributedEventBus EventBus { get; } |
||||
|
public MessageSender(IDistributedEventBus eventBus) |
||||
|
{ |
||||
|
EventBus = eventBus; |
||||
|
} |
||||
|
|
||||
|
public virtual async Task SendMessageAsync(ChatMessage chatMessage) |
||||
|
{ |
||||
|
chatMessage.SetProperty(nameof(ChatMessage.IsAnonymous), chatMessage.IsAnonymous); |
||||
|
|
||||
|
// 如果先存储的话,就紧耦合消息处理模块了
|
||||
|
// await Store.StoreMessageAsync(chatMessage);
|
||||
|
|
||||
|
await EventBus.PublishAsync(chatMessage); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,70 @@ |
|||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Microsoft.Extensions.Logging.Abstractions; |
||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM.Messages |
||||
|
{ |
||||
|
public abstract class MessageSenderProviderBase : IMessageSenderProvider, ITransientDependency |
||||
|
{ |
||||
|
public abstract string Name { get; } |
||||
|
|
||||
|
protected IServiceProvider ServiceProvider { get; } |
||||
|
|
||||
|
protected readonly object ServiceProviderLock = new object(); |
||||
|
|
||||
|
public ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory); |
||||
|
private ILoggerFactory _loggerFactory; |
||||
|
|
||||
|
protected ILogger Logger => _lazyLogger.Value; |
||||
|
private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); |
||||
|
|
||||
|
protected TService LazyGetRequiredService<TService>(ref TService reference) |
||||
|
{ |
||||
|
if (reference == null) |
||||
|
{ |
||||
|
lock (ServiceProviderLock) |
||||
|
{ |
||||
|
if (reference == null) |
||||
|
{ |
||||
|
reference = ServiceProvider.GetRequiredService<TService>(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return reference; |
||||
|
} |
||||
|
|
||||
|
protected MessageSenderProviderBase(IServiceProvider serviceProvider) |
||||
|
{ |
||||
|
ServiceProvider = serviceProvider; |
||||
|
} |
||||
|
|
||||
|
public virtual async Task SendMessageAsync(ChatMessage chatMessage) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
if (!chatMessage.GroupId.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
await SendMessageToGroupAsync(chatMessage); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
await SendMessageToUserAsync(chatMessage); |
||||
|
} |
||||
|
} |
||||
|
catch (Exception ex) |
||||
|
{ |
||||
|
Logger.LogWarning("Could not send message, group: {0}, formUser: {1}, toUser: {2}", |
||||
|
chatMessage.GroupId, chatMessage.FormUserName, |
||||
|
chatMessage.ToUserId.HasValue ? chatMessage.ToUserId.ToString() : "None"); |
||||
|
Logger.LogWarning("Send group message error: {0}", ex.Message); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
protected abstract Task SendMessageToGroupAsync(ChatMessage chatMessage); |
||||
|
protected abstract Task SendMessageToUserAsync(ChatMessage chatMessage); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace LINGYUN.Abp.IM.Messages |
||||
|
{ |
||||
|
public class MessageSenderProviderManager : IMessageSenderProviderManager, ISingletonDependency |
||||
|
{ |
||||
|
public List<IMessageSenderProvider> Providers => _lazyProviders.Value; |
||||
|
|
||||
|
protected AbpIMOptions Options { get; } |
||||
|
|
||||
|
private readonly Lazy<List<IMessageSenderProvider>> _lazyProviders; |
||||
|
|
||||
|
public MessageSenderProviderManager( |
||||
|
IServiceProvider serviceProvider, |
||||
|
IOptions<AbpIMOptions> options) |
||||
|
{ |
||||
|
Options = options.Value; |
||||
|
|
||||
|
_lazyProviders = new Lazy<List<IMessageSenderProvider>>( |
||||
|
() => Options |
||||
|
.Providers |
||||
|
.Select(type => serviceProvider.GetRequiredService(type) as IMessageSenderProvider) |
||||
|
.ToList(), |
||||
|
true |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
namespace LINGYUN.Abp.IM |
||||
|
{ |
||||
|
public enum Sex |
||||
|
{ |
||||
|
Male, |
||||
|
Female, |
||||
|
Other |
||||
|
} |
||||
|
} |
||||
@ -1,82 +0,0 @@ |
|||||
using LINGYUN.Abp.RealTime.Client; |
|
||||
using Microsoft.AspNetCore.Http; |
|
||||
using Microsoft.Extensions.Logging; |
|
||||
using System; |
|
||||
using System.Threading.Tasks; |
|
||||
using Volo.Abp.AspNetCore.SignalR; |
|
||||
using Volo.Abp.Security.Claims; |
|
||||
|
|
||||
namespace LINGYUN.Abp.Notifications.SignalR |
|
||||
{ |
|
||||
public abstract class OnlineClientHubBase : AbpHub |
|
||||
{ |
|
||||
private ICurrentPrincipalAccessor _currentPrincipalAccessor; |
|
||||
protected ICurrentPrincipalAccessor CurrentPrincipalAccessor => LazyGetRequiredService(ref _currentPrincipalAccessor); |
|
||||
|
|
||||
private IOnlineClientManager _onlineClientManager; |
|
||||
protected IOnlineClientManager OnlineClientManager => LazyGetRequiredService(ref _onlineClientManager); |
|
||||
|
|
||||
private IHttpContextAccessor _httpContextAccessor; |
|
||||
protected IHttpContextAccessor HttpContextAccessor => LazyGetRequiredService(ref _httpContextAccessor); |
|
||||
|
|
||||
public override async Task OnConnectedAsync() |
|
||||
{ |
|
||||
await base.OnConnectedAsync(); |
|
||||
IOnlineClient onlineClient = CreateClientForCurrentConnection(); |
|
||||
Logger.LogDebug("A client is connected: " + onlineClient.ToString()); |
|
||||
OnlineClientManager.Add(onlineClient); |
|
||||
if (onlineClient.TenantId.HasValue) |
|
||||
{ |
|
||||
// 以租户为分组,将用户加入租户通讯组
|
|
||||
await Groups.AddToGroupAsync(onlineClient.ConnectionId, onlineClient.TenantId.Value.ToString()); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
public override async Task OnDisconnectedAsync(Exception exception) |
|
||||
{ |
|
||||
await base.OnDisconnectedAsync(exception); |
|
||||
Logger.LogDebug("A client is disconnected: " + Context.ConnectionId); |
|
||||
try |
|
||||
{ |
|
||||
// 从通讯组移除
|
|
||||
var onlineClient = OnlineClientManager.GetByConnectionIdOrNull(Context.ConnectionId); |
|
||||
if(onlineClient != null) |
|
||||
{ |
|
||||
// 移除在线客户端
|
|
||||
OnlineClientManager.Remove(Context.ConnectionId); |
|
||||
} |
|
||||
} |
|
||||
catch (Exception ex) |
|
||||
{ |
|
||||
Logger.LogWarning(ex.ToString(), ex); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
protected virtual IOnlineClient CreateClientForCurrentConnection() |
|
||||
{ |
|
||||
// abp框架没有处理,需要切换一下用户身份令牌.否则无法获取用户信息
|
|
||||
using (CurrentPrincipalAccessor.Change(Context.User)) |
|
||||
{ |
|
||||
return new OnlineClient(Context.ConnectionId, GetClientIpAddress(), |
|
||||
CurrentTenant.Id, CurrentUser.Id) |
|
||||
{ |
|
||||
ConnectTime = Clock.Now, |
|
||||
UserName = CurrentUser.UserName |
|
||||
}; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
protected virtual string GetClientIpAddress() |
|
||||
{ |
|
||||
try |
|
||||
{ |
|
||||
return HttpContextAccessor.HttpContext?.Connection?.RemoteIpAddress?.ToString(); |
|
||||
} |
|
||||
catch (Exception ex) |
|
||||
{ |
|
||||
Logger.LogException(ex, LogLevel.Warning); |
|
||||
return null; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,25 +0,0 @@ |
|||||
using System.Threading.Tasks; |
|
||||
using Volo.Abp.DependencyInjection; |
|
||||
|
|
||||
namespace Microsoft.AspNetCore.Http |
|
||||
{ |
|
||||
public class SignalRJwtTokenMiddleware : IMiddleware, ITransientDependency |
|
||||
{ |
|
||||
public async Task InvokeAsync(HttpContext context, RequestDelegate next) |
|
||||
{ |
|
||||
// 仅针对自定义的SignalR hub
|
|
||||
if (context.Request.Path.StartsWithSegments("/signalr-hubs/notifications")) |
|
||||
{ |
|
||||
if (context.User.Identity?.IsAuthenticated != true) |
|
||||
{ |
|
||||
if (context.Request.Query.TryGetValue("access_token", out var accessToken)) |
|
||||
{ |
|
||||
context.Request.Headers.Add("Authorization", $"Bearer {accessToken}"); |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
} |
|
||||
await next(context); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,9 +1,18 @@ |
|||||
namespace LINGYUN.Abp.Notifications |
using JetBrains.Annotations; |
||||
|
using Volo.Abp.Localization; |
||||
|
using Volo.Abp.MultiTenancy; |
||||
|
|
||||
|
namespace LINGYUN.Abp.Notifications |
||||
{ |
{ |
||||
public interface INotificationDefinitionContext |
public interface INotificationDefinitionContext |
||||
{ |
{ |
||||
NotificationDefinition GetOrNull(string category); |
NotificationGroupDefinition AddGroup( |
||||
|
[NotNull] string name, |
||||
|
ILocalizableString displayName = null, |
||||
|
bool allowSubscriptionToClients = true); |
||||
|
|
||||
|
NotificationGroupDefinition GetGroupOrNull(string name); |
||||
|
|
||||
void Add(params NotificationDefinition[] definitions); |
void RemoveGroup(string name); |
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -0,0 +1,41 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace LINGYUN.Abp.Notifications |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 发送通知接口
|
||||
|
/// </summary>
|
||||
|
public interface INotificationSender |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 发送通知
|
||||
|
/// </summary>
|
||||
|
/// <param name="name">名称</param>
|
||||
|
/// <param name="data">数据</param>
|
||||
|
/// <param name="userId">用户,为空标识发给所有订阅用户</param>
|
||||
|
/// <param name="tenantId">租户</param>
|
||||
|
/// <param name="severity">严重级别</param>
|
||||
|
Task SendNofiterAsync( |
||||
|
string name, |
||||
|
NotificationData data, |
||||
|
UserIdentifier user = null, |
||||
|
Guid? tenantId = null, |
||||
|
NotificationSeverity severity = NotificationSeverity.Info); |
||||
|
/// <summary>
|
||||
|
/// 发送通知
|
||||
|
/// </summary>
|
||||
|
/// <param name="name">名称</param>
|
||||
|
/// <param name="data">数据</param>
|
||||
|
/// <param name="users">用户列表,为空标识发给所有订阅用户</param>
|
||||
|
/// <param name="tenantId">租户</param>
|
||||
|
/// <param name="severity">严重级别</param>
|
||||
|
Task SendNofitersAsync( |
||||
|
string name, |
||||
|
NotificationData data, |
||||
|
IEnumerable<UserIdentifier> users = null, |
||||
|
Guid? tenantId = null, |
||||
|
NotificationSeverity severity = NotificationSeverity.Info); |
||||
|
} |
||||
|
} |
||||
@ -1,45 +1,126 @@ |
|||||
using System; |
using System; |
||||
using System.Collections.Generic; |
using System.Collections.Generic; |
||||
|
using System.Threading; |
||||
using System.Threading.Tasks; |
using System.Threading.Tasks; |
||||
|
|
||||
namespace LINGYUN.Abp.Notifications |
namespace LINGYUN.Abp.Notifications |
||||
{ |
{ |
||||
public interface INotificationStore |
public interface INotificationStore |
||||
{ |
{ |
||||
Task InsertUserSubscriptionAsync(Guid? tenantId, UserIdentifier identifier, string notificationName); |
Task InsertUserSubscriptionAsync( |
||||
|
Guid? tenantId, |
||||
Task InsertUserSubscriptionAsync(Guid? tenantId, IEnumerable<UserIdentifier> identifiers, string notificationName); |
UserIdentifier identifier, |
||||
|
string notificationName, |
||||
Task DeleteUserSubscriptionAsync(Guid? tenantId, Guid userId, string notificationName); |
CancellationToken cancellationToken = default); |
||||
|
|
||||
Task DeleteAllUserSubscriptionAsync(Guid? tenantId, string notificationName); |
Task InsertUserSubscriptionAsync( |
||||
|
Guid? tenantId, |
||||
Task DeleteUserSubscriptionAsync(Guid? tenantId, IEnumerable<UserIdentifier> identifiers, string notificationName); |
IEnumerable<UserIdentifier> identifiers, |
||||
|
string notificationName, |
||||
Task<List<NotificationSubscriptionInfo>> GetSubscriptionsAsync(Guid? tenantId, string notificationName); |
CancellationToken cancellationToken = default); |
||||
|
|
||||
Task<List<NotificationSubscriptionInfo>> GetUserSubscriptionsAsync(Guid? tenantId, Guid userId); |
Task DeleteUserSubscriptionAsync( |
||||
|
Guid? tenantId, |
||||
Task<List<NotificationSubscriptionInfo>> GetUserSubscriptionsAsync(Guid? tenantId, string userName); |
Guid userId, |
||||
|
string notificationName, |
||||
Task<bool> IsSubscribedAsync(Guid? tenantId, Guid userId, string notificationName); |
CancellationToken cancellationToken = default); |
||||
|
|
||||
Task InsertNotificationAsync(NotificationInfo notification); |
Task DeleteAllUserSubscriptionAsync( |
||||
|
Guid? tenantId, |
||||
Task DeleteNotificationAsync(NotificationInfo notification); |
string notificationName, |
||||
|
CancellationToken cancellationToken = default); |
||||
Task DeleteNotificationAsync(int batchCount); |
|
||||
|
Task DeleteUserSubscriptionAsync( |
||||
Task InsertUserNotificationAsync(NotificationInfo notification, Guid userId); |
Guid? tenantId, |
||||
|
IEnumerable<UserIdentifier> identifiers, |
||||
Task InsertUserNotificationsAsync(NotificationInfo notification, IEnumerable<Guid> userIds); |
string notificationName, |
||||
|
CancellationToken cancellationToken = default); |
||||
Task DeleteUserNotificationAsync(Guid? tenantId, Guid userId, long notificationId); |
|
||||
|
Task<List<NotificationSubscriptionInfo>> GetUserSubscriptionsAsync( |
||||
Task<NotificationInfo> GetNotificationOrNullAsync(Guid? tenantId, long notificationId); |
Guid? tenantId, |
||||
|
string notificationName, |
||||
Task<List<NotificationInfo>> GetUserNotificationsAsync(Guid? tenantId, Guid userId, NotificationReadState readState = NotificationReadState.UnRead, int maxResultCount = 10); |
IEnumerable<UserIdentifier> identifiers = null, |
||||
|
CancellationToken cancellationToken = default); |
||||
Task ChangeUserNotificationReadStateAsync(Guid? tenantId, Guid userId, long notificationId, NotificationReadState readState); |
|
||||
|
Task<List<NotificationSubscriptionInfo>> GetUserSubscriptionsAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
|
||||
|
Task<List<NotificationSubscriptionInfo>> GetUserSubscriptionsAsync( |
||||
|
Guid? tenantId, |
||||
|
string userName, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
|
||||
|
Task<bool> 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<Guid> userIds, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
|
||||
|
Task DeleteUserNotificationAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
long notificationId, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
|
||||
|
Task<NotificationInfo> GetNotificationOrNullAsync( |
||||
|
Guid? tenantId, |
||||
|
long notificationId, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
|
||||
|
Task<List<NotificationInfo>> GetUserNotificationsAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
NotificationReadState readState = NotificationReadState.UnRead, |
||||
|
int maxResultCount = 10, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
|
||||
|
Task<int> GetUserNotificationsCountAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
string filter = "", |
||||
|
NotificationReadState readState = NotificationReadState.UnRead, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
|
||||
|
Task<List<NotificationInfo>> GetUserNotificationsAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
string filter = "", |
||||
|
string sorting = nameof(NotificationInfo.CreationTime), |
||||
|
bool reverse = true, |
||||
|
NotificationReadState readState = NotificationReadState.UnRead, |
||||
|
int skipCount = 1, |
||||
|
int maxResultCount = 10, |
||||
|
CancellationToken cancellationToken = default); |
||||
|
|
||||
|
Task ChangeUserNotificationReadStateAsync( |
||||
|
Guid? tenantId, |
||||
|
Guid userId, |
||||
|
long notificationId, |
||||
|
NotificationReadState readState, |
||||
|
CancellationToken cancellationToken = default); |
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -1,220 +0,0 @@ |
|||||
using Microsoft.Extensions.Logging; |
|
||||
using Microsoft.Extensions.Logging.Abstractions; |
|
||||
using Microsoft.Extensions.Options; |
|
||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using System.Linq; |
|
||||
using System.Threading.Tasks; |
|
||||
using Volo.Abp.BackgroundJobs; |
|
||||
using Volo.Abp.EventBus.Distributed; |
|
||||
|
|
||||
namespace LINGYUN.Abp.Notifications.Internal |
|
||||
{ |
|
||||
/// <summary>
|
|
||||
/// Implements <see cref="INotificationDispatcher"/>.
|
|
||||
/// </summary>
|
|
||||
internal class DefaultNotificationDispatcher : INotificationDispatcher |
|
||||
{ |
|
||||
/// <summary>
|
|
||||
/// Reference to <see cref="ILogger<DefaultNotificationDispatcher>"/>.
|
|
||||
/// </summary>
|
|
||||
public ILogger<DefaultNotificationDispatcher> Logger { get; set; } |
|
||||
/// <summary>
|
|
||||
/// Reference to <see cref="IDistributedEventBus"/>.
|
|
||||
/// </summary>
|
|
||||
public IDistributedEventBus DistributedEventBus { get; set; } |
|
||||
/// <summary>
|
|
||||
/// Reference to <see cref="AbpNotificationOptions"/>.
|
|
||||
/// </summary>
|
|
||||
private readonly AbpNotificationOptions _notificationOptions; |
|
||||
/// <summary>
|
|
||||
/// Reference to <see cref="IBackgroundJobManager"/>.
|
|
||||
/// </summary>
|
|
||||
private readonly IBackgroundJobManager _backgroundJobManager; |
|
||||
/// <summary>
|
|
||||
/// Reference to <see cref="INotificationStore"/>.
|
|
||||
/// </summary>
|
|
||||
private readonly INotificationStore _notificationStore; |
|
||||
/// <summary>
|
|
||||
/// Reference to <see cref="INotificationDefinitionManager"/>.
|
|
||||
/// </summary>
|
|
||||
private readonly INotificationDefinitionManager _notificationDefinitionManager; |
|
||||
/// <summary>
|
|
||||
/// Reference to <see cref="INotificationPublishProviderManager"/>.
|
|
||||
/// </summary>
|
|
||||
private readonly INotificationPublishProviderManager _notificationPublishProviderManager; |
|
||||
/// <summary>
|
|
||||
/// Initializes a new instance of the <see cref="DefaultNotificationDispatcher"/> class.
|
|
||||
/// </summary>
|
|
||||
public DefaultNotificationDispatcher( |
|
||||
IBackgroundJobManager backgroundJobManager, |
|
||||
IOptions<AbpNotificationOptions> options, |
|
||||
INotificationStore notificationStore, |
|
||||
INotificationDefinitionManager notificationDefinitionManager, |
|
||||
INotificationPublishProviderManager notificationPublishProviderManager) |
|
||||
{ |
|
||||
_backgroundJobManager = backgroundJobManager; |
|
||||
_notificationOptions = options.Value; |
|
||||
_notificationStore = notificationStore; |
|
||||
_notificationDefinitionManager = notificationDefinitionManager; |
|
||||
_notificationPublishProviderManager = notificationPublishProviderManager; |
|
||||
|
|
||||
DistributedEventBus = NullDistributedEventBus.Instance; |
|
||||
Logger = NullLogger<DefaultNotificationDispatcher>.Instance; |
|
||||
} |
|
||||
/// <summary>
|
|
||||
/// 发送通知
|
|
||||
/// </summary>
|
|
||||
/// <param name="notificationName">通知名称</param>
|
|
||||
/// <param name="data">通知数据</param>
|
|
||||
/// <param name="tenantId">租户</param>
|
|
||||
/// <param name="notificationSeverity">级别</param>
|
|
||||
/// <returns></returns>
|
|
||||
public virtual async Task DispatchAsync(NotificationName notificationName, NotificationData data, Guid? tenantId = null, |
|
||||
NotificationSeverity notificationSeverity = NotificationSeverity.Info) |
|
||||
{ |
|
||||
// 获取自定义的通知
|
|
||||
var defineNotification = _notificationDefinitionManager.Get(notificationName.CateGory); |
|
||||
|
|
||||
//// 没有定义的通知,应该也要能发布、订阅,
|
|
||||
//// 比如订单之类的,是以订单编号为通知名称,这是动态的,没法自定义
|
|
||||
//if(defineNotification == null)
|
|
||||
//{
|
|
||||
// defineNotification = new NotificationDefinition(notificationName.CateGory);
|
|
||||
//}
|
|
||||
|
|
||||
var notificationInfo = new NotificationInfo |
|
||||
{ |
|
||||
CateGory = notificationName.CateGory, |
|
||||
Name = notificationName.Name, |
|
||||
CreationTime = DateTime.Now, |
|
||||
NotificationSeverity = notificationSeverity, |
|
||||
Lifetime = defineNotification.NotificationLifetime, |
|
||||
NotificationType = defineNotification.NotificationType, |
|
||||
TenantId = tenantId, |
|
||||
Data = data |
|
||||
}; |
|
||||
|
|
||||
var providers = Enumerable |
|
||||
.Reverse(_notificationPublishProviderManager.Providers); |
|
||||
|
|
||||
if (defineNotification.Providers.Any()) |
|
||||
{ |
|
||||
providers = providers.Where(p => defineNotification.Providers.Contains(p.Name)); |
|
||||
} |
|
||||
|
|
||||
await PublishFromProvidersAsync(providers, notificationInfo); |
|
||||
|
|
||||
if (notificationInfo.Lifetime == NotificationLifetime.OnlyOne) |
|
||||
{ |
|
||||
// 一次性通知在发送完成后就取消用户订阅
|
|
||||
await _notificationStore.DeleteAllUserSubscriptionAsync(notificationInfo.TenantId, |
|
||||
notificationInfo.Name); |
|
||||
} |
|
||||
} |
|
||||
/// <summary>
|
|
||||
/// 发送通知事件
|
|
||||
/// </summary>
|
|
||||
/// <param name="notificationName"></param>
|
|
||||
/// <param name="data"></param>
|
|
||||
/// <param name="tenantId"></param>
|
|
||||
/// <param name="notificationSeverity"></param>
|
|
||||
/// <returns></returns>
|
|
||||
public virtual async Task DispatchEventAsync(NotificationName notificationName, NotificationData data, Guid? tenantId = null, |
|
||||
NotificationSeverity notificationSeverity = NotificationSeverity.Info) |
|
||||
{ |
|
||||
// 获取自定义的通知
|
|
||||
var defineNotification = _notificationDefinitionManager.Get(notificationName.CateGory); |
|
||||
|
|
||||
var notificationEventData = new NotificationEventData |
|
||||
{ |
|
||||
CateGory = notificationName.CateGory, |
|
||||
Name = notificationName.Name, |
|
||||
CreationTime = DateTime.Now, |
|
||||
NotificationSeverity = notificationSeverity, |
|
||||
Lifetime = defineNotification.NotificationLifetime, |
|
||||
NotificationType = defineNotification.NotificationType, |
|
||||
TenantId = tenantId, |
|
||||
Data = data |
|
||||
}; |
|
||||
// 发布分布式通知事件,让消息中心统一处理
|
|
||||
await DistributedEventBus.PublishAsync(notificationEventData); |
|
||||
} |
|
||||
/// <summary>
|
|
||||
/// 指定提供者发布通知
|
|
||||
/// </summary>
|
|
||||
/// <param name="providers">提供者列表</param>
|
|
||||
/// <param name="notificationInfo">通知信息</param>
|
|
||||
/// <returns></returns>
|
|
||||
protected async Task PublishFromProvidersAsync(IEnumerable<INotificationPublishProvider> providers, |
|
||||
NotificationInfo notificationInfo) |
|
||||
{ |
|
||||
Logger.LogDebug($"Persistent notification {notificationInfo.Name}"); |
|
||||
// 持久化通知
|
|
||||
await _notificationStore.InsertNotificationAsync(notificationInfo); |
|
||||
|
|
||||
Logger.LogDebug($"Gets a list of user subscriptions {notificationInfo.Name}"); |
|
||||
// 获取用户订阅列表
|
|
||||
var userSubscriptions = await _notificationStore.GetSubscriptionsAsync(notificationInfo.TenantId, notificationInfo.Name); |
|
||||
|
|
||||
Logger.LogDebug($"Persistent user notifications {notificationInfo.Name}"); |
|
||||
// 持久化用户通知
|
|
||||
var subscriptionUserIdentifiers = userSubscriptions.Select(us => new UserIdentifier(us.UserId, us.UserName)); |
|
||||
|
|
||||
await _notificationStore.InsertUserNotificationsAsync(notificationInfo, |
|
||||
subscriptionUserIdentifiers.Select(u => u.UserId)); |
|
||||
|
|
||||
// 发布通知
|
|
||||
foreach (var provider in providers) |
|
||||
{ |
|
||||
await PublishAsync(provider, notificationInfo, subscriptionUserIdentifiers); |
|
||||
} |
|
||||
|
|
||||
// TODO: 需要计算队列大小,根据情况是否需要并行发布消息
|
|
||||
//Parallel.ForEach(providers, async (provider) =>
|
|
||||
//{
|
|
||||
// await PublishAsync(provider, notificationInfo, subscriptionUserIdentifiers);
|
|
||||
//});
|
|
||||
} |
|
||||
/// <summary>
|
|
||||
/// 发布通知
|
|
||||
/// </summary>
|
|
||||
/// <param name="provider">通知发布者</param>
|
|
||||
/// <param name="notificationInfo">通知信息</param>
|
|
||||
/// <param name="subscriptionUserIdentifiers">订阅用户列表</param>
|
|
||||
/// <returns></returns>
|
|
||||
protected async Task PublishAsync(INotificationPublishProvider provider, NotificationInfo notificationInfo, |
|
||||
IEnumerable<UserIdentifier> subscriptionUserIdentifiers) |
|
||||
{ |
|
||||
try |
|
||||
{ |
|
||||
Logger.LogDebug($"Sending notification with provider {provider.Name}"); |
|
||||
var notifacationDataMapping = _notificationOptions.NotificationDataMappings |
|
||||
.GetMapItemOrNull(notificationInfo.CateGory, provider.Name); |
|
||||
if (notifacationDataMapping != null) |
|
||||
{ |
|
||||
notificationInfo.Data = notifacationDataMapping.MappingFunc(notificationInfo.Data); |
|
||||
} |
|
||||
// 发布
|
|
||||
await provider.PublishAsync(notificationInfo, subscriptionUserIdentifiers); |
|
||||
|
|
||||
Logger.LogDebug($"Send notification {notificationInfo.Name} with provider {provider.Name} was successful"); |
|
||||
} |
|
||||
catch (Exception ex) |
|
||||
{ |
|
||||
Logger.LogWarning($"Send notification error with provider {provider.Name}"); |
|
||||
Logger.LogWarning($"Error message:{ex.Message}"); |
|
||||
|
|
||||
Logger.LogTrace(ex, $"Send notification error with provider { provider.Name}"); |
|
||||
|
|
||||
Logger.LogDebug($"Send notification error, notification {notificationInfo.Name} entry queue"); |
|
||||
// 发送失败的消息进入后台队列
|
|
||||
await _backgroundJobManager.EnqueueAsync( |
|
||||
new NotificationPublishJobArgs(notificationInfo.GetId(), |
|
||||
provider.GetType().AssemblyQualifiedName, |
|
||||
subscriptionUserIdentifiers.ToList(), |
|
||||
notificationInfo.TenantId)); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,78 @@ |
|||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Microsoft.Extensions.Logging.Abstractions; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.EventBus.Distributed; |
||||
|
|
||||
|
namespace LINGYUN.Abp.Notifications |
||||
|
{ |
||||
|
public class NotificationSender : INotificationSender, ITransientDependency |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Reference to <see cref="ILogger<NotificationSender>"/>.
|
||||
|
/// </summary>
|
||||
|
public ILogger<NotificationSender> Logger { get; set; } |
||||
|
/// <summary>
|
||||
|
/// Reference to <see cref="IDistributedEventBus"/>.
|
||||
|
/// </summary>
|
||||
|
public IDistributedEventBus DistributedEventBus { get; } |
||||
|
|
||||
|
public NotificationSender( |
||||
|
IDistributedEventBus distributedEventBus) |
||||
|
{ |
||||
|
DistributedEventBus = distributedEventBus; |
||||
|
Logger = NullLogger<NotificationSender>.Instance; |
||||
|
} |
||||
|
|
||||
|
public async Task SendNofiterAsync( |
||||
|
string name, |
||||
|
NotificationData data, |
||||
|
UserIdentifier user = null, |
||||
|
Guid? tenantId = null, |
||||
|
NotificationSeverity severity = NotificationSeverity.Info) |
||||
|
{ |
||||
|
if (user == null) |
||||
|
{ |
||||
|
await PublishNofiterAsync(name, data, null, tenantId, severity); |
||||
|
|
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
await PublishNofiterAsync(name, data, new List<UserIdentifier> { user }, tenantId, severity); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public async Task SendNofitersAsync( |
||||
|
string name, |
||||
|
NotificationData data, |
||||
|
IEnumerable<UserIdentifier> users = null, |
||||
|
Guid? tenantId = null, |
||||
|
NotificationSeverity severity = NotificationSeverity.Info) |
||||
|
{ |
||||
|
await PublishNofiterAsync(name, data, users, tenantId, severity); |
||||
|
} |
||||
|
|
||||
|
protected async Task PublishNofiterAsync( |
||||
|
string name, |
||||
|
NotificationData data, |
||||
|
IEnumerable<UserIdentifier> users = null, |
||||
|
Guid? tenantId = null, |
||||
|
NotificationSeverity severity = NotificationSeverity.Info) |
||||
|
{ |
||||
|
await DistributedEventBus |
||||
|
.PublishAsync( |
||||
|
new NotificationEventData |
||||
|
{ |
||||
|
TenantId = tenantId, |
||||
|
Users = users?.ToList(), |
||||
|
Name = name, |
||||
|
Data = data, |
||||
|
CreationTime = DateTime.Now, |
||||
|
Severity = severity |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,23 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
|
||||
|
namespace LINGYUN.Abp.Notifications |
||||
|
{ |
||||
|
public class LocalizableStringInfo |
||||
|
{ |
||||
|
public string ResourceName { get; } |
||||
|
|
||||
|
public string Name { get; } |
||||
|
|
||||
|
public Dictionary<object, object> Values { get; } |
||||
|
|
||||
|
public LocalizableStringInfo( |
||||
|
string resourceName, |
||||
|
string name, |
||||
|
Dictionary<object, object> values = null) |
||||
|
{ |
||||
|
ResourceName = resourceName; |
||||
|
Name = name; |
||||
|
Values = values; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,31 @@ |
|||||
|
using Newtonsoft.Json; |
||||
|
|
||||
|
namespace LINGYUN.Abp.Notifications |
||||
|
{ |
||||
|
public class NotificationDataConverter |
||||
|
{ |
||||
|
public static NotificationData Convert(NotificationData notificationData) |
||||
|
{ |
||||
|
if (notificationData != null) |
||||
|
{ |
||||
|
if (notificationData.NeedLocalizer()) |
||||
|
{ |
||||
|
var title = JsonConvert.DeserializeObject<LocalizableStringInfo>(notificationData.TryGetData("title").ToString()); |
||||
|
var message = JsonConvert.DeserializeObject<LocalizableStringInfo>(notificationData.TryGetData("message").ToString()); |
||||
|
notificationData.TrySetData("title", title); |
||||
|
notificationData.TrySetData("message", message); |
||||
|
|
||||
|
if (notificationData.Properties.TryGetValue("description", out object description) && description != null) |
||||
|
{ |
||||
|
notificationData.TrySetData("description", JsonConvert.DeserializeObject<LocalizableStringInfo>(description.ToString())); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
notificationData = new NotificationData(); |
||||
|
} |
||||
|
return notificationData; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,33 +1,57 @@ |
|||||
using System; |
using JetBrains.Annotations; |
||||
using System.Collections.Generic; |
using System.Collections.Generic; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.Localization; |
||||
|
using Volo.Abp.MultiTenancy; |
||||
|
|
||||
namespace LINGYUN.Abp.Notifications |
namespace LINGYUN.Abp.Notifications |
||||
{ |
{ |
||||
public class NotificationDefinitionContext : INotificationDefinitionContext |
public class NotificationDefinitionContext : INotificationDefinitionContext |
||||
{ |
{ |
||||
protected Dictionary<string, NotificationDefinition> Notifications { get; } |
internal Dictionary<string, NotificationGroupDefinition> Groups { get; } |
||||
|
|
||||
public NotificationDefinitionContext(Dictionary<string, NotificationDefinition> notifications) |
public NotificationDefinitionContext() |
||||
{ |
{ |
||||
Notifications = notifications; |
Groups = new Dictionary<string, NotificationGroupDefinition>(); |
||||
} |
} |
||||
|
|
||||
public void Add(params NotificationDefinition[] definitions) |
public NotificationGroupDefinition AddGroup( |
||||
|
[NotNull] string name, |
||||
|
ILocalizableString displayName = null, |
||||
|
bool allowSubscriptionToClients = true) |
||||
{ |
{ |
||||
if (definitions.IsNullOrEmpty()) |
Check.NotNull(name, nameof(name)); |
||||
|
|
||||
|
if (Groups.ContainsKey(name)) |
||||
{ |
{ |
||||
return; |
throw new AbpException($"There is already an existing notification group with name: {name}"); |
||||
} |
} |
||||
|
|
||||
foreach (var definition in definitions) |
return Groups[name] = new NotificationGroupDefinition(name, displayName, allowSubscriptionToClients); |
||||
|
} |
||||
|
|
||||
|
public NotificationGroupDefinition GetGroupOrNull(string name) |
||||
|
{ |
||||
|
Check.NotNull(name, nameof(name)); |
||||
|
|
||||
|
if (!Groups.ContainsKey(name)) |
||||
{ |
{ |
||||
Notifications[definition.CateGory] = definition; |
return null; |
||||
} |
} |
||||
|
|
||||
|
return Groups[name]; |
||||
} |
} |
||||
|
|
||||
public NotificationDefinition GetOrNull(string category) |
public void RemoveGroup(string name) |
||||
{ |
{ |
||||
return Notifications.GetOrDefault(category); |
Check.NotNull(name, nameof(name)); |
||||
|
|
||||
|
if (!Groups.ContainsKey(name)) |
||||
|
{ |
||||
|
throw new AbpException($"Undefined notification group: '{name}'."); |
||||
|
} |
||||
|
|
||||
|
Groups.Remove(name); |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -1,38 +1,20 @@ |
|||||
using System; |
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using Volo.Abp.MultiTenancy; |
||||
|
|
||||
namespace LINGYUN.Abp.Notifications |
namespace LINGYUN.Abp.Notifications |
||||
{ |
{ |
||||
public class NotificationEventData |
public class NotificationEventData : IMultiTenant |
||||
{ |
{ |
||||
public Guid? TenantId { get; set; } |
public Guid? TenantId { get; set; } |
||||
public string CateGory { get; set; } |
|
||||
public string Name { get; set; } |
public string Name { get; set; } |
||||
public string Id { get; set; } |
|
||||
public NotificationData Data { get; set; } |
public NotificationData Data { get; set; } |
||||
public DateTime CreationTime { get; set; } |
public DateTime CreationTime { get; set; } |
||||
public NotificationLifetime Lifetime { get; set; } |
public NotificationSeverity Severity { get; set; } |
||||
public NotificationType NotificationType { get; set; } |
public List<UserIdentifier> Users { get; set; } |
||||
public NotificationSeverity NotificationSeverity { get; set; } |
|
||||
|
|
||||
public NotificationEventData() |
public NotificationEventData() |
||||
{ |
{ |
||||
|
Users = new List<UserIdentifier>(); |
||||
} |
|
||||
|
|
||||
public NotificationInfo ToNotificationInfo() |
|
||||
{ |
|
||||
return new NotificationInfo |
|
||||
{ |
|
||||
NotificationSeverity = NotificationSeverity, |
|
||||
CreationTime = CreationTime, |
|
||||
Data = Data, |
|
||||
Id = Id, |
|
||||
Name = Name, |
|
||||
CateGory = CateGory, |
|
||||
NotificationType = NotificationType, |
|
||||
Lifetime = Lifetime, |
|
||||
TenantId = TenantId |
|
||||
}; |
|
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -0,0 +1,70 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Collections.Immutable; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.Localization; |
||||
|
using Volo.Abp.MultiTenancy; |
||||
|
|
||||
|
namespace LINGYUN.Abp.Notifications |
||||
|
{ |
||||
|
public class NotificationGroupDefinition |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// 通知组名称
|
||||
|
/// </summary>
|
||||
|
[NotNull] |
||||
|
public string Name { get; set; } |
||||
|
/// <summary>
|
||||
|
/// 通知组显示名称
|
||||
|
/// </summary>
|
||||
|
[NotNull] |
||||
|
public ILocalizableString DisplayName |
||||
|
{ |
||||
|
get => _displayName; |
||||
|
set => _displayName = Check.NotNull(value, nameof(value)); |
||||
|
} |
||||
|
private ILocalizableString _displayName; |
||||
|
/// <summary>
|
||||
|
/// 通知组说明
|
||||
|
/// </summary>
|
||||
|
[CanBeNull] |
||||
|
public ILocalizableString Description { get; set; } |
||||
|
public bool AllowSubscriptionToClients { get; set; } |
||||
|
public IReadOnlyList<NotificationDefinition> Notifications => _notifications.ToImmutableList(); |
||||
|
private readonly List<NotificationDefinition> _notifications; |
||||
|
|
||||
|
protected internal NotificationGroupDefinition( |
||||
|
string name, |
||||
|
ILocalizableString displayName = null, |
||||
|
bool allowSubscriptionToClients = false) |
||||
|
{ |
||||
|
Name = name; |
||||
|
DisplayName = displayName ?? new FixedLocalizableString(Name); |
||||
|
AllowSubscriptionToClients = allowSubscriptionToClients; |
||||
|
|
||||
|
_notifications = new List<NotificationDefinition>(); |
||||
|
} |
||||
|
|
||||
|
public virtual NotificationDefinition AddNotification( |
||||
|
string name, |
||||
|
ILocalizableString displayName = null, |
||||
|
ILocalizableString description = null, |
||||
|
NotificationType notificationType = NotificationType.Application, |
||||
|
NotificationLifetime lifetime = NotificationLifetime.Persistent, |
||||
|
bool allowSubscriptionToClients = false) |
||||
|
{ |
||||
|
var notification = new NotificationDefinition( |
||||
|
name, |
||||
|
displayName, |
||||
|
description, |
||||
|
notificationType, |
||||
|
lifetime, |
||||
|
allowSubscriptionToClients |
||||
|
); |
||||
|
|
||||
|
_notifications.Add(notification); |
||||
|
|
||||
|
return notification; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,14 +0,0 @@ |
|||||
namespace LINGYUN.Abp.Notifications |
|
||||
{ |
|
||||
public class NotificationName |
|
||||
{ |
|
||||
public string CateGory { get; } |
|
||||
public string Name { get; } |
|
||||
|
|
||||
public NotificationName(string cateGory, string name) |
|
||||
{ |
|
||||
Name = name; |
|
||||
CateGory = cateGory; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,15 +0,0 @@ |
|||||
namespace LINGYUN.Abp.Notifications |
|
||||
{ |
|
||||
public static class NotificationNameNormalizer |
|
||||
{ |
|
||||
public static NotificationName NormalizerName(string name) |
|
||||
{ |
|
||||
return new NotificationName(name, name); |
|
||||
} |
|
||||
public static NotificationName NormalizerName(string category, string name) |
|
||||
{ |
|
||||
var notifyName = string.Concat(category, ":", name); |
|
||||
return new NotificationName(category, notifyName); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,18 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netcoreapp3.1</TargetFramework> |
||||
|
<RootNamespace /> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Volo.Abp.AspNetCore.SignalR" Version="3.2.0" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\LINGYUN.Abp.RealTime\LINGYUN.Abp.RealTime.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,12 @@ |
|||||
|
using Volo.Abp.AspNetCore.SignalR; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace LINGYUN.Abp.RealTime.SignalR |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(AbpRealTimeModule), |
||||
|
typeof(AbpAspNetCoreSignalRModule))] |
||||
|
public class AbpRealTimeSignalRModule : AbpModule |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,94 @@ |
|||||
|
using LINGYUN.Abp.RealTime.Client; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.AspNetCore.SignalR; |
||||
|
using Volo.Abp.AspNetCore.WebClientInfo; |
||||
|
|
||||
|
namespace LINGYUN.Abp.RealTime.SignalR |
||||
|
{ |
||||
|
public abstract class OnlineClientHubBase : AbpHub, IClient |
||||
|
{ |
||||
|
private IWebClientInfoProvider _webClientInfoProvider; |
||||
|
protected IWebClientInfoProvider WebClientInfoProvider => LazyGetRequiredService(ref _webClientInfoProvider); |
||||
|
|
||||
|
private IOnlineClientManager _onlineClientManager; |
||||
|
protected IOnlineClientManager OnlineClientManager => LazyGetRequiredService(ref _onlineClientManager); |
||||
|
|
||||
|
public override async Task OnConnectedAsync() |
||||
|
{ |
||||
|
await base.OnConnectedAsync(); |
||||
|
|
||||
|
IOnlineClient onlineClient = CreateClientForCurrentConnection(); |
||||
|
await OnConnectedAsync(onlineClient); |
||||
|
} |
||||
|
|
||||
|
public virtual async Task OnConnectedAsync(IOnlineClient client) |
||||
|
{ |
||||
|
Logger.LogDebug("A client is connected: " + client.ToString()); |
||||
|
OnlineClientManager.Add(client); |
||||
|
await OnClientConnectedAsync(client); |
||||
|
} |
||||
|
|
||||
|
public override async Task OnDisconnectedAsync(Exception exception) |
||||
|
{ |
||||
|
// 从通讯组移除
|
||||
|
var onlineClient = OnlineClientManager.GetByConnectionIdOrNull(Context.ConnectionId); |
||||
|
await OnDisconnectedAsync(onlineClient); |
||||
|
|
||||
|
await base.OnDisconnectedAsync(exception); |
||||
|
} |
||||
|
|
||||
|
public virtual async Task OnDisconnectedAsync(IOnlineClient client) |
||||
|
{ |
||||
|
if (client != null) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
Logger.LogDebug("A client is disconnected: " + client); |
||||
|
// 移除在线客户端
|
||||
|
OnlineClientManager.Remove(Context.ConnectionId); |
||||
|
await OnClientDisconnectedAsync(client); |
||||
|
} |
||||
|
catch (Exception ex) |
||||
|
{ |
||||
|
Logger.LogWarning(ex.ToString(), ex); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
protected virtual IOnlineClient CreateClientForCurrentConnection() |
||||
|
{ |
||||
|
return new OnlineClient( |
||||
|
Context.ConnectionId, |
||||
|
WebClientInfoProvider.ClientIpAddress, |
||||
|
CurrentTenant.Id, |
||||
|
CurrentUser.Id) |
||||
|
{ |
||||
|
ConnectTime = Clock.Now, |
||||
|
UserName = CurrentUser.UserName, |
||||
|
UserAccount = CurrentUser.UserName, |
||||
|
Roles = CurrentUser.Roles ?? new string[0], |
||||
|
Properties = Context.Items |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
protected virtual async Task OnClientConnectedAsync(IOnlineClient client) |
||||
|
{ |
||||
|
// 角色添加进组
|
||||
|
foreach (var role in client.Roles) |
||||
|
{ |
||||
|
await Groups.AddToGroupAsync(client.ConnectionId, role); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
protected virtual async Task OnClientDisconnectedAsync(IOnlineClient client) |
||||
|
{ |
||||
|
// 角色添加进组
|
||||
|
foreach (var role in client.Roles) |
||||
|
{ |
||||
|
await Groups.RemoveFromGroupAsync(client.ConnectionId, role); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,10 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace LINGYUN.Abp.RealTime.Client |
||||
|
{ |
||||
|
public interface IClient |
||||
|
{ |
||||
|
Task OnConnectedAsync(IOnlineClient client); |
||||
|
Task OnDisconnectedAsync(IOnlineClient client); |
||||
|
} |
||||
|
} |
||||
@ -1,9 +0,0 @@ |
|||||
using System.Threading.Tasks; |
|
||||
|
|
||||
namespace LINGYUN.Abp.WeChat.Authorization |
|
||||
{ |
|
||||
public interface IWeChatOpenIdFinder |
|
||||
{ |
|
||||
Task<WeChatOpenId> FindAsync(string code); |
|
||||
} |
|
||||
} |
|
||||
@ -1,9 +0,0 @@ |
|||||
using System.Threading.Tasks; |
|
||||
|
|
||||
namespace LINGYUN.Abp.WeChat.Authorization |
|
||||
{ |
|
||||
public interface IWeChatTokenProvider |
|
||||
{ |
|
||||
Task<WeChatToken> GetTokenAsync(); |
|
||||
} |
|
||||
} |
|
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue